From acd055f1d030a7d03b0f5b82c68eb27121478ed7 Mon Sep 17 00:00:00 2001 From: Matthieu Audemard Date: Tue, 23 Nov 2021 18:22:39 +0100 Subject: [PATCH 1/5] RI-44: [job-board] permet l'ajout d'un job au job-board --- .../adapter/JobApplicationAdapter.java | 2 +- .../controller/JobPostingController.java | 6 +- .../dto/JobApplicationDto.java | 3 +- .../dto/JobApplicationRequest.java | 2 - .../dto/JobPostingDto.java | 1 + .../model/ApplyStatusEnum.java | 2 +- .../repository/JobApplicationRepository.java | 6 +- .../service/JobApplicationService.java | 6 +- .../service/JobPostingService.java | 28 ++++++- .../adapter/JobApplicationAdapterTest.java | 4 +- .../JobApplicationControllerTest.java | 12 +-- .../controller/JobsPostingControllerTest.java | 28 ++++--- .../service/JobApplicationServiceTest.java | 8 +- .../service/JobPostingServiceTest.java | 78 +++++++++++++++++++ .../src/app/board/board.component.ts | 54 +++++-------- .../apply-card/apply-card.component.html | 2 +- .../apply-card/apply-card.component.scss | 2 +- .../src/app/board/models/job-application.ts | 2 +- .../app/board/services/job-board.service.ts | 4 + .../core/services/api-endpoints.service.ts | 9 ++- .../job-card/job-card.component.html | 11 ++- .../components/job-card/job-card.component.ts | 15 ++-- .../jobs-list/jobs-list.component.ts | 2 +- .../src/app/job/services/job.service.ts | 4 +- .../src/app/shared/enums/univers.ts | 2 +- .../src/app/shared/models/job-posting.ts | 1 + 26 files changed, 204 insertions(+), 90 deletions(-) create mode 100644 backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/JobPostingServiceTest.java diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/adapter/JobApplicationAdapter.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/adapter/JobApplicationAdapter.java index fa2730d5..79c2238b 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/adapter/JobApplicationAdapter.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/adapter/JobApplicationAdapter.java @@ -20,7 +20,7 @@ public JobApplicationDto toDto(JobApplication model) { .jobTitle(job.getTitle()) .companyName(companyName) .companyImageUri(companyImageUrl) - .status(model.getStatus()) + .statusCode(model.getStatus().name()) .contractType(job.getContractType()) .build(); } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/controller/JobPostingController.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/controller/JobPostingController.java index 2162d97d..b6bf217d 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/controller/JobPostingController.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/controller/JobPostingController.java @@ -35,10 +35,12 @@ public ResponseEntity> getAllByCriteria( @RequestParam(value = "sortBy", defaultValue = "id") String sortBy, @RequestParam(value = "sortOrder", defaultValue = "ASC") String sortOrder, @RequestParam(value = "search", defaultValue = "") String search, - @RequestParam(value = "contractType", defaultValue = "") String contractType + @RequestParam(value = "contractType", required = false) String contractType, + @RequestParam(value = "checkApply", required = false) String applyCheckAsString ) { Pageable pageable = PageRequest.of(page, rows, Sort.by(Sort.Direction.valueOf(sortOrder), sortBy)); - Page jobPostingDtos = jobPostingService.findAllWithCriteria(pageable, search, contractType); + final boolean applyCheck = Boolean.parseBoolean(applyCheckAsString); + Page jobPostingDtos = jobPostingService.getAllWithCriteria(pageable, search, contractType, applyCheck); return ResponseEntity.ok(jobPostingDtos); } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/dto/JobApplicationDto.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/dto/JobApplicationDto.java index 6208f91c..19690f13 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/dto/JobApplicationDto.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/dto/JobApplicationDto.java @@ -1,6 +1,5 @@ package com.dynonuggets.refonteimplicaction.dto; -import com.dynonuggets.refonteimplicaction.model.ApplyStatusEnum; import com.dynonuggets.refonteimplicaction.model.ContractTypeEnum; import lombok.AllArgsConstructor; import lombok.Builder; @@ -21,7 +20,7 @@ public class JobApplicationDto { private String companyImageUri; - private ApplyStatusEnum status; + private String statusCode; private ContractTypeEnum contractType; diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/dto/JobApplicationRequest.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/dto/JobApplicationRequest.java index 22fdaeb9..5b153442 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/dto/JobApplicationRequest.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/dto/JobApplicationRequest.java @@ -2,10 +2,8 @@ import com.dynonuggets.refonteimplicaction.model.ApplyStatusEnum; import lombok.AllArgsConstructor; -import lombok.Data; import lombok.Getter; -@Data @Getter @AllArgsConstructor public class JobApplicationRequest { diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/dto/JobPostingDto.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/dto/JobPostingDto.java index 7d1f0635..a44d1e27 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/dto/JobPostingDto.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/dto/JobPostingDto.java @@ -25,5 +25,6 @@ public class JobPostingDto { private ContractTypeEnum contractType; private Instant createdAt; private boolean archive; + private boolean apply; } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/model/ApplyStatusEnum.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/model/ApplyStatusEnum.java index b58d5558..3b5e495f 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/model/ApplyStatusEnum.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/model/ApplyStatusEnum.java @@ -1,5 +1,5 @@ package com.dynonuggets.refonteimplicaction.model; public enum ApplyStatusEnum { - PENDING, SENT, CHASED, INTERVIEW, REFUSED, HIRED + PENDING, SENT, CHASED, INTERVIEW, REJECTED, HIRED } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/JobApplicationRepository.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/JobApplicationRepository.java index 73552846..7c0c9494 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/JobApplicationRepository.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/JobApplicationRepository.java @@ -8,8 +8,12 @@ import java.util.List; import java.util.Optional; +// supprime les warnings sur les noms des méthodes ne respectant pas la convention de nommage (cf named queries) +@SuppressWarnings("squid:S00100") public interface JobApplicationRepository extends JpaRepository { - Optional findByJob(JobPosting job); + Optional findByJobAndUser_id(JobPosting job, long userId); List findAllByUserAndArchiveIsFalse(User user); + + List findAllByJob_IdInAndUser_Id(List collect, Long userId); } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobApplicationService.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobApplicationService.java index 8bc08c6b..a051401f 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobApplicationService.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobApplicationService.java @@ -32,14 +32,16 @@ public JobApplicationDto createApplyIfNotExists(JobApplicationRequest applyReque final JobPosting job = jobRepository.findById(applyRequest.getJobId()) .orElseThrow(() -> new NotFoundException(String.format(JOB_NOT_FOUND_MESSAGE, applyRequest.getJobId()))); - if (applyRepository.findByJob(job).isPresent()) { + final User currentUser = authService.getCurrentUser(); + + if (applyRepository.findByJobAndUser_id(job, currentUser.getId()).isPresent()) { throw new IllegalArgumentException(String.format(APPLY_ALREADY_EXISTS_FOR_JOB, job.getId())); } final JobApplication apply = JobApplication.builder() .job(job) .archive(false) - .user(authService.getCurrentUser()) + .user(currentUser) .status(applyRequest.getStatus()) .lastUpdate(Instant.now()) .build(); diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobPostingService.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobPostingService.java index 6989f31d..f846fc78 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobPostingService.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobPostingService.java @@ -4,6 +4,7 @@ import com.dynonuggets.refonteimplicaction.dto.JobPostingDto; import com.dynonuggets.refonteimplicaction.exception.NotFoundException; import com.dynonuggets.refonteimplicaction.model.JobPosting; +import com.dynonuggets.refonteimplicaction.repository.JobApplicationRepository; import com.dynonuggets.refonteimplicaction.repository.JobPostingRepository; import com.dynonuggets.refonteimplicaction.utils.Message; import lombok.AllArgsConstructor; @@ -16,12 +17,16 @@ import java.util.List; import java.util.stream.Collectors; +import static java.util.stream.Collectors.toList; + @Service @AllArgsConstructor public class JobPostingService { private final JobPostingRepository jobPostingRepository; private final JobPostingAdapter jobPostingAdapter; + private final JobApplicationRepository jobApplicationRepository; + private final AuthService authService; public JobPostingDto createJob(JobPostingDto jobPostingDto) { @@ -37,9 +42,26 @@ public JobPostingDto getJobById(Long jobId) { return jobPostingAdapter.toDto(jobPosting); } - public Page findAllWithCriteria(Pageable pageable, String search, String contractType) { - return jobPostingRepository.findAllWithCriteria(pageable, search, contractType) - .map(jobPostingAdapter::toDto); + public Page getAllWithCriteria(Pageable pageable, String search, String contractType, boolean applyCheck) { + // récupération des jobs + final Page jobs = jobPostingRepository.findAllWithCriteria(pageable, search, contractType); + if (applyCheck) { + final List jobIds = jobs.stream().map(JobPosting::getId).collect(toList()); + final List jobAppliesIds = getAllAppliesWithJobIdsIn(jobIds, authService.getCurrentUser().getId()); + return jobs.map(job -> { + final JobPostingDto jobDto = jobPostingAdapter.toDto(job); + jobDto.setApply(jobAppliesIds.contains(jobDto.getId())); + return jobDto; + }); + } + return jobs.map(jobPostingAdapter::toDto); + } + + private List getAllAppliesWithJobIdsIn(List jobIds, Long userId) { + return jobApplicationRepository.findAllByJob_IdInAndUser_Id(jobIds, userId) + .stream() + .map(apply -> apply.getJob().getId()) + .collect(toList()); } @Transactional diff --git a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/adapter/JobApplicationAdapterTest.java b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/adapter/JobApplicationAdapterTest.java index 68a305a3..f747bfaa 100644 --- a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/adapter/JobApplicationAdapterTest.java +++ b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/adapter/JobApplicationAdapterTest.java @@ -35,7 +35,7 @@ void given_company_should_return_dto() { assertThat(actual.getCompanyName()).isEqualTo(model.getJob().getCompany().getName()); assertThat(actual.getJobId()).isEqualTo(model.getJob().getId()); assertThat(actual.getJobTitle()).isEqualTo(model.getJob().getTitle()); - assertThat(actual.getStatus()).isEqualTo(model.getStatus()); + assertThat(actual.getStatusCode()).isEqualTo(model.getStatus().name()); assertThat(actual.getContractType()).isEqualTo(model.getJob().getContractType()); } @@ -56,7 +56,7 @@ void given_no_company_should_return_dto() { assertThat(actual.getCompanyName()).isNull(); assertThat(actual.getJobId()).isEqualTo(model.getJob().getId()); assertThat(actual.getJobTitle()).isEqualTo(model.getJob().getTitle()); - assertThat(actual.getStatus()).isEqualTo(model.getStatus()); + assertThat(actual.getStatusCode()).isEqualTo(model.getStatus().name()); assertThat(actual.getContractType()).isEqualTo(model.getJob().getContractType()); } } diff --git a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/JobApplicationControllerTest.java b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/JobApplicationControllerTest.java index 54b67119..896c5a98 100644 --- a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/JobApplicationControllerTest.java +++ b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/JobApplicationControllerTest.java @@ -39,7 +39,7 @@ class JobApplicationControllerTest extends ControllerIntegrationTestBase { void should_create_apply() throws Exception { // given JobApplicationRequest request = new JobApplicationRequest(123L, PENDING); - JobApplicationDto response = new JobApplicationDto(243L, 123L, "Mon super Job", "Google", "http://uri.com", PENDING, CDI); + JobApplicationDto response = new JobApplicationDto(243L, 123L, "Mon super Job", "Google", "http://uri.com", PENDING.name(), CDI); given(applicationService.createApplyIfNotExists(any())).willReturn(response); String json = gson.toJson(request); @@ -57,7 +57,7 @@ void should_create_apply() throws Exception { .andExpect(jsonPath("$.jobTitle", is(response.getJobTitle()))) .andExpect(jsonPath("$.companyName", is(response.getCompanyName()))) .andExpect(jsonPath("$.companyImageUri", is(response.getCompanyImageUri()))) - .andExpect(jsonPath("$.status", is(response.getStatus().name()))); + .andExpect(jsonPath("$.statusCode", is(response.getStatusCode()))); verify(applicationService, times(1)).createApplyIfNotExists(any()); } @@ -128,9 +128,9 @@ void should_return_forbidden_when_creating_apply_and_no_auth() throws Exception void should_list_all_users_application() throws Exception { // given List expecteds = asList( - new JobApplicationDto(1L, 12L, "super job", "google", "http://url.com", PENDING, CDD), - new JobApplicationDto(2L, 13L, "super job 2", "microsof", "http://url2.com", CHASED, CDD), - new JobApplicationDto(3L, 14L, "super job 3", "amazon", "http://url3.com", INTERVIEW, INTERIM) + new JobApplicationDto(1L, 12L, "super job", "google", "http://url.com", PENDING.name(), CDD), + new JobApplicationDto(2L, 13L, "super job 2", "microsof", "http://url2.com", CHASED.name(), CDD), + new JobApplicationDto(3L, 14L, "super job 3", "amazon", "http://url3.com", INTERVIEW.name(), INTERIM) ); int expectedSize = expecteds.size(); given(applicationService.getAllAppliesForCurrentUser()).willReturn(expecteds); @@ -149,7 +149,7 @@ void should_list_all_users_application() throws Exception { .andExpect(jsonPath(contentPath + "jobId", is(expecteds.get(i).getJobId().intValue()))) .andExpect(jsonPath(contentPath + "companyName", is(expecteds.get(i).getCompanyName()))) .andExpect(jsonPath(contentPath + "companyImageUri", is(expecteds.get(i).getCompanyImageUri()))) - .andExpect(jsonPath(contentPath + "status", is(expecteds.get(i).getStatus().name()))) + .andExpect(jsonPath(contentPath + "statusCode", is(expecteds.get(i).getStatusCode()))) .andExpect(jsonPath(contentPath + "contractType", is(expecteds.get(i).getContractType().name()))); } diff --git a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/JobsPostingControllerTest.java b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/JobsPostingControllerTest.java index b02c7095..d1d4b85a 100644 --- a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/JobsPostingControllerTest.java +++ b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/JobsPostingControllerTest.java @@ -17,6 +17,7 @@ import java.util.Collections; import java.util.List; +import static com.dynonuggets.refonteimplicaction.model.ContractTypeEnum.CDD; import static com.dynonuggets.refonteimplicaction.utils.ApiUrls.*; import static com.dynonuggets.refonteimplicaction.utils.Message.JOB_NOT_FOUND_MESSAGE; import static org.hamcrest.Matchers.is; @@ -40,29 +41,32 @@ class JobsPostingControllerTest extends ControllerIntegrationTestBase { @BeforeEach void setUp() { jobPostings = Arrays.asList( - JobPostingDto.builder().id(1L).createdAt(Instant.now()).description("description").location("Paris").keywords("toto,yoyo").salary("1111$").build(), - JobPostingDto.builder().id(2L).createdAt(Instant.now()).description("description2").location("New York").keywords("toto2,yoyo2").salary("2222$").build()); + JobPostingDto.builder().id(1L).createdAt(Instant.now()).description("description").location("Paris").keywords("toto,yoyo").contractType(CDD).salary("1111$").build(), + JobPostingDto.builder().id(2L).createdAt(Instant.now()).description("description2").location("New York").keywords("toto2,yoyo2").contractType(CDD).salary("2222$").build()); } - @WithMockUser @Test + @WithMockUser void getJobPostingsListShouldListAllJobs() throws Exception { // given - String search = ""; - String contractType = ""; Page jobPostingPageMockResponse = new PageImpl<>(jobPostings); - given(jobPostingService.findAllWithCriteria(DEFAULT_PAGEABLE, search, contractType)).willReturn(jobPostingPageMockResponse); + given(jobPostingService.getAllWithCriteria(any(), anyString(), anyString(), anyBoolean())).willReturn(jobPostingPageMockResponse); - ResultActions actions = mvc.perform(get(JOBS_BASE_URI).contentType(APPLICATION_JSON)) - .andDo(print()) - .andExpect(status().isOk()) + // when + ResultActions resultActions = mvc.perform( + get(JOBS_BASE_URI).param("contractType", CDD.name()) + + ).andDo(print()); + + // then + resultActions.andExpect(status().isOk()) .andExpect(jsonPath("$.totalPages").value(jobPostingPageMockResponse.getTotalPages())) .andExpect(jsonPath("$.totalElements").value(jobPostings.size())); for (int i = 0; i < jobPostings.size(); i++) { final String contentPath = String.format("$.content[%d]", i); - actions.andExpect(jsonPath(contentPath + ".id", is(jobPostings.get(i).getId().intValue()))) + resultActions.andExpect(jsonPath(contentPath + ".id", is(jobPostings.get(i).getId().intValue()))) .andExpect(jsonPath(contentPath + ".createdAt", is(jobPostings.get(i).getCreatedAt().toString()))) .andExpect(jsonPath(contentPath + ".description", is(jobPostings.get(i).getDescription()))) .andExpect(jsonPath(contentPath + ".location", is(jobPostings.get(i).getLocation()))) @@ -70,7 +74,7 @@ void getJobPostingsListShouldListAllJobs() throws Exception { .andExpect(jsonPath(contentPath + ".salary", is(jobPostings.get(i).getSalary()))); } - verify(jobPostingService, times(1)).findAllWithCriteria(any(), anyString(), anyString()); + verify(jobPostingService, times(1)).getAllWithCriteria(any(), anyString(), anyString(), anyBoolean()); } @Test @@ -78,7 +82,7 @@ void getAllWithoutJwtShouldBeForbidden() throws Exception { mvc.perform(get(JOBS_BASE_URI)).andDo(print()) .andExpect(status().isForbidden()); - verify(jobPostingService, times(0)).findAllWithCriteria(any(), anyString(), anyString()); + verify(jobPostingService, times(0)).getAllWithCriteria(any(), anyString(), anyString(), anyBoolean()); } @Test diff --git a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/JobApplicationServiceTest.java b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/JobApplicationServiceTest.java index 3e8f13b3..a3deee67 100644 --- a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/JobApplicationServiceTest.java +++ b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/JobApplicationServiceTest.java @@ -57,7 +57,7 @@ void should_create_apply() { JobPosting job = new JobPosting(123L, Company.builder().id(23L).build(), "Mon super job", "Il est trop cool", "Blablabla", "Paris", "140k", null, CDI, Instant.now(), false); final User currentUser = User.builder().id(45L).build(); JobApplication jobApplication = new JobApplication(67L, job, currentUser, request.getStatus(), Instant.now(), false); - JobApplicationDto expectedDto = new JobApplicationDto(jobApplication.getId(), jobApplication.getJob().getId(), jobApplication.getJob().getTitle(), jobApplication.getJob().getCompany().getName(), jobApplication.getJob().getCompany().getLogo(), jobApplication.getStatus(), CDI); + JobApplicationDto expectedDto = new JobApplicationDto(jobApplication.getId(), jobApplication.getJob().getId(), jobApplication.getJob().getTitle(), jobApplication.getJob().getCompany().getName(), jobApplication.getJob().getCompany().getLogo(), jobApplication.getStatus().name(), CDI); given(jobRepository.findById(anyLong())).willReturn(Optional.of(job)); given(authService.getCurrentUser()).willReturn(currentUser); given(applyRepostitory.save(any())).willReturn(jobApplication); @@ -69,7 +69,7 @@ void should_create_apply() { //then assertThat(actual.getId()).isNotNull(); assertThat(actual.getId()).isEqualTo(jobApplication.getId()); - assertThat(actual.getStatus()).isEqualTo(jobApplication.getStatus()); + assertThat(actual.getStatusCode()).isEqualTo(jobApplication.getStatus().name()); assertThat(actual.getJobId()).isEqualTo(jobApplication.getJob().getId()); assertThat(actual.getJobTitle()).isEqualTo(jobApplication.getJob().getTitle()); assertThat(actual.getContractType()).isEqualTo(jobApplication.getJob().getContractType()); @@ -100,8 +100,10 @@ void should_throw_exception_when_creating_with_already_applied_job() { IllegalArgumentException expectedException = new IllegalArgumentException(String.format(APPLY_ALREADY_EXISTS_FOR_JOB, jobId)); final JobApplication apply = JobApplication.builder().build(); JobPosting job = new JobPosting(123L, Company.builder().id(23L).build(), "Mon super job", "Il est trop cool", "Blablabla", "Paris", "140k", null, CDI, Instant.now(), false); + User currentUser = User.builder().id(123L).build(); given(jobRepository.findById(anyLong())).willReturn(Optional.of(job)); - given(applyRepostitory.findByJob(any())).willReturn(Optional.of(apply)); + given(applyRepostitory.findByJobAndUser_id(any(), anyLong())).willReturn(Optional.of(apply)); + given(authService.getCurrentUser()).willReturn(currentUser); // when final IllegalArgumentException actualException = assertThrows(IllegalArgumentException.class, () -> jobApplicationService.createApplyIfNotExists(request)); diff --git a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/JobPostingServiceTest.java b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/JobPostingServiceTest.java new file mode 100644 index 00000000..cb3f88df --- /dev/null +++ b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/JobPostingServiceTest.java @@ -0,0 +1,78 @@ +package com.dynonuggets.refonteimplicaction.service; + +import com.dynonuggets.refonteimplicaction.adapter.JobPostingAdapter; +import com.dynonuggets.refonteimplicaction.dto.JobPostingDto; +import com.dynonuggets.refonteimplicaction.model.JobPosting; +import com.dynonuggets.refonteimplicaction.model.User; +import com.dynonuggets.refonteimplicaction.repository.JobApplicationRepository; +import com.dynonuggets.refonteimplicaction.repository.JobPostingRepository; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; + +import java.util.Collections; +import java.util.List; + +import static com.dynonuggets.refonteimplicaction.model.ContractTypeEnum.CDD; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.BDDMockito.given; + +@ExtendWith(MockitoExtension.class) +class JobPostingServiceTest { + + @Mock + JobPostingRepository jobPostingRepository; + + @Mock + JobPostingAdapter jobPostingAdapter; + + @Mock + JobApplicationRepository jobApplicationRepository; + + @Mock + AuthService authService; + + @InjectMocks + JobPostingService JobPostingService; + + @Test + void should_get_all_jobs_with_criteria_and_check_apply() { + // given + List jobs = Collections.singletonList(JobPosting.builder().id(123L).contractType(CDD).build()); + Page jobPage = new PageImpl<>(jobs); + Pageable pageable = PageRequest.of(0, 10); + User currentUser = User.builder().id(123L).build(); + given(jobPostingRepository.findAllWithCriteria(any(), anyString(), anyString())).willReturn(jobPage); + given(jobApplicationRepository.findAllByJob_IdInAndUser_Id(anyList(), anyLong())).willReturn(Collections.emptyList()); + given(authService.getCurrentUser()).willReturn(currentUser); + given(jobPostingAdapter.toDto(any())).willReturn(JobPostingDto.builder().build()); + + // when + final Page actual = JobPostingService.getAllWithCriteria(pageable, "", CDD.name(), true); + + // then + assertThat(actual.getTotalElements()).isEqualTo(jobPage.getTotalElements()); + } + + @Test + void should_get_all_jobs_with_criteria_and_check_apply_false() { + // given + List jobs = Collections.singletonList(JobPosting.builder().id(123L).contractType(CDD).build()); + Page jobPage = new PageImpl<>(jobs); + Pageable pageable = PageRequest.of(0, 10); + given(jobPostingRepository.findAllWithCriteria(any(), anyString(), anyString())).willReturn(jobPage); + + // when + final Page actual = JobPostingService.getAllWithCriteria(pageable, "", CDD.name(), false); + + // then + assertThat(actual.getTotalElements()).isEqualTo(jobPage.getTotalElements()); + } +} diff --git a/frontend-implicaction/src/app/board/board.component.ts b/frontend-implicaction/src/app/board/board.component.ts index eaaf4c30..08bc0b92 100644 --- a/frontend-implicaction/src/app/board/board.component.ts +++ b/frontend-implicaction/src/app/board/board.component.ts @@ -2,6 +2,8 @@ import {Component, OnInit} from '@angular/core'; import {ApplyStatusCode, ApplyStatusEnum} from './enums/apply-status-enum'; import {JobApplication} from './models/job-application'; import {CdkDragDrop, moveItemInArray, transferArrayItem} from '@angular/cdk/drag-drop'; +import {JobBoardService} from './services/job-board.service'; +import {ToasterService} from '../core/services/toaster.service'; export class BoardColumn { status: ApplyStatusEnum; @@ -22,43 +24,23 @@ export class BoardComponent implements OnInit { return {status, applies: []}; }); + constructor( + private jobBoardService: JobBoardService, + private toasterService: ToasterService + ) { + } + ngOnInit(): void { - this.columns - .find(column => column.status.code === ApplyStatusCode.PENDING) - .applies - .push({ - jobTitle: 'Responsable de la maintenance et de la sécurité', - contractType: 'CDI', - companyImageUrl: 'https://www.netanswer.fr/wp-content/uploads/2017/01/logoNAli400.png', - companyName: 'Net Answer', - location: 'France, Paris(75)', - jobId: '12', - statusCode: ApplyStatusEnum.PENDING.code - }, { - jobTitle: 'Responsable de la maintenance et de la sécurité', - contractType: 'CDI', - companyImageUrl: 'https://www.netanswer.fr/wp-content/uploads/2017/01/logoNAli400.png', - companyName: 'Net Answer', - location: 'France, Paris(75)', - jobId: '12', - statusCode: ApplyStatusEnum.PENDING.code - }, { - jobTitle: 'Responsable de la maintenance et de la sécurité', - contractType: 'CDI', - companyImageUrl: 'https://www.netanswer.fr/wp-content/uploads/2017/01/logoNAli400.png', - companyName: 'Net Answer', - location: 'France, Paris(75)', - jobId: '12', - statusCode: ApplyStatusEnum.PENDING.code - }, { - jobTitle: 'Responsable de la maintenance et de la sécurité', - contractType: 'CDI', - companyImageUrl: 'https://www.netanswer.fr/wp-content/uploads/2017/01/logoNAli400.png', - companyName: 'Net Answer', - location: 'France, Paris(75)', - jobId: '12', - statusCode: ApplyStatusEnum.PENDING.code - }); + this.jobBoardService + .getAllForCurrentUser() + .subscribe( + applies => applies.forEach(apply => + this.columns + .find(column => column.status.code === apply.statusCode) + .applies + .push(apply)), + () => this.toasterService.error('Oops', 'Une erreur est survenue lors de la récupération des données.') + ); } drop(event: CdkDragDrop, statusCode: ApplyStatusCode): void { diff --git a/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.html b/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.html index e5def728..9fa66169 100644 --- a/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.html +++ b/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.html @@ -4,7 +4,7 @@ {{apply.companyName}} diff --git a/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.scss b/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.scss index 4b7a4232..b4e50bde 100644 --- a/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.scss +++ b/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.scss @@ -5,5 +5,5 @@ .icon { width: 50px; - height: 50px; + //height: 50px; } diff --git a/frontend-implicaction/src/app/board/models/job-application.ts b/frontend-implicaction/src/app/board/models/job-application.ts index 1d8779c8..3451b50d 100644 --- a/frontend-implicaction/src/app/board/models/job-application.ts +++ b/frontend-implicaction/src/app/board/models/job-application.ts @@ -6,7 +6,7 @@ export interface JobApplication { jobTitle: string; location: string; companyName: string; - companyImageUrl: string; + companyImageUri: string; statusCode: ApplyStatusCode; contractType: string; } diff --git a/frontend-implicaction/src/app/board/services/job-board.service.ts b/frontend-implicaction/src/app/board/services/job-board.service.ts index d60bfcba..d4b802bf 100644 --- a/frontend-implicaction/src/app/board/services/job-board.service.ts +++ b/frontend-implicaction/src/app/board/services/job-board.service.ts @@ -19,4 +19,8 @@ export class JobBoardService { createApplication(request: JobApplicationRequest): Observable { return this.http.post(this.apiEndpointService.createJobApplicationEndpoint(), request); } + + getAllForCurrentUser(): Observable { + return this.http.get(this.apiEndpointService.getAllApplicationForCurrentUser()); + } } 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 8709fbfb..96ba0879 100644 --- a/frontend-implicaction/src/app/core/services/api-endpoints.service.ts +++ b/frontend-implicaction/src/app/core/services/api-endpoints.service.ts @@ -196,14 +196,15 @@ export class ApiEndpointsService { * Jobs */ - getAllJobEndpoint(pageable: Pageable, criteria: JobCriteriaFilter): string { + getAllJobEndpoint(pageable: Pageable, criteria: JobCriteriaFilter, checkApply: boolean): 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 + sortOrder: pageable.sortOrder, + checkApply }; return ApiEndpointsService.createUrlWithQueryParameters( Uris.JOBS.BASE_URI, @@ -332,6 +333,10 @@ export class ApiEndpointsService { return ApiEndpointsService.createUrl(Uris.JOB_APPLICATION.BASE_URI); } + getAllApplicationForCurrentUser(): string { + return ApiEndpointsService.createUrl(Uris.JOB_APPLICATION.BASE_URI); + } + /** * Ajoute les attributs filtrés d'un objet de paramétrage de requête à un QueryStringParameters * @return qs le QueryStringParameters modifié diff --git a/frontend-implicaction/src/app/job/components/job-card/job-card.component.html b/frontend-implicaction/src/app/job/components/job-card/job-card.component.html index 339fb772..bdaa517b 100644 --- a/frontend-implicaction/src/app/job/components/job-card/job-card.component.html +++ b/frontend-implicaction/src/app/job/components/job-card/job-card.component.html @@ -35,11 +35,20 @@

+ +

L'offre est ajouté au jobBoard

+
diff --git a/frontend-implicaction/src/app/job/components/job-card/job-card.component.ts b/frontend-implicaction/src/app/job/components/job-card/job-card.component.ts index 69464b90..8e1e879a 100644 --- a/frontend-implicaction/src/app/job/components/job-card/job-card.component.ts +++ b/frontend-implicaction/src/app/job/components/job-card/job-card.component.ts @@ -4,7 +4,7 @@ import {Univers} from '../../../shared/enums/univers'; import {ApplyStatusCode} from '../../../board/enums/apply-status-enum'; import {JobBoardService} from '../../../board/services/job-board.service'; import {ToasterService} from '../../../core/services/toaster.service'; -import {Router} from '@angular/router'; +import {finalize} from 'rxjs/operators'; @Component({ selector: 'app-job-card', @@ -17,24 +17,25 @@ export class JobCardComponent { job: JobPosting; univers = Univers; + isLoading = false; constructor( private jobBoardService: JobBoardService, private toasterService: ToasterService, - private router: Router ) { } addToJobBoard(): void { + this.isLoading = true; this.jobBoardService .createApplication({jobId: this.job.id, status: ApplyStatusCode.PENDING}) + .pipe(finalize(() => this.isLoading = false)) .subscribe( + () => this.job.apply = true, () => { - this.router - .navigate([Univers.BOARD.url]) - .then(() => this.toasterService.success('Succès', `L'offre a bien été ajoutée à votre board`)); - }, - () => this.toasterService.error('Oops', `Une erreur est survenue lors de l'ajout de l'offre à votre board`) + this.job.apply = false; + this.toasterService.error('Oops', `Une erreur est survenue lors de l'ajout de l'offre à votre board`); + } ); } } diff --git a/frontend-implicaction/src/app/job/components/jobs-list/jobs-list.component.ts b/frontend-implicaction/src/app/job/components/jobs-list/jobs-list.component.ts index c7a79b19..82b0b9e8 100644 --- a/frontend-implicaction/src/app/job/components/jobs-list/jobs-list.component.ts +++ b/frontend-implicaction/src/app/job/components/jobs-list/jobs-list.component.ts @@ -67,7 +67,7 @@ export class JobsListComponent extends BaseWithPaginationComponent this.isLoading = false)) .subscribe( data => { diff --git a/frontend-implicaction/src/app/job/services/job.service.ts b/frontend-implicaction/src/app/job/services/job.service.ts index bc534c92..568ac936 100644 --- a/frontend-implicaction/src/app/job/services/job.service.ts +++ b/frontend-implicaction/src/app/job/services/job.service.ts @@ -17,8 +17,8 @@ export class JobService { ) { } - getAllByCriteria(pageable: Pageable, criteria: JobCriteriaFilter): Observable { - return this.http.get(this.apiEndpointsService.getAllJobEndpoint(pageable, criteria)); + getAllByCriteria(pageable: Pageable, criteria: JobCriteriaFilter, applyCheck = false): Observable { + return this.http.get(this.apiEndpointsService.getAllJobEndpoint(pageable, criteria, applyCheck)); } getById(jobId: string): Observable { diff --git a/frontend-implicaction/src/app/shared/enums/univers.ts b/frontend-implicaction/src/app/shared/enums/univers.ts index 1a4c2227..4ba87291 100644 --- a/frontend-implicaction/src/app/shared/enums/univers.ts +++ b/frontend-implicaction/src/app/shared/enums/univers.ts @@ -5,7 +5,7 @@ export class Univers { static readonly HOME = new Univers('Accueil', ''); static readonly USERS = new Univers('Communauté', 'users', [RoleEnumCode.USER]); static readonly JOBS = new Univers(`Offres d'emploi`, 'jobs', [RoleEnumCode.USER]); - static readonly BOARD = new Univers('Job Board', 'board', [RoleEnumCode.ADMIN, RoleEnumCode.PREMIUM]); + static readonly BOARD = new Univers('Job Board', 'board', [RoleEnumCode.PREMIUM]); static readonly DISCUSSIONS = new Univers('Discussion', 'discussions', [RoleEnumCode.USER]); static readonly ADMIN = new Univers('Admin', 'admin', [RoleEnumCode.ADMIN]); diff --git a/frontend-implicaction/src/app/shared/models/job-posting.ts b/frontend-implicaction/src/app/shared/models/job-posting.ts index 40734d1c..34e44c88 100644 --- a/frontend-implicaction/src/app/shared/models/job-posting.ts +++ b/frontend-implicaction/src/app/shared/models/job-posting.ts @@ -12,4 +12,5 @@ export interface JobPosting { createdAt?: Date; contractType?: ContractEnumCode; company?: Company; + apply?: boolean; } From 7e7cddfec53ba6e01d41a1cdd6976cb2b7ea83f4 Mon Sep 17 00:00:00 2001 From: Matthieu Audemard Date: Tue, 23 Nov 2021 18:55:53 +0100 Subject: [PATCH 2/5] RI-44: [job-board] permet l'ajout d'un job au job-board --- .../service/JobPostingService.java | 10 ++++++++-- .../home/components/index/index.component.scss | 1 + .../job-details/job-details.component.html | 10 ++++++++-- .../job-details/job-details.component.ts | 18 +++++++++++++++++- .../src/app/shared/models/job-posting.ts | 1 + 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobPostingService.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobPostingService.java index f846fc78..612af539 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobPostingService.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobPostingService.java @@ -37,9 +37,15 @@ public JobPostingDto createJob(JobPostingDto jobPostingDto) { } public JobPostingDto getJobById(Long jobId) { - JobPosting jobPosting = jobPostingRepository.findById(jobId) + JobPosting job = jobPostingRepository.findById(jobId) .orElseThrow(() -> new NotFoundException(String.format(Message.JOB_NOT_FOUND_MESSAGE, jobId))); - return jobPostingAdapter.toDto(jobPosting); + + final Long currentUserId = authService.getCurrentUser().getId(); + final JobPostingDto jobDto = jobPostingAdapter.toDto(job); + + jobDto.setApply(jobApplicationRepository.findByJobAndUser_id(job, currentUserId).isPresent()); + + return jobDto; } public Page getAllWithCriteria(Pageable pageable, String search, String contractType, boolean applyCheck) { diff --git a/frontend-implicaction/src/app/home/components/index/index.component.scss b/frontend-implicaction/src/app/home/components/index/index.component.scss index 024569c8..7ab60e29 100644 --- a/frontend-implicaction/src/app/home/components/index/index.component.scss +++ b/frontend-implicaction/src/app/home/components/index/index.component.scss @@ -2,6 +2,7 @@ .heading { font-size: 48px; + text-wrap: none; } .subheading { diff --git a/frontend-implicaction/src/app/job/components/job-details/job-details.component.html b/frontend-implicaction/src/app/job/components/job-details/job-details.component.html index abd126bf..0aa4ed34 100644 --- a/frontend-implicaction/src/app/job/components/job-details/job-details.component.html +++ b/frontend-implicaction/src/app/job/components/job-details/job-details.component.html @@ -41,8 +41,14 @@

{{job.title

-
- diff --git a/frontend-implicaction/src/app/job/components/job-details/job-details.component.ts b/frontend-implicaction/src/app/job/components/job-details/job-details.component.ts index 2fbc744c..a6eb1e2b 100644 --- a/frontend-implicaction/src/app/job/components/job-details/job-details.component.ts +++ b/frontend-implicaction/src/app/job/components/job-details/job-details.component.ts @@ -4,6 +4,8 @@ import {JobService} from '../../services/job.service'; import {ToasterService} from '../../../core/services/toaster.service'; import {ActivatedRoute} from '@angular/router'; import {Constants} from '../../../config/constants'; +import {ApplyStatusCode} from '../../../board/enums/apply-status-enum'; +import {JobBoardService} from '../../../board/services/job-board.service'; @Component({ selector: 'app-job-details', @@ -18,7 +20,9 @@ export class JobDetailsComponent implements OnInit { constructor( private jobService: JobService, private toasterService: ToasterService, - private route: ActivatedRoute) { + private route: ActivatedRoute, + private jobBoardService: JobBoardService + ) { } ngOnInit(): void { @@ -34,4 +38,16 @@ export class JobDetailsComponent implements OnInit { ); } + addToJobBoard(): void { + this.jobBoardService + .createApplication({jobId: this.job.id, status: ApplyStatusCode.PENDING}) + .subscribe( + () => this.job.apply = true, + () => { + this.job.apply = false; + this.toasterService.error('Oops', `Une erreur est survenue lors de l'ajout de l'offre à votre board`); + }, + () => this.toasterService.success('Succès', `L'offre a bien été ajoutée au job board.`) + ); + } } diff --git a/frontend-implicaction/src/app/shared/models/job-posting.ts b/frontend-implicaction/src/app/shared/models/job-posting.ts index 34e44c88..a29217ac 100644 --- a/frontend-implicaction/src/app/shared/models/job-posting.ts +++ b/frontend-implicaction/src/app/shared/models/job-posting.ts @@ -13,4 +13,5 @@ export interface JobPosting { contractType?: ContractEnumCode; company?: Company; apply?: boolean; + archive?: boolean; } From 38e65fbab683dbaa81fafa36e5f11e1440feb82a Mon Sep 17 00:00:00 2001 From: Matthieu Audemard Date: Tue, 23 Nov 2021 20:14:38 +0100 Subject: [PATCH 3/5] RI-44: [job-board] permet l'ajout d'un job au job-board --- .../service/JobApplicationService.java | 3 +++ .../refonteimplicaction/service/JobPostingService.java | 8 ++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobApplicationService.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobApplicationService.java index a051401f..e23bf280 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobApplicationService.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobApplicationService.java @@ -11,6 +11,7 @@ import com.dynonuggets.refonteimplicaction.repository.JobPostingRepository; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.time.Instant; import java.util.List; @@ -28,6 +29,7 @@ public class JobApplicationService { private final JobApplicationAdapter applyAdapter; private final AuthService authService; + @Transactional public JobApplicationDto createApplyIfNotExists(JobApplicationRequest applyRequest) { final JobPosting job = jobRepository.findById(applyRequest.getJobId()) .orElseThrow(() -> new NotFoundException(String.format(JOB_NOT_FOUND_MESSAGE, applyRequest.getJobId()))); @@ -51,6 +53,7 @@ public JobApplicationDto createApplyIfNotExists(JobApplicationRequest applyReque return applyAdapter.toDto(applySave); } + @Transactional(readOnly = true) public List getAllAppliesForCurrentUser() { final User currentUser = authService.getCurrentUser(); diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobPostingService.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobPostingService.java index 612af539..4c787afc 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobPostingService.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/JobPostingService.java @@ -6,7 +6,6 @@ import com.dynonuggets.refonteimplicaction.model.JobPosting; import com.dynonuggets.refonteimplicaction.repository.JobApplicationRepository; import com.dynonuggets.refonteimplicaction.repository.JobPostingRepository; -import com.dynonuggets.refonteimplicaction.utils.Message; import lombok.AllArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -17,6 +16,7 @@ import java.util.List; import java.util.stream.Collectors; +import static com.dynonuggets.refonteimplicaction.utils.Message.JOB_NOT_FOUND_MESSAGE; import static java.util.stream.Collectors.toList; @Service @@ -38,7 +38,7 @@ public JobPostingDto createJob(JobPostingDto jobPostingDto) { public JobPostingDto getJobById(Long jobId) { JobPosting job = jobPostingRepository.findById(jobId) - .orElseThrow(() -> new NotFoundException(String.format(Message.JOB_NOT_FOUND_MESSAGE, jobId))); + .orElseThrow(() -> new NotFoundException(String.format(JOB_NOT_FOUND_MESSAGE, jobId))); final Long currentUserId = authService.getCurrentUser().getId(); final JobPostingDto jobDto = jobPostingAdapter.toDto(job); @@ -80,14 +80,14 @@ public JobPostingDto saveOrUpdateJobPosting(final JobPostingDto jobPostingDto) { @Transactional public void deleteJobPosting(Long jobPostingId) { JobPosting jobPosting = jobPostingRepository.findById(jobPostingId) - .orElseThrow(() -> new NotFoundException("Impossible de supprimer l'offre, " + jobPostingId + " n'existe pas.")); + .orElseThrow(() -> new NotFoundException(String.format(JOB_NOT_FOUND_MESSAGE, jobPostingId))); jobPostingRepository.delete(jobPosting); } @Transactional public JobPostingDto toggleArchiveJobPosting(Long jobPostingId) { JobPosting jobPosting = jobPostingRepository.findById(jobPostingId) - .orElseThrow(() -> new NotFoundException(String.format(Message.JOB_NOT_FOUND_MESSAGE, jobPostingId))); + .orElseThrow(() -> new NotFoundException(String.format(JOB_NOT_FOUND_MESSAGE, jobPostingId))); jobPosting.setArchive(!jobPosting.isArchive()); final JobPosting save = jobPostingRepository.save(jobPosting); return jobPostingAdapter.toDto(save); From 3f2b9c63f4202c95a7fa426a97b9952ba5881aac Mon Sep 17 00:00:00 2001 From: Matthieu Audemard Date: Wed, 24 Nov 2021 02:23:11 +0100 Subject: [PATCH 4/5] RI-44: [job-board] permet l'ajout d'un job au job-board --- .../app/board/components/apply-card/apply-card.component.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.scss b/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.scss index b4e50bde..2fbf398f 100644 --- a/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.scss +++ b/frontend-implicaction/src/app/board/components/apply-card/apply-card.component.scss @@ -5,5 +5,4 @@ .icon { width: 50px; - //height: 50px; } From 9e4e309d96beb9df24598968041a4ae810acdc08 Mon Sep 17 00:00:00 2001 From: Matthieu Audemard Date: Wed, 24 Nov 2021 03:03:11 +0100 Subject: [PATCH 5/5] RI-44: [job-board] permet l'ajout d'un job au job-board --- .../src/app/home/components/index/index.component.scss | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend-implicaction/src/app/home/components/index/index.component.scss b/frontend-implicaction/src/app/home/components/index/index.component.scss index 7ab60e29..024569c8 100644 --- a/frontend-implicaction/src/app/home/components/index/index.component.scss +++ b/frontend-implicaction/src/app/home/components/index/index.component.scss @@ -2,7 +2,6 @@ .heading { font-size: 48px; - text-wrap: none; } .subheading {