Presupuestador_web/server/src/contexts/auth/application/Login.useCase.ts
2024-05-20 00:04:23 +02:00

79 lines
2.2 KiB
TypeScript

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";
import { ILogin_DTO, Result, ensureEmailIsValid } from "@shared/contexts";
import { AuthUser } from "../domain";
import { findUserByEmail } from "./authServices";
export type LoginResponseOrError =
| Result<never, IUseCaseError>
| Result<AuthUser, never>;
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
const emailOrError = ensureEmailIsValid(email);
if (emailOrError.isFailure) {
return Result.fail(
UseCaseError.create(
UseCaseError.INVALID_INPUT_DATA,
"Email or password is not valid",
emailOrError.error,
),
);
}
// Crear auth
try {
const user = await findUserByEmail(
emailOrError.object,
this._adapter,
this.getRepositoryByName("Auth"),
);
if (user === null || !user.verifyPassword(password)) {
return Result.fail(
UseCaseError.create(
UseCaseError.INVALID_INPUT_DATA,
"Email or password is not valid",
),
);
}
return Result.ok<AuthUser>(user);
} catch (error: unknown) {
const _error = error as IInfrastructureError;
return Result.fail(
UseCaseError.create(
UseCaseError.REPOSITORY_ERROR,
"Error al buscar el usuario",
_error,
),
);
}
}
}