|
1 | 1 | import { Request, Response } from 'express'; |
2 | 2 | import httpStatus from 'http-status'; |
3 | 3 | import { BackofficeCoursesResponse } from '../../../../Contexts/Backoffice/Courses/application/BackofficeCoursesResponse'; |
4 | | -import { SearchAllCoursesQuery } from '../../../../Contexts/Backoffice/Courses/application/SearchAll/SearchAllCoursesQuery'; |
| 4 | +import { SearchCoursesByCriteriaQuery } from '../../../../Contexts/Backoffice/Courses/application/SearchByCriteria/SearchCoursesByCriteriaQuery'; |
5 | 5 | import { BackofficeCourse } from '../../../../Contexts/Backoffice/Courses/domain/BackofficeCourse'; |
6 | 6 | import { QueryBus } from '../../../../Contexts/Shared/domain/QueryBus'; |
7 | 7 | import { Controller } from './Controller'; |
8 | 8 |
|
| 9 | +type FilterType = { value: string; operator: string; field: string }; |
9 | 10 | export class CoursesGetController implements Controller { |
10 | 11 | constructor(private queryBus: QueryBus) {} |
11 | 12 |
|
12 | 13 | async run(_req: Request, res: Response) { |
13 | | - const query = new SearchAllCoursesQuery(); |
| 14 | + const { query: queryParams } = _req; |
| 15 | + const { filters, orderBy, order, limit, offset } = queryParams; |
| 16 | + |
| 17 | + const query = new SearchCoursesByCriteriaQuery( |
| 18 | + this.parseFilters(filters as Array<FilterType>), |
| 19 | + orderBy as string, |
| 20 | + order as string, |
| 21 | + limit ? Number(limit) : undefined, |
| 22 | + offset ? Number(offset) : undefined |
| 23 | + ); |
| 24 | + |
14 | 25 | const queryResponse: BackofficeCoursesResponse = await this.queryBus.ask(query); |
15 | 26 |
|
16 | 27 | res.header('Access-Control-Allow-Origin', '*'); |
17 | 28 | res.status(httpStatus.OK).send(this.toResponse(queryResponse.courses)); |
18 | 29 | } |
19 | 30 |
|
| 31 | + private parseFilters(params: Array<FilterType>): Array<Map<string, string>> { |
| 32 | + if (!params) { |
| 33 | + return new Array<Map<string, string>>(); |
| 34 | + } |
| 35 | + |
| 36 | + return params.map(filter => { |
| 37 | + const field = filter.field; |
| 38 | + const value = filter.value; |
| 39 | + const operator = filter.operator; |
| 40 | + |
| 41 | + return new Map([ |
| 42 | + ['field', field], |
| 43 | + ['operator', operator], |
| 44 | + ['value', value] |
| 45 | + ]); |
| 46 | + }); |
| 47 | + } |
| 48 | + |
20 | 49 | private toResponse(courses: Array<BackofficeCourse>) { |
21 | 50 | return courses.map(course => ({ |
22 | 51 | id: course.id.toString(), |
|
0 commit comments