import { Controller, Get, Post, Query, } from '@nestjs/common'; import { ApiTags, ApiOperation, ApiBearerAuth, ApiQuery } from '@nestjs/swagger'; import { SearchService } from './search.service'; import { Public } from '../auth/decorators/public.decorator'; @ApiTags('search') @Controller('search') export class SearchController { constructor(private searchService: SearchService) {} @Get('courses') @Public() @ApiOperation({ summary: 'Search courses' }) @ApiQuery({ name: 'q', required: true, description: 'Search query' }) @ApiQuery({ name: 'categoryId', required: false }) @ApiQuery({ name: 'difficulty', required: false, enum: ['beginner', 'intermediate', 'advanced'] }) @ApiQuery({ name: 'tags', required: false, type: [String] }) @ApiQuery({ name: 'priceMin', required: false, type: Number }) @ApiQuery({ name: 'priceMax', required: false, type: Number }) @ApiQuery({ name: 'sort', required: false, enum: ['newest', 'oldest', 'price_asc', 'price_desc', 'title_asc', 'title_desc'] }) @ApiQuery({ name: 'page', required: false, type: Number }) @ApiQuery({ name: 'limit', required: false, type: Number }) async searchCourses( @Query('q') query: string, @Query('categoryId') categoryId?: string, @Query('difficulty') difficulty?: string, @Query('tags') tags?: string[], @Query('priceMin') priceMin?: number, @Query('priceMax') priceMax?: number, @Query('sort') sort?: string, @Query('page') page?: number, @Query('limit') limit?: number ) { return this.searchService.searchCourses(query, { categoryId, difficulty, tags: tags ? (Array.isArray(tags) ? tags : [tags]) : undefined, priceMin, priceMax, sort, page, limit, publishedOnly: true, }); } @Post('reindex') @ApiBearerAuth() @ApiOperation({ summary: 'Reindex all courses (admin only)' }) async reindexAll() { return this.searchService.reindexAllCourses(); } }