feat(auth): add tRPC router with signIn + signUp + signOut

This commit is contained in:
2026-05-05 07:58:20 +02:00
parent 2e445b9c5b
commit 30b49ca19b
2 changed files with 75 additions and 0 deletions

View File

@@ -0,0 +1,43 @@
import { beforeEach, describe, expect, it } from "vitest";
import { authContainer } from "@/di/container";
import { AUTH_SYMBOLS } from "@/di/symbols";
import { MockUsersRepository } from "@/infrastructure/repositories/mock-users.repository";
import { MockAuthenticationService } from "@/infrastructure/services/mock-authentication.service";
import type { IUsersRepository } from "@/application/repositories/users-repository.interface";
import type { IAuthenticationService } from "@/application/services/authentication-service.interface";
import { authRouter } from "./router";
describe("authRouter", () => {
beforeEach(() => {
if (authContainer.isBound(AUTH_SYMBOLS.IUsersRepository)) {
authContainer.unbind(AUTH_SYMBOLS.IUsersRepository);
}
if (authContainer.isBound(AUTH_SYMBOLS.IAuthenticationService)) {
authContainer.unbind(AUTH_SYMBOLS.IAuthenticationService);
}
const usersRepo = new MockUsersRepository();
const authService = new MockAuthenticationService(usersRepo);
authContainer
.bind<IUsersRepository>(AUTH_SYMBOLS.IUsersRepository)
.toConstantValue(usersRepo);
authContainer
.bind<IAuthenticationService>(AUTH_SYMBOLS.IAuthenticationService)
.toConstantValue(authService);
});
it("exposes signIn, signUp, signOut procedures", () => {
const names = Object.keys(authRouter._def.procedures);
expect(names).toContain("signIn");
expect(names).toContain("signUp");
expect(names).toContain("signOut");
});
it("signIn returns a cookie", async () => {
const caller = authRouter.createCaller({});
const result = await caller.signIn({
username: "alice",
password: "password_alice",
});
expect(result.name).toBe("session");
});
});

View File

@@ -0,0 +1,32 @@
import { z } from "zod";
import { router, publicProcedure } from "@repo/core-shared/trpc/init";
import { signInController } from "../../interface-adapters/controllers/sign-in.controller";
import { signUpController } from "../../interface-adapters/controllers/sign-up.controller";
import { signOutController } from "../../interface-adapters/controllers/sign-out.controller";
export const authRouter = router({
signIn: publicProcedure
.input(
z.object({
username: z.string().min(3).max(31),
password: z.string().min(6).max(255),
}),
)
.mutation(({ input }) => signInController(input)),
signUp: publicProcedure
.input(
z.object({
username: z.string().min(3).max(31),
password: z.string().min(6).max(255),
confirmPassword: z.string().min(6).max(255),
}),
)
.mutation(({ input }) => signUpController(input)),
signOut: publicProcedure
.input(z.object({ sessionId: z.string() }))
.mutation(({ input }) => signOutController(input.sessionId)),
});
export type AuthRouter = typeof authRouter;