Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RI-203: permet de valider une offre et un groupe #211

Merged
merged 12 commits into from
Dec 12, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -16,24 +17,31 @@ public class GroupAdapter {

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())
.numberOfPosts(isNotEmpty(model.getPosts()) ? model.getPosts().size() : 0)
.description(model.getDescription())
.createdAt(model.getCreatedAt())
.imageUrl(imageUrl)
.valid(model.isValid())
.username(username)
.userId(userId)
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public JobPostingDto toDto(JobPosting model) {
.createdAt(model.getCreatedAt())
.archive(model.isArchive())
.businessSector(model.getBusinessSector())
.valid(model.isValid())
.build();
}

Expand All @@ -50,6 +51,7 @@ public JobPosting toModel(JobPostingDto dto) {
.businessSector(dto.getBusinessSector())
.createdAt(dto.getCreatedAt())
.archive(dto.isArchive())
.valid(dto.isValid())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -40,15 +41,15 @@ public ResponseEntity<GroupDto> createSubreddit(@RequestBody GroupDto group) {
return ResponseEntity.status(CREATED).body(saveDto);
}

@GetMapping
public ResponseEntity<Page<GroupDto>> getAll(
@GetMapping(GET_VALIDATED_GROUPS_URI)
public ResponseEntity<Page<GroupDto>> 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<GroupDto> subredditDtos = groupService.getAll(pageable);
Page<GroupDto> subredditDtos = groupService.getAllValidGroups(pageable);
return ResponseEntity.ok(subredditDtos);
}

Expand All @@ -63,4 +64,22 @@ public ResponseEntity<List<GroupDto>> subscribeGroup(@PathVariable final String
final List<GroupDto> groupDtos = groupService.addGroup(groupName);
return ResponseEntity.ok(groupDtos);
}

@GetMapping(GET_PENDING_GROUP_URI)
public ResponseEntity<Page<GroupDto>> 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<GroupDto> pendingGroups = groupService.getAllPendingGroups(pageable);
return ResponseEntity.ok(pendingGroups);
}

@PatchMapping(VALIDATE_GROUP_URI)
public ResponseEntity<Void> validateGroup(@RequestBody final Group group) {
groupService.validateGroup(group);
return ResponseEntity.ok().build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -43,7 +44,23 @@ public ResponseEntity<Page<JobPostingDto>> 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<JobPostingDto> jobPostingDtos = jobPostingService.getAllWithCriteria(pageable, search, contractType, isArchive, applyCheck);
Page<JobPostingDto> jobPostingDtos = jobPostingService.getAllWithCriteria(pageable, search, contractType, isArchive, applyCheck, null);
return ResponseEntity.ok(jobPostingDtos);
}

@GetMapping(VALIDATED_JOBS)
public ResponseEntity<Page<JobPostingDto>> 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<JobPostingDto> jobPostingDtos = jobPostingService.getAllActiveWithCriteria(pageable, search, contractType, isArchive);
return ResponseEntity.ok(jobPostingDtos);
}

Expand Down Expand Up @@ -76,4 +93,20 @@ public ResponseEntity<List<JobPostingDto>> toggleArchiveJobs(@RequestBody final
List<JobPostingDto> updated = jobPostingService.toggleArchiveAll(jobsId);
return ResponseEntity.ok(updated);
}

@GetMapping(GET_PENDING_JOB_URI)
public ResponseEntity<Page<JobPostingDto>> getAllPendingJobs(
@RequestParam(value = "page", defaultValue = "0") int page,
@RequestParam(value = "rows", defaultValue = "10") int rows
) {
Pageable pageable = PageRequest.of(page, rows);
Page<JobPostingDto> pendingJobs = jobPostingService.getAllPendingJobs(pageable);
return ResponseEntity.ok(pendingJobs);
}

