diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/adapter/SubredditAdapter.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/adapter/GroupAdapter.java similarity index 73% rename from backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/adapter/SubredditAdapter.java rename to backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/adapter/GroupAdapter.java index 5a3f9b92..c9a11bbd 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/adapter/SubredditAdapter.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/adapter/GroupAdapter.java @@ -2,6 +2,7 @@ import com.dynonuggets.refonteimplicaction.dto.GroupDto; import com.dynonuggets.refonteimplicaction.model.Group; +import com.dynonuggets.refonteimplicaction.model.User; import com.dynonuggets.refonteimplicaction.service.FileService; import lombok.AllArgsConstructor; import org.springframework.stereotype.Component; @@ -10,23 +11,27 @@ @Component @AllArgsConstructor -public class SubredditAdapter { +public class GroupAdapter { protected static final String DEFAULT_GROUP_IMAGE_URI = "assets/img/avatar-ia-group.png"; private FileService fileService; - public Group toModel(final GroupDto dto) { + public Group toModel(GroupDto dto, User user) { return Group.builder() .id(dto.getId()) .name(dto.getName()) .description(dto.getDescription()) .createdAt(dto.getCreatedAt()) + .valid(dto.isValid()) + .user(user) .build(); } public GroupDto toDto(Group model) { final String imageUrl = model.getImage() != null ? fileService.buildFileUri(model.getImage().getObjectKey()) : DEFAULT_GROUP_IMAGE_URI; + final String username = model.getUser() != null ? model.getUser().getUsername() : ""; + final Long userId = model.getUser() != null ? model.getUser().getId() : null; return GroupDto.builder() .id(model.getId()) .name(model.getName()) @@ -34,6 +39,9 @@ public GroupDto toDto(Group model) { .description(model.getDescription()) .createdAt(model.getCreatedAt()) .imageUrl(imageUrl) + .valid(model.isValid()) + .username(username) + .userId(userId) .build(); } } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/adapter/JobPostingAdapter.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/adapter/JobPostingAdapter.java index 88864cfe..9493f41d 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/adapter/JobPostingAdapter.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/adapter/JobPostingAdapter.java @@ -4,6 +4,7 @@ import com.dynonuggets.refonteimplicaction.dto.JobPostingDto; import com.dynonuggets.refonteimplicaction.model.Company; import com.dynonuggets.refonteimplicaction.model.JobPosting; +import com.dynonuggets.refonteimplicaction.model.User; import lombok.AllArgsConstructor; import org.springframework.stereotype.Component; @@ -15,6 +16,8 @@ public class JobPostingAdapter { public JobPostingDto toDto(JobPosting model) { + final String username = model.getPoster() != null ? model.getPoster().getUsername() : ""; + final Long userId = model.getPoster() != null ? model.getPoster().getId() : null; CompanyDto companyDto = companyAdapter.toDto(model.getCompany()); return JobPostingDto.builder() @@ -29,10 +32,14 @@ public JobPostingDto toDto(JobPosting model) { .contractType(model.getContractType()) .createdAt(model.getCreatedAt()) .archive(model.isArchive()) + .businessSector(model.getBusinessSector()) + .valid(model.isValid()) + .posterName(username) + .posterId(userId) .build(); } - public JobPosting toModel(JobPostingDto dto) { + public JobPosting toModel(JobPostingDto dto, User user) { Company company = companyAdapter.toModel(dto.getCompany()); @@ -46,8 +53,11 @@ public JobPosting toModel(JobPostingDto dto) { .salary(dto.getSalary()) .keywords(dto.getKeywords()) .contractType(dto.getContractType()) + .businessSector(dto.getBusinessSector()) .createdAt(dto.getCreatedAt()) .archive(dto.isArchive()) + .valid(dto.isValid()) + .poster(user) .build(); } } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/controller/GroupController.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/controller/GroupController.java index 271c40d1..2fd86bcb 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/controller/GroupController.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/controller/GroupController.java @@ -1,6 +1,7 @@ package com.dynonuggets.refonteimplicaction.controller; import com.dynonuggets.refonteimplicaction.dto.GroupDto; +import com.dynonuggets.refonteimplicaction.model.Group; import com.dynonuggets.refonteimplicaction.service.GroupService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -14,8 +15,7 @@ import java.util.List; -import static com.dynonuggets.refonteimplicaction.utils.ApiUrls.GET_ALL_BY_TOP_POSTING_URI; -import static com.dynonuggets.refonteimplicaction.utils.ApiUrls.GROUPS_BASE_URI; +import static com.dynonuggets.refonteimplicaction.utils.ApiUrls.*; import static org.springframework.http.HttpStatus.CREATED; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; import static org.springframework.http.MediaType.MULTIPART_FORM_DATA_VALUE; @@ -35,21 +35,21 @@ public ResponseEntity createSubreddit(@RequestPart("group") GroupDto g return ResponseEntity.status(CREATED).body(saveDto); } - @PostMapping + @PostMapping(CREATE_NO_IMAGE) public ResponseEntity createSubreddit(@RequestBody GroupDto group) { final GroupDto saveDto = groupService.save(group); return ResponseEntity.status(CREATED).body(saveDto); } - @GetMapping - public ResponseEntity> getAll( + @GetMapping(GET_VALIDATED_GROUPS_URI) + public ResponseEntity> getAllValidGroups( @RequestParam(value = "page", defaultValue = "0") int page, @RequestParam(value = "rows", defaultValue = "10") int rows, @RequestParam(value = "sortBy", defaultValue = "id") String sortBy, @RequestParam(value = "sortOrder", defaultValue = "ASC") String sortOrder ) { Pageable pageable = PageRequest.of(page, rows, Sort.by(Sort.Direction.valueOf(sortOrder), sortBy)); - Page subredditDtos = groupService.getAll(pageable); + Page subredditDtos = groupService.getAllValidGroups(pageable); return ResponseEntity.ok(subredditDtos); } @@ -58,4 +58,28 @@ public ResponseEntity> getAllByTopPosting(@RequestParam int limit List groupDtos = groupService.getAllByTopPosting(limit); return ResponseEntity.ok(groupDtos); } + + @PostMapping(SUBSCRIBE_GROUP) + public ResponseEntity> subscribeGroup(@PathVariable final String groupName) { + final List groupDtos = groupService.addGroup(groupName); + return ResponseEntity.ok(groupDtos); + } + + @GetMapping(GET_PENDING_GROUP_URI) + public ResponseEntity> getAllPendingGroups( + @RequestParam(value = "page", defaultValue = "0") int page, + @RequestParam(value = "rows", defaultValue = "10") int rows, + @RequestParam(value = "sortBy", defaultValue = "id") String sortBy, + @RequestParam(value = "sortOrder", defaultValue = "ASC") String sortOrder + ) { + Pageable pageable = PageRequest.of(page, rows, Sort.by(Sort.Direction.valueOf(sortOrder), sortBy)); + Page pendingGroups = groupService.getAllPendingGroups(pageable); + return ResponseEntity.ok(pendingGroups); + } + + @PatchMapping(VALIDATE_GROUP_URI) + public ResponseEntity validateGroup(@RequestBody final Group group) { + groupService.validateGroup(group); + return ResponseEntity.ok().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 9d9c522c..8ec0708d 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 @@ -2,6 +2,7 @@ import com.dynonuggets.refonteimplicaction.dto.JobPostingDto; import com.dynonuggets.refonteimplicaction.exception.ImplicactionException; +import com.dynonuggets.refonteimplicaction.model.JobPosting; import com.dynonuggets.refonteimplicaction.service.JobPostingService; import lombok.AllArgsConstructor; import org.apache.commons.lang3.StringUtils; @@ -43,7 +44,23 @@ public ResponseEntity> getAllByCriteria( Pageable pageable = PageRequest.of(page, rows, Sort.by(Sort.Direction.valueOf(sortOrder), sortBy)); final boolean applyCheck = Boolean.parseBoolean(checkApplyAsString); final Boolean isArchive = StringUtils.isNotBlank(archiveAsString) ? Boolean.parseBoolean(archiveAsString) : null; - Page jobPostingDtos = jobPostingService.getAllWithCriteria(pageable, search, contractType, isArchive, applyCheck); + Page jobPostingDtos = jobPostingService.getAllWithCriteria(pageable, search, contractType, isArchive, applyCheck, null); + return ResponseEntity.ok(jobPostingDtos); + } + + @GetMapping(VALIDATED_JOBS) + public ResponseEntity> getAllActiveByCriteria( + @RequestParam(value = "page", defaultValue = "0") int page, + @RequestParam(value = "rows", defaultValue = "10") int rows, + @RequestParam(value = "sortBy", defaultValue = "id") String sortBy, + @RequestParam(value = "sortOrder", defaultValue = "ASC") String sortOrder, + @RequestParam(value = "search", defaultValue = "") String search, + @RequestParam(value = "contractType", required = false) String contractType, + @RequestParam(value = "archive", required = false) String archiveAsString + ) { + Pageable pageable = PageRequest.of(page, rows, Sort.by(Sort.Direction.valueOf(sortOrder), sortBy)); + final Boolean isArchive = StringUtils.isNotBlank(archiveAsString) ? Boolean.parseBoolean(archiveAsString) : null; + Page jobPostingDtos = jobPostingService.getAllActiveWithCriteria(pageable, search, contractType, isArchive); return ResponseEntity.ok(jobPostingDtos); } @@ -76,4 +93,20 @@ public ResponseEntity> toggleArchiveJobs(@RequestBody final List updated = jobPostingService.toggleArchiveAll(jobsId); return ResponseEntity.ok(updated); } + + @GetMapping(GET_PENDING_JOB_URI) + public ResponseEntity> getAllPendingJobs( + @RequestParam(value = "page", defaultValue = "0") int page, + @RequestParam(value = "rows", defaultValue = "10") int rows + ) { + Pageable pageable = PageRequest.of(page, rows); + Page pendingJobs = jobPostingService.getAllPendingJobs(pageable); + return ResponseEntity.ok(pendingJobs); + } + + @PatchMapping(VALIDATE_JOB_URI) + public ResponseEntity validateJob(@RequestBody final JobPosting job) { + jobPostingService.validateJob(job); + return ResponseEntity.ok().build(); + } } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/controller/UserController.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/controller/UserController.java index 78a4ba3b..dc263cd0 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/controller/UserController.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/controller/UserController.java @@ -1,7 +1,9 @@ package com.dynonuggets.refonteimplicaction.controller; +import com.dynonuggets.refonteimplicaction.dto.GroupDto; import com.dynonuggets.refonteimplicaction.dto.UserDto; import com.dynonuggets.refonteimplicaction.service.AuthService; +import com.dynonuggets.refonteimplicaction.service.GroupService; import com.dynonuggets.refonteimplicaction.service.RelationService; import com.dynonuggets.refonteimplicaction.service.UserService; import lombok.AllArgsConstructor; @@ -12,6 +14,8 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.util.List; + import static com.dynonuggets.refonteimplicaction.utils.ApiUrls.*; @RestController @@ -22,6 +26,7 @@ public class UserController { private final UserService userService; private final RelationService relationService; private final AuthService authService; + private final GroupService groupService; @GetMapping public ResponseEntity> getAll( @@ -103,4 +108,11 @@ public ResponseEntity updateImageProfile(@RequestParam("file") Multipar final UserDto userDto = userService.updateImageProfile(file); return ResponseEntity.ok(userDto); } + + @GetMapping(GET_USER_GROUPS_URI) + public ResponseEntity> getUserGroups(@PathVariable("userId") Long userId) { + final List groupsDto = userService.getUserGroups(userId); + return ResponseEntity.ok(groupsDto); + } + } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/dto/GroupDto.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/dto/GroupDto.java index 9ce3dff9..9b8172b9 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/dto/GroupDto.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/dto/GroupDto.java @@ -3,6 +3,7 @@ import lombok.*; import java.time.Instant; +import java.util.List; @Data @Builder @@ -17,4 +18,8 @@ public class GroupDto { private Integer numberOfPosts; private String imageUrl; private Instant createdAt; + private boolean valid; + private List users; + private String username; + private Long userId; } 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 a44d1e27..ef56bf85 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 @@ -1,5 +1,6 @@ package com.dynonuggets.refonteimplicaction.dto; +import com.dynonuggets.refonteimplicaction.model.BusinessSectorEnum; import com.dynonuggets.refonteimplicaction.model.ContractTypeEnum; import lombok.AllArgsConstructor; import lombok.Builder; @@ -23,8 +24,11 @@ public class JobPostingDto { private String salary; private String keywords; private ContractTypeEnum contractType; + private BusinessSectorEnum businessSector; private Instant createdAt; private boolean archive; private boolean apply; - + private boolean valid; + private Long posterId; + private String posterName; } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/model/BusinessSectorEnum.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/model/BusinessSectorEnum.java new file mode 100644 index 00000000..2ee66f94 --- /dev/null +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/model/BusinessSectorEnum.java @@ -0,0 +1,7 @@ +package com.dynonuggets.refonteimplicaction.model; + +public enum BusinessSectorEnum { + AGROALIMENTAIRE, BANQUE, ASSURANCE, IMPRIMERIE, BTP, CHIMIE, COMMERCE, EDITION, COMMUNICATION, ELECTRONIQUE, + ETUDES_ET_CONSEILS, INDUSTRIE_PHARMACEUTIQUE, INFORMATIQUE, TELECOMS, AUTOMOBILE, METALLURGIE, SERVICES_AUX_ENTREPRISES, + TEXTILE, TRANSPORTS, LOGISTIQUE +} diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/model/Group.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/model/Group.java index 0ce3cd84..1cbc4671 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/model/Group.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/model/Group.java @@ -42,4 +42,7 @@ public class Group { @ManyToMany(fetch = FetchType.LAZY, cascade = ALL, mappedBy = "groups") private List users; + + @Column(name = "valid") + private boolean valid; } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/model/JobPosting.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/model/JobPosting.java index 5bff791c..7d7fa9a0 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/model/JobPosting.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/model/JobPosting.java @@ -46,9 +46,20 @@ public class JobPosting { @Enumerated(EnumType.STRING) private ContractTypeEnum contractType; + @Enumerated(EnumType.STRING) + private BusinessSectorEnum businessSector; + @Column(name = "created_at") private Instant createdAt; @Column(columnDefinition = "boolean default false") private boolean archive; + + @Column(name = "valid") + private boolean valid; + + @ManyToOne + @JoinColumn(name = "posted_by") + private User poster; + } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/SubredditRepository.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/GroupRepository.java similarity index 68% rename from backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/SubredditRepository.java rename to backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/GroupRepository.java index 3494c8fd..c1020f3a 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/SubredditRepository.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/GroupRepository.java @@ -1,6 +1,7 @@ package com.dynonuggets.refonteimplicaction.repository; import com.dynonuggets.refonteimplicaction.model.Group; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; @@ -8,9 +9,13 @@ import java.util.List; import java.util.Optional; -public interface SubredditRepository extends JpaRepository { +public interface GroupRepository extends JpaRepository { @Query("select s from Group s order by s.posts.size desc") List findAllByTopPosting(Pageable pageable); Optional findByName(String name); + + Page findAllByValidIsFalse(Pageable pageable); + + Page findAllByValidIsTrue(Pageable pageable); } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/JobPostingRepository.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/JobPostingRepository.java index 9c3b5c03..c4d84042 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/JobPostingRepository.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/JobPostingRepository.java @@ -1,10 +1,12 @@ package com.dynonuggets.refonteimplicaction.repository; import com.dynonuggets.refonteimplicaction.model.JobPosting; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface JobPostingRepository extends JpaRepository, JobPostingRepositoryCustom { - + Page findAllByValidIsFalse(Pageable pageable); } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/JobPostingRepositoryCustom.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/JobPostingRepositoryCustom.java index 7c6a7b18..5f8e9046 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/JobPostingRepositoryCustom.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/JobPostingRepositoryCustom.java @@ -10,8 +10,9 @@ public interface JobPostingRepositoryCustom { * @param pageable l'objet de pagination * @param search la chaîne de caratères à rechercher dans les champs title, description, keywords * @param contractType le type de contrat à rechercher (CDD, CDI) + * @param valid la validation de l'offre par l'administrateur * @return la liste de résultats paginée des JobPostings correspondant aux critères */ - Page findAllWithCriteria(final Pageable pageable, final String search, final String contractType, final Boolean archive); + Page findAllWithCriteria(final Pageable pageable, final String search, final String contractType, final Boolean archive, Boolean valid); } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/impl/JobPostingRepositoryImpl.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/impl/JobPostingRepositoryImpl.java index b6e0e9cf..99286712 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/impl/JobPostingRepositoryImpl.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/repository/impl/JobPostingRepositoryImpl.java @@ -24,7 +24,7 @@ public class JobPostingRepositoryImpl implements JobPostingRepositoryCustom { private final EntityManager entityManager; @Override - public Page findAllWithCriteria(Pageable pageable, String search, String contractType, Boolean archive) { + public Page findAllWithCriteria(Pageable pageable, String search, String contractType, Boolean archive, Boolean valid) { CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery query = criteriaBuilder.createQuery(JobPosting.class); Root queryRoot = query.from(JobPosting.class); @@ -52,6 +52,11 @@ public Page findAllWithCriteria(Pageable pageable, String search, St if (archive != null) { predicates.add(criteriaBuilder.equal(queryRoot.get("archive"), archive)); } + + if (valid != null) { + predicates.add(criteriaBuilder.equal(queryRoot.get("valid"), valid)); + } + // combinaison des différents prédicats Predicate finalPredicate = criteriaBuilder.and(predicates.toArray(new Predicate[0])); diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/GroupService.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/GroupService.java index a689f846..dab25ec9 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/GroupService.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/GroupService.java @@ -1,13 +1,16 @@ package com.dynonuggets.refonteimplicaction.service; -import com.dynonuggets.refonteimplicaction.adapter.SubredditAdapter; +import com.dynonuggets.refonteimplicaction.adapter.GroupAdapter; import com.dynonuggets.refonteimplicaction.dto.GroupDto; +import com.dynonuggets.refonteimplicaction.exception.NotFoundException; +import com.dynonuggets.refonteimplicaction.exception.UserNotFoundException; import com.dynonuggets.refonteimplicaction.model.FileModel; import com.dynonuggets.refonteimplicaction.model.Group; +import com.dynonuggets.refonteimplicaction.model.User; import com.dynonuggets.refonteimplicaction.repository.FileRepository; -import com.dynonuggets.refonteimplicaction.repository.SubredditRepository; +import com.dynonuggets.refonteimplicaction.repository.GroupRepository; +import com.dynonuggets.refonteimplicaction.repository.UserRepository; import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @@ -17,54 +20,83 @@ import java.time.Instant; import java.util.List; +import static com.dynonuggets.refonteimplicaction.utils.Message.GROUP_NOT_FOUND_MESSAGE; +import static com.dynonuggets.refonteimplicaction.utils.Message.USER_NOT_FOUND_MESSAGE; import static java.util.stream.Collectors.toList; @Service @AllArgsConstructor -@Slf4j public class GroupService { - private final SubredditAdapter subredditAdapter; - private final SubredditRepository subredditRepository; + private final GroupAdapter groupAdapter; + private final GroupRepository groupRepository; private final AuthService authService; private final CloudService cloudService; private final FileRepository fileRepository; + private final UserRepository userRepository; @Transactional public GroupDto save(MultipartFile image, GroupDto groupDto) { final FileModel fileModel = cloudService.uploadImage(image); final FileModel fileSave = fileRepository.save(fileModel); - - Group group = subredditAdapter.toModel(groupDto); + User user = userRepository.findById(groupDto.getUserId()) + .orElseThrow(() -> new UserNotFoundException(String.format(USER_NOT_FOUND_MESSAGE, groupDto.getUserId()))); + Group group = groupAdapter.toModel(groupDto, user); group.setImage(fileSave); group.setCreatedAt(Instant.now()); group.setUser(authService.getCurrentUser()); - final Group save = subredditRepository.save(group); + final Group save = groupRepository.save(group); - return subredditAdapter.toDto(save); + return groupAdapter.toDto(save); } @Transactional public GroupDto save(GroupDto groupDto) { - Group group = subredditAdapter.toModel(groupDto); + User user = userRepository.findById(groupDto.getUserId()) + .orElseThrow(() -> new UserNotFoundException(String.format(USER_NOT_FOUND_MESSAGE, groupDto.getUserId()))); + Group group = groupAdapter.toModel(groupDto, user); group.setCreatedAt(Instant.now()); group.setUser(authService.getCurrentUser()); - final Group save = subredditRepository.save(group); - return subredditAdapter.toDto(save); + final Group save = groupRepository.save(group); + return groupAdapter.toDto(save); } @Transactional(readOnly = true) - public Page getAll(Pageable pageable) { - final Page subreddits = subredditRepository.findAll(pageable); - return subreddits.map(subredditAdapter::toDto); + public Page getAllValidGroups(Pageable pageable) { + final Page subreddits = groupRepository.findAllByValidIsTrue(pageable); + return subreddits.map(groupAdapter::toDto); } @Transactional(readOnly = true) public List getAllByTopPosting(int limit) { - final List topPostings = subredditRepository.findAllByTopPosting(Pageable.ofSize(limit)); + final List topPostings = groupRepository.findAllByTopPosting(Pageable.ofSize(limit)); return topPostings.stream() - .map(subredditAdapter::toDto) + .map(groupAdapter::toDto) + .collect(toList()); + } + + @Transactional + public List addGroup(String groupName) { + User user = authService.getCurrentUser(); + Group group = groupRepository.findByName(groupName) + .orElseThrow(() -> new NotFoundException(String.format(GROUP_NOT_FOUND_MESSAGE, groupName))); + user.getGroups().add(group); + final User save = userRepository.save(user); + return user.getGroups().stream() + .map(groupAdapter::toDto) .collect(toList()); } + + @Transactional + public Page getAllPendingGroups(Pageable pageable) { + return groupRepository.findAllByValidIsFalse(pageable) + .map(groupAdapter::toDto); + } + + @Transactional + public void validateGroup(Group group) { + group.setValid(true); + groupRepository.save(group); + } } 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 9d4e75b0..255d4a6b 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 @@ -31,7 +31,7 @@ public class JobPostingService { public JobPostingDto createJob(JobPostingDto jobPostingDto) { - JobPosting jobPosting = jobPostingAdapter.toModel(jobPostingDto); + JobPosting jobPosting = jobPostingAdapter.toModel(jobPostingDto, authService.getCurrentUser()); jobPosting.setCreatedAt(Instant.now()); JobPosting jobSaved = jobPostingRepository.save(jobPosting); return jobPostingAdapter.toDto(jobSaved); @@ -49,9 +49,9 @@ public JobPostingDto getJobById(Long jobId) { return jobDto; } - public Page getAllWithCriteria(Pageable pageable, String search, String contractType, Boolean archive, boolean applyCheck) { + public Page getAllWithCriteria(Pageable pageable, String search, String contractType, Boolean archive, boolean applyCheck, Boolean valid) { // récupération des jobs - final Page jobs = jobPostingRepository.findAllWithCriteria(pageable, search, contractType, archive); + final Page jobs = jobPostingRepository.findAllWithCriteria(pageable, search, contractType, archive, valid); if (applyCheck) { final List jobIds = jobs.stream().map(JobPosting::getId).collect(toList()); final List jobAppliesIds = getAllAppliesWithJobIdsIn(jobIds, authService.getCurrentUser().getId()); @@ -73,7 +73,7 @@ private List getAllAppliesWithJobIdsIn(List jobIds, Long userId) { @Transactional public JobPostingDto saveOrUpdateJobPosting(final JobPostingDto jobPostingDto) { - JobPosting jobPosting = jobPostingAdapter.toModel(jobPostingDto); + JobPosting jobPosting = jobPostingAdapter.toModel(jobPostingDto, authService.getCurrentUser()); final JobPosting save = jobPostingRepository.save(jobPosting); return jobPostingAdapter.toDto(save); } @@ -103,4 +103,20 @@ public List toggleArchiveAll(List jobsId) { .map(jobPostingAdapter::toDto) .collect(Collectors.toList()); } + + @Transactional + public Page getAllPendingJobs(Pageable pageable) { + return jobPostingRepository.findAllByValidIsFalse(pageable) + .map(jobPostingAdapter::toDto); + } + + @Transactional + public void validateJob(JobPosting job) { + job.setValid(true); + jobPostingRepository.save(job); + } + + public Page getAllActiveWithCriteria(Pageable pageable, String search, String contractType, Boolean isArchive) { + return this.getAllWithCriteria(pageable, search, contractType, isArchive, true, true); + } } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/PostService.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/PostService.java index 2f1fc375..97279fa1 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/PostService.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/PostService.java @@ -6,8 +6,8 @@ import com.dynonuggets.refonteimplicaction.exception.NotFoundException; import com.dynonuggets.refonteimplicaction.model.Group; import com.dynonuggets.refonteimplicaction.model.Post; +import com.dynonuggets.refonteimplicaction.repository.GroupRepository; import com.dynonuggets.refonteimplicaction.repository.PostRepository; -import com.dynonuggets.refonteimplicaction.repository.SubredditRepository; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -26,7 +26,7 @@ public class PostService { private final PostRepository postRepository; - private final SubredditRepository subredditRepository; + private final GroupRepository groupRepository; private final AuthService authService; private final PostAdapter postAdapter; private final CommentService commentService; @@ -38,7 +38,7 @@ public PostResponse saveOrUpdate(PostRequest postRequest) { throw new IllegalArgumentException(POST_SHOULD_HAVE_A_NAME); } - Group group = subredditRepository.findById(postRequest.getGroupId()) + Group group = groupRepository.findById(postRequest.getGroupId()) .orElseThrow(() -> new NotFoundException(String.format(SUBREDDIT_NOT_FOUND_MESSAGE, postRequest.getGroupId()))); Post post = postAdapter.toPost(postRequest, group, authService.getCurrentUser()); diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/UserService.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/UserService.java index 0b00c71f..cfdd310c 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/UserService.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/service/UserService.java @@ -1,17 +1,14 @@ package com.dynonuggets.refonteimplicaction.service; +import com.dynonuggets.refonteimplicaction.adapter.GroupAdapter; import com.dynonuggets.refonteimplicaction.adapter.UserAdapter; +import com.dynonuggets.refonteimplicaction.dto.GroupDto; import com.dynonuggets.refonteimplicaction.dto.RelationTypeEnum; import com.dynonuggets.refonteimplicaction.dto.UserDto; import com.dynonuggets.refonteimplicaction.exception.UserNotFoundException; -import com.dynonuggets.refonteimplicaction.model.FileModel; -import com.dynonuggets.refonteimplicaction.model.JobSeeker; -import com.dynonuggets.refonteimplicaction.model.Relation; -import com.dynonuggets.refonteimplicaction.model.User; -import com.dynonuggets.refonteimplicaction.repository.FileRepository; -import com.dynonuggets.refonteimplicaction.repository.JobSeekerRepository; -import com.dynonuggets.refonteimplicaction.repository.RelationRepository; -import com.dynonuggets.refonteimplicaction.repository.UserRepository; +import com.dynonuggets.refonteimplicaction.model.*; +import com.dynonuggets.refonteimplicaction.repository.*; +import com.dynonuggets.refonteimplicaction.utils.Message; import lombok.AllArgsConstructor; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -34,6 +31,8 @@ public class UserService { private final JobSeekerRepository jobSeekerRepository; private final CloudService cloudService; private final FileRepository fileRepository; + private final GroupRepository groupRepository; + private GroupAdapter groupAdapter; /** * @return la liste paginée de tous les utilisateurs @@ -123,4 +122,15 @@ public UserDto updateImageProfile(MultipartFile file) { final User save = userRepository.save(currentUser); return userAdapter.toDto(save); } + + @Transactional(readOnly = true) + public List getUserGroups(Long userId) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new UserNotFoundException(Message.USER_NOT_FOUND_MESSAGE)); + ; + final List groups = user.getGroups(); + return groups.stream() + .map(groupAdapter::toDto) + .collect(toList()); + } } diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/utils/ApiUrls.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/utils/ApiUrls.java index 2193de95..b316d142 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/utils/ApiUrls.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/utils/ApiUrls.java @@ -19,6 +19,9 @@ public class ApiUrls { public static final String DELETE_JOB_URI = "/{jobId}"; public static final String ARCHIVE_JOB_URI = "/{jobId}/archive"; public static final String ARCHIVE_JOBS_URI = "/archive"; + public static final String GET_PENDING_JOB_URI = "/pending"; + public static final String VALIDATE_JOB_URI = "/validate"; + public static final String VALIDATED_JOBS = "/validated"; // POSTS public static final String POSTS_BASE_URI = "/api/posts"; @@ -28,6 +31,11 @@ public class ApiUrls { // GROUPS public static final String GROUPS_BASE_URI = "/api/groups"; public static final String GET_ALL_BY_TOP_POSTING_URI = "/top-posting"; + public static final String CREATE_NO_IMAGE = "/no-image"; + public static final String GET_PENDING_GROUP_URI = "/pending"; + public static final String VALIDATE_GROUP_URI = "/validate"; + public static final String GET_VALIDATED_GROUPS_URI = "/validated"; + public static final String SUBSCRIBE_GROUP = "/{groupName}/subscribe"; // COMMENTS public static final String COMMENTS_BASE_URI = "/api/comments"; @@ -45,6 +53,7 @@ public class ApiUrls { public static final String GET_PENDING_USER_URI = "/pending"; public static final String GET_COMMUNITY_URI = "/community"; public static final String SET_USER_IMAGE = "/image"; + public static final String GET_USER_GROUPS_URI = "/{userId}/groups"; // FILES public static final String FILE_BASE_URI = "/api/files"; diff --git a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/utils/Message.java b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/utils/Message.java index 07e78466..255c478d 100644 --- a/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/utils/Message.java +++ b/backend-implicaction/src/main/java/com/dynonuggets/refonteimplicaction/utils/Message.java @@ -9,6 +9,9 @@ public class Message { // Jobs messages public static final String JOB_NOT_FOUND_MESSAGE = "No job found with id [%d]"; + // Groups messages + public static final String GROUP_NOT_FOUND_MESSAGE = "No group found with id [%d]"; + // Subreddit messages public static final String SUBREDDIT_NOT_FOUND_MESSAGE = "No subreddit found with id [%s]"; diff --git a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/adapter/GroupAdapterTest.java b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/adapter/GroupAdapterTest.java index bcef7afc..09c48ff8 100644 --- a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/adapter/GroupAdapterTest.java +++ b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/adapter/GroupAdapterTest.java @@ -4,6 +4,8 @@ import com.dynonuggets.refonteimplicaction.model.FileModel; import com.dynonuggets.refonteimplicaction.model.Group; import com.dynonuggets.refonteimplicaction.model.Post; +import com.dynonuggets.refonteimplicaction.model.User; +import com.dynonuggets.refonteimplicaction.repository.UserRepository; import com.dynonuggets.refonteimplicaction.service.FileService; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -25,7 +27,10 @@ class GroupAdapterTest { FileService fileService; @InjectMocks - SubredditAdapter subredditAdapter; + GroupAdapter groupAdapter; + + @Mock + UserRepository userRepository; @Test void should_map_to_model() { @@ -34,10 +39,17 @@ void should_map_to_model() { .id(123L) .description("blablabla") .name("blabla") + .userId(1L) + .username("test") + .build(); + + User user = User.builder() + .id(1L) + .username("test") .build(); // when - final Group actual = subredditAdapter.toModel(expected); + final Group actual = groupAdapter.toModel(expected, user); // then assertThat(actual.getId()).isEqualTo(expected.getId()); @@ -49,35 +61,49 @@ void should_map_to_model() { @Test void should_map_to_dto_with_count_when_model_has_posts() { // given + User user = User.builder() + .id(1L) + .username("test") + .build(); + Group expectedModel = Group.builder() .id(123L) .description("blablabla") .name("blabla") .posts(Arrays.asList(new Post(), new Post(), new Post(), new Post())) .createdAt(Instant.now()) + .user(user) .build(); // when - final GroupDto actualDto = subredditAdapter.toDto(expectedModel); + final GroupDto actualDto = groupAdapter.toDto(expectedModel); // then assertThat(actualDto).usingRecursiveComparison() - .ignoringFields("user", "posts", "numberOfPosts", "imageUrl") + .ignoringFields("user", "posts", "numberOfPosts", "imageUrl", "username", "userId") .isEqualTo(expectedModel); assertThat(actualDto.getNumberOfPosts()).isEqualTo(expectedModel.getPosts().size()); - assertThat(actualDto.getImageUrl()).isEqualTo(SubredditAdapter.DEFAULT_GROUP_IMAGE_URI); + assertThat(actualDto.getImageUrl()).isEqualTo(GroupAdapter.DEFAULT_GROUP_IMAGE_URI); + assertThat(actualDto.getUsername()).isEqualTo(expectedModel.getUser().getUsername()); + assertThat(actualDto.getUserId()).isEqualTo(expectedModel.getUser().getId()); } @Test void should_map_to_dto_with_image_url_when_model_has_image() { // given + User user = User.builder() + .id(1L) + .username("test") + .build(); + Group expectedModel = Group.builder() .id(123L) .description("blablabla") .name("blabla") .image(FileModel.builder().url("http://url.com").objectKey("blablabla").build()) .createdAt(Instant.now()) + .user(user) .build(); String expectedUrl = "http://url/objectKey"; @@ -85,14 +111,16 @@ void should_map_to_dto_with_image_url_when_model_has_image() { given(fileService.buildFileUri(anyString())).willReturn(expectedUrl); // when - final GroupDto actualDto = subredditAdapter.toDto(expectedModel); + final GroupDto actualDto = groupAdapter.toDto(expectedModel); // then assertThat(actualDto).usingRecursiveComparison() - .ignoringFields("user", "posts", "numberOfPosts", "imageUrl") + .ignoringFields("user", "posts", "numberOfPosts", "imageUrl", "username", "userId") .isEqualTo(expectedModel); assertThat(actualDto.getNumberOfPosts()).isZero(); assertThat(actualDto.getImageUrl()).contains(expectedUrl); + assertThat(actualDto.getUsername()).isEqualTo(expectedModel.getUser().getUsername()); + assertThat(actualDto.getUserId()).isEqualTo(expectedModel.getUser().getId()); } } 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 f747bfaa..0a60073d 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 @@ -2,10 +2,7 @@ import com.dynonuggets.refonteimplicaction.controller.ControllerIntegrationTestBase; import com.dynonuggets.refonteimplicaction.dto.JobApplicationDto; -import com.dynonuggets.refonteimplicaction.model.Company; -import com.dynonuggets.refonteimplicaction.model.JobApplication; -import com.dynonuggets.refonteimplicaction.model.JobPosting; -import com.dynonuggets.refonteimplicaction.model.User; +import com.dynonuggets.refonteimplicaction.model.*; import org.junit.jupiter.api.Test; import java.time.Instant; @@ -21,9 +18,9 @@ class JobApplicationAdapterTest extends ControllerIntegrationTestBase { @Test void given_company_should_return_dto() { // given - Company company = new Company(1234L, "World Company", "http://logo.com", "La World Company est une multinationale imaginaire basée aux États-Unis", "http://word-company.com"); - JobPosting job = new JobPosting(34L, company, "Job de folie", "blablabla", "blablabla", "Paris", "240k", null, CDD, Instant.now(), false); User user = User.builder().id(87L).build(); + Company company = new Company(1234L, "World Company", "http://logo.com", "La World Company est une multinationale imaginaire basée aux États-Unis", "http://word-company.com"); + JobPosting job = new JobPosting(34L, company, "Job de folie", "blablabla", "blablabla", "Paris", "240k", null, CDD, BusinessSectorEnum.ASSURANCE, Instant.now(), false, true, user); JobApplication model = new JobApplication(123L, job, user, PENDING, Instant.now(), false); // when @@ -43,8 +40,8 @@ void given_company_should_return_dto() { void given_no_company_should_return_dto() { // given Company company = null; - JobPosting job = new JobPosting(34L, company, "Job de folie", "blablabla", "blablabla", "Paris", "240k", null, CDD, Instant.now(), false); User user = User.builder().id(87L).build(); + JobPosting job = new JobPosting(34L, company, "Job de folie", "blablabla", "blablabla", "Paris", "240k", null, CDD, BusinessSectorEnum.ASSURANCE, Instant.now(), false, true, user); JobApplication model = new JobApplication(123L, job, user, PENDING, Instant.now(), false); // when diff --git a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/adapter/JobPostingAdapterTest.java b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/adapter/JobPostingAdapterTest.java index c8664012..a772baf4 100644 --- a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/adapter/JobPostingAdapterTest.java +++ b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/adapter/JobPostingAdapterTest.java @@ -2,8 +2,10 @@ import com.dynonuggets.refonteimplicaction.dto.CompanyDto; import com.dynonuggets.refonteimplicaction.dto.JobPostingDto; +import com.dynonuggets.refonteimplicaction.model.BusinessSectorEnum; import com.dynonuggets.refonteimplicaction.model.Company; import com.dynonuggets.refonteimplicaction.model.JobPosting; +import com.dynonuggets.refonteimplicaction.model.User; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -16,8 +18,11 @@ class JobPostingAdapterTest { CompanyDto companyDto; Company company; JobPosting jobPosting; + JobPostingDto expectedJobPostingDto; JobPostingAdapter jobPostingAdapter; CompanyAdapter companyAdapter; + User user; + Instant createdAt; @BeforeEach public void setUp() { @@ -25,6 +30,8 @@ public void setUp() { jobPostingAdapter = new JobPostingAdapter(companyAdapter); company = new Company(1L, "urlModel", "logo", "name", "description"); companyDto = new CompanyDto(1L, "urlModel", "logo", "name", "description"); + user = User.builder().id(2L).username("user").build(); + createdAt = Instant.now(); jobPosting = JobPosting.builder() .id(7L) @@ -36,31 +43,45 @@ public void setUp() { .salary("salary") .keywords("keywords") .contractType(CDD) - .createdAt(Instant.now()) + .businessSector(BusinessSectorEnum.ASSURANCE) + .createdAt(createdAt) + .archive(false) + .valid(true) + .poster(user) + .build(); + + expectedJobPostingDto = JobPostingDto.builder() + .id(7L) + .company(companyDto) + .title("title") + .shortDescription("short_description") + .description("description") + .location("location") + .salary("salary") + .keywords("keywords") + .contractType(CDD) + .businessSector(BusinessSectorEnum.ASSURANCE) + .createdAt(createdAt) + .archive(false) + .valid(true) + .posterId(user.getId()) + .posterName(user.getUsername()) .build(); } @Test void toDtoTest() { - JobPostingDto jobPostingDto = jobPostingAdapter.toDto(jobPosting); - assertThat(jobPostingDto.getId()).isEqualTo(jobPosting.getId()); - assertThat(jobPostingDto.getTitle()).isEqualTo(jobPosting.getTitle()); - assertThat(jobPostingDto.getShortDescription()).isEqualTo(jobPosting.getShortDescription()); - assertThat(jobPostingDto.getDescription()).isEqualTo(jobPosting.getDescription()); - assertThat(jobPostingDto.getLocation()).isEqualTo(jobPosting.getLocation()); - assertThat(jobPostingDto.getSalary()).isEqualTo(jobPosting.getSalary()); - assertThat(jobPostingDto.getKeywords()).isEqualTo(jobPosting.getKeywords()); - assertThat(jobPostingDto.getContractType()).isEqualTo(CDD); - assertThat(jobPostingDto.getCreatedAt()).isEqualTo(jobPosting.getCreatedAt()); + assertThat(jobPostingDto).usingRecursiveComparison() + .isEqualTo(expectedJobPostingDto); } @Test void toModelTest() { final JobPostingDto dto = jobPostingAdapter.toDto(jobPosting); - final JobPosting expectedJobPosting = jobPostingAdapter.toModel(dto); + final JobPosting expectedJobPosting = jobPostingAdapter.toModel(dto, user); assertThat(jobPosting).usingRecursiveComparison() .isEqualTo(expectedJobPosting); diff --git a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/adapter/PostAdapterTest.java b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/adapter/PostAdapterTest.java index d37ecadc..510c81de 100644 --- a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/adapter/PostAdapterTest.java +++ b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/adapter/PostAdapterTest.java @@ -32,7 +32,7 @@ class PostAdapterTest { void toPost() { // given User currentUser = User.builder().id(123L).username("test user").build(); - Group group = new Group(123L, "Super Subreddit", "Subreddit Description", emptyList(), now(), currentUser, null, emptyList()); + Group group = new Group(123L, "Super Subreddit", "Subreddit Description", emptyList(), now(), currentUser, null, emptyList(), true); Post expected = new Post(123L, "Super Post", "http://url.site", "Test", 0, currentUser, now(), group); PostRequest postRequest = new PostRequest(123L, null, "Super Post", "http://url.site", "Test"); @@ -62,7 +62,7 @@ void should_return_post_with_no_subreddit_and_poster_has_no_image() { @Test void should_return_post_with_subreddit_image_null() { User currentUser = User.builder().id(123L).username("test user").build(); - Group group = new Group(123L, "Super Subreddit", "Subreddit Description", emptyList(), now(), currentUser, null, emptyList()); + Group group = new Group(123L, "Super Subreddit", "Subreddit Description", emptyList(), now(), currentUser, null, emptyList(), true); Post expected = new Post(123L, "Super Post", "http://url.site", "Test", 12, currentUser, now(), group); final int expectedCommentCount = 10; @@ -77,7 +77,7 @@ void should_return_post_with_subreddit_image_null() { void toPostResponse() { // given User currentUser = User.builder().id(123L).username("test user").image(FileModel.builder().url("http://url.com").build()).build(); - Group group = new Group(123L, "Super Subreddit", "Subreddit Description", emptyList(), now(), currentUser, FileModel.builder().url("http://img.com").build(), emptyList()); + Group group = new Group(123L, "Super Subreddit", "Subreddit Description", emptyList(), now(), currentUser, FileModel.builder().url("http://img.com").build(), emptyList(), true); Post expected = new Post(123L, "Super Post", "http://url.site", "Test", 12, currentUser, now(), group); final int expectedCommentCount = 10; diff --git a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/GroupControllerIntegrationTest.java b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/GroupControllerIntegrationTest.java index 9124eb9a..43bf370c 100644 --- a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/GroupControllerIntegrationTest.java +++ b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/GroupControllerIntegrationTest.java @@ -1,17 +1,22 @@ package com.dynonuggets.refonteimplicaction.controller; import com.dynonuggets.refonteimplicaction.dto.GroupDto; +import com.dynonuggets.refonteimplicaction.model.User; +import com.dynonuggets.refonteimplicaction.repository.UserRepository; import com.dynonuggets.refonteimplicaction.service.GroupService; import com.google.common.collect.Ordering; import com.google.gson.reflect.TypeToken; import org.junit.jupiter.api.Test; +import org.mockito.Mock; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.data.domain.*; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.web.servlet.ResultActions; +import java.util.Arrays; import java.util.List; +import java.util.Optional; import static com.dynonuggets.refonteimplicaction.utils.ApiUrls.*; import static java.util.Arrays.asList; @@ -33,6 +38,9 @@ class GroupControllerIntegrationTest extends ControllerIntegrationTestBase { @MockBean GroupService groupService; + @Mock + UserRepository userRepository; + @Test void should_response_forbidden_when_create_subreddit_with_no_authentication() throws Exception { // given @@ -55,7 +63,7 @@ void should_response_forbidden_when_create_subreddit_with_no_authentication() th @Test @WithMockUser - void should_list_all_subreddit_whith_no_authentication() throws Exception { + void should_list_all_subreddit_with_no_authentication() throws Exception { // given final Pageable DEFAULT_PAGEABLE = PageRequest.of(0, 10, Sort.DEFAULT_DIRECTION, "id"); final Page subreddits = new PageImpl<>(asList( @@ -70,10 +78,16 @@ void should_list_all_subreddit_whith_no_authentication() throws Exception { GroupDto.builder().id(14L).build(), GroupDto.builder().id(15L).build() )); - given(groupService.getAll(DEFAULT_PAGEABLE)).willReturn(subreddits); + final User user = User.builder() + .id(1L) + .username("test") + .build(); + + given(groupService.getAllValidGroups(DEFAULT_PAGEABLE)).willReturn(subreddits); + given(userRepository.findById(any())).willReturn(Optional.of(user)); // when - final ResultActions resultActions = mvc.perform(get(GROUPS_BASE_URI).contentType(APPLICATION_JSON)); + final ResultActions resultActions = mvc.perform(get(GROUPS_BASE_URI + GET_VALIDATED_GROUPS_URI).contentType(APPLICATION_JSON)); // then resultActions.andDo(print()) @@ -91,7 +105,7 @@ void should_list_all_subreddit_whith_no_authentication() throws Exception { } resultActions.andReturn(); - verify(groupService, times(1)).getAll(any()); + verify(groupService, times(1)).getAllValidGroups(any()); } @Test @@ -102,7 +116,7 @@ void should_response_forbidden_when_listing_all_subreddit_whith_no_authenticatio // then resultActions.andDo(print()).andExpect(status().isForbidden()); - verify(groupService, never()).getAll(any()); + verify(groupService, never()).getAllValidGroups(any()); } @Test @@ -157,4 +171,45 @@ void should_response_forbidden_when_top_posting_and_not_authenticated() throws E verify(groupService, never()).getAllByTopPosting(anyInt()); } + + @Test + @WithMockUser + void should_get_all_pending_groups_when_authenticated() throws Exception { + //given + List groupDtos = Arrays.asList( + GroupDto.builder().id(1L).valid(false).build(), + GroupDto.builder().id(2L).valid(false).build(), + GroupDto.builder().id(3L).valid(false).build() + ); + Page groupPageMockResponse = new PageImpl<>(groupDtos); + given(groupService.getAllPendingGroups(any())).willReturn(groupPageMockResponse); + + // when + ResultActions resultActions = mvc.perform( + get(GROUPS_BASE_URI + GET_PENDING_GROUP_URI).contentType(APPLICATION_JSON)); + + // then + resultActions.andDo(print()) + .andExpect(status().isOk()); + + for (int i = 0; i < groupDtos.size(); i++) { + final String contentPath = String.format("$.content[%d]", i); + resultActions.andExpect(jsonPath(contentPath + ".id", is(Math.toIntExact(groupDtos.get(i).getId())))); + resultActions.andExpect(jsonPath(contentPath + ".valid", is(groupDtos.get(i).isValid()))); + } + + verify(groupService, times(1)).getAllPendingGroups(any()); + } + + @Test + void should_response_forbidden_when_pending_groups_and_not_authenticated() throws Exception { + + // when + final ResultActions resultActions = mvc.perform(get(GROUPS_BASE_URI + GET_PENDING_GROUP_URI).contentType(APPLICATION_JSON)); + + // then + resultActions.andDo(print()).andExpect(status().isForbidden()); + + verify(groupService, never()).getAllPendingGroups(any()); + } } 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 99afb790..88ee9c47 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 @@ -1,5 +1,6 @@ package com.dynonuggets.refonteimplicaction.controller; +import com.dynonuggets.refonteimplicaction.adapter.JobPostingAdapter; import com.dynonuggets.refonteimplicaction.dto.JobPostingDto; import com.dynonuggets.refonteimplicaction.exception.NotFoundException; import com.dynonuggets.refonteimplicaction.service.JobPostingService; @@ -36,6 +37,9 @@ class JobsPostingControllerTest extends ControllerIntegrationTestBase { @MockBean JobPostingService jobPostingService; + @MockBean + JobPostingAdapter jobPostingAdapter; + List jobPostings; @BeforeEach @@ -51,7 +55,7 @@ void getJobPostingsListShouldListAllJobs() throws Exception { // given Page jobPostingPageMockResponse = new PageImpl<>(jobPostings); - given(jobPostingService.getAllWithCriteria(any(), anyString(), anyString(), anyBoolean(), anyBoolean())).willReturn(jobPostingPageMockResponse); + given(jobPostingService.getAllWithCriteria(any(), anyString(), anyString(), anyBoolean(), anyBoolean(), any())).willReturn(jobPostingPageMockResponse); // when ResultActions resultActions = mvc.perform( @@ -74,7 +78,7 @@ void getJobPostingsListShouldListAllJobs() throws Exception { .andExpect(jsonPath(contentPath + ".salary", is(jobPostings.get(i).getSalary()))); } - verify(jobPostingService, times(1)).getAllWithCriteria(any(), anyString(), anyString(), anyBoolean(), anyBoolean()); + verify(jobPostingService, times(1)).getAllWithCriteria(any(), anyString(), anyString(), anyBoolean(), anyBoolean(), any()); } @Test @@ -82,7 +86,7 @@ void getAllWithoutJwtShouldBeForbidden() throws Exception { mvc.perform(get(JOBS_BASE_URI)).andDo(print()) .andExpect(status().isForbidden()); - verify(jobPostingService, times(0)).getAllWithCriteria(any(), anyString(), anyString(), anyBoolean(), anyBoolean()); + verify(jobPostingService, times(0)).getAllWithCriteria(any(), anyString(), anyString(), anyBoolean(), anyBoolean(), anyBoolean()); } @Test @@ -246,4 +250,46 @@ void archiveJobListWithoutJwtShouldBeForbidden() throws Exception { .andExpect(status().isForbidden()); verify(jobPostingService, never()).toggleArchiveAll(Collections.singletonList(anyLong())); } + + @Test + @WithMockUser + void should_get_all_pending_jobs_when_authenticated() throws Exception { + //given + List jobPostingDtos = Arrays.asList( + JobPostingDto.builder().id(1L).valid(false).build(), + JobPostingDto.builder().id(2L).valid(false).build(), + JobPostingDto.builder().id(3L).valid(false).build() + ); + Page jobPageMockResponse = new PageImpl<>(jobPostingDtos); + given(jobPostingService.getAllPendingJobs(any())).willReturn(jobPageMockResponse); + + // when + ResultActions resultActions = mvc.perform( + get(JOBS_BASE_URI + GET_PENDING_JOB_URI).contentType(APPLICATION_JSON)); + + // then + resultActions.andDo(print()) + .andExpect(status().isOk()); + + for (int i = 0; i < jobPostingDtos.size(); i++) { + final String contentPath = String.format("$.content[%d]", i); + resultActions.andExpect(jsonPath(contentPath + ".id", is(Math.toIntExact(jobPostingDtos.get(i).getId())))); + resultActions.andExpect(jsonPath(contentPath + ".valid", is(jobPostingDtos.get(i).isValid()))); + } + + verify(jobPostingService, times(1)).getAllPendingJobs(any()); + } + + @Test + void should_response_forbidden_when_pending_jobs_and_not_authenticated() throws Exception { + + // when + final ResultActions resultActions = mvc.perform(get(JOBS_BASE_URI + GET_PENDING_JOB_URI).contentType(APPLICATION_JSON)); + + // then + resultActions.andDo(print()).andExpect(status().isForbidden()); + + verify(jobPostingService, never()).getAllPendingJobs(any()); + } + } diff --git a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/UserControllerTest.java b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/UserControllerTest.java index 88ad826f..78604dfd 100644 --- a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/UserControllerTest.java +++ b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/controller/UserControllerTest.java @@ -1,11 +1,13 @@ package com.dynonuggets.refonteimplicaction.controller; +import com.dynonuggets.refonteimplicaction.dto.GroupDto; import com.dynonuggets.refonteimplicaction.dto.RelationTypeEnum; import com.dynonuggets.refonteimplicaction.dto.UserDto; import com.dynonuggets.refonteimplicaction.model.RoleEnum; import com.dynonuggets.refonteimplicaction.model.User; import com.dynonuggets.refonteimplicaction.repository.RelationRepository; import com.dynonuggets.refonteimplicaction.service.AuthService; +import com.dynonuggets.refonteimplicaction.service.GroupService; import com.dynonuggets.refonteimplicaction.service.RelationService; import com.dynonuggets.refonteimplicaction.service.UserService; import org.junit.jupiter.api.BeforeEach; @@ -40,6 +42,7 @@ class UserControllerTest extends ControllerIntegrationTestBase { List userDtos; + List groupDtos; ArrayList roles = new ArrayList<>(); @MockBean @@ -51,6 +54,9 @@ class UserControllerTest extends ControllerIntegrationTestBase { @MockBean AuthService authService; + @MockBean + GroupService groupService; + @MockBean RelationRepository relationRepository; @@ -615,4 +621,34 @@ void should_return_forbidden_when_save_user_image_with_no_authentication() throw verify(userService, never()).updateImageProfile(any()); } + + @Test + @WithMockUser + void getAllGroupsByUser() throws Exception { + UserDto user = UserDto.builder().id(1L).build(); + ArrayList userList = new ArrayList<>(); + userList.add(user); + + GroupDto group = GroupDto.builder().id(1L).name("ile-de-france").description("communauté ile de france").numberOfPosts(0).imageUrl("").users(userList).build(); + + ArrayList groupList = new ArrayList<>(); + groupList.add(group); + given(userService.getUserGroups(anyLong())).willReturn(groupList); + + final ResultActions resultActions = mvc.perform(get(USER_BASE_URI + GET_USER_GROUPS_URI, user.getId()).contentType(APPLICATION_JSON)) + .andDo(print()) + .andExpect(status().isOk()); + + for (int i = 0; i < groupList.size(); i++) { + final String contentPath = String.format("$[%d]", i); + + resultActions + .andExpect(jsonPath(contentPath + ".id", is(groupList.get(i).getId().intValue()))) + .andExpect(jsonPath(contentPath + ".description", is(groupList.get(i).getDescription()))) + .andExpect(jsonPath(contentPath + ".numberOfPosts", is(groupList.get(i).getNumberOfPosts()))) + .andExpect(jsonPath(contentPath + ".imageUrl", is(groupList.get(i).getImageUrl()))) + .andExpect(jsonPath(contentPath + ".name", is(groupList.get(i).getName()))); + } + verify(userService, times(1)).getUserGroups(anyLong()); + } } diff --git a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/repository/GroupRepositoryTest.java b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/repository/GroupRepositoryTest.java index 8d1e9553..d0c48742 100644 --- a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/repository/GroupRepositoryTest.java +++ b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/repository/GroupRepositoryTest.java @@ -25,7 +25,7 @@ class GroupRepositoryTest extends AbstractContainerBaseTest { @Autowired - SubredditRepository subredditRepository; + GroupRepository groupRepository; @Autowired PostRepository postRepository; @@ -45,7 +45,7 @@ void findAllByTopPosting() { final Group s9 = Group.builder().id(9L).name("sub9").description("sub9").createdAt(Instant.now()).build(); List groups = asList(s1, s2, s3, s4, s5, s6, s7, s8, s9); - subredditRepository.saveAll(groups); + groupRepository.saveAll(groups); List s1Posts = Stream.of(1, 2, 3, 4, 5) .map(id -> Post.builder().name("bla").group(s1).build()) @@ -88,7 +88,7 @@ void findAllByTopPosting() { .collect(toList()); // when - final List actual = subredditRepository.findAllByTopPosting(Pageable.ofSize(limit)); + final List actual = groupRepository.findAllByTopPosting(Pageable.ofSize(limit)); // then assertThat(actual.size()).isEqualTo(limit); diff --git a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/CommentServiceTest.java b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/CommentServiceTest.java index 5c8e7cfa..b9d07870 100644 --- a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/CommentServiceTest.java +++ b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/CommentServiceTest.java @@ -144,7 +144,7 @@ void should_throw_exception_when_not_exists() { void should_get_comments_for_post_when_exists() { // given User currentUser = User.builder().id(123L).username("Sankukai").build(); - Group group = new Group(123L, "Super Subreddit", "Subreddit Description", emptyList(), Instant.now(), currentUser, null, emptyList()); + Group group = new Group(123L, "Super Subreddit", "Subreddit Description", emptyList(), Instant.now(), currentUser, null, emptyList(), true); Post post = new Post(12L, "Super Post", "http://url.site", "Test", 88000, currentUser, Instant.now(), group); List comments = asList( new Comment(3L, "comment1", post, Instant.now(), currentUser), diff --git a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/GroupServiceTest.java b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/GroupServiceTest.java index 4e3b58c9..68503195 100644 --- a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/GroupServiceTest.java +++ b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/GroupServiceTest.java @@ -1,12 +1,14 @@ package com.dynonuggets.refonteimplicaction.service; -import com.dynonuggets.refonteimplicaction.adapter.SubredditAdapter; +import com.dynonuggets.refonteimplicaction.adapter.GroupAdapter; +import com.dynonuggets.refonteimplicaction.adapter.UserAdapter; import com.dynonuggets.refonteimplicaction.dto.GroupDto; import com.dynonuggets.refonteimplicaction.model.FileModel; import com.dynonuggets.refonteimplicaction.model.Group; import com.dynonuggets.refonteimplicaction.model.User; import com.dynonuggets.refonteimplicaction.repository.FileRepository; -import com.dynonuggets.refonteimplicaction.repository.SubredditRepository; +import com.dynonuggets.refonteimplicaction.repository.GroupRepository; +import com.dynonuggets.refonteimplicaction.repository.UserRepository; import com.dynonuggets.refonteimplicaction.service.impl.S3CloudServiceImpl; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -23,6 +25,7 @@ import java.util.Arrays; import java.util.List; +import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; @@ -32,10 +35,10 @@ class GroupServiceTest { @Mock - SubredditRepository subredditRepository; + GroupRepository groupRepository; @Mock - SubredditAdapter subredditAdapter; + GroupAdapter groupAdapter; @Mock AuthService authService; @@ -46,6 +49,12 @@ class GroupServiceTest { @Mock FileRepository fileRepository; + @Mock + UserRepository userRepository; + + @Mock + UserAdapter userAdapter; + @InjectMocks GroupService groupService; @@ -93,18 +102,24 @@ void should_save_subreddit_with_image() { "test data".getBytes() ); + final User user = User.builder() + .id(1L) + .username("test") + .build(); + given(userRepository.findById(any())).willReturn(Optional.of(user)); + when(cloudService.uploadImage(any())).thenReturn(fileModel); when(fileRepository.save(fileModel)).thenReturn(fileModel); - when(subredditAdapter.toModel(any())).thenReturn(sentModel); + when(groupAdapter.toModel(any(), any())).thenReturn(sentModel); when(authService.getCurrentUser()).thenReturn(currentUser); - when(subredditRepository.save(any())).thenReturn(saveModel); - when(subredditAdapter.toDto(any())).thenReturn(expectedDto); + when(groupRepository.save(any())).thenReturn(saveModel); + when(groupAdapter.toDto(any())).thenReturn(expectedDto); // when groupService.save(mockMultipartFile, sentDto); // then - verify(subredditRepository, times(1)).save(argumentCaptor.capture()); + verify(groupRepository, times(1)).save(argumentCaptor.capture()); final Group value = argumentCaptor.getValue(); @@ -136,14 +151,20 @@ void should_save_when_no_image() { .description("Elle est super bien ma description") .build(); - given(subredditAdapter.toModel(any())).willReturn(sentModel); + final User user = User.builder() + .id(1L) + .username("test") + .build(); + + given(groupAdapter.toModel(any(), any())).willReturn(sentModel); given(authService.getCurrentUser()).willReturn(currentUser); - given(subredditRepository.save(any())).willReturn(saveModel); + given(groupRepository.save(any())).willReturn(saveModel); + given(userRepository.findById(any())).willReturn(Optional.of(user)); // when groupService.save(sentDto); - verify(subredditRepository, times(1)).save(argumentCaptor.capture()); + verify(groupRepository, times(1)).save(argumentCaptor.capture()); assertThat(argumentCaptor.getValue().getId()).isNull(); assertThat(argumentCaptor.getValue().getName()).isEqualTo("coucou subreddit"); @@ -173,10 +194,9 @@ void should_list_all_subreddits() { Pageable pageable = PageRequest.of(first, first * size); Page subredditsPage = new PageImpl<>(groups.subList(0, size - 1)); - given(subredditRepository.findAll(any(Pageable.class))).willReturn(subredditsPage); - + given(groupRepository.findAllByValidIsTrue(any(Pageable.class))).willReturn(subredditsPage); // when - Page actuals = groupService.getAll(pageable); + Page actuals = groupService.getAllValidGroups(pageable); // then assertThat(actuals.getTotalElements()).isEqualTo(subredditsPage.getTotalElements()); 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 9e23ab3d..5a3b19ba 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 @@ -5,10 +5,7 @@ import com.dynonuggets.refonteimplicaction.dto.JobApplicationDto; import com.dynonuggets.refonteimplicaction.dto.JobApplicationRequest; import com.dynonuggets.refonteimplicaction.exception.NotFoundException; -import com.dynonuggets.refonteimplicaction.model.Company; -import com.dynonuggets.refonteimplicaction.model.JobApplication; -import com.dynonuggets.refonteimplicaction.model.JobPosting; -import com.dynonuggets.refonteimplicaction.model.User; +import com.dynonuggets.refonteimplicaction.model.*; import com.dynonuggets.refonteimplicaction.repository.JobApplicationRepository; import com.dynonuggets.refonteimplicaction.repository.JobPostingRepository; import org.junit.jupiter.api.Test; @@ -61,8 +58,8 @@ class JobApplicationServiceTest extends ControllerIntegrationTestBase { void should_create_apply() { // given JobApplicationRequest request = new JobApplicationRequest(123L, PENDING, null); - 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(); + JobPosting job = new JobPosting(123L, Company.builder().id(23L).build(), "Mon super job", "Il est trop cool", "Blablabla", "Paris", "140k", null, CDI, BusinessSectorEnum.ASSURANCE, Instant.now(), false, true, currentUser); 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().name(), "Paris (75)", CDI, false); given(jobRepository.findById(anyLong())).willReturn(Optional.of(job)); @@ -106,8 +103,8 @@ void should_throw_exception_when_creating_with_already_applied_job() { JobApplicationRequest request = new JobApplicationRequest(jobId, PENDING, null); IllegalArgumentException expectedException = new IllegalArgumentException(String.format(APPLY_ALREADY_EXISTS_FOR_JOB, jobId)); final JobApplication apply = JobApplication.builder().id(123L).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(); + JobPosting job = new JobPosting(123L, Company.builder().id(23L).build(), "Mon super job", "Il est trop cool", "Blablabla", "Paris", "140k", null, CDI, BusinessSectorEnum.ASSURANCE, Instant.now(), false, true, currentUser); given(jobRepository.findById(anyLong())).willReturn(Optional.of(job)); given(authService.getCurrentUser()).willReturn(currentUser); given(applyRepository.findByJob_IdAndUser_id(anyLong(), anyLong())).willReturn(Optional.of(apply)); 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 index 61436945..de58a203 100644 --- a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/JobPostingServiceTest.java +++ b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/JobPostingServiceTest.java @@ -49,13 +49,13 @@ void should_get_all_jobs_with_criteria_and_check_apply() { Page jobPage = new PageImpl<>(jobs); Pageable pageable = PageRequest.of(0, 10); User currentUser = User.builder().id(123L).build(); - given(jobPostingRepository.findAllWithCriteria(any(), anyString(), anyString(), anyBoolean())).willReturn(jobPage); + given(jobPostingRepository.findAllWithCriteria(any(), anyString(), anyString(), anyBoolean(), anyBoolean())).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(), false, true); + final Page actual = JobPostingService.getAllWithCriteria(pageable, "", CDD.name(), false, true, true); // then assertThat(actual.getTotalElements()).isEqualTo(jobPage.getTotalElements()); @@ -67,10 +67,10 @@ void should_get_all_jobs_with_criteria_and_check_apply_false() { 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(), anyBoolean())).willReturn(jobPage); + given(jobPostingRepository.findAllWithCriteria(any(), anyString(), anyString(), anyBoolean(), anyBoolean())).willReturn(jobPage); // when - final Page actual = JobPostingService.getAllWithCriteria(pageable, "", CDD.name(), false, false); + final Page actual = JobPostingService.getAllWithCriteria(pageable, "", CDD.name(), false, false, true); // then assertThat(actual.getTotalElements()).isEqualTo(jobPage.getTotalElements()); diff --git a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/PostServiceTest.java b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/PostServiceTest.java index 53eec4b4..f810f517 100644 --- a/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/PostServiceTest.java +++ b/backend-implicaction/src/test/java/com/dynonuggets/refonteimplicaction/service/PostServiceTest.java @@ -7,8 +7,8 @@ import com.dynonuggets.refonteimplicaction.model.Group; import com.dynonuggets.refonteimplicaction.model.Post; import com.dynonuggets.refonteimplicaction.model.User; +import com.dynonuggets.refonteimplicaction.repository.GroupRepository; import com.dynonuggets.refonteimplicaction.repository.PostRepository; -import com.dynonuggets.refonteimplicaction.repository.SubredditRepository; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.ArgumentCaptor; @@ -42,7 +42,7 @@ class PostServiceTest { PostRepository postRepository; @Mock - SubredditRepository subredditRepository; + GroupRepository groupRepository; @Mock AuthService authService; @@ -63,11 +63,11 @@ class PostServiceTest { void should_save_post_if_subreddit_exists() { // given User currentUser = User.builder().id(123L).username("test user").build(); - Group group = new Group(123L, "Super Subreddit", "Subreddit Description", emptyList(), Instant.now(), currentUser, null, emptyList()); + Group group = new Group(123L, "Super Subreddit", "Subreddit Description", emptyList(), Instant.now(), currentUser, null, emptyList(), true); Post expected = new Post(123L, "Super Post", "http://url.site", "Test", 0, null, Instant.now(), null); PostRequest postRequest = new PostRequest(123L, 123L, "First Subreddit", "http://url.site", "Test"); - given(subredditRepository.findById(anyLong())).willReturn(Optional.of(group)); + given(groupRepository.findById(anyLong())).willReturn(Optional.of(group)); given(authService.getCurrentUser()).willReturn(currentUser); given(postAdapter.toPost(postRequest, group, currentUser)).willReturn(expected); @@ -86,7 +86,7 @@ void should_throw_exception_on_save_when_subreddit_not_exists() { // given long subredditId = 1234L; NotFoundException expectedException = new NotFoundException(String.format(SUBREDDIT_NOT_FOUND_MESSAGE, subredditId)); - given(subredditRepository.findById(anyLong())).willThrow(expectedException); + given(groupRepository.findById(anyLong())).willThrow(expectedException); PostRequest postRequest = PostRequest.builder().name("test").groupId(subredditId).build(); // when @@ -113,7 +113,7 @@ void should_throw_exception_when_save_post_and_subreddit_not_found() { // given PostRequest postRequest = new PostRequest(123L, 123L, "First Post", "http://url.site", "Test"); - given(subredditRepository.findById(anyLong())).willReturn(Optional.empty()); + given(groupRepository.findById(anyLong())).willReturn(Optional.empty()); // when Exception actualException = assertThrows(NotFoundException.class, () -> postService.saveOrUpdate(postRequest)); @@ -128,7 +128,7 @@ void should_throw_exception_when_save_post_and_subreddit_not_found() { void should_get_post_when_exists() { // given User currentUser = User.builder().id(123L).username("Sankukai").build(); - Group group = new Group(123L, "Super Subreddit", "Subreddit Description", emptyList(), Instant.now(), currentUser, null, emptyList()); + Group group = new Group(123L, "Super Subreddit", "Subreddit Description", emptyList(), Instant.now(), currentUser, null, emptyList(), true); Post post = new Post(12L, "Super Post", "http://url.site", "Test", 88000, currentUser, Instant.now(), group); PostResponse expectedResponse = new PostResponse(123L, "Super post", "http://url.site", "Test", "Sankukai", currentUser.getId(), null, "Super Subreddit", 88000, 12, null, true, false, null); given(postRepository.findById(anyLong())).willReturn(Optional.of(post)); @@ -158,7 +158,7 @@ void should_throw_exception_when_post_not_exists() { void should_list_all_posts() { // given User currentUser = User.builder().id(1345L).username("gustave").build(); - Group group = new Group(123L, "Sub 1", "Description Sub 1", null, Instant.now(), currentUser, null, emptyList()); + Group group = new Group(123L, "Sub 1", "Description Sub 1", null, Instant.now(), currentUser, null, emptyList(), true); Pageable pageable = PageRequest.of(0, 10, Sort.DEFAULT_DIRECTION, "id"); Page expectedPages = new PageImpl<>(asList( new Post(1L, "Post 1", null, "Description 1", 0, currentUser, Instant.now(), group), diff --git a/frontend-implicaction/src/app/admin/admin.module.ts b/frontend-implicaction/src/app/admin/admin.module.ts index 19926ba9..97210239 100644 --- a/frontend-implicaction/src/app/admin/admin.module.ts +++ b/frontend-implicaction/src/app/admin/admin.module.ts @@ -8,12 +8,14 @@ import {CompaniesComponent} from './companies/companies.component'; import {TableModule} from 'primeng/table'; import {CompaniesModule} from './companies/companies.module'; import {FeatherModule} from 'angular-feather'; +import {PendingGroupTableComponent} from './groups/pending-group-table/pending-group-table.component'; @NgModule({ declarations: [ AdminComponent, CompaniesComponent, + PendingGroupTableComponent, ], imports: [ CommonModule, @@ -24,6 +26,9 @@ import {FeatherModule} from 'angular-feather'; FeatherModule ], providers: [{provide: LOCALE_ID, useValue: 'fr'}], + exports: [ + PendingGroupTableComponent + ] }) export class AdminModule { constructor() { diff --git a/frontend-implicaction/src/app/admin/dashboard/dashboard.component.html b/frontend-implicaction/src/app/admin/dashboard/dashboard.component.html index 6e3e3c41..7280055b 100644 --- a/frontend-implicaction/src/app/admin/dashboard/dashboard.component.html +++ b/frontend-implicaction/src/app/admin/dashboard/dashboard.component.html @@ -7,3 +7,16 @@
Nouveaux utilisateurs
+
+
+
Nouvelles offres
+
+ +
+
+
+
Nouveaux groupes
+
+ +
+ diff --git a/frontend-implicaction/src/app/admin/dashboard/dashboard.module.ts b/frontend-implicaction/src/app/admin/dashboard/dashboard.module.ts index 57868219..68e0a150 100644 --- a/frontend-implicaction/src/app/admin/dashboard/dashboard.module.ts +++ b/frontend-implicaction/src/app/admin/dashboard/dashboard.module.ts @@ -4,6 +4,8 @@ import {DashboardComponent} from './dashboard.component'; import {AdminOverviewComponent} from './components/admin-overview/admin-overview.component'; import {DashboardRoutingModule} from './dashboard-routing.module'; import {UsersModule} from '../users/users.module'; +import {AdminJobsModule} from '../jobs/admin-jobs.module'; +import {AdminModule} from '../admin.module'; @NgModule({ @@ -14,7 +16,9 @@ import {UsersModule} from '../users/users.module'; imports: [ CommonModule, DashboardRoutingModule, - UsersModule + UsersModule, + AdminJobsModule, + AdminModule, ] }) export class DashboardModule { diff --git a/frontend-implicaction/src/app/admin/groups/pending-group-table/pending-group-table.component.html b/frontend-implicaction/src/app/admin/groups/pending-group-table/pending-group-table.component.html new file mode 100644 index 00000000..77541784 --- /dev/null +++ b/frontend-implicaction/src/app/admin/groups/pending-group-table/pending-group-table.component.html @@ -0,0 +1,41 @@ + + + + Nom + Description + Administrateur + Crée le + + + + + {{group.name}} + {{group.description}} + {{group.username}} + {{group.createdAt}} + + + + + + + Aucun groupe est en attente de validation. + + diff --git a/frontend-implicaction/src/app/admin/groups/pending-group-table/pending-group-table.component.scss b/frontend-implicaction/src/app/admin/groups/pending-group-table/pending-group-table.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/frontend-implicaction/src/app/admin/groups/pending-group-table/pending-group-table.component.spec.ts b/frontend-implicaction/src/app/admin/groups/pending-group-table/pending-group-table.component.spec.ts new file mode 100644 index 00000000..0add9b8d --- /dev/null +++ b/frontend-implicaction/src/app/admin/groups/pending-group-table/pending-group-table.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PendingGroupTableComponent } from './pending-group-table.component'; + +describe('PendingGroupTableComponent', () => { + let component: PendingGroupTableComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ PendingGroupTableComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(PendingGroupTableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend-implicaction/src/app/admin/groups/pending-group-table/pending-group-table.component.ts b/frontend-implicaction/src/app/admin/groups/pending-group-table/pending-group-table.component.ts new file mode 100644 index 00000000..46a8d601 --- /dev/null +++ b/frontend-implicaction/src/app/admin/groups/pending-group-table/pending-group-table.component.ts @@ -0,0 +1,56 @@ +import {Component} from '@angular/core'; +import {BaseWithPaginationComponent} from '../../../shared/components/base-with-pagination/base-with-pagination.component'; +import {Group} from '../../../discussion/model/group'; +import {ActivatedRoute} from '@angular/router'; +import {ToasterService} from '../../../core/services/toaster.service'; +import {GroupService} from '../../../discussion/services/group.service'; +import {finalize, take} from 'rxjs/operators'; +import {Criteria} from '../../../shared/models/Criteria'; + +@Component({ + selector: 'app-pending-group-table', + templateUrl: './pending-group-table.component.html', + styleUrls: ['./pending-group-table.component.scss'] +}) +export class PendingGroupTableComponent extends BaseWithPaginationComponent { + + isLoading = true; + selectedOrderCode: string; + rowsPerPage = this.pageable.rowsPerPages[0]; + + constructor( + private toastService: ToasterService, + private groupService: GroupService, + protected route: ActivatedRoute + ) { + super(route); + } + + validateGroup(group: Group): void { + this.groupService + .validateGroup(group) + .subscribe( + () => this.paginate(this.pageable), + () => this.toastService.error('Oops', `Une erreur est survenue lors de la validation du groupe.`), + () => this.toastService.success('Succès', `Le groupe ${group.name} est désormais validé.`), + ); + } + + protected innerPaginate(): void { + this.groupService + .getAllPendingGroup(this.pageable) + .pipe( + take(1), + finalize(() => this.isLoading = false) + ) + .subscribe( + data => { + this.pageable.totalPages = data.totalPages; + this.pageable.rows = data.size; + this.pageable.totalElements = data.totalElements; + this.pageable.content = data.content; + }, + () => this.toastService.error('Oops', 'Une erreur est survenue lors de la récupération des données'), + ); + } +} diff --git a/frontend-implicaction/src/app/admin/jobs/admin-jobs.component.html b/frontend-implicaction/src/app/admin/jobs/admin-jobs.component.html index 0a391eb6..0dce9948 100644 --- a/frontend-implicaction/src/app/admin/jobs/admin-jobs.component.html +++ b/frontend-implicaction/src/app/admin/jobs/admin-jobs.component.html @@ -11,7 +11,107 @@
Toutes les offres d'emplois
title="Ajouter une offre" > + - + + + + + + + Nom + Type + Localisation + Description + Actions + + + + + + + + + {{job.title}} + {{job.contractType?.label}} + {{job.location}} + {{job.description}} + +
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+ + +
+
+ diff --git a/frontend-implicaction/src/app/admin/jobs/admin-jobs.component.scss b/frontend-implicaction/src/app/admin/jobs/admin-jobs.component.scss index e69de29b..f3dfcba3 100644 --- a/frontend-implicaction/src/app/admin/jobs/admin-jobs.component.scss +++ b/frontend-implicaction/src/app/admin/jobs/admin-jobs.component.scss @@ -0,0 +1,13 @@ +::ng-deep { + .p-datatable .p-datatable-tbody > tr > td { + border-width: 0 !important; + } + + .p-datatable-thead { + + th { + background-color: transparent !important; + border: 0 !important; + } + } +} diff --git a/frontend-implicaction/src/app/admin/jobs/admin-jobs.component.ts b/frontend-implicaction/src/app/admin/jobs/admin-jobs.component.ts index 111c24bd..0a235859 100644 --- a/frontend-implicaction/src/app/admin/jobs/admin-jobs.component.ts +++ b/frontend-implicaction/src/app/admin/jobs/admin-jobs.component.ts @@ -1,17 +1,126 @@ -import {Component} from '@angular/core'; +import {Component, OnInit} from '@angular/core'; import {SidebarService} from '../../shared/services/sidebar.service'; import {JobPostingFormComponent} from './components/job-posting-form/job-posting-form.component'; +import {BaseWithPaginationComponent} from '../../shared/components/base-with-pagination/base-with-pagination.component'; +import {JobPosting} from '../../shared/models/job-posting'; +import {JobCriteriaFilter} from '../../job/models/job-criteria-filter'; +import {Constants} from '../../config/constants'; +import {Pageable} from '../../shared/models/pageable'; +import {JobSortEnum} from '../../job/enums/job-sort.enum'; +import {SortDirectionEnum} from '../../shared/enums/sort-direction.enum'; +import {JobService} from '../../job/services/job.service'; +import {ToasterService} from '../../core/services/toaster.service'; +import {JobFilterContextService} from '../../job/services/job-filter-context.service'; +import {ActivatedRoute} from '@angular/router'; +import {finalize, take} from 'rxjs/operators'; @Component({ selector: 'app-job', templateUrl: './admin-jobs.component.html', styleUrls: ['./admin-jobs.component.scss'] }) -export class AdminJobsComponent { +export class AdminJobsComponent extends BaseWithPaginationComponent implements OnInit { + readonly ROWS_PER_PAGE_OPTIONS = Constants.ROWS_PER_PAGE_OPTIONS; + loading = true; // indique si les données sont en chargement + isArchiveEnabled: boolean; + isArchive: boolean; + selectedJobs: JobPosting[] = []; + + // Pagination + pageable: Pageable = Constants.PAGEABLE_DEFAULT; + orderByEnums = JobSortEnum.all(); + selectedOrder = JobSortEnum.DATE_DESC; + criteria: JobCriteriaFilter; + selectedOrderCode: string; + sortDirection = SortDirectionEnum; constructor( + private jobService: JobService, + private toastService: ToasterService, private sidebarService: SidebarService, + private filterService: JobFilterContextService, + protected route: ActivatedRoute ) { + super(route); + } + + ngOnInit(): void { + this.pageable.sortOrder = JobSortEnum.DATE_DESC.sortDirection; + this.pageable.sortBy = JobSortEnum.DATE_DESC.sortBy; + this.selectedOrderCode = JobSortEnum.DATE_DESC.code; + + this.filterService + .observe() + .subscribe(criteria => { + this.criteria = criteria; + const objectParam = this.buildQueryParams(); + this.filterService.updateRouteQueryParams(objectParam); + this.paginate(); + }); + + this.getFilterFromQueryParams(['search', 'contractType']).then(() => this.filterService.criteria = this.criteria); + } + + onSortChange({value}): void { + const selectedOrderField = JobSortEnum.from(value); + this.pageable.sortBy = selectedOrderField.sortBy; + this.pageable.sortOrder = selectedOrderField.sortDirection; + this.filterService.criteria = this.criteria; // on relance la recherche en updatant le filtre + } + + onSearchChange(): void { + this.filterService.criteria = this.criteria; + } + + protected innerPaginate(): void { + this.jobService + .getAllByCriteria(this.pageable, this.criteria) + .pipe( + take(1), + finalize(() => this.loading = false) + ) + .subscribe( + data => { + this.pageable.totalPages = data.totalPages; + this.pageable.rows = data.size; + this.pageable.totalElements = data.totalElements; + this.pageable.content = data.content; + }, + () => this.toastService.error('Oops', 'Une erreur est survenue lors de la récupération des données'), + ); + } + + editJob(job: JobPosting): void { + this.sidebarService + .open({ + title: `Editer une nouvelle offre d'emploi`, + input: {job}, + component: JobPostingFormComponent, + width: 650 + }); + } + + toggleArchiveJob(job: JobPosting): void { + this.jobService + .archiveJob(job.id) + .subscribe( + () => this.paginate(), + () => this.toastService.error('Oops', 'Une erreur est survenue'), + () => this.toastService.success('Succès', job.archive ? 'Offre désarchivée' : `Offre archivée`) + ); + } + + toggleArchiveSelectedJobs(): void { + const jobsId = this.selectedJobs.map(job => job.id); + this.jobService + .toggleArchiveJobs(jobsId) + .subscribe( + () => this.paginate(), + () => this.toastService.error('Oops', 'Une erreur est survenue'), + () => this.toastService.success('Succès', 'Opération effectuée'), + ); + this.selectedJobs = []; + this.isArchiveEnabled = false; } onAddJob(): void { @@ -23,4 +132,12 @@ export class AdminJobsComponent { }); } + onRowSelected(): void { + // on vérifie que tous les éléments sélectionné sont tous archivés ou désarchivés + this.isArchiveEnabled = this.selectedJobs.every(job => job.archive === this.selectedJobs[0].archive); + // on recherche si le bouton toggleArchive doit archiver ou désarchiver + this.isArchive = this.selectedJobs.length > 0 ? this.selectedJobs[0].archive : false; + + } + } diff --git a/frontend-implicaction/src/app/admin/jobs/admin-jobs.module.ts b/frontend-implicaction/src/app/admin/jobs/admin-jobs.module.ts index f9be2146..3d943005 100644 --- a/frontend-implicaction/src/app/admin/jobs/admin-jobs.module.ts +++ b/frontend-implicaction/src/app/admin/jobs/admin-jobs.module.ts @@ -1,22 +1,25 @@ import {NgModule} from '@angular/core'; import {CommonModule} from '@angular/common'; -import {JobsTableComponent} from './components/jobs-table/jobs-table.component'; import {AdminJobsComponent} from './admin-jobs.component'; import {AdminJobsRoutingModule} from './admin-jobs-routing.module'; import {TableModule} from 'primeng/table'; import {EditorModule} from 'primeng/editor'; -import {JobPostingFormComponent} from './components/job-posting-form/job-posting-form.component'; import {ReactiveFormsModule} from '@angular/forms'; import {FeatherModule} from 'angular-feather'; import {DropdownModule} from 'primeng/dropdown'; import {CheckboxModule} from 'primeng/checkbox'; +import {PendingJobTableComponent} from './components/pending-job-table/pending-job-table.component'; +import {JobPostingFormComponent} from './components/job-posting-form/job-posting-form.component'; @NgModule({ declarations: [ AdminJobsComponent, - JobsTableComponent, - JobPostingFormComponent + JobPostingFormComponent, + PendingJobTableComponent + ], + exports: [ + PendingJobTableComponent ], imports: [ CommonModule, diff --git a/frontend-implicaction/src/app/admin/jobs/components/job-posting-form/job-posting-form.component.html b/frontend-implicaction/src/app/admin/jobs/components/job-posting-form/job-posting-form.component.html index 3fb7dace..a5ded3f7 100644 --- a/frontend-implicaction/src/app/admin/jobs/components/job-posting-form/job-posting-form.component.html +++ b/frontend-implicaction/src/app/admin/jobs/components/job-posting-form/job-posting-form.component.html @@ -44,7 +44,6 @@ Vous devez fournir une localisation pour cette offre. -
-
@@ -95,6 +93,30 @@
+
+
+
+ + +
+
+ +
+ Vous devez fournir un secteur d'activités pour cette offre +
+
- - - - - - Nom - Type - Localisation - Description - Actions - - - - - - - - {{job.title}} - {{job.contractType?.label}} - {{job.location}} - {{job.description}} - -
    -
  • - -
  • -
  • - -
  • -
  • - -
  • -
- - -
- diff --git a/frontend-implicaction/src/app/admin/jobs/components/jobs-table/jobs-table.component.scss b/frontend-implicaction/src/app/admin/jobs/components/jobs-table/jobs-table.component.scss deleted file mode 100644 index f3dfcba3..00000000 --- a/frontend-implicaction/src/app/admin/jobs/components/jobs-table/jobs-table.component.scss +++ /dev/null @@ -1,13 +0,0 @@ -::ng-deep { - .p-datatable .p-datatable-tbody > tr > td { - border-width: 0 !important; - } - - .p-datatable-thead { - - th { - background-color: transparent !important; - border: 0 !important; - } - } -} diff --git a/frontend-implicaction/src/app/admin/jobs/components/jobs-table/jobs-table.component.spec.ts b/frontend-implicaction/src/app/admin/jobs/components/jobs-table/jobs-table.component.spec.ts deleted file mode 100644 index 41224298..00000000 --- a/frontend-implicaction/src/app/admin/jobs/components/jobs-table/jobs-table.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import {ComponentFixture, TestBed} from '@angular/core/testing'; - -import {JobsTableComponent} from './jobs-table.component'; - -describe('JobTableComponent', () => { - let component: JobsTableComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [JobsTableComponent] - }) - .compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(JobsTableComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/frontend-implicaction/src/app/admin/jobs/components/jobs-table/jobs-table.component.ts b/frontend-implicaction/src/app/admin/jobs/components/jobs-table/jobs-table.component.ts deleted file mode 100644 index 0cbd4d5f..00000000 --- a/frontend-implicaction/src/app/admin/jobs/components/jobs-table/jobs-table.component.ts +++ /dev/null @@ -1,108 +0,0 @@ -import {Component, OnInit} from '@angular/core'; -import {Constants} from '../../../../config/constants'; -import {ToasterService} from '../../../../core/services/toaster.service'; -import {JobService} from '../../../../job/services/job.service'; -import {finalize} from 'rxjs/operators'; -import {JobSortEnum} from '../../../../job/enums/job-sort.enum'; -import {JobCriteriaFilter} from '../../../../job/models/job-criteria-filter'; -import {JobPosting} from '../../../../shared/models/job-posting'; -import {JobPostingFormComponent} from '../job-posting-form/job-posting-form.component'; -import {SidebarService} from '../../../../shared/services/sidebar.service'; -import {SortDirectionEnum} from '../../../../shared/enums/sort-direction.enum'; -import {JobFilterContextService} from '../../../../job/services/job-filter-context.service'; -import {ActivatedRoute} from '@angular/router'; -import {BaseWithPaginationComponent} from '../../../../shared/components/base-with-pagination/base-with-pagination.component'; - -@Component({ - selector: 'app-jobs-table', - templateUrl: './jobs-table.component.html', - styleUrls: ['./jobs-table.component.scss'] -}) -export class JobsTableComponent extends BaseWithPaginationComponent implements OnInit { - - readonly ROWS_PER_PAGE_OPTIONS = Constants.ROWS_PER_PAGE_OPTIONS; - - selectedJobs: JobPosting[] = []; - isLoading = true; - - // Pagination et filtres - orderByEnums = JobSortEnum.all(); - selectedOrderCode: string; - sortDirection = SortDirectionEnum; - - constructor( - private jobService: JobService, - private toastService: ToasterService, - private sidebarService: SidebarService, - private filterService: JobFilterContextService, - protected route: ActivatedRoute - ) { - super(route); - } - - ngOnInit(): void { - this.pageable.sortOrder = JobSortEnum.DATE_DESC.sortDirection; - this.pageable.sortBy = JobSortEnum.DATE_DESC.sortBy; - this.selectedOrderCode = JobSortEnum.DATE_DESC.code; - - this.filterService.criteria = {}; - - this.filterService - .observe() - .subscribe(criteria => { - this.criteria = criteria; - const objectParam = this.buildQueryParams(); - this.filterService.updateRouteQueryParams(objectParam); - this.paginate(); - }); - - this.getFilterFromQueryParams(['search', 'contractType']) - .then(() => this.filterService.criteria = this.criteria); - } - - protected innerPaginate(): void { - this.jobService - .getAllByCriteria(this.pageable, this.criteria) - .pipe(finalize(() => this.isLoading = false)) - .subscribe( - data => { - this.pageable.totalPages = data.totalPages; - this.pageable.rows = data.size; - 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') - ); - } - - onSortChange({value}): void { - const selectedOrderField = JobSortEnum.from(value); - this.pageable.sortBy = selectedOrderField.sortBy; - this.pageable.sortOrder = selectedOrderField.sortDirection; - this.filterService.criteria = this.criteria; // on relance la recherche en updatant le filtre - } - - onSearchChange(): void { - this.filterService.criteria = this.criteria; - } - - editJob(job: JobPosting): void { - this.sidebarService - .open({ - title: `Editer une nouvelle offre d'emploi`, - input: {job}, - component: JobPostingFormComponent, - width: 650 - }); - } - - archiveJob(job: JobPosting): void { - this.jobService - .archiveJob(job.id) - .subscribe( - () => this.paginate(), - () => this.toastService.error('Oops', 'Une erreur est survenue'), - () => this.toastService.success('Succès', job.archive ? 'Offre désarchivée' : `Offre archivée`) - ); - } -} diff --git a/frontend-implicaction/src/app/admin/jobs/components/pending-job-table/pending-job-table.component.html b/frontend-implicaction/src/app/admin/jobs/components/pending-job-table/pending-job-table.component.html new file mode 100644 index 00000000..a1a7ceee --- /dev/null +++ b/frontend-implicaction/src/app/admin/jobs/components/pending-job-table/pending-job-table.component.html @@ -0,0 +1,39 @@ + + + + Title + Description + Localisation + + + + + {{job.title}} + {{job.description}} + {{job.location}} + + + + + + + Aucune offre est en attente de validation. + + diff --git a/frontend-implicaction/src/app/admin/jobs/components/pending-job-table/pending-job-table.component.scss b/frontend-implicaction/src/app/admin/jobs/components/pending-job-table/pending-job-table.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/frontend-implicaction/src/app/admin/jobs/components/pending-job-table/pending-job-table.component.spec.ts b/frontend-implicaction/src/app/admin/jobs/components/pending-job-table/pending-job-table.component.spec.ts new file mode 100644 index 00000000..fec40b42 --- /dev/null +++ b/frontend-implicaction/src/app/admin/jobs/components/pending-job-table/pending-job-table.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { PendingJobTableComponent } from './pending-job-table.component'; + +describe('PendingJobTableComponent', () => { + let component: PendingJobTableComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ PendingJobTableComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(PendingJobTableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend-implicaction/src/app/admin/jobs/components/pending-job-table/pending-job-table.component.ts b/frontend-implicaction/src/app/admin/jobs/components/pending-job-table/pending-job-table.component.ts new file mode 100644 index 00000000..381986fc --- /dev/null +++ b/frontend-implicaction/src/app/admin/jobs/components/pending-job-table/pending-job-table.component.ts @@ -0,0 +1,57 @@ +import {Component} from '@angular/core'; +import {BaseWithPaginationComponent} from '../../../../shared/components/base-with-pagination/base-with-pagination.component'; +import {JobPosting} from '../../../../shared/models/job-posting'; +import {ToasterService} from '../../../../core/services/toaster.service'; +import {JobService} from '../../../../job/services/job.service'; +import {ActivatedRoute} from '@angular/router'; +import {finalize, take} from 'rxjs/operators'; +import {Criteria} from '../../../../shared/models/Criteria'; + +@Component({ + selector: 'app-pending-job-table', + templateUrl: './pending-job-table.component.html', + styleUrls: ['./pending-job-table.component.scss'] +}) +export class PendingJobTableComponent extends BaseWithPaginationComponent { + + isLoading = true; + // Pagination et filtres + rowsPerPage = this.pageable.rowsPerPages[0]; + + constructor( + private toastService: ToasterService, + private jobsService: JobService, + protected route: ActivatedRoute + ) { + super(route); + } + + validateJob(job: JobPosting): void { + this.jobsService + .validateJob(job) + .subscribe( + () => this.paginate(this.pageable), + () => this.toastService.error('Oops', `Une erreur est survenue lors de la validation de l'offre.`), + () => this.toastService.success('Succès', `L'offre ${job.title} est désormais validée.`), + ); + } + + protected innerPaginate(): void { + this.jobsService + .getAllPendingActivationJobs(this.pageable) + .pipe( + take(1), + finalize(() => this.isLoading = false) + ) + .subscribe( + data => { + this.pageable.totalPages = data.totalPages; + this.pageable.rows = data.size; + this.pageable.totalElements = data.totalElements; + this.pageable.content = data.content; + }, + () => this.toastService.error('Oops', 'Une erreur est survenue lors de la récupération des données'), + ); + } + +} diff --git a/frontend-implicaction/src/app/admin/users/components/pending-user-table/pending-user-table.component.html b/frontend-implicaction/src/app/admin/users/components/pending-user-table/pending-user-table.component.html index 2671b4eb..1514c6cd 100644 --- a/frontend-implicaction/src/app/admin/users/components/pending-user-table/pending-user-table.component.html +++ b/frontend-implicaction/src/app/admin/users/components/pending-user-table/pending-user-table.component.html @@ -1,5 +1,5 @@ {{roleCodesToString(user.roles)}}
@@ -23,7 +35,8 @@

- Aucun groupe n'a encore été créé. Créer un groupe ? + Aucun groupe n'a encore été créé. Créer + un groupe ?

diff --git a/frontend-implicaction/src/app/discussion/components/top-group-listing/top-group-listing.component.ts b/frontend-implicaction/src/app/discussion/components/top-group-listing/top-group-listing.component.ts index 06b2f474..36a104f0 100644 --- a/frontend-implicaction/src/app/discussion/components/top-group-listing/top-group-listing.component.ts +++ b/frontend-implicaction/src/app/discussion/components/top-group-listing/top-group-listing.component.ts @@ -6,6 +6,9 @@ import {SidebarService} from '../../../shared/services/sidebar.service'; import {CreateGroupFormComponent} from '../create-group-form/create-group-form.component'; import {finalize} from 'rxjs/operators'; import {Constants} from '../../../config/constants'; +import {AuthService} from '../../../shared/services/auth.service'; +import {UserService} from '../../../user/services/user.service'; +import {User} from '../../../shared/models/user'; @Component({ selector: 'app-top-group-listing', @@ -21,15 +24,25 @@ export class TopGroupListingComponent implements OnInit { groups: Group[] = []; isLoading = true; + userGroupNames: string[] = []; + currentUser: User; + canSubscribe: boolean; constructor( private groupService: GroupService, private toasterService: ToasterService, - private sidebarService: SidebarService + private sidebarService: SidebarService, + private authService: AuthService, + private userService: UserService ) { } ngOnInit(): void { + this.currentUser = this.authService.getCurrentUser(); + this.userService + .getUserGroups(this.currentUser.id) + .subscribe(groups => this.userGroupNames = groups.map(group => group.name)); + this.groupService .findByTopPosting(this.limit) .pipe(finalize(() => this.isLoading = false)) @@ -48,4 +61,16 @@ export class TopGroupListingComponent implements OnInit { width: 650 }); } + + joinGroup(groupName: string): void { + this.groupService.subscribeGroup(groupName) + .subscribe( + (groups) => { + this.toasterService.success('Succès', `Vous avez adhéré au groupe !`); + this.userGroupNames = groups.map(group => group.name); + }, + () => this.toasterService.error('Oops', 'Une erreur est survenue lors de la souscription au groupe') + ); + } + } diff --git a/frontend-implicaction/src/app/discussion/discussion.module.ts b/frontend-implicaction/src/app/discussion/discussion.module.ts index 6e6b758c..54241edb 100644 --- a/frontend-implicaction/src/app/discussion/discussion.module.ts +++ b/frontend-implicaction/src/app/discussion/discussion.module.ts @@ -21,6 +21,7 @@ import {EditorModule} from 'primeng/editor'; import {CommentTileComponent} from './components/comment-tile/comment-tile.component'; import {CommentSkeletonComponent} from './components/comment-skeleton/comment-skeleton.component'; import {CreatePostFormComponent} from './components/create-post-form/create-post-form.component'; +import {IconsModule} from '../icons/icons.module'; @NgModule({ @@ -48,7 +49,8 @@ import {CreatePostFormComponent} from './components/create-post-form/create-post AvatarModule, SkeletonModule, ReactiveFormsModule, - EditorModule + EditorModule, + IconsModule ] }) export class DiscussionModule { diff --git a/frontend-implicaction/src/app/discussion/model/group.ts b/frontend-implicaction/src/app/discussion/model/group.ts index 93398691..0eec20ff 100644 --- a/frontend-implicaction/src/app/discussion/model/group.ts +++ b/frontend-implicaction/src/app/discussion/model/group.ts @@ -4,4 +4,8 @@ export interface Group { description?: string; numberOfPosts?: number; imageUrl?: string; + createdAt?: Date; + active?: boolean; + username?: string; + userId?: string; } diff --git a/frontend-implicaction/src/app/discussion/services/group.service.ts b/frontend-implicaction/src/app/discussion/services/group.service.ts index a3d60152..5d1c0e71 100644 --- a/frontend-implicaction/src/app/discussion/services/group.service.ts +++ b/frontend-implicaction/src/app/discussion/services/group.service.ts @@ -21,7 +21,7 @@ export class GroupService { } createGroupWithoutPicture(group: any): Observable { - return this.http.post(this.apiEndpointService.createGroupEndpoint(), group); + return this.http.post(this.apiEndpointService.createGroupWithoutImageEndpoint(), group); } findByTopPosting(limit: number): Observable { @@ -29,6 +29,18 @@ export class GroupService { } getAllGroups(pageable: Pageable): Observable { - return this.http.get(this.apiEndpointService.findAllGroupsEndpoint(pageable)); + return this.http.get(this.apiEndpointService.findAllActiveGroupsEndpoint(pageable)); + } + + subscribeGroup(groupName: string): Observable { + return this.http.post(this.apiEndpointService.createGroupSubscription(groupName), null); + } + + getAllPendingGroup(pageable: Pageable): Observable { + return this.http.get(this.apiEndpointService.getAllPendingGroupEndpoint(pageable)); + } + + validateGroup(group: Group): Observable { + return this.http.patch(this.apiEndpointService.getValidateGroupEndpoint(), group); } } 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 66f63341..71980baf 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 @@ -70,7 +70,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 1175b093..9dda76a5 100644 --- a/frontend-implicaction/src/app/job/services/job.service.ts +++ b/frontend-implicaction/src/app/job/services/job.service.ts @@ -21,6 +21,10 @@ export class JobService { return this.http.get(this.apiEndpointsService.getAllJobEndpoint(pageable, criteria, archive, applyCheck)); } + getAllValidatedByCriteria(pageable: Pageable, criteria: JobCriteriaFilter, archive = null): Observable { + return this.http.get(this.apiEndpointsService.getAllValidatedJobEndpoint(pageable, criteria, archive)); + } + getById(jobId: string): Observable { return this.http.get(this.apiEndpointsService.getJobByIdEndpoint(jobId)); } @@ -40,4 +44,16 @@ export class JobService { archiveJob(jobPostingId: string): Observable { return this.http.patch(this.apiEndpointsService.archiveJobPostingEndpoint(jobPostingId), null); } + + toggleArchiveJobs(jobIds: string[]): Observable { + return this.http.patch(this.apiEndpointsService.toggleArchiveJobsEndpoint(), jobIds); + } + + getAllPendingActivationJobs(pageable: Pageable): Observable { + return this.http.get(this.apiEndpointsService.getAllPendingActivationJobsEndpoint(pageable)); + } + + validateJob(job: JobPosting): Observable { + return this.http.patch(this.apiEndpointsService.getValidateJobEndpoint(), job); + } } diff --git a/frontend-implicaction/src/app/shared/components/base-with-pagination/base-with-pagination.component.ts b/frontend-implicaction/src/app/shared/components/base-with-pagination/base-with-pagination.component.ts index 0edfc7d9..cefd12e6 100644 --- a/frontend-implicaction/src/app/shared/components/base-with-pagination/base-with-pagination.component.ts +++ b/frontend-implicaction/src/app/shared/components/base-with-pagination/base-with-pagination.component.ts @@ -13,7 +13,7 @@ export class BaseWithPaginationComponent { criteria: C; // Pagination - pageable: Pageable = Constants.PAGEABLE_DEFAULT; + pageable: Pageable = {...Constants.PAGEABLE_DEFAULT}; constructor(protected route: ActivatedRoute) { } diff --git a/frontend-implicaction/src/app/shared/components/header/header.component.ts b/frontend-implicaction/src/app/shared/components/header/header.component.ts index 36387a8f..d019893f 100644 --- a/frontend-implicaction/src/app/shared/components/header/header.component.ts +++ b/frontend-implicaction/src/app/shared/components/header/header.component.ts @@ -59,7 +59,7 @@ export class HeaderComponent implements OnInit, OnDestroy { this.router .navigateByUrl('/') .then(() => { - this.toaster.success('Félicitations', 'Vous êtes deconnecté!'); + this.toaster.success('Success', 'You are now logged out!'); }); }); } diff --git a/frontend-implicaction/src/app/shared/enums/sector.enum.ts b/frontend-implicaction/src/app/shared/enums/sector.enum.ts new file mode 100644 index 00000000..76595f03 --- /dev/null +++ b/frontend-implicaction/src/app/shared/enums/sector.enum.ts @@ -0,0 +1,62 @@ +import {EnumCodeLabelAbstract} from './enum-code-label-abstract.enum'; + +export enum BusinessSectorEnumCode { + AGROALIMENTAIRE = 'AGROALIMENTAIRE', + ASSURANCE = 'ASSURANCE', + AUTOMOBILE = 'AUTOMOBILE', + BANQUE = 'BANQUE', + BTP = 'BTP', + CHIMIE = 'CHIMIE', + COMMERCE = 'COMMERCE', + COMMUNICATION = 'COMMUNICATION', + EDITION = 'EDITION', + ELECTRONIQUE = 'ELECTRONIQUE', + ETUDES_ET_CONSEILS = 'ETUDES_ET_CONSEILS', + IMPRIMERIE = 'IMPRIMERIE', + INDUSTRIE_PHARMACEUTIQUE = 'INDUSTRIE_PHARMACEUTIQUE', + INFORMATIQUE = 'INFORMATIQUE', + LOGISTIQUE = 'LOGISTIQUE', + METALLURGIE = 'METALLURGIE', + SERVICES_AUX_ENTREPRISES = 'SERVICES_AUX_ENTREPRISES', + TELECOMS = 'TELECOMS', + TEXTILE = 'TEXTILE', + TRANSPORTS = 'TRANSPORTS', + +} + +export class BusinessSectorEnum extends EnumCodeLabelAbstract { + static readonly AGROALIMENTAIRE = new BusinessSectorEnum(BusinessSectorEnumCode.AGROALIMENTAIRE, 'Agroalimentaire'); + static readonly ASSURANCE = new BusinessSectorEnum(BusinessSectorEnumCode.ASSURANCE, 'Assurance'); + static readonly AUTOMOBILE = new BusinessSectorEnum(BusinessSectorEnumCode.AUTOMOBILE, 'Automobile'); + static readonly BANQUE = new BusinessSectorEnum(BusinessSectorEnumCode.BANQUE, 'Banque'); + static readonly BTP = new BusinessSectorEnum(BusinessSectorEnumCode.BTP, 'BTP'); + static readonly CHIMIE = new BusinessSectorEnum(BusinessSectorEnumCode.CHIMIE, 'Chimie'); + static readonly COMMERCE = new BusinessSectorEnum(BusinessSectorEnumCode.COMMERCE, 'Commerce'); + static readonly COMMUNICATION = new BusinessSectorEnum(BusinessSectorEnumCode.COMMUNICATION, 'Communication'); + static readonly EDITION = new BusinessSectorEnum(BusinessSectorEnumCode.EDITION, 'Édition'); + static readonly ELECTRONIQUE = new BusinessSectorEnum(BusinessSectorEnumCode.ELECTRONIQUE, 'Éléctronique'); + static readonly ETUDES_ET_CONSEILS = new BusinessSectorEnum(BusinessSectorEnumCode.ETUDES_ET_CONSEILS, 'Études et conseils'); + static readonly IMPRIMERIE = new BusinessSectorEnum(BusinessSectorEnumCode.IMPRIMERIE, 'Imprimerie'); + static readonly INDUSTRIE_PHARMACEUTIQUE = new BusinessSectorEnum(BusinessSectorEnumCode.INDUSTRIE_PHARMACEUTIQUE, 'Industrie pharmaceutique'); + static readonly INFORMATIQUE = new BusinessSectorEnum(BusinessSectorEnumCode.INFORMATIQUE, 'Informatique'); + static readonly LOGISTIQUE = new BusinessSectorEnum(BusinessSectorEnumCode.LOGISTIQUE, 'Logistique'); + static readonly METALLURGIE = new BusinessSectorEnum(BusinessSectorEnumCode.METALLURGIE, 'Métallurgie'); + static readonly SERVICES_AUX_ENTREPRISES = new BusinessSectorEnum(BusinessSectorEnumCode.SERVICES_AUX_ENTREPRISES, 'Services aux entreprises'); + static readonly TELECOMS = new BusinessSectorEnum(BusinessSectorEnumCode.TELECOMS, 'Télécoms'); + static readonly TRANSPORTS = new BusinessSectorEnum(BusinessSectorEnumCode.TRANSPORTS, 'Transports'); + + constructor( + readonly code: BusinessSectorEnumCode, + readonly label: string + ) { + super(code, label); + } + + static all(): BusinessSectorEnum[] { + return this.values(); + } + + static from(code: BusinessSectorEnumCode): BusinessSectorEnum { + return this.fromCode(code); + } +} diff --git a/frontend-implicaction/src/app/shared/models/job-posting.ts b/frontend-implicaction/src/app/shared/models/job-posting.ts index a29217ac..a2cbda05 100644 --- a/frontend-implicaction/src/app/shared/models/job-posting.ts +++ b/frontend-implicaction/src/app/shared/models/job-posting.ts @@ -1,5 +1,6 @@ import {Company} from './company'; import {ContractEnumCode} from '../enums/contract.enum'; +import {BusinessSectorEnumCode} from '../enums/sector.enum'; export interface JobPosting { id?: string; @@ -11,7 +12,11 @@ export interface JobPosting { description?: string; createdAt?: Date; contractType?: ContractEnumCode; + businessSector?: BusinessSectorEnumCode; company?: Company; apply?: boolean; archive?: boolean; + active?: boolean; + posterId?: string; + posterName?: string; } diff --git a/frontend-implicaction/src/app/shared/models/uris.ts b/frontend-implicaction/src/app/shared/models/uris.ts index a543a62d..b4f0e0ba 100644 --- a/frontend-implicaction/src/app/shared/models/uris.ts +++ b/frontend-implicaction/src/app/shared/models/uris.ts @@ -22,6 +22,7 @@ export class Uris { static readonly GET_FRIEND_REQUEST_RECEIVED = 'users/friends/received'; static readonly GET_FRIEND_REQUEST_SENT = 'users/friends/sent'; static readonly GET_ALL_PENDING_USERS = 'users/pending'; + static readonly GROUP_LIST = 'users'; }; /** @@ -52,6 +53,10 @@ export class Uris { */ static readonly JOBS = class { static readonly BASE_URI = 'job-postings'; + static readonly GET_ALL_PENDING_JOBS = 'job-postings/pending'; + static readonly VALIDATE_JOB = 'job-postings/validate'; + static readonly GET_VALIDATED_JOBS = 'job-postings/validated'; + static readonly TOGGLE_ARCHIVE = 'job-postings/archive'; }; /** @@ -88,6 +93,10 @@ export class Uris { static GROUP = class { static readonly BASE_URI = 'groups'; static readonly TOP_POSTING = 'groups/top-posting'; + static readonly CREATE_NO_IMAGE = 'groups/no-image'; + static readonly VALIDATE_GROUP = 'groups/validate'; + static readonly GET_ALL_PENDING_GROUPS = 'groups/pending'; + static readonly VALIDATED_GROUPS = 'groups/validated'; }; /** diff --git a/frontend-implicaction/src/app/user/services/user.service.ts b/frontend-implicaction/src/app/user/services/user.service.ts index 18d2eb88..84aa3d35 100644 --- a/frontend-implicaction/src/app/user/services/user.service.ts +++ b/frontend-implicaction/src/app/user/services/user.service.ts @@ -6,6 +6,7 @@ import {User} from '../../shared/models/user'; import {Pageable} from '../../shared/models/pageable'; import {HttpClient} from '@angular/common/http'; import {Relation} from '../models/relation'; +import {Group} from '../../discussion/model/group'; @Injectable({ providedIn: 'root' @@ -63,4 +64,9 @@ export class UserService { updateUserImage(formData: FormData): Observable { return this.http.post(this.apiEndpointsService.updateImageProfileEndpoint(), formData); } + + getUserGroups(userId: string): Observable { + return this.http.get(this.apiEndpointsService.getAllGroups(userId)); + } + }