diff --git a/@types/index.ts b/@types/index.ts index 8d7bd8a..3e28ed4 100644 --- a/@types/index.ts +++ b/@types/index.ts @@ -1,4 +1,4 @@ -import { Interview, InterviewStatus } from "@prisma/client"; +import { Interview, InterviewStatus, User } from "@prisma/client"; export interface JWTToken { id: string; @@ -35,6 +35,10 @@ export interface UpdateInterviewRequest { status: InterviewStatus; } +export type UserPreferences = Omit; + +export type UpdateUserPreferencesRequest = UserPreferences; + declare global { namespace Express { interface User { diff --git a/controllers/userController.ts b/controllers/userController.ts new file mode 100644 index 0000000..509d45c --- /dev/null +++ b/controllers/userController.ts @@ -0,0 +1,23 @@ +import { PrismaClient, User } from ".prisma/client"; +import express, { Request, Response } from "express"; +import { UpdateUserPreferencesRequest } from "../@types"; +import UserRepository from "../models/UserRepository"; + +export default function userController(prismaClient: PrismaClient) { + const userRouter = express.Router(); + const userRepository = new UserRepository(prismaClient); + + userRouter.post("/", async (req: Request<{}, {}, Partial>, res: Response) => { + const userId = req.user?.id; + + try { + if (!userId) return res.status(401).send({ error: "Not Authenticated." }); + const user = await userRepository.updateUserById(userId, req.body); + res.send(200).json(user); + } catch (e) { + res.status(500).send({ error: e.message }); + } + }); + + return userRouter; +} diff --git a/index.ts b/index.ts index eacc895..507b784 100644 --- a/index.ts +++ b/index.ts @@ -9,6 +9,7 @@ import { Socket } from "socket.io"; import authController from "./controllers/authController"; import interviewController from "./controllers/interviewController"; +import userController from "./controllers/userController"; const port = process.env.PORT || 8000; const app = express(); @@ -28,6 +29,7 @@ app.use( app.use("/api/auth", authController(prismaClient)); app.use("/api/interviews", interviewController(prismaClient)); +app.use("/api/users", userController(prismaClient)); app.use((err: Error, _req: Request, res: Response) => { if (err.name === "UnauthorizedError") res.status(401).send("Unauthorized token"); diff --git a/models/UserRepository.ts b/models/UserRepository.ts index 1606245..072514a 100644 --- a/models/UserRepository.ts +++ b/models/UserRepository.ts @@ -1,5 +1,6 @@ import { PrismaClient, User } from ".prisma/client"; import { TokenPayload } from "google-auth-library"; +import { UserPreferences } from "../@types"; export default class UserRepository { prisma: PrismaClient; @@ -24,4 +25,10 @@ export default class UserRepository { return newUser; } } + + async updateUserById(id: string, preferences: Partial): Promise { + const user = await this.prisma.user.update({ where: { id }, data: preferences }); + if (!user) throw new Error("User not found"); + return user; + } }