From 6fa8f6c5d8a076719f4eac43b24350be0b071774 Mon Sep 17 00:00:00 2001 From: Vantz Stockwell Date: Thu, 12 Mar 2026 17:09:08 -0400 Subject: [PATCH] =?UTF-8?q?feat:=20settings=20=E2=80=94=20key/value=20stor?= =?UTF-8?q?e=20with=20CRUD=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- backend/src/settings/settings.controller.ts | 19 +++++++++++ backend/src/settings/settings.module.ts | 10 ++++++ backend/src/settings/settings.service.ts | 36 +++++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 backend/src/settings/settings.controller.ts create mode 100644 backend/src/settings/settings.module.ts create mode 100644 backend/src/settings/settings.service.ts diff --git a/backend/src/settings/settings.controller.ts b/backend/src/settings/settings.controller.ts new file mode 100644 index 0000000..10d99eb --- /dev/null +++ b/backend/src/settings/settings.controller.ts @@ -0,0 +1,19 @@ +import { Controller, Get, Put, Body, UseGuards } from '@nestjs/common'; +import { JwtAuthGuard } from '../auth/jwt-auth.guard'; +import { SettingsService } from './settings.service'; + +@UseGuards(JwtAuthGuard) +@Controller('settings') +export class SettingsController { + constructor(private settings: SettingsService) {} + + @Get() + getAll() { + return this.settings.getAll(); + } + + @Put() + update(@Body() body: Record) { + return this.settings.setMany(body); + } +} diff --git a/backend/src/settings/settings.module.ts b/backend/src/settings/settings.module.ts new file mode 100644 index 0000000..7114b26 --- /dev/null +++ b/backend/src/settings/settings.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { SettingsService } from './settings.service'; +import { SettingsController } from './settings.controller'; + +@Module({ + providers: [SettingsService], + controllers: [SettingsController], + exports: [SettingsService], +}) +export class SettingsModule {} diff --git a/backend/src/settings/settings.service.ts b/backend/src/settings/settings.service.ts new file mode 100644 index 0000000..6255908 --- /dev/null +++ b/backend/src/settings/settings.service.ts @@ -0,0 +1,36 @@ +import { Injectable } from '@nestjs/common'; +import { PrismaService } from '../prisma/prisma.service'; + +@Injectable() +export class SettingsService { + constructor(private prisma: PrismaService) {} + + async getAll(): Promise> { + const settings = await this.prisma.setting.findMany(); + return Object.fromEntries(settings.map((s) => [s.key, s.value])); + } + + async get(key: string): Promise { + const setting = await this.prisma.setting.findUnique({ where: { key } }); + return setting?.value ?? null; + } + + async set(key: string, value: string) { + return this.prisma.setting.upsert({ + where: { key }, + update: { value }, + create: { key, value }, + }); + } + + async setMany(settings: Record) { + const ops = Object.entries(settings).map(([key, value]) => + this.prisma.setting.upsert({ where: { key }, update: { value }, create: { key, value } }), + ); + return this.prisma.$transaction(ops); + } + + async remove(key: string) { + return this.prisma.setting.delete({ where: { key } }).catch(() => null); + } +}