Skip to content

Commit 96dffb9

Browse files
committed
added list courses and filter
1 parent d2372e8 commit 96dffb9

File tree

6 files changed

+60
-11
lines changed

6 files changed

+60
-11
lines changed

Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ start-mooc-backend: build
3838
start-backoffice-frontend: build
3939
docker-compose up $(BACKOFFICE_APP_NAME)-frontend && docker-compose down
4040

41+
# Start backoffice backend app
42+
start-backoffice-backend: build
43+
docker-compose up $(BACKOFFICE_APP_NAME)-backend && docker-compose down
44+
4145
# Clean containers
4246
clean:
4347
docker-compose down --rmi local --volumes --remove-orphans

docker-compose.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ services:
2929
ports:
3030
- 8032:8032
3131

32+
backoffice-backend:
33+
<<: *default-app
34+
command: bash -c "npm run build && npm run start:backoffice:backend"
35+
ports:
36+
- 3001:3000
37+
3238
mongo:
3339
image: mongo:3.4.6
3440
volumes:

src/Contexts/Shared/infrastructure/persistence/elasticsearch/ElasticCriteriaConverter.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import { Filters } from '../../../domain/criteria/Filters';
66

77
export enum TypeQueryEnum {
88
TERMS = 'terms',
9-
MATCH = 'match',
109
MATCH_ALL = 'match_all',
11-
RANGE = 'range'
10+
RANGE = 'range',
11+
WILDCARD = 'wildcard'
1212
}
1313

1414
type QueryObject = { type: TypeQueryEnum; field: string; value: string | object };
@@ -26,8 +26,8 @@ export class ElasticCriteriaConverter {
2626
[Operator.NOT_EQUAL, this.termsQuery],
2727
[Operator.GT, this.greaterThanQuery],
2828
[Operator.LT, this.lowerThanQuery],
29-
[Operator.CONTAINS, this.matchQuery],
30-
[Operator.NOT_CONTAINS, this.matchQuery]
29+
[Operator.CONTAINS, this.wildcardQuery],
30+
[Operator.NOT_CONTAINS, this.wildcardQuery]
3131
]);
3232
}
3333

@@ -84,7 +84,7 @@ export class ElasticCriteriaConverter {
8484
return { type: TypeQueryEnum.RANGE, field: filter.field.value, value: { lt: filter.value.value } };
8585
}
8686

87-
private matchQuery(filter: Filter): QueryObject {
88-
return { type: TypeQueryEnum.MATCH, field: filter.field.value, value: filter.value.value };
87+
private wildcardQuery(filter: Filter): QueryObject {
88+
return { type: TypeQueryEnum.WILDCARD, field: filter.field.value, value: `*${filter.value.value}*` };
8989
}
9090
}

src/apps/backoffice/backend/controllers/CoursesGetController.ts

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,51 @@
11
import { Request, Response } from 'express';
22
import httpStatus from 'http-status';
33
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';
55
import { BackofficeCourse } from '../../../../Contexts/Backoffice/Courses/domain/BackofficeCourse';
66
import { QueryBus } from '../../../../Contexts/Shared/domain/QueryBus';
77
import { Controller } from './Controller';
88

9+
type FilterType = { value: string; operator: string; field: string };
910
export class CoursesGetController implements Controller {
1011
constructor(private queryBus: QueryBus) {}
1112

1213
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+
1425
const queryResponse: BackofficeCoursesResponse = await this.queryBus.ask(query);
1526

1627
res.header('Access-Control-Allow-Origin', '*');
1728
res.status(httpStatus.OK).send(this.toResponse(queryResponse.courses));
1829
}
1930

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+
2049
private toResponse(courses: Array<BackofficeCourse>) {
2150
return courses.map(course => ({
2251
id: course.id.toString(),

src/apps/backoffice/backend/dependency-injection/Courses/application.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,16 @@ services:
2323
tags:
2424
- { name: 'queryHandler' }
2525

26+
Backoffice.courses.CoursesByCriteriaSearcher:
27+
class: ../../../../../Contexts/Backoffice/Courses/application/SearchByCriteria/CoursesByCriteriaSearcher
28+
arguments: ['@Backoffice.courses.BackofficeCourseRepository']
29+
30+
Backoffice.courses.SearchCoursesByCriteriaQueryHandler:
31+
class: ../../../../../Contexts/Backoffice/Courses/application/SearchByCriteria/SearchCoursesByCriteriaQueryHandler
32+
arguments: ['@Backoffice.courses.CoursesByCriteriaSearcher']
33+
tags:
34+
- { name: 'queryHandler' }
35+
2636
Backoffice.courses.BackofficeCourseCreator:
2737
class: ../../../../../Contexts/Backoffice/Courses/application/Create/BackofficeCourseCreator
2838
arguments: ['@Backoffice.courses.BackofficeCourseRepository']

src/apps/backoffice/frontend/templates/pages/courses/partials/list_courses.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<h3 class="font-sans text-gray-800 text-center text-3xl mb-10">Cursos existentes</h3>
22

3-
<!-- <form action="" method="get" id="courses-filters" name="filter-courses">
3+
<form action="" method="get" id="courses-filters" name="filter-courses">
44
<div id="filter-rows">
55

66
</div>
@@ -18,7 +18,7 @@ <h3 class="font-sans text-gray-800 text-center text-3xl mb-10">Cursos existentes
1818
👉 Filtrar 👈
1919
</button>
2020
</div>
21-
</form> -->
21+
</form>
2222

2323
<table class="text-left w-full border-collapse">
2424
<thead>
@@ -139,7 +139,7 @@ <h3 class="font-sans text-gray-800 text-center text-3xl mb-10">Cursos existentes
139139

140140
const urlParts = inputs.map(input => input.name + "=" + input.value);
141141

142-
const url = "http://localhost:8040/courses?" + urlParts.join("&");
142+
const url = "http://localhost:3000/courses?" + urlParts.join("&");
143143

144144
addCoursesList(url);
145145
}

0 commit comments

Comments
 (0)