diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/controller/CompanyController.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/controller/CompanyController.java index 2815353a2..1134dfabc 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/controller/CompanyController.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/controller/CompanyController.java @@ -25,10 +25,10 @@ public ResponseEntity> getAllByCriteria( @RequestParam(value = "rows", defaultValue = "10") int rows, @RequestParam(value = "sortBy", defaultValue = "id") String sortBy, @RequestParam(value = "sortOrder", defaultValue = "ASC") String sortOrder, - @RequestParam(value = "name", defaultValue = "") String name + @RequestParam(value = "keyword", defaultValue = "") String keyword ) { Pageable pageable = PageRequest.of(page, rows, Sort.by(Sort.Direction.valueOf(sortOrder), sortBy)); - Page companyDtos = companyService.findAllWithCriteria(pageable, name); + Page companyDtos = companyService.findAllWithCriteria(pageable, keyword); return ResponseEntity.ok(companyDtos); } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/CompanyRepositoryCustom.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/CompanyRepositoryCustom.java index b405071e8..ae931f3a6 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/CompanyRepositoryCustom.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/CompanyRepositoryCustom.java @@ -7,9 +7,9 @@ public interface CompanyRepositoryCustom { /** * @param pageable l'objet de pagination - * @param name la chaîne de caractère à rechercher dans les champs name, description + * @param keyword la chaîne de caractère à rechercher dans les champs keyword, description * @return la liste de résultats paginée des Company correspondant aux critères */ - Page findAllWithCriteria(final Pageable pageable, final String name); + Page findAllWithCriteria(final Pageable pageable, final String keyword); } \ No newline at end of file diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/impl/CompanyRepositoryImpl.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/impl/CompanyRepositoryImpl.java index 449524bff..b9513c243 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/impl/CompanyRepositoryImpl.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/impl/CompanyRepositoryImpl.java @@ -22,7 +22,7 @@ public class CompanyRepositoryImpl implements CompanyRepositoryCustom { private final EntityManager entityManager; @Override - public Page findAllWithCriteria(Pageable pageable, String name) { + public Page findAllWithCriteria(Pageable pageable, String keyword) { CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery query = criteriaBuilder.createQuery(Company.class); Root queryRoot = query.from(Company.class); @@ -34,10 +34,10 @@ public Page findAllWithCriteria(Pageable pageable, String name) { } // recherche par mot clé dans le nom et description - if (StringUtils.isNotEmpty(name)) { - name = "%" + name + "%"; - Predicate namePredicate = criteriaBuilder.like(queryRoot.get("name"), name); - Predicate descriptionPredicate = criteriaBuilder.like(queryRoot.get("description"), name); + if (StringUtils.isNotEmpty(keyword)) { + keyword = "%" + keyword + "%"; + Predicate namePredicate = criteriaBuilder.like(queryRoot.get("name"), keyword); + Predicate descriptionPredicate = criteriaBuilder.like(queryRoot.get("description"), keyword); predicates.add(criteriaBuilder.or(namePredicate, descriptionPredicate)); } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/CompanyService.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/CompanyService.java index 480bd65aa..6937049bd 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/CompanyService.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/CompanyService.java @@ -25,8 +25,8 @@ public Page getAll(Pageable pageable) { .map(companyAdapter::toDto); } - public Page findAllWithCriteria(Pageable pageable, String name) { - return companyRepository.findAllWithCriteria(pageable, name) + public Page findAllWithCriteria(Pageable pageable, String keyword) { + return companyRepository.findAllWithCriteria(pageable, keyword) .map(companyAdapter::toDto); } diff --git a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/CompanyControllerTest.java b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/CompanyControllerTest.java index ce14fc03b..6492fd6c9 100644 --- a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/CompanyControllerTest.java +++ b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/CompanyControllerTest.java @@ -15,6 +15,7 @@ import java.util.List; import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.times; @@ -38,8 +39,9 @@ class CompanyControllerTest extends ControllerIntegrationTestBase { @BeforeEach protected void setUp() { companyDtos = Arrays.asList( - CompanyDto.builder().id(1L).description("description").name("Idemia").logo("logo").url("url").build(), - CompanyDto.builder().id(2L).description("description2").name("SG").logo("logo2").url("url2").build()); + CompanyDto.builder().id(1L).description("Société").name("Idemia").logo("logo").url("url").build(), + CompanyDto.builder().id(2L).description("description2").name("Société générale").logo("logo2").url("url2").build()); + } @WithMockUser @@ -68,6 +70,36 @@ void getCompanysListShouldListAllCompanies() throws Exception { verify(companyService, times(1)).getAll(any()); } + @WithMockUser + @Test + void getCompanysListShouldListAllCompaniesByCriteria() throws Exception { + //given + Page companyDtoPage = new PageImpl<>(companyDtos); + + //when + // test des données de pagination + given(companyService.findAllWithCriteria(DEFAULT_PAGEABLE, "société")).willReturn(companyDtoPage); + ResultActions actions = mvc.perform(get(BASE_URI).contentType(APPLICATION_JSON)); + + //then + actions.andDo(print()) + .andExpect(status().isOk()); + + // test des propriétés de chaque éléments de la liste reçue + for (int i = 0; i < companyDtos.size(); i++) { + final String contentPath = String.format("$.content[%d]", i); + actions.andExpect(jsonPath(contentPath + ".id", is(Math.toIntExact(companyDtos.get(i).getId())))) + .andExpect(jsonPath(contentPath + ".description", is(companyDtos.get(i).getDescription()))) + .andExpect(jsonPath(contentPath + ".name", is(companyDtos.get(i).getName()))) + .andExpect(jsonPath(contentPath + ".logo", is(companyDtos.get(i).getLogo()))) + .andExpect(jsonPath(contentPath + ".url", is(companyDtos.get(i).getUrl()))); + assertTrue(companyDtos.get(i).getName().contains("Société") || companyDtos.get(i).getDescription().contains("Société")); + + } + + verify(companyService, times(1)).getAll(any()); + } + @Test void getAllWithoutJwtShouldBeForbidden() throws Exception { mvc.perform(get(BASE_URI).contentType(APPLICATION_JSON)).andDo(print()) diff --git a/frontend-implicaction/src/app/admin/companies/components/companies-table/companies-table.component.ts b/frontend-implicaction/src/app/admin/companies/components/companies-table/companies-table.component.ts index f6b05490b..35eb82654 100644 --- a/frontend-implicaction/src/app/admin/companies/components/companies-table/companies-table.component.ts +++ b/frontend-implicaction/src/app/admin/companies/components/companies-table/companies-table.component.ts @@ -73,7 +73,7 @@ export class CompaniesTableComponent implements OnInit { this.pageable.totalElements = data.totalElements; this.pageable.content = data.content; }, - () => this.toastService.error('Oops', 'Une erreur est survenue lors de la récupération de la liste des offres') + () => this.toastService.error('Oops', 'Une erreur est survenue lors de la récupération de la liste des compagnies') ); } @@ -88,9 +88,14 @@ export class CompaniesTableComponent implements OnInit { this.filterService.setFilter(this.criteria); } + /** + * méthode qui ajoute les paramètres de l'url dans la variable correspondante + * la variable correspond à un critère de recherche ou à la pagination + * @private + */ private async getFilterFromQueryParams(): Promise { // TODO: voir si y'a un moyen plus élégant avec typeof - const filterKeys = ['name']; + const filterKeys = ['keyword']; const pageableKeys = ['rows', 'page', 'sortOrder', 'sortBy']; return new Promise(resolve => { this.route diff --git a/frontend-implicaction/src/app/company/enums/company-sort.enum.ts b/frontend-implicaction/src/app/company/enums/company-sort.enum.ts index e8f2f064a..3e8b3c338 100644 --- a/frontend-implicaction/src/app/company/enums/company-sort.enum.ts +++ b/frontend-implicaction/src/app/company/enums/company-sort.enum.ts @@ -10,8 +10,18 @@ export enum CompanySortEnumCode { * Représente les différents paramètres de tri des jobs */ export class CompanySortEnum extends EnumCodeLabelAbstract { - static readonly NAME_DESC = new CompanySortEnum(CompanySortEnumCode.NAME_DESC, 'Trier par ordre décroissant de l\'alphabet', 'name', SortDirectionEnum.DESC); - static readonly NAME_ASC = new CompanySortEnum(CompanySortEnumCode.NAME_ASC, 'Trier par ordre alphabétique ', 'name', SortDirectionEnum.ASC); + static readonly NAME_DESC = new CompanySortEnum( + CompanySortEnumCode.NAME_DESC, + 'Trier par ordre décroissant de l\'alphabet', + 'name', + SortDirectionEnum.DESC + ); + static readonly NAME_ASC = new CompanySortEnum( + CompanySortEnumCode.NAME_ASC, + 'Trier par ordre alphabétique ', + 'name', + SortDirectionEnum.ASC + ); /** * @param code code associé à la constante de tri @@ -23,7 +33,8 @@ export class CompanySortEnum extends EnumCodeLabelAbstract readonly code: CompanySortEnumCode, readonly label: string, readonly sortBy: string, - readonly sortDirection: SortDirectionEnum) { + readonly sortDirection: SortDirectionEnum + ) { super(code, label); } diff --git a/frontend-implicaction/src/app/core/services/api-endpoints.service.ts b/frontend-implicaction/src/app/core/services/api-endpoints.service.ts index 1aa0f00e5..bcfcbb467 100644 --- a/frontend-implicaction/src/app/core/services/api-endpoints.service.ts +++ b/frontend-implicaction/src/app/core/services/api-endpoints.service.ts @@ -71,6 +71,17 @@ export class ApiEndpointsService { }); } + private concatCriterias(criteria: CompanyCriteriaFilter, pageable: Pageable) { + const objectParam = { + ...criteria, + rows: pageable.rows, + page: pageable.page, + sortBy: pageable.sortBy, + sortOrder: pageable.sortOrder + }; + return objectParam; + } + /** * Auth */ @@ -229,18 +240,12 @@ export class ApiEndpointsService { */ getAllCompanyByCriteriaEndpoint(pageable: Pageable, criteria: CompanyCriteriaFilter): string { // on merge les filtres et les attributs de pagination - const objectParam = { - ...criteria, - rows: pageable.rows, - page: pageable.page, - sortBy: pageable.sortBy, - sortOrder: pageable.sortOrder - }; + const objectParam = this.concatCriterias(criteria, pageable); return ApiEndpointsService.createUrlWithQueryParameters( Uris.COMPANIES.BASE_URI, - (qs: QueryStringParameters) => { - this.buildQueryStringFromFilters(objectParam, qs); - }); + (qs: QueryStringParameters) => + this.buildQueryStringFromFilters(objectParam, qs) + ); } getAllCompanyEndpoint(pageable: Pageable): string { diff --git a/frontend-implicaction/src/app/job/models/company-criteria-filter.ts b/frontend-implicaction/src/app/job/models/company-criteria-filter.ts index e3f8f82e1..feaf7061d 100644 --- a/frontend-implicaction/src/app/job/models/company-criteria-filter.ts +++ b/frontend-implicaction/src/app/job/models/company-criteria-filter.ts @@ -1,3 +1,3 @@ export interface CompanyCriteriaFilter { - name?: string; + keyword?: string; } diff --git a/frontend-implicaction/src/app/shared/components/company-filter/company-filter.component.html b/frontend-implicaction/src/app/shared/components/company-filter/company-filter.component.html index 0b5150e53..92ea220c2 100644 --- a/frontend-implicaction/src/app/shared/components/company-filter/company-filter.component.html +++ b/frontend-implicaction/src/app/shared/components/company-filter/company-filter.component.html @@ -1,13 +1,13 @@
- + + #keyword>
diff --git a/frontend-implicaction/src/app/shared/components/company-filter/company-filter.component.ts b/frontend-implicaction/src/app/shared/components/company-filter/company-filter.component.ts index 9389cd95d..5710a59d6 100644 --- a/frontend-implicaction/src/app/shared/components/company-filter/company-filter.component.ts +++ b/frontend-implicaction/src/app/shared/components/company-filter/company-filter.component.ts @@ -20,8 +20,8 @@ export class CompanyFilterComponent implements OnInit { .subscribe(criteria => this.criteria = criteria); } - onNameChange(name: string): void { - this.criteria.name = name; + onKeywordChange(keyword: string): void { + this.criteria.keyword = keyword; this.filterContextService.setFilter(this.criteria); } } diff --git a/frontend-implicaction/src/app/shared/shared.module.ts b/frontend-implicaction/src/app/shared/shared.module.ts index 09285e673..fddc5568b 100644 --- a/frontend-implicaction/src/app/shared/shared.module.ts +++ b/frontend-implicaction/src/app/shared/shared.module.ts @@ -26,8 +26,8 @@ import {BaseWithPaginationComponent} from './components/base-with-pagination-com ContractTypeComponent, DateTimelapseComponent, JobFilterComponent, - CompanyFilterComponent BaseWithPaginationComponent, + CompanyFilterComponent ], exports: [ HeaderComponent,