diff --git a/apps/admin/src/features/auth/infrastructure/auth.transform.ts b/apps/admin/src/features/auth/infrastructure/auth.transform.ts index df613cc0..774e5def 100644 --- a/apps/admin/src/features/auth/infrastructure/auth.transform.ts +++ b/apps/admin/src/features/auth/infrastructure/auth.transform.ts @@ -18,8 +18,8 @@ export function toUserDomain(dto: AuthUserDto): User { email: dto.email, firstName: dto.firstName ?? null, lastName: dto.lastName ?? null, - timezone: dto.timezone ?? '', - status: dto.status as 'ACTIVE' | 'INACTIVE', + timezone: dto.timezone, + status: dto.status as 'active' | 'inactive', role: toRoleDomain(dto.role), createdAt: dto.createdAt ? new Date(dto.createdAt) : new Date(), updatedAt: dto.updatedAt ? new Date(dto.updatedAt) : new Date(), diff --git a/apps/admin/src/features/userManagement/domain/user.model.ts b/apps/admin/src/features/userManagement/domain/user.model.ts index 34cba579..6b9dc7f1 100644 --- a/apps/admin/src/features/userManagement/domain/user.model.ts +++ b/apps/admin/src/features/userManagement/domain/user.model.ts @@ -3,7 +3,7 @@ * This represents the user entity as used in the UI layer */ -export type UserStatus = 'ACTIVE' | 'INACTIVE'; +export type UserStatus = 'active' | 'inactive'; export interface User { id: string; diff --git a/apps/admin/src/shared/currentUser/infrastructure/currentUser.transform.ts b/apps/admin/src/shared/currentUser/infrastructure/currentUser.transform.ts index 1ac25714..0b3b8e5f 100644 --- a/apps/admin/src/shared/currentUser/infrastructure/currentUser.transform.ts +++ b/apps/admin/src/shared/currentUser/infrastructure/currentUser.transform.ts @@ -13,7 +13,7 @@ export function toCurrentUserDomain(dto: CurrentUserDto): User { firstName: dto.firstName ?? null, lastName: dto.lastName ?? null, timezone: dto.timezone, - status: dto.status as 'ACTIVE' | 'INACTIVE', + status: dto.status as 'active' | 'inactive', role: dto.role ? { id: dto.role.id, diff --git a/apps/api/src/app.module.ts b/apps/api/src/app.module.ts index 1830f6b0..135c9186 100644 --- a/apps/api/src/app.module.ts +++ b/apps/api/src/app.module.ts @@ -3,9 +3,10 @@ import { UsersModule } from './modules/user/module'; import { AuthModule } from './modules/auth/module'; import { BusModule } from './bus.module'; import { SecurityModule } from './security.module'; +import { DrizzleModule } from './infrastructure/database/drizzle.module'; @Module({ - imports: [UsersModule, AuthModule, BusModule, SecurityModule], + imports: [DrizzleModule, UsersModule, AuthModule, BusModule, SecurityModule], controllers: [], }) export class AppModule {} diff --git a/apps/api/src/modules/auth/application/use-case/SignInUseCase.ts b/apps/api/src/modules/auth/application/use-case/SignInUseCase.ts index 9d55d1a4..f40fc74c 100644 --- a/apps/api/src/modules/auth/application/use-case/SignInUseCase.ts +++ b/apps/api/src/modules/auth/application/use-case/SignInUseCase.ts @@ -1,22 +1,25 @@ -import { UnauthorizedException } from '@nestjs/common'; +import { Inject, UnauthorizedException } from '@nestjs/common'; import { CommandHandler, type ICommandHandler, - type QueryBus, + QueryBus, } from '@nestjs/cqrs'; import { type LoginCommand, SignInUseCasePort, } from '../ports/in/SignInUseCasePort'; import { GetUserByEmailPort } from '../ports/out/GetUserByEmail'; -import type { PasswordHasher } from '../ports/out/PasswordHasher'; -import type { TokenGenerator } from '../ports/out/TokenGenerator'; +import { PasswordHasher } from '../ports/out/PasswordHasher'; +import { TokenGenerator } from '../ports/out/TokenGenerator'; @CommandHandler(SignInUseCasePort) export class SignInUseCase implements ICommandHandler { constructor( + @Inject(QueryBus) private readonly queryBus: QueryBus, + @Inject(PasswordHasher) private readonly passwordService: PasswordHasher, + @Inject(TokenGenerator) private readonly tokenGenerator: TokenGenerator ) {} diff --git a/apps/api/src/modules/auth/infrastructure/mediators/GetUserByEmail.ts b/apps/api/src/modules/auth/infrastructure/mediators/GetUserByEmail.ts index 0ac99f47..01e233a2 100644 --- a/apps/api/src/modules/auth/infrastructure/mediators/GetUserByEmail.ts +++ b/apps/api/src/modules/auth/infrastructure/mediators/GetUserByEmail.ts @@ -1,4 +1,5 @@ -import type { ICommandHandler, QueryBus } from '@nestjs/cqrs'; +import { Inject } from '@nestjs/common'; +import { type ICommandHandler, QueryBus } from '@nestjs/cqrs'; import { GetUserByEmailQuery } from '../../../shared/user/GetUserByEmail'; import type { GetUserByEmailCommand, @@ -10,7 +11,10 @@ import type { UserStatusEnum } from '../../domain/value-objects/UserStatus'; export class GetUserByEmailAdapter implements ICommandHandler { - constructor(private readonly queryBus: QueryBus) {} + constructor( + @Inject(QueryBus) + private readonly queryBus: QueryBus + ) {} async execute(command: GetUserByEmailCommand) { const result = await this.queryBus.execute( diff --git a/apps/api/src/modules/auth/infrastructure/web/AuthController.ts b/apps/api/src/modules/auth/infrastructure/web/AuthController.ts index a1ab5090..c4ec068a 100644 --- a/apps/api/src/modules/auth/infrastructure/web/AuthController.ts +++ b/apps/api/src/modules/auth/infrastructure/web/AuthController.ts @@ -1,6 +1,6 @@ -import { Body, Controller, HttpCode, HttpStatus, Post } from '@nestjs/common'; +import { Body, Controller, HttpCode, HttpStatus, Inject, Post } from '@nestjs/common'; import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; -import type { CommandBus } from '@nestjs/cqrs'; +import { CommandBus } from '@nestjs/cqrs'; import { authDTO, type TSignInInput, type TSignInResponse } from '@repo/schemas'; import { SignInUseCasePort } from '../../application/ports/in/SignInUseCasePort'; import { ZodApiBody, ZodApiResponse } from '../../../../shared/decorators/zodSwagger'; @@ -8,7 +8,10 @@ import { ZodApiBody, ZodApiResponse } from '../../../../shared/decorators/zodSwa @ApiTags('auth') @Controller('auth') export class AuthController { - constructor(private readonly commandBus: CommandBus) {} + constructor( + @Inject(CommandBus) + private readonly commandBus: CommandBus + ) {} @Post('/sign-in') @HttpCode(HttpStatus.OK) diff --git a/apps/api/src/modules/user/application/use-cases/CreateUserUseCase.ts b/apps/api/src/modules/user/application/use-cases/CreateUserUseCase.ts index e3856de6..d029fedd 100644 --- a/apps/api/src/modules/user/application/use-cases/CreateUserUseCase.ts +++ b/apps/api/src/modules/user/application/use-cases/CreateUserUseCase.ts @@ -1,14 +1,17 @@ -import { ConflictException, Injectable } from '@nestjs/common'; +import { ConflictException, Inject, Injectable } from '@nestjs/common'; import type { User } from '../../domain/User'; import { Email } from '../../domain/value-objects/Email'; import { UserStatus } from '../../domain/value-objects/UserStatus'; import { NewUser } from '../../domain/NewUser'; import type { CreateUserDto, CreateUserPort } from '../ports/in/CreateUserPort'; -import type { UserRepository } from '../ports/out/UserRepository'; +import { UserRepository } from '../ports/out/UserRepository'; @Injectable() export class CreateUserUseCase implements CreateUserPort { - constructor(private readonly userRepository: UserRepository) {} + constructor( + @Inject(UserRepository) + private readonly userRepository: UserRepository + ) {} async execute(dto: CreateUserDto): Promise { const email = Email.create(dto.email); diff --git a/apps/api/src/modules/user/application/use-cases/GetUserByEmailUseCase.ts b/apps/api/src/modules/user/application/use-cases/GetUserByEmailUseCase.ts index 3527a732..ee6c9c50 100644 --- a/apps/api/src/modules/user/application/use-cases/GetUserByEmailUseCase.ts +++ b/apps/api/src/modules/user/application/use-cases/GetUserByEmailUseCase.ts @@ -1,10 +1,13 @@ -import { Injectable } from '@nestjs/common'; -import type { UserRepository } from '../ports/out/UserRepository'; +import { Inject, Injectable } from '@nestjs/common'; +import { UserRepository } from '../ports/out/UserRepository'; import type { GetUserByEmailPort } from '../ports/in/GetUserByEmailPort'; @Injectable() export class GetUserByEmailUseCase implements GetUserByEmailPort { - constructor(private readonly userRepository: UserRepository) {} + constructor( + @Inject(UserRepository) + private readonly userRepository: UserRepository + ) {} async execute(email: string) { const user = await this.userRepository.findByEmailWithCredentials(email); diff --git a/apps/api/src/modules/user/infrastructure/services/GetUserByEmailService.ts b/apps/api/src/modules/user/infrastructure/services/GetUserByEmailService.ts index d523b5e3..a7e4f93f 100644 --- a/apps/api/src/modules/user/infrastructure/services/GetUserByEmailService.ts +++ b/apps/api/src/modules/user/infrastructure/services/GetUserByEmailService.ts @@ -1,12 +1,16 @@ +import { Inject } from '@nestjs/common'; import { type IQueryHandler, QueryHandler } from '@nestjs/cqrs'; import { GetUserByEmailQuery } from '../../../shared/user/GetUserByEmail'; -import type { GetUserByEmailPort } from '../../application/ports/in/GetUserByEmailPort'; +import { GetUserByEmailPort } from '../../application/ports/in/GetUserByEmailPort'; @QueryHandler(GetUserByEmailQuery) export class GetUserByEmailService implements IQueryHandler { - constructor(private readonly getUserByEmail: GetUserByEmailPort) {} + constructor( + @Inject(GetUserByEmailPort) + private readonly getUserByEmail: GetUserByEmailPort + ) {} async execute(query: GetUserByEmailQuery) { const user = await this.getUserByEmail.execute(query.email); diff --git a/apps/api/src/modules/user/infrastructure/web/UserController.ts b/apps/api/src/modules/user/infrastructure/web/UserController.ts index 561c3cd1..f2ba911f 100644 --- a/apps/api/src/modules/user/infrastructure/web/UserController.ts +++ b/apps/api/src/modules/user/infrastructure/web/UserController.ts @@ -1,8 +1,8 @@ -import { BadRequestException, Body, Controller, Post } from '@nestjs/common'; +import { BadRequestException, Body, Controller, Inject, Post } from '@nestjs/common'; import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; import { createUserInput, type TUser, userSchema } from '@repo/schemas'; import { ZodApiBody, ZodApiResponse } from '../../../../shared/decorators/zodSwagger'; -import type { CreateUserPort } from '../../application/ports/in/CreateUserPort'; +import { CreateUserPort } from '../../application/ports/in/CreateUserPort'; import { InvalidPasswordError } from '../../domain/policies/PasswordPolicy'; import { RegisterUserRequest } from './dto/RegisterUserRequest'; import { userFromDomain } from './dto/UserResponse'; @@ -10,7 +10,10 @@ import { userFromDomain } from './dto/UserResponse'; @ApiTags('Users') @Controller('users') export class UserController { - constructor(private readonly registerUseCase: CreateUserPort) {} + constructor( + @Inject(CreateUserPort) + private readonly registerUseCase: CreateUserPort + ) {} @Post('register') @ApiOperation({ diff --git a/apps/client/src/features/auth/domain/auth.model.ts b/apps/client/src/features/auth/domain/auth.model.ts index 92efff70..d9c710ac 100644 --- a/apps/client/src/features/auth/domain/auth.model.ts +++ b/apps/client/src/features/auth/domain/auth.model.ts @@ -8,7 +8,7 @@ import { getEnumObjectFromArray } from '@repo/utils'; * API input/output types come from @repo/schemas */ -export const userStatus = ['ACTIVE', 'INACTIVE'] as const; +export const userStatus = ['active', 'inactive'] as const; export type TUserStatusEnum = (typeof userStatus)[number]; export const userStatusEnumObject = getEnumObjectFromArray(userStatus); diff --git a/packages/auth/src/domain/auth.model.ts b/packages/auth/src/domain/auth.model.ts index 5e778ecd..9d618cc3 100644 --- a/packages/auth/src/domain/auth.model.ts +++ b/packages/auth/src/domain/auth.model.ts @@ -5,7 +5,7 @@ import { getEnumObjectFromArray } from '@repo/utils'; * Aligned with backend schema (Better Auth + Supabase) */ -export const userStatus = ['ACTIVE', 'INACTIVE'] as const; +export const userStatus = ['active', 'inactive'] as const; export type TUserStatusEnum = (typeof userStatus)[number]; export const userStatusEnumObject = getEnumObjectFromArray(userStatus); diff --git a/packages/schemas/src/users/user.schema.ts b/packages/schemas/src/users/user.schema.ts index 4f96e9fc..0a3f38cb 100644 --- a/packages/schemas/src/users/user.schema.ts +++ b/packages/schemas/src/users/user.schema.ts @@ -1,7 +1,7 @@ import { z } from 'zod'; import { zDateToIsoNullableOpt } from '../utils'; -export const userStatusSchema = z.enum(['ACTIVE', 'INACTIVE']); +export const userStatusSchema = z.enum(['active', 'inactive']); export type TUserStatus = z.infer; export const roleSchema = z.object({