Skip to content
Open

fix #47

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions apps/admin/src/features/auth/infrastructure/auth.transform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
3 changes: 2 additions & 1 deletion apps/api/src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {}
11 changes: 7 additions & 4 deletions apps/api/src/modules/auth/application/use-case/SignInUseCase.ts
Original file line number Diff line number Diff line change
@@ -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<SignInUseCasePort> {
constructor(
@Inject(QueryBus)
private readonly queryBus: QueryBus,
@Inject(PasswordHasher)
private readonly passwordService: PasswordHasher,
@Inject(TokenGenerator)
private readonly tokenGenerator: TokenGenerator
) {}

Expand Down
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -10,7 +11,10 @@ import type { UserStatusEnum } from '../../domain/value-objects/UserStatus';
export class GetUserByEmailAdapter
implements ICommandHandler<GetUserByEmailPort>
{
constructor(private readonly queryBus: QueryBus) {}
constructor(
@Inject(QueryBus)
private readonly queryBus: QueryBus
) {}

async execute(command: GetUserByEmailCommand) {
const result = await this.queryBus.execute(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
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';

@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)
Expand Down
Original file line number Diff line number Diff line change
@@ -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<User> {
const email = Email.create(dto.email);
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
Expand Down
Original file line number Diff line number Diff line change
@@ -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<GetUserByEmailQuery>
{
constructor(private readonly getUserByEmail: GetUserByEmailPort) {}
constructor(
@Inject(GetUserByEmailPort)
private readonly getUserByEmail: GetUserByEmailPort
) {}

async execute(query: GetUserByEmailQuery) {
const user = await this.getUserByEmail.execute(query.email);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
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';

@ApiTags('Users')
@Controller('users')
export class UserController {
constructor(private readonly registerUseCase: CreateUserPort) {}
constructor(
@Inject(CreateUserPort)
private readonly registerUseCase: CreateUserPort
) {}

@Post('register')
@ApiOperation({
Expand Down
2 changes: 1 addition & 1 deletion apps/client/src/features/auth/domain/auth.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
2 changes: 1 addition & 1 deletion packages/auth/src/domain/auth.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
2 changes: 1 addition & 1 deletion packages/schemas/src/users/user.schema.ts
Original file line number Diff line number Diff line change
@@ -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<typeof userStatusSchema>;

export const roleSchema = z.object({
Expand Down