diff --git a/src/db/repo/user.repo.ts b/src/db/repo/user.repo.ts index c23d853fb3a28c3fcaff9507f9f37cdfa264cfe2..ad04965fda132db122b44bfdfd99157b83b05249 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 c161ebc0bf68ca87961cc7d89121ad0c9418a6f6..92785537b631db527d67518f9b52d846a26601f1 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 fd1950d5f581c1e341d3cc7d9908f0e4aab82b0e..d4752ea0edad4d6f3fed7b816a93e10ba706f650 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 fe9bdc8df8b46822ea48aa828b300cfb9ed78de5..d4f311f4f106f4d8b3695f889b585769fd6d9d6a 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 71e8eda421dc230bcba9697085379af718788f46..6c3597e44fe35b3a9959faa59b52ad1087e3b7d7 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) + } }