feat(auth): add module read/write admin RBAC

Introduce permission catalog, PermissionsGuard, JWT/me payload with
role+permissions, and gate all module controllers. Admins CRUD accepts
role/permissions with safety rules; migrate existing users to super_admin.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-10 15:29:04 +03:30
co-authored by Cursor
parent 4b3a8a1d6c
commit af1e217a68
28 changed files with 532 additions and 75 deletions
@@ -1,10 +1,12 @@
import { Module } from '@nestjs/common';
import { AuthModule } from '../auth/auth.module';
import { AdminNotifyService } from './admin-notify.service';
import { CentralSmsService } from './central-sms.service';
import { RuntimeSettingsController } from './runtime-settings.controller';
import { RuntimeSettingsService } from './runtime-settings.service';
@Module({
imports: [AuthModule],
controllers: [RuntimeSettingsController],
providers: [CentralSmsService, AdminNotifyService, RuntimeSettingsService],
exports: [CentralSmsService, AdminNotifyService, RuntimeSettingsService],
@@ -1,19 +1,23 @@
import { Body, Controller, Get, Patch, UseGuards } from '@nestjs/common';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
import { PermissionsGuard } from '../auth/permissions.guard';
import { RequirePermissions } from '../auth/permissions.decorator';
import { UpdateAdminSmsDto } from './dto/update-admin-sms.dto';
import { RuntimeSettingsService } from './runtime-settings.service';
@Controller('settings')
@UseGuards(JwtAuthGuard)
@UseGuards(JwtAuthGuard, PermissionsGuard)
export class RuntimeSettingsController {
constructor(private readonly settings: RuntimeSettingsService) {}
@Get('admin-sms')
@RequirePermissions('settings:write')
getAdminSms() {
return this.settings.getPublic();
}
@Patch('admin-sms')
@RequirePermissions('settings:write')
setAdminSms(@Body() dto: UpdateAdminSmsDto) {
this.settings.setAdminSmsEnabled(dto.enabled);
return this.settings.getPublic();