@PatchMapping(VALIDATE_JOB_URI)
public ResponseEntity<Void> validateJob(@RequestBody final JobPosting job) {
jobPostingService.validateJob(job);
return ResponseEntity.ok().build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,8 @@ public class GroupDto {
private Integer numberOfPosts;
private String imageUrl;
private Instant createdAt;
private boolean valid;
private List<UserDto> users;
private String username;
private Long userId;
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,6 @@ public class JobPostingDto {
private Instant createdAt;
private boolean archive;
private boolean apply;
private boolean valid;

}
Original file line number Diff line number Diff line change
Expand Up @@ -42,4 +42,7 @@ public class Group {

@ManyToMany(fetch = FetchType.LAZY, cascade = ALL, mappedBy = "groups")
private List<User> users;

@Column(name = "valid")
private boolean valid;
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,4 +54,7 @@ public class JobPosting {

@Column(columnDefinition = "boolean default false")
private boolean archive;

@Column(name = "valid")
private boolean valid;
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -13,4 +14,8 @@ public interface GroupRepository extends JpaRepository<Group, Long> {
List<Group> findAllByTopPosting(Pageable pageable);

Optional<Group> findByName(String name);

Page<Group> findAllByValidIsFalse(Pageable pageable);

Page<Group> findAllByValidIsTrue(Pageable pageable);
}
Original file line number Diff line number Diff line change
@@ -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<JobPosting, Long>, JobPostingRepositoryCustom {

Page<JobPosting> findAllByValidIsFalse(Pageable pageable);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<JobPosting> findAllWithCriteria(final Pageable pageable, final String search, final String contractType, final Boolean archive);
Page<JobPosting> findAllWithCriteria(final Pageable pageable, final String search, final String contractType, final Boolean archive, Boolean valid);

}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public class JobPostingRepositoryImpl implements JobPostingRepositoryCustom {
private final EntityManager entityManager;

@Override
public Page<JobPosting> findAllWithCriteria(Pageable pageable, String search, String contractType, Boolean archive) {
public Page<JobPosting> findAllWithCriteria(Pageable pageable, String search, String contractType, Boolean archive, Boolean valid) {
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<JobPosting> query = criteriaBuilder.createQuery(JobPosting.class);
Root<JobPosting> queryRoot = query.from(JobPosting.class);
Expand Down Expand Up @@ -52,6 +52,11 @@ public Page<JobPosting> 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]));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
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;
Expand All @@ -20,6 +21,7 @@
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
Expand All @@ -37,8 +39,9 @@ public class GroupService {
public GroupDto save(MultipartFile image, GroupDto groupDto) {
final FileModel fileModel = cloudService.uploadImage(image);
final FileModel fileSave = fileRepository.save(fileModel);

Group group = groupAdapter.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());
Expand All @@ -50,16 +53,18 @@ public GroupDto save(MultipartFile image, GroupDto groupDto) {

@Transactional
public GroupDto save(GroupDto groupDto) {
Group group = groupAdapter.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 = groupRepository.save(group);
return groupAdapter.toDto(save);
}

@Transactional(readOnly = true)
public Page<GroupDto> getAll(Pageable pageable) {
final Page<Group> subreddits = groupRepository.findAll(pageable);
public Page<GroupDto> getAllValidGroups(Pageable pageable) {
final Page<Group> subreddits = groupRepository.findAllByValidIsTrue(pageable);
return subreddits.map(groupAdapter::toDto);
}

Expand All @@ -82,4 +87,16 @@ public List<GroupDto> addGroup(String groupName) {
.map(groupAdapter::toDto)
.collect(toList());
}

@Transactional
public Page<GroupDto> getAllPendingGroups(Pageable pageable) {
return groupRepository.findAllByValidIsFalse(pageable)
.map(groupAdapter::toDto);
}

@Transactional
public void validateGroup(Group group) {
group.setValid(true);
groupRepository.save(group);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,9 @@ public JobPostingDto getJobById(Long jobId) {
return jobDto;
}

public Page<JobPostingDto> getAllWithCriteria(Pageable pageable, String search, String contractType, Boolean archive, boolean applyCheck) {
public Page<JobPostingDto> getAllWithCriteria(Pageable pageable, String search, String contractType, Boolean archive, boolean applyCheck, Boolean valid) {
// récupération des jobs
final Page<JobPosting> jobs = jobPostingRepository.findAllWithCriteria(pageable, search, contractType, archive);
final Page<JobPosting> jobs = jobPostingRepository.findAllWithCriteria(pageable, search, contractType, archive, valid);
if (applyCheck) {
final List<Long> jobIds = jobs.stream().map(JobPosting::getId).collect(toList());
final List<Long> jobAppliesIds = getAllAppliesWithJobIdsIn(jobIds, authService.getCurrentUser().getId());
Expand Down Expand Up @@ -103,4 +103,20 @@ public List<JobPostingDto> toggleArchiveAll(List<Long> jobsId) {
.map(jobPostingAdapter::toDto)
.collect(Collectors.toList());
}

@Transactional
public Page<JobPostingDto> getAllPendingJobs(Pageable pageable) {
return jobPostingRepository.findAllByValidIsFalse(pageable)
.map(jobPostingAdapter::toDto);
}

@Transactional
public void validateJob(JobPosting job) {
job.setValid(true);
jobPostingRepository.save(job);
}

public Page<JobPostingDto> getAllActiveWithCriteria(Pageable pageable, String search, String contractType, Boolean isArchive) {
return this.getAllWithCriteria(pageable, search, contractType, isArchive, true, true);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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";
Expand All @@ -29,6 +32,9 @@ public class ApiUrls {
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
Expand Down
Loading