Files
Lucky_Wheel/apps/api/src/modules/prize/admin-prize.controller.ts
T
s.esmaeili c5a841c35f feat(rbac): implement full admin management, dynamic roles, permissions matrix, and workspace access control
- Add Workspace, Role, Permission, RolePermission, AdminRoleAssignment, and AdminWorkspaceAssignment models to Prisma schema\n- Create database migration and RBAC seed script\n- Implement PermissionsGuard, @RequirePermission decorator, and real-time permission resolution in JwtAdminStrategy\n- Implement AdminManagementModule with endpoints for managers CRUD, roles matrix, permissions catalog, and workspaces\n- Secure all sensitive admin controllers with granular permission requirements\n- Add useAuthStore helpers (can, canAny, fetchMe) and v-permission directive\n- Implement Desktop views: AdminListView, AdminFormDrawer (RTL right-side), RoleMatrixView, WorkspaceListView, and ForbiddenView\n- Implement Mobile views: MAdminListView, MAdminFormView (stepped mobile form), MRoleMatrixView, MWorkspaceListView, and MForbiddenView\n- Fix sticky header behavior across desktop and mobile shells\n- Update route guards and device detection logic for mobile prefixing
2026-10-02 16:29:23 +03:30

78 lines
2.8 KiB
TypeScript

import {
Body,
Controller,
Delete,
Get,
Param,
Patch,
Post,
Put,
UseGuards,
UseInterceptors,
} from '@nestjs/common';
import { ApiBearerAuth, ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { JwtAdminGuard } from '../../common/guards/jwt-admin.guard';
import { PermissionsGuard } from '../../common/guards/permissions.guard';
import { RequirePermission } from '../../common/decorators/require-permission.decorator';
import { AuditInterceptor } from '../../common/interceptors/audit.interceptor';
import { CreatePrizeDto } from './dto/create-prize.dto';
import { UpdatePrizeDto } from './dto/update-prize.dto';
import { UpdateStockDto } from './dto/update-stock.dto';
import { PrizeService } from './prize.service';
@ApiTags('Admin Prizes (مدیریت جوایز)')
@Controller('admin')
@UseGuards(JwtAdminGuard, PermissionsGuard)
@UseInterceptors(AuditInterceptor)
@ApiBearerAuth('AdminAuth')
export class AdminPrizeController {
constructor(private readonly prizeService: PrizeService) {}
@Post('campaigns/:campaignId/prizes')
@RequirePermission('prizes:manage')
@ApiOperation({ summary: 'ایجاد جایزه جدید برای یک کمپین' })
@ApiResponse({ status: 201, description: 'جایزه با موفقیت به کمپین اضافه شد' })
async create(
@Param('campaignId') campaignId: string,
@Body() dto: CreatePrizeDto,
) {
return this.prizeService.create(campaignId, dto);
}
@Get('campaigns/:campaignId/prizes')
@RequirePermission('prizes:read')
@ApiOperation({ summary: 'لیست تمام جوایز تعریف‌شده برای یک کمپین' })
async findByCampaign(@Param('campaignId') campaignId: string) {
return this.prizeService.findByCampaign(campaignId);
}
@Get('prizes/:id')
@RequirePermission('prizes:read')
@ApiOperation({ summary: 'دریافت مشخصات کامل یک جایزه' })
async findOne(@Param('id') id: string) {
return this.prizeService.findOne(id);
}
@Patch('prizes/:id')
@Put('prizes/:id')
@RequirePermission('prizes:manage')
@ApiOperation({ summary: 'ویرایش اطلاعات و وزن جایزه' })
async update(@Param('id') id: string, @Body() dto: UpdatePrizeDto) {
return this.prizeService.update(id, dto);
}
@Patch('prizes/:id/stock')
@RequirePermission('prizes:manage')
@ApiOperation({ summary: 'شارژ یا اصلاح دستی موجودی جایزه' })
async updateStock(@Param('id') id: string, @Body() dto: UpdateStockDto) {
return this.prizeService.updateStock(id, dto);
}
@Delete('prizes/:id')
@RequirePermission('prizes:manage')
@ApiOperation({ summary: 'حذف جایزه (در صورت عدم ثبت در نتایج قرعه‌کشی)' })
async remove(@Param('id') id: string) {
return this.prizeService.remove(id);
}
}