diff options
Diffstat (limited to 'api/src/modules/settings')
| -rw-r--r-- | api/src/modules/settings/settings.controller.ts | 24 | ||||
| -rw-r--r-- | api/src/modules/settings/settings.repository.ts | 26 | ||||
| -rw-r--r-- | api/src/modules/settings/settings.routes.ts | 30 | ||||
| -rw-r--r-- | api/src/modules/settings/settings.schema.ts | 7 |
4 files changed, 87 insertions, 0 deletions
diff --git a/api/src/modules/settings/settings.controller.ts b/api/src/modules/settings/settings.controller.ts new file mode 100644 index 0000000..479f476 --- /dev/null +++ b/api/src/modules/settings/settings.controller.ts @@ -0,0 +1,24 @@ +import type { FastifyReply, FastifyRequest } from 'fastify'; +import { getSettings, updateSettings } from './settings.repository.js'; +import type { UpdateSettingsBody } from './settings.schema.js'; + +export async function getSettingsHandler( + request: FastifyRequest, + reply: FastifyReply, +) { + const settings = await getSettings(request.server.db); + return reply.send(settings); +} + +export async function updateSettingsHandler( + request: FastifyRequest<{ Body: UpdateSettingsBody }>, + reply: FastifyReply, +) { + // Apenas admins podem atualizar as configurações globais + if (request.user?.role !== 'admin') { + return reply.forbidden('Apenas administradores podem alterar configurações do sistema.'); + } + + const updated = await updateSettings(request.server.db, request.body); + return reply.send(updated); +} diff --git a/api/src/modules/settings/settings.repository.ts b/api/src/modules/settings/settings.repository.ts new file mode 100644 index 0000000..a3d38ba --- /dev/null +++ b/api/src/modules/settings/settings.repository.ts @@ -0,0 +1,26 @@ +import type { Database } from '@/db/connection.js'; +import { systemSettings } from '@/db/schema.js'; + +export async function getSettings(db: Database) { + let [settings] = await db.select().from(systemSettings).limit(1); + + if (!settings) { + [settings] = await db.insert(systemSettings).values({ allowRequesterChat: true }).returning(); + } + + return settings; +} + +export async function updateSettings(db: Database, data: { allowRequesterChat: boolean }) { + let [settings] = await db.select().from(systemSettings).limit(1); + + if (!settings) { + [settings] = await db.insert(systemSettings).values(data).returning(); + } else { + [settings] = await db.update(systemSettings) + .set({ allowRequesterChat: data.allowRequesterChat, updatedAt: new Date().toISOString() }) + .returning(); + } + + return settings; +} diff --git a/api/src/modules/settings/settings.routes.ts b/api/src/modules/settings/settings.routes.ts new file mode 100644 index 0000000..5ae97da --- /dev/null +++ b/api/src/modules/settings/settings.routes.ts @@ -0,0 +1,30 @@ +import type { FastifyInstance } from 'fastify'; +import { getSettingsHandler, updateSettingsHandler } from './settings.controller.js'; +import { SettingsSchema } from './settings.schema.js'; + +export default async function settingsRoutes(fastify: FastifyInstance) { + fastify.get( + '/', + { + schema: { + tags: ['Settings'], + summary: 'Obtém as configurações globais do sistema', + }, + preHandler: [fastify.authenticate], + }, + getSettingsHandler, + ); + + fastify.patch( + '/', + { + schema: { + tags: ['Settings'], + summary: 'Atualiza as configurações globais do sistema (apenas admin)', + body: SettingsSchema, + }, + preHandler: [fastify.authenticate], + }, + updateSettingsHandler, + ); +} diff --git a/api/src/modules/settings/settings.schema.ts b/api/src/modules/settings/settings.schema.ts new file mode 100644 index 0000000..cd3a19b --- /dev/null +++ b/api/src/modules/settings/settings.schema.ts @@ -0,0 +1,7 @@ +import { z } from 'zod'; + +export const SettingsSchema = z.object({ + allowRequesterChat: z.boolean(), +}); + +export type UpdateSettingsBody = z.infer<typeof SettingsSchema>; |