feat(auth): add signUpUseCase (test red until DI lands)
This commit is contained in:
46
packages/auth/src/application/use-cases/sign-up.use-case.ts
Normal file
46
packages/auth/src/application/use-cases/sign-up.use-case.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
import { AuthenticationError } from "../../entities/errors";
|
||||
import type { Cookie } from "../../entities/cookie";
|
||||
import type { Session } from "../../entities/session";
|
||||
import type { User } from "../../entities/user";
|
||||
import { authContainer } from "../../di/container";
|
||||
import { AUTH_SYMBOLS } from "../../di/symbols";
|
||||
import type { IUsersRepository } from "../repositories/users-repository.interface";
|
||||
import type { IAuthenticationService } from "../services/authentication-service.interface";
|
||||
|
||||
export async function signUpUseCase(input: {
|
||||
username: string;
|
||||
password: string;
|
||||
}): Promise<{
|
||||
session: Session;
|
||||
cookie: Cookie;
|
||||
user: Pick<User, "id" | "username">;
|
||||
}> {
|
||||
const usersRepository = authContainer.get<IUsersRepository>(
|
||||
AUTH_SYMBOLS.IUsersRepository,
|
||||
);
|
||||
const authService = authContainer.get<IAuthenticationService>(
|
||||
AUTH_SYMBOLS.IAuthenticationService,
|
||||
);
|
||||
|
||||
const existingUser = await usersRepository.getUserByUsername(input.username);
|
||||
if (existingUser) {
|
||||
throw new AuthenticationError("Username taken");
|
||||
}
|
||||
|
||||
const passwordHash = await authService.hashPassword(input.password);
|
||||
const userId = authService.generateUserId();
|
||||
|
||||
const newUser = await usersRepository.createUser({
|
||||
id: userId,
|
||||
username: input.username,
|
||||
passwordHash,
|
||||
});
|
||||
|
||||
const { cookie, session } = await authService.createSession(newUser);
|
||||
|
||||
return {
|
||||
cookie,
|
||||
session,
|
||||
user: { id: newUser.id, username: newUser.username },
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user