import { Controller, Get, Post, Patch, Param, Query, HttpCode, HttpStatus } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiBearerAuth, ApiQuery } from '@nestjs/swagger'; import { CatalogService } from './catalog.service'; import { CurrentUser } from '../auth/decorators/current-user.decorator'; import { Public } from '../auth/decorators/public.decorator'; import { User } from '@coursecraft/database'; @ApiTags('catalog') @Controller('catalog') export class CatalogController { constructor(private catalogService: CatalogService) {} @Public() @Get() @ApiOperation({ summary: 'Browse published courses (public)' }) async browseCourses( @Query('page') page?: number, @Query('limit') limit?: number, @Query('search') search?: string, @Query('difficulty') difficulty?: string, ): Promise { return this.catalogService.getPublishedCourses({ page, limit, search, difficulty }); } @Public() @Get(':id') @ApiOperation({ summary: 'Get public course details' }) async getCourse(@Param('id') id: string): Promise { return this.catalogService.getPublicCourse(id); } @Post(':id/submit') @ApiBearerAuth() @HttpCode(HttpStatus.OK) @ApiOperation({ summary: 'Submit course for review / publish' }) async submitForReview(@Param('id') id: string, @CurrentUser() user: User): Promise { return this.catalogService.publishCourse(id, user.id); } @Patch(':id/verify') @ApiBearerAuth() @ApiOperation({ summary: 'Toggle author verification badge' }) async toggleVerify(@Param('id') id: string, @CurrentUser() user: User): Promise { return this.catalogService.toggleVerification(id, user.id); } }