import { Elysia, t } from 'elysia' import { bearerAuthMiddleware } from '~/middlewares' import { validationErrorSchema } from '~/plugins/defaultHandler' import CommandService from './commands/service' import QueryService from './queries/service' import { createUserBody, createUserResponse, listUserResponse } from './schema' export const router = new Elysia({ name: 'modules.user', detail: { tags: ['Users'] }, prefix: '/user/v1/users', }) .get('/', async ({ headers, set }) => { await bearerAuthMiddleware(headers, set) const users = await QueryService.getUsers() return { message: 'Get users.' as const, data: users, } }, { response: { 200: t.Object({ message: t.Literal('Get users.'), data: listUserResponse, }), 401: t.Object({ message: t.Literal('Unauthenticated.'), }), }, }) .post('/', async ({ body, headers, set }) => { await bearerAuthMiddleware(headers, set) const user = await CommandService.createUser(body) return { message: 'User created.', data: user, } }, { body: createUserBody, response: { 200: t.Object({ message: t.Literal('User created.'), data: createUserResponse, }), 401: t.Object({ message: t.Literal('Unauthenticated.'), }), 422: validationErrorSchema, }, }) .put('/:id', async ({ params: { id }, body, headers, set }) => { await bearerAuthMiddleware(headers, set) const user = await CommandService.updateUser(id, body) return { message: 'User updated.' as const, data: user, } }, { body: createUserBody, response: { 200: t.Object({ message: t.Literal('User updated.'), data: createUserResponse, }), }, }) .delete('/:id', async ({ params: { id }, headers, set }) => { await bearerAuthMiddleware(headers, set) await CommandService.deleteUser(id) return { message: 'User deleted.' as const, data: { id }, } }, { response: { 200: t.Object({ message: t.Literal('User deleted.'), data: t.Object({ id: t.String() }), }), }, }) export default router