mirror of
https://github.com/HamzaSha1/zod-backend.git
synced 2026-03-10 21:01:45 +00:00
Compare commits
16 Commits
ZOD-204-vi
...
9d9408dedd
| Author | SHA1 | Date | |
|---|---|---|---|
| 9d9408dedd | |||
| bbeece9e03 | |||
| 596562f6dc | |||
| 10de8f69c9 | |||
| 8a6b1cc900 | |||
| d16ae66252 | |||
| e966f95463 | |||
| 2714255dd1 | |||
| 39a0b131b8 | |||
| 4f778f7904 | |||
| 7e9bc397a9 | |||
| 7bfc14f0d9 | |||
| f81714a525 | |||
| f3282a680b | |||
| 7b57277a7f | |||
| d70ab09960 |
@ -85,8 +85,8 @@ export class TransactionService {
|
||||
}
|
||||
|
||||
async getWeeklySummary(juniorId: string) {
|
||||
const startOfWeek = moment().startOf('week').toDate();
|
||||
const endOfWeek = moment().endOf('week').toDate();
|
||||
const endOfWeek = moment().toDate();
|
||||
const startOfWeek = moment().subtract(1, 'week').toDate();
|
||||
|
||||
const transactions = await this.transactionRepository.getTransactionsForCardWithinDateRange(
|
||||
juniorId,
|
||||
|
||||
@ -0,0 +1,15 @@
|
||||
import { MigrationInterface, QueryRunner } from "typeorm";
|
||||
|
||||
export class AddUniqueConstraintToUserEmail1761032305682 implements MigrationInterface {
|
||||
name = 'AddUniqueConstraintToUserEmail1761032305682'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
|
||||
await queryRunner.query(`ALTER TABLE "users" ADD CONSTRAINT "UQ_97672ac88f789774dd47f7c8be3" UNIQUE ("email")`);
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(`ALTER TABLE "users" DROP CONSTRAINT "UQ_97672ac88f789774dd47f7c8be3"`);
|
||||
}
|
||||
|
||||
}
|
||||
@ -4,4 +4,5 @@ export * from './1754915164810-seed-default-avatar';
|
||||
export * from './1757349525708-create-money-requests-table';
|
||||
export * from './1757433339849-add-reservation-amount-to-account-entity';
|
||||
export * from './1757915357218-add-deleted-at-column-to-junior';
|
||||
export * from './1760869651296-AddMerchantInfoToTransactions';
|
||||
export * from './1760869651296-AddMerchantInfoToTransactions';
|
||||
export * from './1761032305682-AddUniqueConstraintToUserEmail';
|
||||
@ -120,6 +120,7 @@ export class JuniorService {
|
||||
setIf(customer, 'firstName', body.firstName);
|
||||
setIf(customer, 'lastName', body.lastName);
|
||||
setIf(customer, 'dateOfBirth', body.dateOfBirth as unknown as Date);
|
||||
setIf(customer, 'gender', body.gender);
|
||||
|
||||
setIf(junior, 'relationship', body.relationship);
|
||||
await Promise.all([junior.save(), customer.save(), user.save()]);
|
||||
@ -211,8 +212,8 @@ export class JuniorService {
|
||||
this.logger.log(`Junior ${juniorId} deleted successfully`);
|
||||
}
|
||||
|
||||
getWeeklySummary(juniorId: string, guardianId: string) {
|
||||
const doesBelong = this.doesJuniorBelongToGuardian(guardianId, juniorId);
|
||||
async getWeeklySummary(juniorId: string, guardianId: string) {
|
||||
const doesBelong = await this.doesJuniorBelongToGuardian(guardianId, juniorId);
|
||||
|
||||
if (!doesBelong) {
|
||||
this.logger.error(`Junior ${juniorId} does not belong to guardian ${guardianId}`);
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
import { ApiProperty } from '@nestjs/swagger';
|
||||
import { IsNotEmpty, IsOptional, IsString, IsUUID } from 'class-validator';
|
||||
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
|
||||
import { IsDateString, IsEmail, IsEnum, IsNotEmpty, IsOptional, IsString, IsUUID } from 'class-validator';
|
||||
import { i18nValidationMessage as i18n } from 'nestjs-i18n';
|
||||
import { Gender } from '~/customer/enums';
|
||||
export class UpdateUserRequestDto {
|
||||
@ApiProperty({ example: 'John' })
|
||||
@IsString({ message: i18n('validation.IsString', { path: 'general', property: 'user.firstName' }) })
|
||||
@ -14,8 +15,23 @@ export class UpdateUserRequestDto {
|
||||
@IsOptional()
|
||||
lastName!: string;
|
||||
|
||||
@ApiPropertyOptional({ example: 'child@example.com' })
|
||||
@IsEmail({}, { message: i18n('validation.IsEmail', { path: 'general', property: 'user.email' }) })
|
||||
@IsOptional()
|
||||
email!: string;
|
||||
|
||||
@ApiProperty({ example: '123e4567-e89b-12d3-a456-426614174000' })
|
||||
@IsUUID('4', { message: i18n('validation.IsUUID', { path: 'general', property: 'user.profilePictureId' }) })
|
||||
@IsOptional()
|
||||
profilePictureId!: string;
|
||||
|
||||
@ApiPropertyOptional({ enum: Gender })
|
||||
@IsEnum(Gender, { message: i18n('validation.IsEnum', { path: 'general', property: 'customer.gender' }) })
|
||||
@IsOptional()
|
||||
gender!: Gender;
|
||||
|
||||
@ApiPropertyOptional({ example: '2020-01-01' })
|
||||
@IsDateString({}, { message: i18n('validation.IsDateString', { path: 'general', property: 'customer.dateOfBirth' }) })
|
||||
@IsOptional()
|
||||
dateOfBirth!: Date;
|
||||
}
|
||||
|
||||
@ -28,7 +28,7 @@ export class User extends BaseEntity {
|
||||
@Column('varchar', { length: 255, name: 'last_name', nullable: false })
|
||||
lastName!: string;
|
||||
|
||||
@Column('varchar', { length: 255, name: 'email', nullable: true })
|
||||
@Column('varchar', { length: 255, name: 'email', nullable: true, unique: true })
|
||||
email!: string;
|
||||
|
||||
@Column('varchar', { length: 255, name: 'phone_number', nullable: true })
|
||||
|
||||
@ -191,16 +191,38 @@ export class UserService {
|
||||
async updateUser(userId: string, data: UpdateUserRequestDto) {
|
||||
await this.validateProfilePictureId(data.profilePictureId, userId);
|
||||
|
||||
if (data.email) {
|
||||
const userWithEmail = await this.findUser({ email: data.email });
|
||||
if (userWithEmail && userWithEmail.id !== userId) {
|
||||
this.logger.error(`Email ${data.email} is already taken by another user`);
|
||||
throw new BadRequestException('USER.EMAIL_ALREADY_TAKEN');
|
||||
}
|
||||
}
|
||||
|
||||
this.logger.log(`Updating user ${userId} with data ${JSON.stringify(data)}`);
|
||||
const { affected } = await this.userRepository.update(userId, data);
|
||||
|
||||
const { gender, dateOfBirth, ...userData } = data;
|
||||
|
||||
const { affected } = await this.userRepository.update(userId, userData);
|
||||
if (affected === 0) {
|
||||
this.logger.error(`User with id ${userId} not found`);
|
||||
throw new BadRequestException('USER.NOT_FOUND');
|
||||
}
|
||||
|
||||
if (gender !== undefined || dateOfBirth !== undefined) {
|
||||
const customerData: Partial<{ gender: typeof gender; dateOfBirth: Date }> = {};
|
||||
if (gender !== undefined) {
|
||||
customerData.gender = gender;
|
||||
}
|
||||
if (dateOfBirth !== undefined) {
|
||||
customerData.dateOfBirth = dateOfBirth;
|
||||
}
|
||||
await this.customerService.updateCustomer(userId, customerData);
|
||||
}
|
||||
}
|
||||
|
||||
async updateUserEmail(userId: string, email: string) {
|
||||
const userWithEmail = await this.findUser({ email, isEmailVerified: true });
|
||||
const userWithEmail = await this.findUser({ email });
|
||||
|
||||
if (userWithEmail) {
|
||||
if (userWithEmail.id === userId) {
|
||||
|
||||
Reference in New Issue
Block a user