import { Request, Response } from 'express'; import { z } from 'zod'; import settingsService from '../services/settings.service'; import logger from '../utils/logger'; const updateSchema = z.object({ value: z.any(), }); const externalLinkSchema = z.array(z.object({ name: z.string().min(1).max(200), url: z.string().url().max(500), })); class SettingsController { async getAll(_req: Request, res: Response): Promise { try { const settings = await settingsService.getAll(); res.json({ success: true, data: settings }); } catch (error) { logger.error('Failed to get settings', { error }); res.status(500).json({ success: false, message: 'Failed to get settings' }); } } async get(req: Request, res: Response): Promise { try { const setting = await settingsService.get(req.params.key as string); if (!setting) { res.status(404).json({ success: false, message: 'Setting not found' }); return; } res.json({ success: true, data: setting }); } catch (error) { logger.error('Failed to get setting', { error }); res.status(500).json({ success: false, message: 'Failed to get setting' }); } } async update(req: Request, res: Response): Promise { try { const { value } = updateSchema.parse(req.body); // Validate external_links specifically if ((req.params.key as string) === 'external_links') { externalLinkSchema.parse(value); } const setting = await settingsService.set(req.params.key as string, value, req.user!.id); res.json({ success: true, data: setting }); } catch (error) { if (error instanceof z.ZodError) { res.status(400).json({ success: false, message: 'Invalid input', errors: error.issues }); return; } logger.error('Failed to update setting', { error }); res.status(500).json({ success: false, message: 'Failed to update setting' }); } } } export default new SettingsController();