Files
mp-pilates/packages/server/src/membership/membership.controller.ts
richarjiang 593a6e5453 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
2026-04-02 12:24:07 +08:00

69 lines
2.4 KiB
TypeScript

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)
}
}