Presupuestador_web/server/src/contexts/auth/application/Login.useCase.ts

79 lines
2.2 KiB
TypeScript
Raw Normal View History

2024-05-15 19:56:22 +00:00
import {
IUseCase,
IUseCaseError,
UseCaseError,
} from "@/contexts/common/application";
import { IRepositoryManager } from "@/contexts/common/domain";
import { IInfrastructureError } from "@/contexts/common/infrastructure";
import { ISequelizeAdapter } from "@/contexts/common/infrastructure/sequelize";
2024-05-19 22:04:23 +00:00
import { ILogin_DTO, Result, ensureEmailIsValid } from "@shared/contexts";
2024-05-16 18:16:00 +00:00
import { AuthUser } from "../domain";
2024-05-16 11:56:46 +00:00
import { findUserByEmail } from "./authServices";
2024-05-15 19:56:22 +00:00
export type LoginResponseOrError =
| Result<never, IUseCaseError>
2024-05-16 18:16:00 +00:00
| Result<AuthUser, never>;
2024-05-15 19:56:22 +00:00
export class LoginUseCase
implements IUseCase<ILogin_DTO, Promise<LoginResponseOrError>>
{
private _adapter: ISequelizeAdapter;
private _repositoryManager: IRepositoryManager;
constructor(props: {
adapter: ISequelizeAdapter;
repositoryManager: IRepositoryManager;
}) {
this._adapter = props.adapter;
this._repositoryManager = props.repositoryManager;
}
private getRepositoryByName<T>(name: string) {
return this._repositoryManager.getRepository<T>(name);
}
async execute(request: ILogin_DTO): Promise<LoginResponseOrError> {
const { email, password } = request;
// Validaciones de datos
2024-05-19 22:04:23 +00:00
const emailOrError = ensureEmailIsValid(email);
2024-05-15 19:56:22 +00:00
if (emailOrError.isFailure) {
return Result.fail(
2024-05-19 22:04:23 +00:00
UseCaseError.create(
2024-05-15 19:56:22 +00:00
UseCaseError.INVALID_INPUT_DATA,
"Email or password is not valid",
emailOrError.error,
),
);
}
// Crear auth
try {
2024-05-16 11:56:46 +00:00
const user = await findUserByEmail(
emailOrError.object,
this._adapter,
this.getRepositoryByName("Auth"),
);
2024-05-15 19:56:22 +00:00
if (user === null || !user.verifyPassword(password)) {
return Result.fail(
2024-05-19 22:04:23 +00:00
UseCaseError.create(
2024-05-15 19:56:22 +00:00
UseCaseError.INVALID_INPUT_DATA,
"Email or password is not valid",
),
);
}
2024-05-16 18:16:00 +00:00
return Result.ok<AuthUser>(user);
2024-05-15 19:56:22 +00:00
} catch (error: unknown) {
const _error = error as IInfrastructureError;
return Result.fail(
2024-05-19 22:04:23 +00:00
UseCaseError.create(
2024-05-15 19:56:22 +00:00
UseCaseError.REPOSITORY_ERROR,
"Error al buscar el usuario",
_error,
),
);
}
}
}