diff --git a/maternal-app/maternal-app-backend/src/modules/invite-codes/invite-codes.controller.ts b/maternal-app/maternal-app-backend/src/modules/invite-codes/invite-codes.controller.ts index 27a35fc..bdfc995 100644 --- a/maternal-app/maternal-app-backend/src/modules/invite-codes/invite-codes.controller.ts +++ b/maternal-app/maternal-app-backend/src/modules/invite-codes/invite-codes.controller.ts @@ -9,11 +9,14 @@ import { Query, UseGuards, Request, + Patch, } from '@nestjs/common'; import { InviteCodesService } from './invite-codes.service'; import { CreateInviteCodeDto, UpdateInviteCodeDto } from './invite-codes.dto'; +import { AdminGuard } from '../../common/guards/admin.guard'; @Controller('api/v1/admin/invite-codes') +@UseGuards(AdminGuard) export class InviteCodesController { constructor(private readonly inviteCodesService: InviteCodesService) {} @@ -57,6 +60,11 @@ export class InviteCodesController { return this.inviteCodesService.update(id, dto); } + @Patch(':id') + async patch(@Param('id') id: string, @Body() dto: UpdateInviteCodeDto) { + return this.inviteCodesService.update(id, dto); + } + @Delete(':id') async remove(@Param('id') id: string) { await this.inviteCodesService.delete(id); diff --git a/parentflow-admin/src/app/invite-codes/page.tsx b/parentflow-admin/src/app/invite-codes/page.tsx index 0f17a43..4d99500 100644 --- a/parentflow-admin/src/app/invite-codes/page.tsx +++ b/parentflow-admin/src/app/invite-codes/page.tsx @@ -17,7 +17,6 @@ import { Switch, Alert, Tooltip, - Grid, } from '@mui/material'; import { DataGrid, GridColDef } from '@mui/x-data-grid'; import { @@ -178,7 +177,7 @@ export default function InviteCodesPage() { width: 100, renderCell: (params) => ( - {params.value} / {params.row.maxUses || '∞'} + {params.value.toLocaleString()} / {params.row.maxUses?.toLocaleString() || '∞'} ), }, @@ -255,50 +254,42 @@ export default function InviteCodesPage() { - - - - - Total Codes - - {inviteCodes.length} - - - - - - Active Codes - - - {inviteCodes.filter(c => c.isActive).length} - - - - - - - Total Uses - - - {inviteCodes.reduce((sum, c) => sum + c.uses, 0)} - - - - - - - Available - - - {inviteCodes.filter(c => { - const isExpired = c.expiresAt && new Date(c.expiresAt) < new Date(); - const isMaxedOut = c.maxUses && c.uses >= c.maxUses; - return c.isActive && !isExpired && !isMaxedOut; - }).length} - - - - + + + + Total Codes + + {inviteCodes.length.toLocaleString()} + + + + Active Codes + + + {inviteCodes.filter(c => c.isActive).length.toLocaleString()} + + + + + Total Uses + + + {inviteCodes.reduce((sum, c) => sum + c.uses, 0).toLocaleString()} + + + + + Available + + + {inviteCodes.filter(c => { + const isExpired = c.expiresAt && new Date(c.expiresAt) < new Date(); + const isMaxedOut = c.maxUses && c.uses >= c.maxUses; + return c.isActive && !isExpired && !isMaxedOut; + }).length.toLocaleString()} + + +