From 7473c5be03551ebc2521dde35cf024fa86dbd950 Mon Sep 17 00:00:00 2001 From: nar20 <nar20@inf.ufpr.br> Date: Tue, 3 Sep 2024 11:11:38 -0300 Subject: [PATCH] Issue #1:ADD update user route --- src/db/repo/user.repo.ts | 12 +++++++ src/db/schema/user.model.ts | 5 +++ src/index.ts | 5 +-- src/routes/user.routes.ts | 68 +++++++++++++++++++++++++----------- src/services/user.service.ts | 7 ++++ 5 files changed, 75 insertions(+), 22 deletions(-) diff --git a/src/db/repo/user.repo.ts b/src/db/repo/user.repo.ts index c23d853..ad04965 100644 --- a/src/db/repo/user.repo.ts +++ b/src/db/repo/user.repo.ts @@ -4,6 +4,7 @@ import userTable, { userSchemas, type UserInput, type UserModel, + type UserUpdate, } from '../schema/user.model' import { z } from 'zod' import { eq } from 'drizzle-orm' @@ -57,4 +58,15 @@ export class UserRepo { .parse(await tx.insert(userTable).values(users).returning()) }) } + + async update(user: UserUpdate): Promise<UserModel>{ + const [ret] = await db + .update(userTable) + .set(user) + .where(eq(userTable.id, user.id)) + .returning() + + return userSchemas.userModelSchema.parse(ret) + } + } diff --git a/src/db/schema/user.model.ts b/src/db/schema/user.model.ts index c161ebc..9278553 100644 --- a/src/db/schema/user.model.ts +++ b/src/db/schema/user.model.ts @@ -14,13 +14,18 @@ const userModelSchema = createSelectSchema(userTable) const userDtoSchema = createSelectSchema(userTable).omit({ password: true, }) +const userUpdateSchema = createSelectSchema(userTable) + .partial() + .required({ id: true }) export type UserInput = z.infer<typeof userInputSchema> +export type UserUpdate = z.infer<typeof userUpdateSchema> export type UserModel = z.infer<typeof userModelSchema> export type UserDto = z.infer<typeof userDtoSchema> export const userSchemas = { userInputSchema, + userUpdateSchema, userModelSchema, userDtoSchema, } diff --git a/src/index.ts b/src/index.ts index fd1950d..d4752ea 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,7 @@ import { Hono } from 'hono' import { logger } from 'hono/logger' -import { userRouter } from './routes/user.routes' +import { signUpRouter, userRouter } from './routes/user.routes' import { authRouter } from './routes/auth.route' import { jwt } from 'hono/jwt' import env from './env' @@ -46,7 +46,8 @@ app.use( app.get('/', (c) => c.json({ message: 'sv running on /api' })) -app.route('auth', authRouter) +app.route('/auth', authRouter) +app.route('/signup', signUpRouter) app .basePath('/api') diff --git a/src/routes/user.routes.ts b/src/routes/user.routes.ts index fe9bdc8..d4f311f 100644 --- a/src/routes/user.routes.ts +++ b/src/routes/user.routes.ts @@ -4,21 +4,29 @@ import { Container } from 'typedi' import { z } from 'zod' import { zValidator } from '@hono/zod-validator' import { honoWithJwt } from '..' +import { Hono } from 'hono' +import { createApexError, HttpStatus } from '@/services/error.service' const service = Container.get(UserService) -export const userRouter = honoWithJwt() - .get('/:username', async (c) => { - try { - const username = c.req.param('username') - const user = await service.findByUsername(username) - const ret = userSchemas.userDtoSchema.parse(user) +export const signUpRouter = new Hono() + .post('/', + zValidator('json', userSchemas.userInputSchema), + async (c) => { + try { + const input = await c.req.valid('json') - return c.json({ user: ret }) - } catch { - return c.notFound() - } + const user = userSchemas.userDtoSchema.parse( + await service.create(input) + ) + + return c.json({ user }) + } catch (e) { + return c.text('could not create') + } }) + +export const userRouter = honoWithJwt() .get('/users', async (c) => { const p = c.get('jwtPayload') @@ -29,21 +37,41 @@ export const userRouter = honoWithJwt() const ret = z.array(userSchemas.userDtoSchema).parse(users) return c.json({ users: ret }) - }) - .post( - '/create', - zValidator('json', userSchemas.userInputSchema), + }) + .get('/:username', async (c) => { + try { + const username = c.req.param('username') + const user = await service.findByUsername(username) + const ret = userSchemas.userDtoSchema.parse(user) + + return c.json({ user: ret }) + } catch { + return c.notFound() + } + }) + .post('/update', + zValidator('json', userSchemas.userUpdateSchema), async (c) => { try { const input = await c.req.valid('json') const user = userSchemas.userDtoSchema.parse( - await service.create(input) + await service.update(input) ) - - return c.json({ user }) + + return c.json({user}) } catch (e) { - return c.text('could not create') + + return c.json( + createApexError({ + status: 'error', + message: 'could not update user', + code: HttpStatus.BAD_REQUEST, + path: c.req.routePath, + suggestion: 'check the input and try again', + }), + HttpStatus.BAD_REQUEST + ) + } - } - ) + }) diff --git a/src/services/user.service.ts b/src/services/user.service.ts index 71e8eda..6c3597e 100644 --- a/src/services/user.service.ts +++ b/src/services/user.service.ts @@ -5,6 +5,7 @@ import { userSchemas, type UserInput, type UserModel, + type UserUpdate, } from '@/db/schema/user.model' import { Inject, Service } from 'typedi' import { z } from 'zod' @@ -51,4 +52,10 @@ export class UserService { return this.repo.uploadUsers(users) } + + async update(user: UserUpdate): Promise<UserModel> { + if(user.password) + user.password = hashPassword(user.password) + return this.repo.update(user) + } } -- GitLab