From beae01f1b397a31313199445b68666535c6e6f7d Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Sat, 6 May 2023 17:52:25 +0300 Subject: [PATCH 1/6] add getAllSkillsOnProof --- .../controller/TalentSkillsController.java | 8 ++++++ .../talent/model/dto/SkillsOnProofDTO.java | 12 ++++++++ .../talent/service/TalentSkillsService.java | 28 ++++++++++++++++++- 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/provedcode/talent/model/dto/SkillsOnProofDTO.java diff --git a/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java b/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java index 35d9acb..848a792 100644 --- a/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java +++ b/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java @@ -1,6 +1,7 @@ package com.provedcode.talent.controller; import com.provedcode.talent.model.dto.ProofSkillsDTO; +import com.provedcode.talent.model.dto.SkillsOnProofDTO; import com.provedcode.talent.service.TalentSkillsService; import jakarta.validation.Valid; import lombok.AllArgsConstructor; @@ -25,4 +26,11 @@ void addSkillOnProof(@PathVariable("talent-id") long talentId, Authentication authentication) { talentSkillsService.addSkillsOnProof(talentId, proofId, skills, authentication); } + + @GetMapping("/{talent-id}/proofs/{proof-id}") + SkillsOnProofDTO getAllSkillsOnProof(@PathVariable("talent-id") long talentId, + @PathVariable("proof-id") long proofId, + Authentication authentication) { + return talentSkillsService.getAllSkillsOnProof(talentId, proofId, authentication); + } } diff --git a/src/main/java/com/provedcode/talent/model/dto/SkillsOnProofDTO.java b/src/main/java/com/provedcode/talent/model/dto/SkillsOnProofDTO.java new file mode 100644 index 0000000..f70ff5e --- /dev/null +++ b/src/main/java/com/provedcode/talent/model/dto/SkillsOnProofDTO.java @@ -0,0 +1,12 @@ +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 +) { +} diff --git a/src/main/java/com/provedcode/talent/service/TalentSkillsService.java b/src/main/java/com/provedcode/talent/service/TalentSkillsService.java index 7fdd351..6070520 100644 --- a/src/main/java/com/provedcode/talent/service/TalentSkillsService.java +++ b/src/main/java/com/provedcode/talent/service/TalentSkillsService.java @@ -2,7 +2,9 @@ import com.provedcode.talent.model.ProofStatus; import com.provedcode.talent.model.dto.ProofSkillsDTO; +import com.provedcode.talent.model.dto.SkillsOnProofDTO; import com.provedcode.talent.model.entity.Skills; +import com.provedcode.talent.model.entity.Talent; import com.provedcode.talent.model.entity.TalentProof; import com.provedcode.talent.repo.SkillsRepository; import com.provedcode.talent.repo.TalentProofRepository; @@ -15,8 +17,9 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.server.ResponseStatusException; +import java.util.Collections; import java.util.HashSet; -import java.util.List; +import java.util.Optional; import java.util.Set; import java.util.function.BiConsumer; @@ -60,5 +63,28 @@ public void addSkillsOnProof(long talentId, long proofId, ProofSkillsDTO skills, talentProofRepository.save(talentProof); } + public SkillsOnProofDTO getAllSkillsOnProof(long talentId, long proofId, Authentication authentication) { + TalentProof talentProof = talentProofRepository.findById(proofId) + .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, + "proof with id = %s not found".formatted(proofId))); + Talent talent = talentRepository.findById(talentId) + .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, + "talent with id = %s not found".formatted(talentId))); + if (!talent.getId().equals(talentProof.getTalent().getId())) { + throw new ResponseStatusException(BAD_REQUEST, + "talentId with id = %s and proofId with id = %s do not match".formatted(talentId, proofId)); + } + Optional userInfo = userInfoRepository.findByLogin(authentication.getName()); + if (talentProof.getStatus().equals(ProofStatus.PUBLISHED)) { + return SkillsOnProofDTO.builder().skills(talentProof.getSkills()).build(); + } else if (userInfo.isPresent()) { + if (userInfo.get().getTalent().getId().equals(talentProof.getTalent().getId())) { + return SkillsOnProofDTO.builder().skills(talentProof.getSkills()).build(); + } + } else { + throw new ResponseStatusException(FORBIDDEN, "you can't see proofs in DRAFT and HIDDEN status"); + } + return new SkillsOnProofDTO(Collections.emptySet()); + } } From 6049476efcf49af0f6560427d7b2cd906439db50 Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Sat, 6 May 2023 18:02:34 +0300 Subject: [PATCH 2/6] add deleteSkillOnProof --- .../controller/TalentSkillsController.java | 8 +++++++ .../talent/service/TalentSkillsService.java | 23 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java b/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java index 848a792..2a318c9 100644 --- a/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java +++ b/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java @@ -33,4 +33,12 @@ SkillsOnProofDTO getAllSkillsOnProof(@PathVariable("talent-id") long talentId, Authentication authentication) { return talentSkillsService.getAllSkillsOnProof(talentId, proofId, authentication); } + + @DeleteMapping("/talents/{talent-id}/proofs/{proof-id}/skills/{skill-id}") + void deleteSkillOnProof(@PathVariable("talent-id") long talentId, + @PathVariable("proof-id") long proofId, + @PathVariable("skill-id") long skillId, + Authentication authentication) { + talentSkillsService.deleteSkillOnProof(talentId, proofId, skillId, authentication); + } } diff --git a/src/main/java/com/provedcode/talent/service/TalentSkillsService.java b/src/main/java/com/provedcode/talent/service/TalentSkillsService.java index 6070520..173288c 100644 --- a/src/main/java/com/provedcode/talent/service/TalentSkillsService.java +++ b/src/main/java/com/provedcode/talent/service/TalentSkillsService.java @@ -63,6 +63,7 @@ public void addSkillsOnProof(long talentId, long proofId, ProofSkillsDTO skills, talentProofRepository.save(talentProof); } + @Transactional(readOnly = true) public SkillsOnProofDTO getAllSkillsOnProof(long talentId, long proofId, Authentication authentication) { TalentProof talentProof = talentProofRepository.findById(proofId) .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, @@ -87,4 +88,26 @@ public SkillsOnProofDTO getAllSkillsOnProof(long talentId, long proofId, Authent } return new SkillsOnProofDTO(Collections.emptySet()); } + + public void deleteSkillOnProof(long talentId, long proofId, long skillId, Authentication authentication) { + Talent talent = talentRepository.findById(talentId) + .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, + "talent with id = %s not found".formatted(talentId))); + UserInfo userInfo = userInfoRepository.findByLogin(authentication.getName()) + .orElseThrow(() -> new ResponseStatusException(NOT_FOUND)); + TalentProof talentProof = talentProofRepository.findById(proofId) + .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, "proof with id = %s not found".formatted(proofId))); + if (!talentProof.getStatus().equals(ProofStatus.DRAFT)) { + throw new ResponseStatusException(CONFLICT, "proof status must be DRAFT"); + } + if (!talent.getId().equals(talentProof.getTalent().getId())) { + throw new ResponseStatusException(BAD_REQUEST, + "talentId with id = %s and proofId with id = %s do not match".formatted(talentId, proofId)); + } + isValidUserEditTalent.accept(talentId, userInfo); + Skills skills = skillsRepository.findById(skillId) + .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, + "skill with id = %s not found".formatted(skillId))); + talentProof.getSkills().remove(skills); + } } From c37be5d237dc8177a9f8369f73be0f41f2a68be1 Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Sat, 6 May 2023 18:38:23 +0300 Subject: [PATCH 3/6] add skills in get mapping bug fix --- .../controller/TalentSkillsController.java | 2 +- .../db/changelog/changeset/V4/data-V4.1.sql | 19 +++++++++++++++++++ .../db/changelog/db.changelog-master.yaml | 2 ++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/db/changelog/changeset/V4/data-V4.1.sql diff --git a/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java b/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java index 2a318c9..6516489 100644 --- a/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java +++ b/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java @@ -27,7 +27,7 @@ void addSkillOnProof(@PathVariable("talent-id") long talentId, talentSkillsService.addSkillsOnProof(talentId, proofId, skills, authentication); } - @GetMapping("/{talent-id}/proofs/{proof-id}") + @GetMapping("/{talent-id}/proofs/{proof-id}/skills") SkillsOnProofDTO getAllSkillsOnProof(@PathVariable("talent-id") long talentId, @PathVariable("proof-id") long proofId, Authentication authentication) { diff --git a/src/main/resources/db/changelog/changeset/V4/data-V4.1.sql b/src/main/resources/db/changelog/changeset/V4/data-V4.1.sql new file mode 100644 index 0000000..02b807a --- /dev/null +++ b/src/main/resources/db/changelog/changeset/V4/data-V4.1.sql @@ -0,0 +1,19 @@ +--liquibase formatted sql +--changeset dennis:3 +-- Skill +INSERT INTO talent_skill (proof_id, skill_id) +VALUES (1, 1); +INSERT INTO talent_skill (proof_id, skill_id) +VALUES (1, 2); +INSERT INTO talent_skill (proof_id, skill_id) +VALUES (1, 3); +INSERT INTO talent_skill (proof_id, skill_id) +VALUES (1, 4); +INSERT INTO talent_skill (proof_id, skill_id) +VALUES (2, 1); +INSERT INTO talent_skill (proof_id, skill_id) +VALUES (2, 2); +INSERT INTO talent_skill (proof_id, skill_id) +VALUES (2, 3); + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 8c5dc7c..102ca3c 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -9,3 +9,5 @@ databaseChangeLog: file: db/changelog/changeset/V4/schema-V4.sql - include: file: db/changelog/changeset/V4/data-V4.sql + - include: + file: db/changelog/changeset/V4/data-V4.1.sql From b73cf0629a5a46a088928ce82ddb180bc04dfa18 Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Sat, 6 May 2023 19:02:33 +0300 Subject: [PATCH 4/6] bug fix --- .../talent/controller/TalentSkillsController.java | 2 +- .../talent/service/TalentSkillsService.java | 12 ++++++------ .../db/changelog/changeset/V4/data-V4.1.sql | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java b/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java index 6516489..0254050 100644 --- a/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java +++ b/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java @@ -34,7 +34,7 @@ SkillsOnProofDTO getAllSkillsOnProof(@PathVariable("talent-id") long talentId, return talentSkillsService.getAllSkillsOnProof(talentId, proofId, authentication); } - @DeleteMapping("/talents/{talent-id}/proofs/{proof-id}/skills/{skill-id}") + @DeleteMapping("/{talent-id}/proofs/{proof-id}/skills/{skill-id}") void deleteSkillOnProof(@PathVariable("talent-id") long talentId, @PathVariable("proof-id") long proofId, @PathVariable("skill-id") long skillId, diff --git a/src/main/java/com/provedcode/talent/service/TalentSkillsService.java b/src/main/java/com/provedcode/talent/service/TalentSkillsService.java index 173288c..0460805 100644 --- a/src/main/java/com/provedcode/talent/service/TalentSkillsService.java +++ b/src/main/java/com/provedcode/talent/service/TalentSkillsService.java @@ -17,9 +17,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.server.ResponseStatusException; -import java.util.Collections; import java.util.HashSet; -import java.util.Optional; import java.util.Set; import java.util.function.BiConsumer; @@ -75,18 +73,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)); } - Optional userInfo = userInfoRepository.findByLogin(authentication.getName()); if (talentProof.getStatus().equals(ProofStatus.PUBLISHED)) { return SkillsOnProofDTO.builder().skills(talentProof.getSkills()).build(); - } else if (userInfo.isPresent()) { - if (userInfo.get().getTalent().getId().equals(talentProof.getTalent().getId())) { + } 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(); + } else { + throw new ResponseStatusException(FORBIDDEN, "you can't see proofs in DRAFT and HIDDEN status"); } } else { throw new ResponseStatusException(FORBIDDEN, "you can't see proofs in DRAFT and HIDDEN status"); } - return new SkillsOnProofDTO(Collections.emptySet()); } public void deleteSkillOnProof(long talentId, long proofId, long skillId, Authentication authentication) { diff --git a/src/main/resources/db/changelog/changeset/V4/data-V4.1.sql b/src/main/resources/db/changelog/changeset/V4/data-V4.1.sql index 02b807a..9261f0d 100644 --- a/src/main/resources/db/changelog/changeset/V4/data-V4.1.sql +++ b/src/main/resources/db/changelog/changeset/V4/data-V4.1.sql @@ -10,10 +10,10 @@ VALUES (1, 3); INSERT INTO talent_skill (proof_id, skill_id) VALUES (1, 4); INSERT INTO talent_skill (proof_id, skill_id) -VALUES (2, 1); +VALUES (4, 1); INSERT INTO talent_skill (proof_id, skill_id) -VALUES (2, 2); +VALUES (5, 2); INSERT INTO talent_skill (proof_id, skill_id) -VALUES (2, 3); +VALUES (6, 3); From 906c1e0b3e3ec6720c9f0fea5dde5165a16038df Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Sat, 6 May 2023 19:13:35 +0300 Subject: [PATCH 5/6] bug fix --- .../provedcode/talent/controller/TalentSkillsController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java b/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java index 0254050..bc0a57e 100644 --- a/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java +++ b/src/main/java/com/provedcode/talent/controller/TalentSkillsController.java @@ -6,6 +6,7 @@ import jakarta.validation.Valid; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +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.*; @@ -33,7 +34,7 @@ SkillsOnProofDTO getAllSkillsOnProof(@PathVariable("talent-id") long talentId, Authentication authentication) { return talentSkillsService.getAllSkillsOnProof(talentId, proofId, authentication); } - + @PreAuthorize("hasRole('TALENT')") @DeleteMapping("/{talent-id}/proofs/{proof-id}/skills/{skill-id}") void deleteSkillOnProof(@PathVariable("talent-id") long talentId, @PathVariable("proof-id") long proofId, From 42e5e5a499a361b938df6740fd99ae68a7ee2aa4 Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Sun, 7 May 2023 13:54:26 +0300 Subject: [PATCH 6/6] add verification in deleteSkillOnProof --- .../com/provedcode/talent/service/TalentSkillsService.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/provedcode/talent/service/TalentSkillsService.java b/src/main/java/com/provedcode/talent/service/TalentSkillsService.java index 0460805..0fed22f 100644 --- a/src/main/java/com/provedcode/talent/service/TalentSkillsService.java +++ b/src/main/java/com/provedcode/talent/service/TalentSkillsService.java @@ -108,6 +108,10 @@ public void deleteSkillOnProof(long talentId, long proofId, long skillId, Authen Skills skills = skillsRepository.findById(skillId) .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, "skill with id = %s not found".formatted(skillId))); + if (!talentProof.getSkills().contains(skills)) { + throw new ResponseStatusException(NOT_FOUND, + "you dont have skill with id = %s on proof with id = %s".formatted(skillId, proofId)); + } talentProof.getSkills().remove(skills); } }