From 6571481cecc1cad7083b1e7cc7e1e8c7701df8d5 Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Thu, 11 May 2023 22:35:18 +0300 Subject: [PATCH 01/11] bug fix SkillsOnProofDTO --- .../com/provedcode/talent/mapper/SkillMapper.java | 1 + .../com/provedcode/talent/model/dto/SkillDTO.java | 3 +++ .../talent/model/dto/SkillsOnProofDTO.java | 3 +-- .../talent/service/ProofSkillsService.java | 13 +++++++++++-- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/provedcode/talent/mapper/SkillMapper.java b/src/main/java/com/provedcode/talent/mapper/SkillMapper.java index 74c30b6..319185e 100644 --- a/src/main/java/com/provedcode/talent/mapper/SkillMapper.java +++ b/src/main/java/com/provedcode/talent/mapper/SkillMapper.java @@ -9,4 +9,5 @@ @Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, componentModel = MappingConstants.ComponentModel.SPRING) public interface SkillMapper { SkillDTO skillToSkillDTO(Skills skills); + } diff --git a/src/main/java/com/provedcode/talent/model/dto/SkillDTO.java b/src/main/java/com/provedcode/talent/model/dto/SkillDTO.java index f93fe25..e02a54d 100644 --- a/src/main/java/com/provedcode/talent/model/dto/SkillDTO.java +++ b/src/main/java/com/provedcode/talent/model/dto/SkillDTO.java @@ -1,5 +1,8 @@ package com.provedcode.talent.model.dto; +import lombok.Builder; + +@Builder public record SkillDTO( Long id, String skill diff --git a/src/main/java/com/provedcode/talent/model/dto/SkillsOnProofDTO.java b/src/main/java/com/provedcode/talent/model/dto/SkillsOnProofDTO.java index f70ff5e..c916456 100644 --- a/src/main/java/com/provedcode/talent/model/dto/SkillsOnProofDTO.java +++ b/src/main/java/com/provedcode/talent/model/dto/SkillsOnProofDTO.java @@ -1,12 +1,11 @@ package com.provedcode.talent.model.dto; -import com.provedcode.talent.model.entity.Skills; import lombok.Builder; import java.util.Set; @Builder public record SkillsOnProofDTO( - Set skills + Set skills ) { } diff --git a/src/main/java/com/provedcode/talent/service/ProofSkillsService.java b/src/main/java/com/provedcode/talent/service/ProofSkillsService.java index 84c4b2d..70056fa 100644 --- a/src/main/java/com/provedcode/talent/service/ProofSkillsService.java +++ b/src/main/java/com/provedcode/talent/service/ProofSkillsService.java @@ -2,6 +2,7 @@ import com.provedcode.talent.model.ProofStatus; import com.provedcode.talent.model.dto.ProofSkillsDTO; +import com.provedcode.talent.model.dto.SkillDTO; import com.provedcode.talent.model.dto.SkillsOnProofDTO; import com.provedcode.talent.model.entity.Skills; import com.provedcode.talent.model.entity.Talent; @@ -18,8 +19,10 @@ import org.springframework.web.server.ResponseStatusException; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.function.BiConsumer; +import java.util.stream.Collectors; import static org.springframework.http.HttpStatus.*; @@ -79,14 +82,20 @@ public SkillsOnProofDTO getAllSkillsOnProof(long talentId, long proofId, Authent throw new ResponseStatusException(BAD_REQUEST, "talentId with id = %s and proofId with id = %s do not match".formatted(talentId, proofId)); } + Set skills = talentProof.getSkills().stream().map(skill -> { + return SkillDTO.builder() + .skill(skill.getSkill()) + .id(skill.getId()) + .build(); + }).collect(Collectors.toSet()); if (talentProof.getStatus().equals(ProofStatus.PUBLISHED)) { - return SkillsOnProofDTO.builder().skills(talentProof.getSkills()).build(); + return SkillsOnProofDTO.builder().skills(skills).build(); } else if (authentication != null) { UserInfo userInfo = userInfoRepository.findByLogin(authentication.getName()) .orElseThrow(() -> new ResponseStatusException(NOT_FOUND)); if (userInfo.getTalent().getId().equals(talentProof.getTalent().getId())) { - return SkillsOnProofDTO.builder().skills(talentProof.getSkills()).build(); + return SkillsOnProofDTO.builder().skills(skills).build(); } else { throw new ResponseStatusException(FORBIDDEN, "you can't see proofs in DRAFT and HIDDEN status"); } From 2b0a89c641f57ca6d8d56441a447c3228efffa03 Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Thu, 11 May 2023 22:38:19 +0300 Subject: [PATCH 02/11] refactor SkillsOnProofDTO --- .../talent/service/ProofSkillsService.java | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/provedcode/talent/service/ProofSkillsService.java b/src/main/java/com/provedcode/talent/service/ProofSkillsService.java index 70056fa..55580f4 100644 --- a/src/main/java/com/provedcode/talent/service/ProofSkillsService.java +++ b/src/main/java/com/provedcode/talent/service/ProofSkillsService.java @@ -1,5 +1,6 @@ package com.provedcode.talent.service; +import com.provedcode.talent.mapper.SkillMapper; import com.provedcode.talent.model.ProofStatus; import com.provedcode.talent.model.dto.ProofSkillsDTO; import com.provedcode.talent.model.dto.SkillDTO; @@ -34,6 +35,8 @@ public class ProofSkillsService { TalentRepository talentRepository; UserInfoRepository userInfoRepository; TalentProofRepository talentProofRepository; + SkillMapper skillMapper; + static BiConsumer isValidUserEditTalent = (talentId, userInfo) -> { if (!userInfo.getTalent().getId().equals(talentId)) { @@ -82,13 +85,8 @@ public SkillsOnProofDTO getAllSkillsOnProof(long talentId, long proofId, Authent throw new ResponseStatusException(BAD_REQUEST, "talentId with id = %s and proofId with id = %s do not match".formatted(talentId, proofId)); } - Set skills = talentProof.getSkills().stream().map(skill -> { - return SkillDTO.builder() - .skill(skill.getSkill()) - .id(skill.getId()) - .build(); - }).collect(Collectors.toSet()); - + Set skills = talentProof.getSkills().stream() + .map(skillMapper::skillToSkillDTO).collect(Collectors.toSet()); if (talentProof.getStatus().equals(ProofStatus.PUBLISHED)) { return SkillsOnProofDTO.builder().skills(skills).build(); } else if (authentication != null) { From 87e83bb3b8481a8e0f83427881f4b5d418f831d7 Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Thu, 11 May 2023 22:44:26 +0300 Subject: [PATCH 03/11] add addSkillOnProof --- .../talent/controller/TalentController.java | 9 +++ .../talent/model/dto/SkillIdDTO.java | 6 ++ .../talent/service/TalentService.java | 57 ++++++++++++------- 3 files changed, 53 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/provedcode/talent/model/dto/SkillIdDTO.java diff --git a/src/main/java/com/provedcode/talent/controller/TalentController.java b/src/main/java/com/provedcode/talent/controller/TalentController.java index 1b9e20d..290c576 100644 --- a/src/main/java/com/provedcode/talent/controller/TalentController.java +++ b/src/main/java/com/provedcode/talent/controller/TalentController.java @@ -4,6 +4,7 @@ import com.provedcode.talent.mapper.TalentMapper; import com.provedcode.talent.model.dto.FullTalentDTO; import com.provedcode.talent.model.dto.ShortTalentDTO; +import com.provedcode.talent.model.dto.SkillIdDTO; import com.provedcode.talent.model.request.EditTalent; import com.provedcode.talent.service.TalentService; import com.provedcode.user.model.dto.SessionInfoDTO; @@ -69,4 +70,12 @@ FullTalentDTO editTalent(@PathVariable("talent-id") long id, SessionInfoDTO deleteTalent(@PathVariable("id") long id, Authentication authentication) { return talentService.deleteTalentById(id, authentication); } + + @PreAuthorize("hasRole('TALENT')") + @PostMapping("/talents/{talent-id}/skills") + void addSkillOnProof(@PathVariable("talent-id") long id, + @RequestBody SkillIdDTO skillIdDTO, + Authentication authentication) { + talentService.addSkillOnProof(id, skillIdDTO, authentication); + } } \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/model/dto/SkillIdDTO.java b/src/main/java/com/provedcode/talent/model/dto/SkillIdDTO.java new file mode 100644 index 0000000..5777910 --- /dev/null +++ b/src/main/java/com/provedcode/talent/model/dto/SkillIdDTO.java @@ -0,0 +1,6 @@ +package com.provedcode.talent.model.dto; + +public record SkillIdDTO( + Long id +) { +} diff --git a/src/main/java/com/provedcode/talent/service/TalentService.java b/src/main/java/com/provedcode/talent/service/TalentService.java index fb35aa9..d4e19ce 100644 --- a/src/main/java/com/provedcode/talent/service/TalentService.java +++ b/src/main/java/com/provedcode/talent/service/TalentService.java @@ -1,8 +1,10 @@ package com.provedcode.talent.service; import com.provedcode.config.PageProperties; +import com.provedcode.talent.model.dto.SkillIdDTO; import com.provedcode.talent.model.entity.*; import com.provedcode.talent.model.request.EditTalent; +import com.provedcode.talent.repo.SkillsRepository; import com.provedcode.talent.repo.TalentProofRepository; import com.provedcode.talent.repo.TalentRepository; import com.provedcode.talent.utill.ValidateTalentForCompliance; @@ -22,8 +24,7 @@ import java.util.List; import java.util.Optional; -import static org.springframework.http.HttpStatus.BAD_REQUEST; -import static org.springframework.http.HttpStatus.NOT_FOUND; +import static org.springframework.http.HttpStatus.*; @Service @Slf4j @@ -36,6 +37,7 @@ public class TalentService { UserInfoRepository userInfoRepository; PageProperties pageProperties; ValidateTalentForCompliance validateTalentForCompliance; + SkillsRepository skillsRepository; @Transactional(readOnly = true) public Page getTalentsPage(Integer page, Integer size) { @@ -81,10 +83,10 @@ public Talent editTalent(long id, EditTalent editTalent, Authentication authenti editableTalentDescription.setBio(editTalent.bio()); } else { editableTalentDescription = TalentDescription.builder() - .additionalInfo(editTalent.additionalInfo()) - .bio(editTalent.bio()) - .talent(editableTalent) - .build(); + .additionalInfo(editTalent.additionalInfo()) + .bio(editTalent.bio()) + .talent(editableTalent) + .build(); } editableTalent.setTalentDescription(editableTalentDescription); } @@ -99,27 +101,27 @@ public Talent editTalent(long id, EditTalent editTalent, Authentication authenti if (editTalent.links() != null) { editableTalentLinks.clear(); editableTalentLinks.addAll(editTalent.links().stream().map(s -> TalentLink.builder() - .talent(editableTalent) - .link(s) - .build()).toList()); + .talent(editableTalent) + .link(s) + .build()).toList()); editableTalent.setTalentLinks(editableTalentLinks); } if (editTalent.contacts() != null) { editableTalentContacts.clear(); editableTalentContacts.addAll(editTalent.contacts().stream().map(s -> TalentContact.builder() - .talent(editableTalent) - .contact(s) - .build()).toList()); + .talent(editableTalent) + .contact(s) + .build()).toList()); editableTalent.setTalentContacts(editableTalentContacts); } if (editTalent.attachedFiles() != null) { editableTalentAttachedFiles.clear(); editableTalentAttachedFiles.addAll(editTalent.attachedFiles().stream().map(s -> TalentAttachedFile.builder() - .talent(editableTalent) - .attachedFile( - s) - .build()) - .toList()); + .talent(editableTalent) + .attachedFile( + s) + .build()) + .toList()); editableTalent.setTalentAttachedFiles(editableTalentAttachedFiles); } return talentRepository.save(editableTalent); @@ -143,8 +145,25 @@ public SessionInfoDTO deleteTalentById(long id, Authentication authentication) { private void checkEditTalentNull(EditTalent editTalent) { if (editTalent.firstName() == null && editTalent.lastName() == null && editTalent.image() == null && - editTalent.specialization() == null && editTalent.additionalInfo() == null && editTalent.bio() == null && - editTalent.links() == null && editTalent.contacts() == null && editTalent.attachedFiles() == null) + editTalent.specialization() == null && editTalent.additionalInfo() == null && editTalent.bio() == null && + editTalent.links() == null && editTalent.contacts() == null && editTalent.attachedFiles() == null) throw new ResponseStatusException(BAD_REQUEST, "you did not provide information to make changes"); } + + public void addSkillOnProof(long id, SkillIdDTO skillIdDTO, Authentication authentication) { + Optional talent = talentRepository.findById(id); + Optional userInfo = userInfoRepository.findByLogin(authentication.getName()); + Skills skill = skillsRepository.findById(skillIdDTO.id()) + .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, + "Skill with id = %d not found".formatted( + skillIdDTO.id()))); + validateTalentForCompliance.userVerification(talent, userInfo, id); + + Talent talentObject = talent.get(); + talentObject.getTalentProofs().stream().filter(proof -> proof.getSkills() + .contains(skill)).findFirst().orElseThrow(() -> new ResponseStatusException(FORBIDDEN, + "Skill with id = %d not found in talent's proofs".formatted( + skillIdDTO.id()))); + talentObject.getSkills().add(skill); + } } \ No newline at end of file From f6174f516b9b7ca7428894dde8824ce4692b9b7f Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Thu, 11 May 2023 23:06:40 +0300 Subject: [PATCH 04/11] bug fix addSkillOnProof --- .../java/com/provedcode/talent/service/TalentService.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/provedcode/talent/service/TalentService.java b/src/main/java/com/provedcode/talent/service/TalentService.java index d4e19ce..9f1b196 100644 --- a/src/main/java/com/provedcode/talent/service/TalentService.java +++ b/src/main/java/com/provedcode/talent/service/TalentService.java @@ -158,12 +158,15 @@ public void addSkillOnProof(long id, SkillIdDTO skillIdDTO, Authentication authe "Skill with id = %d not found".formatted( skillIdDTO.id()))); validateTalentForCompliance.userVerification(talent, userInfo, id); - Talent talentObject = talent.get(); + if (!talentObject.getSkills().isEmpty() && talentObject.getSkills().contains(skill)) { + throw new ResponseStatusException(BAD_REQUEST, "you have already specified the skill"); + } talentObject.getTalentProofs().stream().filter(proof -> proof.getSkills() .contains(skill)).findFirst().orElseThrow(() -> new ResponseStatusException(FORBIDDEN, "Skill with id = %d not found in talent's proofs".formatted( skillIdDTO.id()))); talentObject.getSkills().add(skill); + talentRepository.save(talentObject); } } \ No newline at end of file From c16cc21694e975a41a76867f8b79672092a1675f Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Thu, 11 May 2023 23:09:41 +0300 Subject: [PATCH 05/11] bug fix Talent --- src/main/java/com/provedcode/talent/model/entity/Talent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/provedcode/talent/model/entity/Talent.java b/src/main/java/com/provedcode/talent/model/entity/Talent.java index c093e16..cbb2f54 100644 --- a/src/main/java/com/provedcode/talent/model/entity/Talent.java +++ b/src/main/java/com/provedcode/talent/model/entity/Talent.java @@ -66,7 +66,7 @@ public class Talent { @OneToMany(mappedBy = "talent", cascade = CascadeType.ALL, orphanRemoval = true) private List talentProofs = new ArrayList<>(); @ManyToMany - @JoinTable(name = "talent_skills", + @JoinTable(name = "talent_skill", joinColumns = @JoinColumn(name = "talent_id"), inverseJoinColumns = @JoinColumn(name = "skill_id")) private Set skills = new LinkedHashSet<>(); From 1e74676186c86f76391dc754466cab0a19c18563 Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Fri, 12 May 2023 12:29:59 +0300 Subject: [PATCH 06/11] refactor FullTalentDTO and ShortTalentDTO --- .../talent/controller/TalentController.java | 12 ++++++------ .../provedcode/talent/model/dto/FullTalentDTO.java | 3 ++- .../provedcode/talent/model/dto/ShortTalentDTO.java | 4 ++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/provedcode/talent/controller/TalentController.java b/src/main/java/com/provedcode/talent/controller/TalentController.java index 290c576..81c9856 100644 --- a/src/main/java/com/provedcode/talent/controller/TalentController.java +++ b/src/main/java/com/provedcode/talent/controller/TalentController.java @@ -31,7 +31,7 @@ @Slf4j @RestController @AllArgsConstructor -@RequestMapping("/api/v2") +@RequestMapping("/api/") @Tag(name = "talent", description = "Talent API") @Validated public class TalentController { @@ -39,7 +39,7 @@ public class TalentController { TalentMapper talentMapper; @GetAllTalentsApiDoc - @GetMapping("/talents") + @GetMapping("v2/talents") @Validated Page getTalents(@RequestParam(value = "page", defaultValue = "0") @PositiveOrZero Integer page, @RequestParam(value = "size", defaultValue = "5") @Min(1) @Max(1000) Integer size) { @@ -48,7 +48,7 @@ Page getTalents(@RequestParam(value = "page", defaultValue = "0" @GetTalentApiDoc @PreAuthorize("hasRole('TALENT')") - @GetMapping("/talents/{id}") + @GetMapping("v2/talents/{id}") FullTalentDTO getTalent(@PathVariable("id") long id, Authentication authentication) { log.info("get-talent auth = {}", authentication); log.info("get-talent auth.name = {}", authentication.getAuthorities()); @@ -57,7 +57,7 @@ FullTalentDTO getTalent(@PathVariable("id") long id, Authentication authenticati @PatchEditTalentApiDoc @PreAuthorize("hasRole('TALENT')") - @PatchMapping("/talents/{talent-id}") + @PatchMapping("v2/talents/{talent-id}") FullTalentDTO editTalent(@PathVariable("talent-id") long id, @RequestBody @Valid EditTalent editTalent, Authentication authentication) { @@ -66,13 +66,13 @@ FullTalentDTO editTalent(@PathVariable("talent-id") long id, @DeleteTalentApiDoc @PreAuthorize("hasRole('TALENT')") - @DeleteMapping("/talents/{id}") + @DeleteMapping("v2/talents/{id}") SessionInfoDTO deleteTalent(@PathVariable("id") long id, Authentication authentication) { return talentService.deleteTalentById(id, authentication); } @PreAuthorize("hasRole('TALENT')") - @PostMapping("/talents/{talent-id}/skills") + @PostMapping("v4/talents/{talent-id}/skills") void addSkillOnProof(@PathVariable("talent-id") long id, @RequestBody SkillIdDTO skillIdDTO, Authentication authentication) { diff --git a/src/main/java/com/provedcode/talent/model/dto/FullTalentDTO.java b/src/main/java/com/provedcode/talent/model/dto/FullTalentDTO.java index b67b317..8ee5f11 100644 --- a/src/main/java/com/provedcode/talent/model/dto/FullTalentDTO.java +++ b/src/main/java/com/provedcode/talent/model/dto/FullTalentDTO.java @@ -6,6 +6,7 @@ import lombok.Builder; import java.util.List; +import java.util.Set; @Builder public record FullTalentDTO( @@ -22,7 +23,7 @@ public record FullTalentDTO( @JsonProperty("additional_info") String additionalInfo, String bio, - List talents, + Set skills, @UrlList List links, List contacts, diff --git a/src/main/java/com/provedcode/talent/model/dto/ShortTalentDTO.java b/src/main/java/com/provedcode/talent/model/dto/ShortTalentDTO.java index d252bcd..14d2f09 100644 --- a/src/main/java/com/provedcode/talent/model/dto/ShortTalentDTO.java +++ b/src/main/java/com/provedcode/talent/model/dto/ShortTalentDTO.java @@ -2,7 +2,7 @@ import lombok.Builder; -import java.util.List; +import java.util.Set; @Builder public record ShortTalentDTO( @@ -11,6 +11,6 @@ public record ShortTalentDTO( String firstName, String lastName, String specialization, - List talents + Set skills ) { } From ebeefcecb8ff04890b2367c0bb441fa3dfe26e56 Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Fri, 12 May 2023 12:36:01 +0300 Subject: [PATCH 07/11] add controller deleteSkillFromTalent --- .../talent/controller/TalentController.java | 21 ++++++++++++------- .../talent/service/TalentService.java | 2 +- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/provedcode/talent/controller/TalentController.java b/src/main/java/com/provedcode/talent/controller/TalentController.java index 81c9856..4c9e906 100644 --- a/src/main/java/com/provedcode/talent/controller/TalentController.java +++ b/src/main/java/com/provedcode/talent/controller/TalentController.java @@ -1,6 +1,5 @@ package com.provedcode.talent.controller; -import com.provedcode.config.PageProperties; import com.provedcode.talent.mapper.TalentMapper; import com.provedcode.talent.model.dto.FullTalentDTO; import com.provedcode.talent.model.dto.ShortTalentDTO; @@ -20,14 +19,11 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; -import org.springframework.http.HttpStatus; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.Authentication; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.Optional; - @Slf4j @RestController @AllArgsConstructor @@ -73,9 +69,18 @@ SessionInfoDTO deleteTalent(@PathVariable("id") long id, Authentication authenti @PreAuthorize("hasRole('TALENT')") @PostMapping("v4/talents/{talent-id}/skills") - void addSkillOnProof(@PathVariable("talent-id") long id, - @RequestBody SkillIdDTO skillIdDTO, - Authentication authentication) { - talentService.addSkillOnProof(id, skillIdDTO, authentication); + void addSkillOnTalent(@PathVariable("talent-id") long id, + @RequestBody SkillIdDTO skillIdDTO, + Authentication authentication) { + talentService.addSkillOnTalent(id, skillIdDTO, authentication); } + + @PreAuthorize("hasRole('TALENT')") + @DeleteMapping("/talents/{talent-id}/skills/{skill-id}") + void deleteSkillFromTalent(@PathVariable("talent-id") long talentId, + @PathVariable("skill-id") long skillId, + Authentication authentication) { + talentService.deleteSkillFromTalent(talentId, skillId, authentication); + } + } \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/service/TalentService.java b/src/main/java/com/provedcode/talent/service/TalentService.java index 9f1b196..844e3e3 100644 --- a/src/main/java/com/provedcode/talent/service/TalentService.java +++ b/src/main/java/com/provedcode/talent/service/TalentService.java @@ -150,7 +150,7 @@ private void checkEditTalentNull(EditTalent editTalent) { throw new ResponseStatusException(BAD_REQUEST, "you did not provide information to make changes"); } - public void addSkillOnProof(long id, SkillIdDTO skillIdDTO, Authentication authentication) { + public void addSkillOnTalent(long id, SkillIdDTO skillIdDTO, Authentication authentication) { Optional talent = talentRepository.findById(id); Optional userInfo = userInfoRepository.findByLogin(authentication.getName()); Skills skill = skillsRepository.findById(skillIdDTO.id()) From 13bbdf6d6dfc23da71840bfb4e86d0e4e756cee0 Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Fri, 12 May 2023 12:41:26 +0300 Subject: [PATCH 08/11] add service deleteSkillFromTalent --- .../provedcode/talent/service/TalentService.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/java/com/provedcode/talent/service/TalentService.java b/src/main/java/com/provedcode/talent/service/TalentService.java index 844e3e3..982a61b 100644 --- a/src/main/java/com/provedcode/talent/service/TalentService.java +++ b/src/main/java/com/provedcode/talent/service/TalentService.java @@ -169,4 +169,18 @@ public void addSkillOnTalent(long id, SkillIdDTO skillIdDTO, Authentication auth talentObject.getSkills().add(skill); talentRepository.save(talentObject); } + + public void deleteSkillFromTalent(long talentId, long skillId, Authentication authentication) { + Optional talent = talentRepository.findById(talentId); + Optional userInfo = userInfoRepository.findByLogin(authentication.getName()); + Skills skill = skillsRepository.findById(skillId) + .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, + "Skill with id = %d not found".formatted(skillId))); + validateTalentForCompliance.userVerification(talent, userInfo, talentId); + Talent talentObject = talent.get(); + if (!talentObject.getSkills().remove(skill)) { + throw new ResponseStatusException(NOT_FOUND, + "Skill with id = %d not found".formatted(skillId)); + } + } } \ No newline at end of file From 3daec0f84726fe333c910f5e31a421593a6cbc68 Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Fri, 12 May 2023 13:26:37 +0300 Subject: [PATCH 09/11] bug fix --- .../java/com/provedcode/talent/controller/TalentController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/provedcode/talent/controller/TalentController.java b/src/main/java/com/provedcode/talent/controller/TalentController.java index 4c9e906..4b73370 100644 --- a/src/main/java/com/provedcode/talent/controller/TalentController.java +++ b/src/main/java/com/provedcode/talent/controller/TalentController.java @@ -76,7 +76,7 @@ void addSkillOnTalent(@PathVariable("talent-id") long id, } @PreAuthorize("hasRole('TALENT')") - @DeleteMapping("/talents/{talent-id}/skills/{skill-id}") + @DeleteMapping("v4/talents/{talent-id}/skills/{skill-id}") void deleteSkillFromTalent(@PathVariable("talent-id") long talentId, @PathVariable("skill-id") long skillId, Authentication authentication) { From 2a567cd35a751cfedb610994b80ab43f3864d35e Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Fri, 12 May 2023 23:29:20 +0300 Subject: [PATCH 10/11] addSkillOnTalent refactor --- .../talent/model/dto/SkillIdDTO.java | 4 +- .../talent/service/TalentService.java | 37 ++++++++++++------- 2 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/provedcode/talent/model/dto/SkillIdDTO.java b/src/main/java/com/provedcode/talent/model/dto/SkillIdDTO.java index 5777910..911aa6a 100644 --- a/src/main/java/com/provedcode/talent/model/dto/SkillIdDTO.java +++ b/src/main/java/com/provedcode/talent/model/dto/SkillIdDTO.java @@ -1,6 +1,8 @@ package com.provedcode.talent.model.dto; +import java.util.List; + public record SkillIdDTO( - Long id + List id ) { } diff --git a/src/main/java/com/provedcode/talent/service/TalentService.java b/src/main/java/com/provedcode/talent/service/TalentService.java index 982a61b..0cdb04c 100644 --- a/src/main/java/com/provedcode/talent/service/TalentService.java +++ b/src/main/java/com/provedcode/talent/service/TalentService.java @@ -21,8 +21,11 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.server.ResponseStatusException; +import java.util.HashSet; import java.util.List; import java.util.Optional; +import java.util.Set; +import java.util.stream.Collectors; import static org.springframework.http.HttpStatus.*; @@ -153,21 +156,29 @@ private void checkEditTalentNull(EditTalent editTalent) { public void addSkillOnTalent(long id, SkillIdDTO skillIdDTO, Authentication authentication) { Optional talent = talentRepository.findById(id); Optional userInfo = userInfoRepository.findByLogin(authentication.getName()); - Skills skill = skillsRepository.findById(skillIdDTO.id()) - .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, - "Skill with id = %d not found".formatted( - skillIdDTO.id()))); validateTalentForCompliance.userVerification(talent, userInfo, id); Talent talentObject = talent.get(); - if (!talentObject.getSkills().isEmpty() && talentObject.getSkills().contains(skill)) { - throw new ResponseStatusException(BAD_REQUEST, "you have already specified the skill"); - } - talentObject.getTalentProofs().stream().filter(proof -> proof.getSkills() - .contains(skill)).findFirst().orElseThrow(() -> new ResponseStatusException(FORBIDDEN, - "Skill with id = %d not found in talent's proofs".formatted( - skillIdDTO.id()))); - talentObject.getSkills().add(skill); - talentRepository.save(talentObject); + + Set skillsFromRepo = skillIdDTO.id().stream() + .map(element -> skillsRepository.findById(element) + .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, + "Skill with id = %d not found".formatted(element)))) + .collect(Collectors.toSet()); + + Set skillsFromProofs = talentObject.getTalentProofs().stream() + .flatMap(talentProof -> talentProof.getSkills().stream()) + .collect(Collectors.toSet()); + + skillsFromRepo.stream() + .filter(skill -> !skillsFromProofs.contains(skill)) + .findFirst() + .ifPresent(skill -> { + throw new ResponseStatusException(FORBIDDEN, + "Skill with id = %d not found in talent's proofs".formatted(skill.getId())); + }); + + skillsFromRepo.stream() + .forEach(skill -> talentObject.getSkills().add(skill)); } public void deleteSkillFromTalent(long talentId, long skillId, Authentication authentication) { From a4a2461a5bf5ec17a048eff2bda83ff146e97df2 Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Fri, 12 May 2023 23:33:36 +0300 Subject: [PATCH 11/11] add @NotEmpty to SkillIdDTO --- .../com/provedcode/talent/controller/TalentController.java | 2 +- src/main/java/com/provedcode/talent/model/dto/SkillIdDTO.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/provedcode/talent/controller/TalentController.java b/src/main/java/com/provedcode/talent/controller/TalentController.java index 4b73370..ff09687 100644 --- a/src/main/java/com/provedcode/talent/controller/TalentController.java +++ b/src/main/java/com/provedcode/talent/controller/TalentController.java @@ -70,7 +70,7 @@ SessionInfoDTO deleteTalent(@PathVariable("id") long id, Authentication authenti @PreAuthorize("hasRole('TALENT')") @PostMapping("v4/talents/{talent-id}/skills") void addSkillOnTalent(@PathVariable("talent-id") long id, - @RequestBody SkillIdDTO skillIdDTO, + @RequestBody @Valid SkillIdDTO skillIdDTO, Authentication authentication) { talentService.addSkillOnTalent(id, skillIdDTO, authentication); } diff --git a/src/main/java/com/provedcode/talent/model/dto/SkillIdDTO.java b/src/main/java/com/provedcode/talent/model/dto/SkillIdDTO.java index 911aa6a..c6d4013 100644 --- a/src/main/java/com/provedcode/talent/model/dto/SkillIdDTO.java +++ b/src/main/java/com/provedcode/talent/model/dto/SkillIdDTO.java @@ -1,8 +1,11 @@ package com.provedcode.talent.model.dto; +import jakarta.validation.constraints.NotEmpty; + import java.util.List; public record SkillIdDTO( + @NotEmpty List id ) { }