feat(api): add tRPC routers (auth + content) calling core controllers

This commit is contained in:
2026-04-06 14:48:42 +02:00
parent 1b93fecb7f
commit a870b9e0e5
8 changed files with 119 additions and 3 deletions

View File

@@ -10,8 +10,14 @@
"lint": "eslint .", "lint": "eslint .",
"typecheck": "tsc --noEmit" "typecheck": "tsc --noEmit"
}, },
"dependencies": {
"@repo/core": "workspace:*",
"@trpc/server": "^11.1.0",
"zod": "^3.24.0"
},
"devDependencies": { "devDependencies": {
"@repo/eslint-config": "workspace:*", "@repo/eslint-config": "workspace:*",
"@repo/typescript-config": "workspace:*" "@repo/typescript-config": "workspace:*",
"@types/node": "^22.0.0"
} }
} }

View File

@@ -1,2 +1 @@
// @repo/api — tRPC router definitions export { appRouter, type AppRouter } from "./router/index.js";
export {};

View File

@@ -0,0 +1,38 @@
import { z } from "zod";
import { router, publicProcedure } from "../trpc.js";
import {
signInController,
signUpController,
signOutController,
} from "@repo/core";
export const authRouter = router({
signIn: publicProcedure
.input(
z.object({
username: z.string().min(3).max(31),
password: z.string().min(6).max(255),
})
)
.mutation(async ({ input }) => {
return await 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(async ({ input }) => {
return await signUpController(input);
}),
signOut: publicProcedure
.input(z.object({ sessionId: z.string() }))
.mutation(async ({ input }) => {
return await signOutController(input.sessionId);
}),
});

View File

@@ -0,0 +1,33 @@
import { z } from "zod";
import { router, publicProcedure } from "../trpc.js";
import { createArticleController, getArticlesController } from "@repo/core";
export const contentRouter = router({
listArticles: publicProcedure
.input(
z
.object({
status: z.string().optional(),
authorId: z.string().optional(),
limit: z.number().optional(),
offset: z.number().optional(),
})
.optional()
)
.query(async ({ input }) => {
return await getArticlesController(input ?? {});
}),
createArticle: publicProcedure
.input(
z.object({
title: z.string().min(1).max(255),
content: z.string(),
authorId: z.string(),
slug: z.string().optional(),
})
)
.mutation(async ({ input }) => {
return await createArticleController(input);
}),
});

View File

@@ -0,0 +1,10 @@
import { router } from "../trpc.js";
import { authRouter } from "./auth.router.js";
import { contentRouter } from "./content.router.js";
export const appRouter = router({
auth: authRouter,
content: contentRouter,
});
export type AppRouter = typeof appRouter;

6
packages/api/src/trpc.ts Normal file
View File

@@ -0,0 +1,6 @@
import { initTRPC } from "@trpc/server";
const t = initTRPC.create();
export const router = t.router;
export const publicProcedure = t.procedure;

View File

@@ -1,6 +1,7 @@
{ {
"extends": "@repo/typescript-config/base.json", "extends": "@repo/typescript-config/base.json",
"compilerOptions": { "compilerOptions": {
"lib": ["ES2022", "DOM", "DOM.Iterable"],
"baseUrl": ".", "baseUrl": ".",
"paths": { "paths": {
"@/*": ["./src/*"] "@/*": ["./src/*"]

23
pnpm-lock.yaml generated
View File

@@ -107,6 +107,16 @@ importers:
version: link:../../packages/typescript-config version: link:../../packages/typescript-config
packages/api: packages/api:
dependencies:
'@repo/core':
specifier: workspace:*
version: link:../core
'@trpc/server':
specifier: ^11.1.0
version: 11.16.0(typescript@5.9.3)
zod:
specifier: ^3.24.0
version: 3.25.76
devDependencies: devDependencies:
'@repo/eslint-config': '@repo/eslint-config':
specifier: workspace:* specifier: workspace:*
@@ -114,6 +124,9 @@ importers:
'@repo/typescript-config': '@repo/typescript-config':
specifier: workspace:* specifier: workspace:*
version: link:../typescript-config version: link:../typescript-config
'@types/node':
specifier: ^22.0.0
version: 22.19.17
packages/api-client: packages/api-client:
devDependencies: devDependencies:
@@ -1546,6 +1559,12 @@ packages:
'@tokenizer/token@0.3.0': '@tokenizer/token@0.3.0':
resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==}
'@trpc/server@11.16.0':
resolution: {integrity: sha512-XgGuUMddrUTd04+za/WE5GFuZ1/YU9XQG0t3VL5WOIu2JspkOlq6k4RYEiqS6HSJt+S0RXaPdIoE2anIP/BBRQ==}
hasBin: true
peerDependencies:
typescript: '>=5.7.2'
'@turbo/darwin-64@2.9.4': '@turbo/darwin-64@2.9.4':
resolution: {integrity: sha512-ZSlPqJ5Vqg/wgVw8P3AOVCIosnbBilOxLq7TMz3MN/9U46DUYfdG2jtfevNDufyxyrg98pcPs/GBgDRaaids6g==} resolution: {integrity: sha512-ZSlPqJ5Vqg/wgVw8P3AOVCIosnbBilOxLq7TMz3MN/9U46DUYfdG2jtfevNDufyxyrg98pcPs/GBgDRaaids6g==}
cpu: [x64] cpu: [x64]
@@ -4682,6 +4701,10 @@ snapshots:
'@tokenizer/token@0.3.0': {} '@tokenizer/token@0.3.0': {}
'@trpc/server@11.16.0(typescript@5.9.3)':
dependencies:
typescript: 5.9.3
'@turbo/darwin-64@2.9.4': '@turbo/darwin-64@2.9.4':
optional: true optional: true