File size: 2,999 Bytes
910c878
 
6cd3ae1
910c878
6cd3ae1
910c878
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6cd3ae1
 
910c878
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import { Controller, Get, Query, Param, UseGuards, Req } from '@nestjs/common';
import { CoursesService, CourseFilters } from './courses.service';
import { ApiTags, ApiOperation, ApiBearerAuth, ApiQuery, ApiSecurity } from '@nestjs/swagger';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
import { AdminKeyGuard } from '../auth/admin-key.guard';

@ApiTags('Courses')
@Controller('courses')
export class CoursesController {
  constructor(private readonly coursesService: CoursesService) {}

  // ─── GET /courses/me ──────────────────────────────────────────────────────
  @Get('me')
  @UseGuards(JwtAuthGuard)
  @ApiBearerAuth()
  @ApiOperation({ summary: 'Get personalized courses for logged-in user' })
  @ApiQuery({ name: 'search',   required: false })
  @ApiQuery({ name: 'platform', required: false, enum: ['edX', 'YouTube', 'Coursera', 'Udemy'] })
  @ApiQuery({ name: 'level',    required: false, enum: ['Beginner', 'Intermediate', 'Advanced', 'All Levels'] })
  @ApiQuery({ name: 'category', required: false })
  @ApiQuery({ name: 'price',    required: false, enum: ['Free', 'Paid'] })
  @ApiQuery({ name: 'language', required: false })
  @ApiQuery({ name: 'page',     required: false, type: Number })
  @ApiQuery({ name: 'limit',    required: false, type: Number })
  getMyCourses(@Req() req: any, @Query() filters: CourseFilters) {
    return this.coursesService.getUserCoursesFiltered(req.user.id, filters);
  }

  // ─── GET /courses/me/stats ────────────────────────────────────────────────
  @Get('me/stats')
  @UseGuards(JwtAuthGuard)
  @ApiBearerAuth()
  @ApiOperation({ summary: 'Get course stats for logged-in user'
   })
  getMyStats(@Req() req: any) {
    return this.coursesService.getUserStats(req.user.id);
  }

  // ─── GET /courses/me/filters ──────────────────────────────────────────────
  @Get('me/filters')
  @UseGuards(JwtAuthGuard)
  @ApiBearerAuth()
  @ApiOperation({ summary: 'Get available filter options for logged-in user courses' })
  getMyFilters(@Req() req: any) {
    return this.coursesService.getUserFilterOptions(req.user.id);
  }

  // ─── GET /courses/user/:userId β€” admin ────────────────────────────────────
  @Get('user/:userId')
  @UseGuards(AdminKeyGuard)
  @ApiSecurity('admin-key')
  @ApiOperation({ summary: 'Admin: get personalized courses for any user' })
  @ApiQuery({ name: 'page',  required: false, type: Number })
  @ApiQuery({ name: 'limit', required: false, type: Number })
  getUserCourses(@Param('userId') userId: string, @Query() filters: CourseFilters) {
    return this.coursesService.getUserCoursesFiltered(userId, filters);
  }
}