From a870b9e0e5f240b1c24060870963942e62464ae9 Mon Sep 17 00:00:00 2001 From: Danijel Martinek Date: Mon, 6 Apr 2026 14:48:42 +0200 Subject: [PATCH] feat(api): add tRPC routers (auth + content) calling core controllers --- packages/api/package.json | 8 ++++- packages/api/src/index.ts | 3 +- packages/api/src/router/auth.router.ts | 38 +++++++++++++++++++++++ packages/api/src/router/content.router.ts | 33 ++++++++++++++++++++ packages/api/src/router/index.ts | 10 ++++++ packages/api/src/trpc.ts | 6 ++++ packages/api/tsconfig.json | 1 + pnpm-lock.yaml | 23 ++++++++++++++ 8 files changed, 119 insertions(+), 3 deletions(-) create mode 100644 packages/api/src/router/auth.router.ts create mode 100644 packages/api/src/router/content.router.ts create mode 100644 packages/api/src/router/index.ts create mode 100644 packages/api/src/trpc.ts diff --git a/packages/api/package.json b/packages/api/package.json index 8219d3e..6fe25f6 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -10,8 +10,14 @@ "lint": "eslint .", "typecheck": "tsc --noEmit" }, + "dependencies": { + "@repo/core": "workspace:*", + "@trpc/server": "^11.1.0", + "zod": "^3.24.0" + }, "devDependencies": { "@repo/eslint-config": "workspace:*", - "@repo/typescript-config": "workspace:*" + "@repo/typescript-config": "workspace:*", + "@types/node": "^22.0.0" } } diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index 9e6a672..b35fc58 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -1,2 +1 @@ -// @repo/api — tRPC router definitions -export {}; +export { appRouter, type AppRouter } from "./router/index.js"; diff --git a/packages/api/src/router/auth.router.ts b/packages/api/src/router/auth.router.ts new file mode 100644 index 0000000..6bbf14e --- /dev/null +++ b/packages/api/src/router/auth.router.ts @@ -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); + }), +}); diff --git a/packages/api/src/router/content.router.ts b/packages/api/src/router/content.router.ts new file mode 100644 index 0000000..ad4ac54 --- /dev/null +++ b/packages/api/src/router/content.router.ts @@ -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); + }), +}); diff --git a/packages/api/src/router/index.ts b/packages/api/src/router/index.ts new file mode 100644 index 0000000..c5f6193 --- /dev/null +++ b/packages/api/src/router/index.ts @@ -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; diff --git a/packages/api/src/trpc.ts b/packages/api/src/trpc.ts new file mode 100644 index 0000000..be3ed16 --- /dev/null +++ b/packages/api/src/trpc.ts @@ -0,0 +1,6 @@ +import { initTRPC } from "@trpc/server"; + +const t = initTRPC.create(); + +export const router = t.router; +export const publicProcedure = t.procedure; diff --git a/packages/api/tsconfig.json b/packages/api/tsconfig.json index 4f4ddbc..36de03f 100644 --- a/packages/api/tsconfig.json +++ b/packages/api/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "@repo/typescript-config/base.json", "compilerOptions": { + "lib": ["ES2022", "DOM", "DOM.Iterable"], "baseUrl": ".", "paths": { "@/*": ["./src/*"] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9f83be8..3d3c4bf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -107,6 +107,16 @@ importers: version: link:../../packages/typescript-config 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: '@repo/eslint-config': specifier: workspace:* @@ -114,6 +124,9 @@ importers: '@repo/typescript-config': specifier: workspace:* version: link:../typescript-config + '@types/node': + specifier: ^22.0.0 + version: 22.19.17 packages/api-client: devDependencies: @@ -1546,6 +1559,12 @@ packages: '@tokenizer/token@0.3.0': 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': resolution: {integrity: sha512-ZSlPqJ5Vqg/wgVw8P3AOVCIosnbBilOxLq7TMz3MN/9U46DUYfdG2jtfevNDufyxyrg98pcPs/GBgDRaaids6g==} cpu: [x64] @@ -4682,6 +4701,10 @@ snapshots: '@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': optional: true