From 6971eeda3c321a859c55643592276473afdb65a5 Mon Sep 17 00:00:00 2001 From: Francisco Pessano Date: Tue, 4 Jul 2023 23:06:32 -0300 Subject: [PATCH] feat: mongoose integration --- .../screens/SpendScreen/SpendScreen.tsx | 2 +- packages/server/app.ts | 23 ++++++++++++++----- packages/server/db.ts | 13 +++++++++++ packages/server/package.json | 2 ++ packages/server/schemas/index.ts | 1 + packages/server/schemas/user.ts | 17 ++++++++++++++ packages/server/types/index.ts | 1 + packages/server/types/primitives.ts | 3 +++ packages/server/types/user.ts | 7 ++++++ 9 files changed, 62 insertions(+), 7 deletions(-) create mode 100644 packages/server/schemas/index.ts create mode 100644 packages/server/schemas/user.ts create mode 100644 packages/server/types/index.ts create mode 100644 packages/server/types/primitives.ts create mode 100644 packages/server/types/user.ts diff --git a/packages/client/screens/SpendScreen/SpendScreen.tsx b/packages/client/screens/SpendScreen/SpendScreen.tsx index a14f8fa..b2c32c4 100644 --- a/packages/client/screens/SpendScreen/SpendScreen.tsx +++ b/packages/client/screens/SpendScreen/SpendScreen.tsx @@ -19,7 +19,7 @@ export const SpendScreen = (): JSX.Element => { ]); useEffect(() => { trpc.userCreate - .mutate({ name: 'ABC' }) + .mutate({ email: 'abdfasfasdfasdc@gmail.com', name: 'ABC', password: '23eqwrqwerqwe4' }) .then(() => { trpc.userList .query() diff --git a/packages/server/app.ts b/packages/server/app.ts index 3a4f5b2..1291f28 100644 --- a/packages/server/app.ts +++ b/packages/server/app.ts @@ -1,21 +1,26 @@ import { z } from 'zod'; import { createHTTPServer } from '@trpc/server/adapters/standalone'; import cors from 'cors'; -import { db } from './db'; +import dotenv from 'dotenv'; +import dbConnection from './db'; import { publicProcedure, router } from './trpc'; +import { User, UserSchema } from './schemas'; +dotenv.config(); + +console.log(process.env); const appRouter = router({ userById: publicProcedure.input(z.string()).query(async (opts) => { const { input } = opts; - const user = await db.user.findById(input); + const user = await User.findById(input); return user; }), - userCreate: publicProcedure.input(z.object({ name: z.string() })).mutation(async ({ input }) => { - const user = await db.user.create(input); + userCreate: publicProcedure.input(UserSchema).mutation(async ({ input }) => { + const user = await User.create(input); return user; }), userList: publicProcedure.query(async () => { - const users = await db.user.findMany(); + const users = await User.find(); return users; }), }); @@ -27,4 +32,10 @@ const server = createHTTPServer({ router: appRouter, }); -server.listen(3000); +dbConnection() + .then(() => { + server.listen(3000); + }) + .catch((e) => { + console.log(e); + }); diff --git a/packages/server/db.ts b/packages/server/db.ts index bb16109..a5760f7 100644 --- a/packages/server/db.ts +++ b/packages/server/db.ts @@ -1,3 +1,5 @@ +import mongoose from 'mongoose'; + export interface User { id: string; name: string; @@ -16,3 +18,14 @@ export const db = { findMany: async () => users, }, }; + +export default async (): Promise => { + await mongoose + .connect(process.env.MONGO_URI as string) + .then(() => { + console.log('Connected to MongoDB'); + }) + .catch((error) => { + console.error('Error connecting to MongoDB:', error); + }); +}; diff --git a/packages/server/package.json b/packages/server/package.json index 7f67775..98a6c7f 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -15,6 +15,8 @@ "dependencies": { "@types/cors": "^2.8.13", "cors": "^2.8.5", + "dotenv": "^16.3.1", + "mongoose": "^7.3.1", "ts-node": "^10.9.1" } } diff --git a/packages/server/schemas/index.ts b/packages/server/schemas/index.ts new file mode 100644 index 0000000..e5abc85 --- /dev/null +++ b/packages/server/schemas/index.ts @@ -0,0 +1 @@ +export * from './user'; diff --git a/packages/server/schemas/user.ts b/packages/server/schemas/user.ts new file mode 100644 index 0000000..c300d87 --- /dev/null +++ b/packages/server/schemas/user.ts @@ -0,0 +1,17 @@ +import { Schema, model } from 'mongoose'; +import { z } from 'zod'; +import { type UserType } from '../types'; + +export const UserSchema = z.object({ + email: z.string().email(), + name: z.string(), + password: z.string().min(8), +} satisfies UserType); + +const schema = new Schema({ + email: { required: true, type: String, unique: true }, + name: { required: true, type: String }, + password: { required: true, type: String }, +} satisfies UserType); + +export const User = model('User', schema); diff --git a/packages/server/types/index.ts b/packages/server/types/index.ts new file mode 100644 index 0000000..e5abc85 --- /dev/null +++ b/packages/server/types/index.ts @@ -0,0 +1 @@ +export * from './user'; diff --git a/packages/server/types/primitives.ts b/packages/server/types/primitives.ts new file mode 100644 index 0000000..2535f30 --- /dev/null +++ b/packages/server/types/primitives.ts @@ -0,0 +1,3 @@ +import { type z } from 'zod'; + +export type StringInput = string | z.ZodString | { type: StringConstructor; [key: string]: any }; diff --git a/packages/server/types/user.ts b/packages/server/types/user.ts new file mode 100644 index 0000000..e50a793 --- /dev/null +++ b/packages/server/types/user.ts @@ -0,0 +1,7 @@ +import { type StringInput } from './primitives'; + +export interface UserType { + email: StringInput; + name: StringInput; + password: StringInput; +}