feat(server): add membership and time-slot modules
Membership: card type CRUD, deduction/restore logic, valid card lookup (15 tests) TimeSlot: slot generation from week templates, availability query with booking status, admin management, cleanup tasks (26 tests) 65 total tests passing
This commit is contained in:
68
packages/server/src/membership/membership.controller.ts
Normal file
68
packages/server/src/membership/membership.controller.ts
Normal file
@@ -0,0 +1,68 @@
|
||||
import {
|
||||
Body,
|
||||
Controller,
|
||||
Delete,
|
||||
Get,
|
||||
Param,
|
||||
Post,
|
||||
Put,
|
||||
UseGuards,
|
||||
} from '@nestjs/common'
|
||||
import { UserRole } from '@mp-pilates/shared'
|
||||
import { JwtAuthGuard } from '../auth/jwt-auth.guard'
|
||||
import { Roles } from '../auth/roles.decorator'
|
||||
import { RolesGuard } from '../auth/roles.guard'
|
||||
import { CurrentUser } from '../common/decorators/current-user.decorator'
|
||||
import { CreateCardTypeDto } from './dto/create-card-type.dto'
|
||||
import { UpdateCardTypeDto } from './dto/update-card-type.dto'
|
||||
import { MembershipService } from './membership.service'
|
||||
|
||||
@Controller()
|
||||
export class MembershipController {
|
||||
constructor(private readonly membershipService: MembershipService) {}
|
||||
|
||||
// ─── Public ────────────────────────────────────────────────────────────────
|
||||
|
||||
@Get('membership/card-types')
|
||||
getActiveCardTypes() {
|
||||
return this.membershipService.getActiveCardTypes()
|
||||
}
|
||||
|
||||
// ─── User ──────────────────────────────────────────────────────────────────
|
||||
|
||||
@Get('membership/my')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
getUserMemberships(@CurrentUser('sub') userId: string) {
|
||||
return this.membershipService.getUserMemberships(userId)
|
||||
}
|
||||
|
||||
// ─── Admin ─────────────────────────────────────────────────────────────────
|
||||
|
||||
@Get('admin/card-types')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles(UserRole.ADMIN)
|
||||
getAllCardTypes() {
|
||||
return this.membershipService.getAllCardTypes()
|
||||
}
|
||||
|
||||
@Post('admin/card-types')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles(UserRole.ADMIN)
|
||||
createCardType(@Body() dto: CreateCardTypeDto) {
|
||||
return this.membershipService.createCardType(dto)
|
||||
}
|
||||
|
||||
@Put('admin/card-types/:id')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles(UserRole.ADMIN)
|
||||
updateCardType(@Param('id') id: string, @Body() dto: UpdateCardTypeDto) {
|
||||
return this.membershipService.updateCardType(id, dto)
|
||||
}
|
||||
|
||||
@Delete('admin/card-types/:id')
|
||||
@UseGuards(JwtAuthGuard, RolesGuard)
|
||||
@Roles(UserRole.ADMIN)
|
||||
deleteCardType(@Param('id') id: string) {
|
||||
return this.membershipService.deleteCardType(id)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user