From ca71632755e21054d23509d19c4ebc14e83298c6 Mon Sep 17 00:00:00 2001 From: Abdalhamid Alhamad Date: Sun, 29 Dec 2024 14:17:39 +0300 Subject: [PATCH] refactor: sepeare user and auth modules --- src/app.module.ts | 3 +++ src/auth/auth.module.ts | 21 ++++++------------- src/auth/dtos/response/login.response.dto.ts | 2 +- src/auth/dtos/response/user.response.dto.ts | 2 +- .../dtos/response/verify-user.response.dto.ts | 2 +- src/auth/services/auth.service.ts | 6 +++--- src/auth/services/index.ts | 2 -- .../entities/notification.entity.ts | 2 +- .../notification/notification.module.ts | 4 ++-- .../services/notifications.service.ts | 6 +++--- src/common/modules/otp/entities/otp.entity.ts | 2 +- src/customer/customer.module.ts | 4 ++-- .../request/update-customer.request.dto.ts | 1 + src/customer/entities/customer.entity.ts | 2 +- .../repositories/customer.repository.ts | 2 +- src/customer/services/customer.service.ts | 8 +++---- src/document/entities/document.entity.ts | 2 +- src/junior/junior.module.ts | 10 +++------ src/junior/services/junior.service.ts | 8 +++---- src/{auth => user}/entities/device.entity.ts | 0 src/{auth => user}/entities/index.ts | 0 src/{auth => user}/entities/user.entity.ts | 2 +- .../repositories/device.repository.ts | 2 +- src/{auth => user}/repositories/index.ts | 0 .../repositories/user.repository.ts | 2 +- src/{auth => user}/services/device.service.ts | 0 src/user/services/index.ts | 2 ++ src/{auth => user}/services/user.service.ts | 4 ++-- src/user/user.module.ts | 13 ++++++++++++ 29 files changed, 59 insertions(+), 55 deletions(-) rename src/{auth => user}/entities/device.entity.ts (100%) rename src/{auth => user}/entities/index.ts (100%) rename src/{auth => user}/entities/user.entity.ts (97%) rename src/{auth => user}/repositories/device.repository.ts (94%) rename src/{auth => user}/repositories/index.ts (100%) rename src/{auth => user}/repositories/user.repository.ts (95%) rename src/{auth => user}/services/device.service.ts (100%) create mode 100644 src/user/services/index.ts rename src/{auth => user}/services/user.service.ts (95%) create mode 100644 src/user/user.module.ts diff --git a/src/app.module.ts b/src/app.module.ts index cde9f93..e2dc6d3 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -27,6 +27,7 @@ import { JuniorModule } from './junior/junior.module'; import { MoneyRequestModule } from './money-request/money-request.module'; import { SavingGoalsModule } from './saving-goals/saving-goals.module'; import { TaskModule } from './task/task.module'; +import { UserModule } from './user/user.module'; @Module({ controllers: [], @@ -72,6 +73,8 @@ import { TaskModule } from './task/task.module'; LookupModule, HealthModule, + + UserModule, ], providers: [ // Global Pipes diff --git a/src/auth/auth.module.ts b/src/auth/auth.module.ts index fff54ce..a4ddaa6 100644 --- a/src/auth/auth.module.ts +++ b/src/auth/auth.module.ts @@ -1,24 +1,15 @@ -import { forwardRef, Module } from '@nestjs/common'; +import { Module } from '@nestjs/common'; import { JwtModule } from '@nestjs/jwt'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { CustomerModule } from '~/customer/customer.module'; import { JuniorModule } from '~/junior/junior.module'; +import { UserModule } from '~/user/user.module'; import { AuthController } from './controllers'; -import { Device, User } from './entities'; -import { DeviceRepository, UserRepository } from './repositories'; -import { AuthService, DeviceService } from './services'; -import { UserService } from './services/user.service'; +import { AuthService } from './services'; import { AccessTokenStrategy } from './strategies'; @Module({ - imports: [ - TypeOrmModule.forFeature([User, Device]), - JwtModule.register({}), - forwardRef(() => CustomerModule), - forwardRef(() => JuniorModule), - ], - providers: [AuthService, UserRepository, UserService, DeviceService, DeviceRepository, AccessTokenStrategy], + imports: [JwtModule.register({}), JuniorModule, UserModule], + providers: [AuthService, AccessTokenStrategy], controllers: [AuthController], - exports: [DeviceService, UserService], + exports: [], }) export class AuthModule {} diff --git a/src/auth/dtos/response/login.response.dto.ts b/src/auth/dtos/response/login.response.dto.ts index 75da7b1..f097a55 100644 --- a/src/auth/dtos/response/login.response.dto.ts +++ b/src/auth/dtos/response/login.response.dto.ts @@ -1,7 +1,7 @@ import { ApiProperty } from '@nestjs/swagger'; -import { User } from '~/auth/entities'; import { ILoginResponse } from '~/auth/interfaces'; import { CustomerResponseDto } from '~/customer/dtos/response'; +import { User } from '~/user/entities'; import { UserResponseDto } from './user.response.dto'; export class LoginResponseDto { diff --git a/src/auth/dtos/response/user.response.dto.ts b/src/auth/dtos/response/user.response.dto.ts index dd36099..8d2c8ca 100644 --- a/src/auth/dtos/response/user.response.dto.ts +++ b/src/auth/dtos/response/user.response.dto.ts @@ -1,6 +1,6 @@ import { ApiProperty } from '@nestjs/swagger'; -import { User } from '~/auth/entities'; import { Roles } from '~/auth/enums'; +import { User } from '~/user/entities'; export class UserResponseDto { @ApiProperty() diff --git a/src/auth/dtos/response/verify-user.response.dto.ts b/src/auth/dtos/response/verify-user.response.dto.ts index 21f426b..b6cfdd0 100644 --- a/src/auth/dtos/response/verify-user.response.dto.ts +++ b/src/auth/dtos/response/verify-user.response.dto.ts @@ -1,6 +1,6 @@ import { ApiProperty } from '@nestjs/swagger'; -import { User } from '~/auth/entities'; import { ILoginResponse } from '~/auth/interfaces'; +import { User } from '~/user/entities'; export class VerifyUserResponseDto { @ApiProperty() diff --git a/src/auth/services/auth.service.ts b/src/auth/services/auth.service.ts index 9d83b17..9c77565 100644 --- a/src/auth/services/auth.service.ts +++ b/src/auth/services/auth.service.ts @@ -7,6 +7,9 @@ import { CacheService } from '~/common/modules/cache/services'; import { OtpScope, OtpType } from '~/common/modules/otp/enums'; import { OtpService } from '~/common/modules/otp/services'; import { JuniorTokenService } from '~/junior/services'; +import { User } from '../../user/entities'; + +import { DeviceService, UserService } from '~/user/services'; import { PASSCODE_REGEX, PASSWORD_REGEX } from '../constants'; import { CreateUnverifiedUserRequestDto, @@ -19,12 +22,9 @@ import { setJuniorPasswordRequestDto, } from '../dtos/request'; import { VerifyUserRequestDto } from '../dtos/request/verify-user.request.dto'; -import { User } from '../entities'; import { GrantType, Roles } from '../enums'; import { IJwtPayload, ILoginResponse } from '../interfaces'; import { removePadding, verifySignature } from '../utils'; -import { DeviceService } from './device.service'; -import { UserService } from './user.service'; const ONE_THOUSAND = 1000; const SALT_ROUNDS = 10; diff --git a/src/auth/services/index.ts b/src/auth/services/index.ts index 96bcd76..2a719d1 100644 --- a/src/auth/services/index.ts +++ b/src/auth/services/index.ts @@ -1,3 +1 @@ export * from './auth.service'; -export * from './device.service'; -export * from './user.service'; diff --git a/src/common/modules/notification/entities/notification.entity.ts b/src/common/modules/notification/entities/notification.entity.ts index cff5d42..867b8ec 100644 --- a/src/common/modules/notification/entities/notification.entity.ts +++ b/src/common/modules/notification/entities/notification.entity.ts @@ -7,7 +7,7 @@ import { PrimaryGeneratedColumn, UpdateDateColumn, } from 'typeorm'; -import { User } from '~/auth/entities'; +import { User } from '~/user/entities'; import { NotificationChannel, NotificationScope, NotificationStatus } from '../enums'; @Entity('notifications') diff --git a/src/common/modules/notification/notification.module.ts b/src/common/modules/notification/notification.module.ts index 2ecb31f..b5b866a 100644 --- a/src/common/modules/notification/notification.module.ts +++ b/src/common/modules/notification/notification.module.ts @@ -2,8 +2,8 @@ import { Module } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; import { TwilioModule } from 'nestjs-twilio'; -import { AuthModule } from '~/auth/auth.module'; import { buildTwilioOptions } from '~/core/module-options'; +import { UserModule } from '~/user/user.module'; import { NotificationsController } from './controllers'; import { Notification } from './entities'; import { NotificationsRepository } from './repositories'; @@ -17,7 +17,7 @@ import { TwilioService } from './services/twilio.service'; useFactory: buildTwilioOptions, inject: [ConfigService], }), - AuthModule, + UserModule, ], providers: [NotificationsService, FirebaseService, NotificationsRepository, TwilioService], exports: [NotificationsService], diff --git a/src/common/modules/notification/services/notifications.service.ts b/src/common/modules/notification/services/notifications.service.ts index bfb4e30..e45b4a2 100644 --- a/src/common/modules/notification/services/notifications.service.ts +++ b/src/common/modules/notification/services/notifications.service.ts @@ -1,7 +1,7 @@ -import { forwardRef, Inject, Injectable } from '@nestjs/common'; +import { Injectable } from '@nestjs/common'; import { EventEmitter2, OnEvent } from '@nestjs/event-emitter'; -import { DeviceService } from '~/auth/services'; import { PageOptionsRequestDto } from '~/core/dtos'; +import { DeviceService } from '~/user/services'; import { OTP_BODY, OTP_TITLE } from '../../otp/constants'; import { OtpType } from '../../otp/enums'; import { ISendOtp } from '../../otp/interfaces'; @@ -18,7 +18,7 @@ export class NotificationsService { private readonly notificationRepository: NotificationsRepository, private readonly twilioService: TwilioService, private readonly eventEmitter: EventEmitter2, - @Inject(forwardRef(() => DeviceService)) private readonly deviceService: DeviceService, + private readonly deviceService: DeviceService, ) {} async sendPushNotification(userId: string, title: string, body: string) { diff --git a/src/common/modules/otp/entities/otp.entity.ts b/src/common/modules/otp/entities/otp.entity.ts index 4648457..ec3b57c 100644 --- a/src/common/modules/otp/entities/otp.entity.ts +++ b/src/common/modules/otp/entities/otp.entity.ts @@ -1,5 +1,5 @@ import { Column, CreateDateColumn, Entity, Index, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; -import { User } from '~/auth/entities'; +import { User } from '~/user/entities'; import { OtpScope, OtpType } from '../enums'; @Entity('otp') diff --git a/src/customer/customer.module.ts b/src/customer/customer.module.ts index 979ff9c..90eb700 100644 --- a/src/customer/customer.module.ts +++ b/src/customer/customer.module.ts @@ -1,6 +1,6 @@ import { forwardRef, Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AuthModule } from '~/auth/auth.module'; +import { UserModule } from '~/user/user.module'; import { CustomerController } from './controllers'; import { Customer } from './entities'; import { CustomerNotificationSettings } from './entities/customer-notification-settings.entity'; @@ -8,7 +8,7 @@ import { CustomerRepository } from './repositories/customer.repository'; import { CustomerService } from './services'; @Module({ - imports: [TypeOrmModule.forFeature([Customer, CustomerNotificationSettings]), forwardRef(() => AuthModule)], + imports: [TypeOrmModule.forFeature([Customer, CustomerNotificationSettings]), forwardRef(() => UserModule)], controllers: [CustomerController], providers: [CustomerService, CustomerRepository], exports: [CustomerService], diff --git a/src/customer/dtos/request/update-customer.request.dto.ts b/src/customer/dtos/request/update-customer.request.dto.ts index a835722..0da021a 100644 --- a/src/customer/dtos/request/update-customer.request.dto.ts +++ b/src/customer/dtos/request/update-customer.request.dto.ts @@ -29,5 +29,6 @@ export class UpdateCustomerRequestDto { @ApiProperty({ example: '123e4567-e89b-12d3-a456-426614174000' }) @IsUUID('4', { message: i18n('validation.IsUUID', { path: 'general', property: 'customer.profilePictureId' }) }) + @IsOptional() profilePictureId!: string; } diff --git a/src/customer/entities/customer.entity.ts b/src/customer/entities/customer.entity.ts index 1405d4c..5dfacd1 100644 --- a/src/customer/entities/customer.entity.ts +++ b/src/customer/entities/customer.entity.ts @@ -8,10 +8,10 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { User } from '~/auth/entities'; import { Document } from '~/document/entities'; import { Guardian } from '~/guardian/entities/guradian.entity'; import { Junior } from '~/junior/entities'; +import { User } from '~/user/entities'; import { CustomerNotificationSettings } from './customer-notification-settings.entity'; @Entity('customers') diff --git a/src/customer/repositories/customer.repository.ts b/src/customer/repositories/customer.repository.ts index a18a90c..b49e904 100644 --- a/src/customer/repositories/customer.repository.ts +++ b/src/customer/repositories/customer.repository.ts @@ -1,8 +1,8 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { FindOptionsWhere, Repository } from 'typeorm'; -import { User } from '~/auth/entities'; import { Roles } from '~/auth/enums'; +import { User } from '~/user/entities'; import { UpdateNotificationsSettingsRequestDto } from '../dtos/request'; import { Customer } from '../entities'; import { CustomerNotificationSettings } from '../entities/customer-notification-settings.entity'; diff --git a/src/customer/services/customer.service.ts b/src/customer/services/customer.service.ts index 11407cb..e8b987c 100644 --- a/src/customer/services/customer.service.ts +++ b/src/customer/services/customer.service.ts @@ -1,7 +1,7 @@ -import { BadRequestException, forwardRef, Inject, Injectable } from '@nestjs/common'; -import { User } from '~/auth/entities'; -import { DeviceService } from '~/auth/services'; +import { BadRequestException, Injectable } from '@nestjs/common'; import { OciService } from '~/document/services'; +import { User } from '~/user/entities'; +import { DeviceService } from '~/user/services'; import { UpdateCustomerRequestDto, UpdateNotificationsSettingsRequestDto } from '../dtos/request'; import { Customer } from '../entities'; import { CustomerRepository } from '../repositories/customer.repository'; @@ -11,7 +11,7 @@ export class CustomerService { constructor( private readonly customerRepository: CustomerRepository, private readonly ociService: OciService, - @Inject(forwardRef(() => DeviceService)) private readonly deviceService: DeviceService, + private readonly deviceService: DeviceService, ) {} async updateNotificationSettings(userId: string, data: UpdateNotificationsSettingsRequestDto, deviceId: string) { const customer = await this.findCustomerById(userId); diff --git a/src/document/entities/document.entity.ts b/src/document/entities/document.entity.ts index 861bdf2..055799b 100644 --- a/src/document/entities/document.entity.ts +++ b/src/document/entities/document.entity.ts @@ -1,11 +1,11 @@ import { Column, Entity, OneToMany, OneToOne, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'; -import { User } from '~/auth/entities'; import { Customer } from '~/customer/entities'; import { Gift } from '~/gift/entities'; import { Junior, Theme } from '~/junior/entities'; import { SavingGoal } from '~/saving-goals/entities'; import { Task } from '~/task/entities'; import { TaskSubmission } from '~/task/entities/task-submissions.entity'; +import { User } from '~/user/entities'; import { DocumentType } from '../enums'; @Entity('documents') diff --git a/src/junior/junior.module.ts b/src/junior/junior.module.ts index ae2fcdd..d1d8ec4 100644 --- a/src/junior/junior.module.ts +++ b/src/junior/junior.module.ts @@ -1,7 +1,7 @@ -import { forwardRef, Module } from '@nestjs/common'; +import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AuthModule } from '~/auth/auth.module'; import { CustomerModule } from '~/customer/customer.module'; +import { UserModule } from '~/user/user.module'; import { JuniorController } from './controllers'; import { Junior, JuniorRegistrationToken, Theme } from './entities'; import { JuniorRepository, JuniorTokenRepository } from './repositories'; @@ -10,11 +10,7 @@ import { JuniorService, JuniorTokenService, QrcodeService } from './services'; @Module({ controllers: [JuniorController], providers: [JuniorService, JuniorRepository, JuniorTokenService, JuniorTokenRepository, QrcodeService], - imports: [ - TypeOrmModule.forFeature([Junior, Theme, JuniorRegistrationToken]), - forwardRef(() => AuthModule), - CustomerModule, - ], + imports: [TypeOrmModule.forFeature([Junior, Theme, JuniorRegistrationToken]), UserModule, CustomerModule], exports: [JuniorService, JuniorTokenService], }) export class JuniorModule {} diff --git a/src/junior/services/junior.service.ts b/src/junior/services/junior.service.ts index 3252d0c..09ddc03 100644 --- a/src/junior/services/junior.service.ts +++ b/src/junior/services/junior.service.ts @@ -1,10 +1,10 @@ -import { BadRequestException, forwardRef, Inject, Injectable } from '@nestjs/common'; +import { BadRequestException, Injectable } from '@nestjs/common'; import { Transactional } from 'typeorm-transactional'; import { Roles } from '~/auth/enums'; -import { UserService } from '~/auth/services'; import { PageOptionsRequestDto } from '~/core/dtos'; import { CustomerNotificationSettings } from '~/customer/entities/customer-notification-settings.entity'; import { CustomerService } from '~/customer/services'; +import { UserService } from '~/user/services'; import { CreateJuniorRequestDto, SetThemeRequestDto } from '../dtos/request'; import { Junior } from '../entities'; import { JuniorRepository } from '../repositories'; @@ -15,8 +15,8 @@ export class JuniorService { constructor( private readonly juniorRepository: JuniorRepository, private readonly juniorTokenService: JuniorTokenService, - @Inject(forwardRef(() => UserService)) private readonly userService: UserService, - @Inject(forwardRef(() => CustomerService)) private readonly customerService: CustomerService, + private readonly userService: UserService, + private readonly customerService: CustomerService, ) {} @Transactional() diff --git a/src/auth/entities/device.entity.ts b/src/user/entities/device.entity.ts similarity index 100% rename from src/auth/entities/device.entity.ts rename to src/user/entities/device.entity.ts diff --git a/src/auth/entities/index.ts b/src/user/entities/index.ts similarity index 100% rename from src/auth/entities/index.ts rename to src/user/entities/index.ts diff --git a/src/auth/entities/user.entity.ts b/src/user/entities/user.entity.ts similarity index 97% rename from src/auth/entities/user.entity.ts rename to src/user/entities/user.entity.ts index 4c63f15..72edff0 100644 --- a/src/auth/entities/user.entity.ts +++ b/src/user/entities/user.entity.ts @@ -11,7 +11,7 @@ import { import { Notification } from '~/common/modules/notification/entities'; import { Otp } from '~/common/modules/otp/entities'; import { Customer } from '~/customer/entities/customer.entity'; -import { Roles } from '../enums'; +import { Roles } from '../../auth/enums'; import { Device } from './device.entity'; @Entity('users') diff --git a/src/auth/repositories/device.repository.ts b/src/user/repositories/device.repository.ts similarity index 94% rename from src/auth/repositories/device.repository.ts rename to src/user/repositories/device.repository.ts index 9033437..43c093e 100644 --- a/src/auth/repositories/device.repository.ts +++ b/src/user/repositories/device.repository.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { IsNull, Not, Repository } from 'typeorm'; -import { Device } from '../entities'; +import { Device } from '../../user/entities'; @Injectable() export class DeviceRepository { diff --git a/src/auth/repositories/index.ts b/src/user/repositories/index.ts similarity index 100% rename from src/auth/repositories/index.ts rename to src/user/repositories/index.ts diff --git a/src/auth/repositories/user.repository.ts b/src/user/repositories/user.repository.ts similarity index 95% rename from src/auth/repositories/user.repository.ts rename to src/user/repositories/user.repository.ts index eeaa281..c080917 100644 --- a/src/auth/repositories/user.repository.ts +++ b/src/user/repositories/user.repository.ts @@ -1,7 +1,7 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; import { FindOptionsWhere, Repository } from 'typeorm'; -import { User } from '../entities'; +import { User } from '../../user/entities'; @Injectable() export class UserRepository { diff --git a/src/auth/services/device.service.ts b/src/user/services/device.service.ts similarity index 100% rename from src/auth/services/device.service.ts rename to src/user/services/device.service.ts diff --git a/src/user/services/index.ts b/src/user/services/index.ts new file mode 100644 index 0000000..d507880 --- /dev/null +++ b/src/user/services/index.ts @@ -0,0 +1,2 @@ +export * from './device.service'; +export * from './user.service'; diff --git a/src/auth/services/user.service.ts b/src/user/services/user.service.ts similarity index 95% rename from src/auth/services/user.service.ts rename to src/user/services/user.service.ts index 37942d3..8919a28 100644 --- a/src/auth/services/user.service.ts +++ b/src/user/services/user.service.ts @@ -3,9 +3,9 @@ import { FindOptionsWhere } from 'typeorm'; import { CustomerNotificationSettings } from '~/customer/entities/customer-notification-settings.entity'; import { CustomerService } from '~/customer/services'; import { Guardian } from '~/guardian/entities/guradian.entity'; -import { CreateUnverifiedUserRequestDto } from '../dtos/request'; +import { CreateUnverifiedUserRequestDto } from '../../auth/dtos/request'; +import { Roles } from '../../auth/enums'; import { User } from '../entities'; -import { Roles } from '../enums'; import { UserRepository } from '../repositories'; @Injectable() diff --git a/src/user/user.module.ts b/src/user/user.module.ts new file mode 100644 index 0000000..a781db5 --- /dev/null +++ b/src/user/user.module.ts @@ -0,0 +1,13 @@ +import { forwardRef, Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; +import { CustomerModule } from '~/customer/customer.module'; +import { Device, User } from './entities'; +import { DeviceRepository, UserRepository } from './repositories'; +import { DeviceService, UserService } from './services'; + +@Module({ + imports: [TypeOrmModule.forFeature([User, Device]), forwardRef(() => CustomerModule)], + providers: [UserService, DeviceService, UserRepository, DeviceRepository], + exports: [UserService, DeviceService], +}) +export class UserModule {}