diff --git a/server/package.json b/server/package.json index 432f5dd..00dc766 100644 --- a/server/package.json +++ b/server/package.json @@ -17,6 +17,7 @@ "@linux-odyssey/file-graph": "*", "@linux-odyssey/models": "*", "@linux-odyssey/utils": "*", + "@trpc/server": "^11.1.0", "bcrypt": "^5.1.1", "commander": "^11.0.0", "connect-mongo": "^5.0.0", @@ -44,7 +45,8 @@ "swagger-ui-express": "^5.0.0", "validator": "^13.11.0", "winston": "^3.11.0", - "yaml": "^2.3.1" + "yaml": "^2.3.1", + "zod": "^3.24.2" }, "devDependencies": { "@swc/core": "^1.4.2", diff --git a/server/src/index.ts b/server/src/index.ts index 22916d8..b0d2f01 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -4,6 +4,7 @@ import http from 'http' import YAML from 'yaml' import swaggerUI from 'swagger-ui-express' import passport from 'passport' +import * as trpcExpress from '@trpc/server/adapters/express' import connectDB from '@linux-odyssey/models' import './auth/passport.js' @@ -17,6 +18,7 @@ import sessionMiddleware from './middleware/session.js' import expiryRemovalScheduler from './containers/expiryChecker.js' import setupTest from './utils/setupTest.js' import logger from './utils/logger.js' +import { appRouter } from './routers/index.js' async function main() { if (!config.secret) { @@ -70,6 +72,13 @@ async function main() { }) app.use('/api/v1', apiRouter) + app.use( + '/trpc', + trpcExpress.createExpressMiddleware({ + router: appRouter, + // createContext, + }) + ) app.use(errorHandler) server.listen(config.port, '0.0.0.0', () => { diff --git a/server/src/routers/index.ts b/server/src/routers/index.ts new file mode 100644 index 0000000..f83f4d2 --- /dev/null +++ b/server/src/routers/index.ts @@ -0,0 +1,11 @@ +import { router, publicProcedure } from '../trpc.js' + +export const appRouter = router({ + userList: publicProcedure.query(async () => { + // Retrieve users from a datasource, this is an imaginary database + return 'hello' + }), +}) +// Export type router type signature, +// NOT the router itself. +export type AppRouter = typeof appRouter diff --git a/server/src/trpc.ts b/server/src/trpc.ts new file mode 100644 index 0000000..e946384 --- /dev/null +++ b/server/src/trpc.ts @@ -0,0 +1,11 @@ +import { initTRPC } from '@trpc/server' +/** + * Initialization of tRPC backend + * Should be done only once per backend! + */ +const t = initTRPC.create() +/** + * Export reusable router and procedure helpers + * that can be used throughout the router + */ +export const { router, procedure: publicProcedure } = t diff --git a/server/tests/trpc.test.ts b/server/tests/trpc.test.ts new file mode 100644 index 0000000..e69de29 diff --git a/yarn.lock b/yarn.lock index 78ca72a..61a3994 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1711,6 +1711,11 @@ lz-string "^1.5.0" pretty-format "^27.0.2" +"@trpc/server@^11.1.0": + version "11.1.0" + resolved "https://registry.yarnpkg.com/@trpc/server/-/server-11.1.0.tgz#8169fa8b944beddf65a95f376d4afea5732be254" + integrity sha512-uAJ7ikejeujVkf53XFJ/0W8nr7bDjul+Szk5Rsepq97Hb/WS1RkRXdyX4KqAyCE9b1vDFCJVJwSxiIZdRtbTZQ== + "@tsconfig/node10@^1.0.7": version "1.0.9" resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" @@ -9780,3 +9785,8 @@ zod@^3.23.8: version "3.23.8" resolved "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz" integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== + +zod@^3.24.2: + version "3.24.2" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.24.2.tgz#8efa74126287c675e92f46871cfc8d15c34372b3" + integrity sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==