From 6db35375697959b359ed036e4bf3411c2d687445 Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Sat, 20 May 2023 14:54:12 +0300 Subject: [PATCH 1/6] preparation for US3 --- .../talent/controller/TalentController.java | 8 +++++ .../talent/model/dto/StatisticsDTO.java | 4 +++ .../talent/service/TalentService.java | 32 ++++++++++++++++--- 3 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/provedcode/talent/model/dto/StatisticsDTO.java diff --git a/src/main/java/com/provedcode/talent/controller/TalentController.java b/src/main/java/com/provedcode/talent/controller/TalentController.java index ecff1f5..98a4420 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.model.dto.FullTalentDTO; import com.provedcode.talent.model.dto.ShortTalentDTO; import com.provedcode.talent.model.dto.SkillIdDTO; +import com.provedcode.talent.model.dto.StatisticsDTO; import com.provedcode.talent.model.request.EditTalent; import com.provedcode.talent.service.TalentService; import com.provedcode.user.model.dto.SessionInfoDTO; @@ -90,4 +91,11 @@ Page getFilteredBySkillsTalents(@RequestParam(value = "page", de return talentService.getFilteredBySkillsTalentsPage(page, size, filterBy).map(talentMapper::talentToShortTalentDTO); } + @GetMapping("v5/talents{talent-id}/statistics") + StatisticsDTO getStatisticsForTalent(@PathVariable("talent-id") long talentId, + Authentication authentication) { + return talentService.getStatisticsForTalent(talentId, authentication); + } + + } \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/model/dto/StatisticsDTO.java b/src/main/java/com/provedcode/talent/model/dto/StatisticsDTO.java new file mode 100644 index 0000000..58cbffe --- /dev/null +++ b/src/main/java/com/provedcode/talent/model/dto/StatisticsDTO.java @@ -0,0 +1,4 @@ +package com.provedcode.talent.model.dto; + +public record StatisticsDTO() { +} diff --git a/src/main/java/com/provedcode/talent/service/TalentService.java b/src/main/java/com/provedcode/talent/service/TalentService.java index 775b78a..df8e62d 100644 --- a/src/main/java/com/provedcode/talent/service/TalentService.java +++ b/src/main/java/com/provedcode/talent/service/TalentService.java @@ -1,7 +1,10 @@ package com.provedcode.talent.service; import com.provedcode.config.PageProperties; +import com.provedcode.talent.model.dto.ProofDTO; +import com.provedcode.talent.model.dto.SkillDTO; import com.provedcode.talent.model.dto.SkillIdDTO; +import com.provedcode.talent.model.dto.StatisticsDTO; import com.provedcode.talent.model.entity.*; import com.provedcode.talent.model.request.EditTalent; import com.provedcode.talent.repo.SkillsRepository; @@ -24,10 +27,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.server.ResponseStatusException; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import static org.springframework.http.HttpStatus.*; @@ -214,4 +214,28 @@ public Page getFilteredBySkillsTalentsPage(@PositiveOrZero Integer page, talentRepository.findBySkills_SkillsInIgnoreCase(PageRequest.of(page, size), Arrays.stream(filterBy).map(String::toUpperCase).toList()) : talentRepository.findAll(PageRequest.of(page, size)); } + + public StatisticsDTO getStatisticsForTalent(long talentId, Authentication authentication) { + Optional talent = talentRepository.findById(talentId); + Optional userInfo = userInfoRepository.findByLogin(authentication.getName()); + validateTalentForCompliance.userVerification(talent, userInfo, talentId); + Talent talentObject = talent.get(); + getAllKudosOnTalent(talentObject); + getSkillWithLargestNumberOfKudos(talentObject); + getProofWithLargestNumberOfKudos(talentObject); + + return null; + } + + public Long getAllKudosOnTalent(Talent talent) { + return null; + } + + public Map getSkillWithLargestNumberOfKudos(Talent talent) { + return null; + } + + public Map getProofWithLargestNumberOfKudos(Talent talent) { + return null; + } } \ No newline at end of file From c4734c742c8b4f9284509edc0e3a76d07664c8c1 Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Sat, 20 May 2023 15:08:14 +0300 Subject: [PATCH 2/6] getAllKudosOnTalent --- .../talent/controller/TalentController.java | 5 ++--- .../provedcode/talent/model/dto/StatisticsDTO.java | 7 ++++++- .../com/provedcode/talent/service/TalentService.java | 12 +++++++++--- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/provedcode/talent/controller/TalentController.java b/src/main/java/com/provedcode/talent/controller/TalentController.java index 98a4420..3c0b319 100644 --- a/src/main/java/com/provedcode/talent/controller/TalentController.java +++ b/src/main/java/com/provedcode/talent/controller/TalentController.java @@ -91,11 +91,10 @@ Page getFilteredBySkillsTalents(@RequestParam(value = "page", de return talentService.getFilteredBySkillsTalentsPage(page, size, filterBy).map(talentMapper::talentToShortTalentDTO); } - @GetMapping("v5/talents{talent-id}/statistics") + @PreAuthorize("hasRole('TALENT')") + @GetMapping("v5/talents/{talent-id}/statistics") StatisticsDTO getStatisticsForTalent(@PathVariable("talent-id") long talentId, Authentication authentication) { return talentService.getStatisticsForTalent(talentId, authentication); } - - } \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/model/dto/StatisticsDTO.java b/src/main/java/com/provedcode/talent/model/dto/StatisticsDTO.java index 58cbffe..1d53fb1 100644 --- a/src/main/java/com/provedcode/talent/model/dto/StatisticsDTO.java +++ b/src/main/java/com/provedcode/talent/model/dto/StatisticsDTO.java @@ -1,4 +1,9 @@ package com.provedcode.talent.model.dto; -public record StatisticsDTO() { +import lombok.Builder; + +@Builder +public record StatisticsDTO( + Long allKudosOnTalent +) { } diff --git a/src/main/java/com/provedcode/talent/service/TalentService.java b/src/main/java/com/provedcode/talent/service/TalentService.java index df8e62d..d93c1bc 100644 --- a/src/main/java/com/provedcode/talent/service/TalentService.java +++ b/src/main/java/com/provedcode/talent/service/TalentService.java @@ -220,15 +220,21 @@ public StatisticsDTO getStatisticsForTalent(long talentId, Authentication authen Optional userInfo = userInfoRepository.findByLogin(authentication.getName()); validateTalentForCompliance.userVerification(talent, userInfo, talentId); Talent talentObject = talent.get(); - getAllKudosOnTalent(talentObject); getSkillWithLargestNumberOfKudos(talentObject); getProofWithLargestNumberOfKudos(talentObject); - return null; + return StatisticsDTO.builder() + .allKudosOnTalent(getAllKudosOnTalent(talentObject)) + .build(); } public Long getAllKudosOnTalent(Talent talent) { - return null; + return talent.getTalentProofs() + .stream() + .flatMap(x -> x.getProofSkills().stream()) + .flatMap(y -> y.getKudos().stream()) + .mapToLong(q -> q.getAmount()) + .sum(); } public Map getSkillWithLargestNumberOfKudos(Talent talent) { From 34baabf8ccae0fef1a861845de1799902726b7d8 Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Sat, 20 May 2023 15:26:59 +0300 Subject: [PATCH 3/6] not yet getSkillWithLargestNumberOfKudos --- .../talent/model/dto/StatisticsDTO.java | 6 +++++- .../talent/service/TalentService.java | 20 +++++++++++++++---- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/provedcode/talent/model/dto/StatisticsDTO.java b/src/main/java/com/provedcode/talent/model/dto/StatisticsDTO.java index 1d53fb1..1914887 100644 --- a/src/main/java/com/provedcode/talent/model/dto/StatisticsDTO.java +++ b/src/main/java/com/provedcode/talent/model/dto/StatisticsDTO.java @@ -2,8 +2,12 @@ import lombok.Builder; +import java.util.Map; + @Builder public record StatisticsDTO( - Long allKudosOnTalent + Long allKudosOnTalent, + Map skillWithLargestNumberOfKudos, + Map proofWithLargestNumberOfKudos ) { } diff --git a/src/main/java/com/provedcode/talent/service/TalentService.java b/src/main/java/com/provedcode/talent/service/TalentService.java index d93c1bc..68b6420 100644 --- a/src/main/java/com/provedcode/talent/service/TalentService.java +++ b/src/main/java/com/provedcode/talent/service/TalentService.java @@ -1,6 +1,7 @@ package com.provedcode.talent.service; import com.provedcode.config.PageProperties; +import com.provedcode.kudos.model.entity.Kudos; import com.provedcode.talent.model.dto.ProofDTO; import com.provedcode.talent.model.dto.SkillDTO; import com.provedcode.talent.model.dto.SkillIdDTO; @@ -220,11 +221,10 @@ public StatisticsDTO getStatisticsForTalent(long talentId, Authentication authen Optional userInfo = userInfoRepository.findByLogin(authentication.getName()); validateTalentForCompliance.userVerification(talent, userInfo, talentId); Talent talentObject = talent.get(); - getSkillWithLargestNumberOfKudos(talentObject); - getProofWithLargestNumberOfKudos(talentObject); - return StatisticsDTO.builder() .allKudosOnTalent(getAllKudosOnTalent(talentObject)) + .skillWithLargestNumberOfKudos(getSkillWithLargestNumberOfKudos(talentObject)) + .proofWithLargestNumberOfKudos(getProofWithLargestNumberOfKudos(talentObject)) .build(); } @@ -238,7 +238,19 @@ public Long getAllKudosOnTalent(Talent talent) { } public Map getSkillWithLargestNumberOfKudos(Talent talent) { - return null; + Map rez = new HashMap<>(); + Long max = Long.MIN_VALUE; + for (TalentProof talentProof : talent.getTalentProofs()) { + for (ProofSkill proofSkill : talentProof.getProofSkills()) { + for (Kudos kudos : proofSkill.getKudos()) { + if (max < kudos.getAmount()) { + rez.put(proofSkill.getSkill().getSkill(), kudos.getAmount()); + max = kudos.getAmount(); + } + } + } + } + return rez; } public Map getProofWithLargestNumberOfKudos(Talent talent) { From 6665f88cca64482bbe4f926d61e6f2b7cf79e80b Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Sat, 20 May 2023 22:22:23 +0300 Subject: [PATCH 4/6] finish getProofWithLargestNumberOfKudos --- .../talent/service/TalentService.java | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/provedcode/talent/service/TalentService.java b/src/main/java/com/provedcode/talent/service/TalentService.java index 68b6420..4e3fcfd 100644 --- a/src/main/java/com/provedcode/talent/service/TalentService.java +++ b/src/main/java/com/provedcode/talent/service/TalentService.java @@ -2,6 +2,7 @@ import com.provedcode.config.PageProperties; import com.provedcode.kudos.model.entity.Kudos; +import com.provedcode.talent.mapper.TalentProofMapper; import com.provedcode.talent.model.dto.ProofDTO; import com.provedcode.talent.model.dto.SkillDTO; import com.provedcode.talent.model.dto.SkillIdDTO; @@ -45,6 +46,7 @@ public class TalentService { PageProperties pageProperties; ValidateTalentForCompliance validateTalentForCompliance; SkillsRepository skillsRepository; + TalentProofMapper talentProofMapper; @Transactional(readOnly = true) public Page getTalentsPage(Integer page, Integer size) { @@ -239,21 +241,36 @@ public Long getAllKudosOnTalent(Talent talent) { public Map getSkillWithLargestNumberOfKudos(Talent talent) { Map rez = new HashMap<>(); - Long max = Long.MIN_VALUE; +// Long max = Long.MIN_VALUE; +// for (TalentProof talentProof : talent.getTalentProofs()) { +// for (ProofSkill proofSkill : talentProof.getProofSkills()) { +// for (Kudos kudos : proofSkill.getKudos()) { +// if (max < kudos.getAmount()) { +// rez.put(proofSkill.getSkill().getSkill(), kudos.getAmount()); +// max = kudos.getAmount(); +// } +// } +// } +// } + return rez; + } + + public Map getProofWithLargestNumberOfKudos(Talent talent) { + Map result = new HashMap<>(); + Long maxForResult = 0L; for (TalentProof talentProof : talent.getTalentProofs()) { + Long amountKudosOnSkills = 0L; for (ProofSkill proofSkill : talentProof.getProofSkills()) { for (Kudos kudos : proofSkill.getKudos()) { - if (max < kudos.getAmount()) { - rez.put(proofSkill.getSkill().getSkill(), kudos.getAmount()); - max = kudos.getAmount(); - } + amountKudosOnSkills += kudos.getAmount(); } } + if (amountKudosOnSkills > maxForResult) { + maxForResult = amountKudosOnSkills; + result.clear(); + result.put(talentProofMapper.toProofDTO(talentProof), amountKudosOnSkills); + } } - return rez; - } - - public Map getProofWithLargestNumberOfKudos(Talent talent) { - return null; + return result; } } \ No newline at end of file From cae01954b25c85d13f66098557e819c4c06814cb Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Sat, 20 May 2023 22:44:52 +0300 Subject: [PATCH 5/6] finish getSkillWithLargestNumberOfKudos --- .../controller/TalentProofController.java | 1 - .../talent/service/TalentService.java | 36 ++++++++++++------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/provedcode/talent/controller/TalentProofController.java b/src/main/java/com/provedcode/talent/controller/TalentProofController.java index ff89e09..775edf6 100644 --- a/src/main/java/com/provedcode/talent/controller/TalentProofController.java +++ b/src/main/java/com/provedcode/talent/controller/TalentProofController.java @@ -3,7 +3,6 @@ import com.provedcode.talent.mapper.TalentProofMapper; import com.provedcode.talent.model.dto.FullProofDTO; import com.provedcode.talent.model.dto.ProofDTO; -import com.provedcode.talent.model.dto.StatusDTO; import com.provedcode.talent.model.request.AddProof; import com.provedcode.talent.service.TalentProofService; import com.provedcode.util.annotations.doc.controller.proof.*; diff --git a/src/main/java/com/provedcode/talent/service/TalentService.java b/src/main/java/com/provedcode/talent/service/TalentService.java index 4e3fcfd..d89b82d 100644 --- a/src/main/java/com/provedcode/talent/service/TalentService.java +++ b/src/main/java/com/provedcode/talent/service/TalentService.java @@ -240,19 +240,29 @@ public Long getAllKudosOnTalent(Talent talent) { } public Map getSkillWithLargestNumberOfKudos(Talent talent) { - Map rez = new HashMap<>(); -// Long max = Long.MIN_VALUE; -// for (TalentProof talentProof : talent.getTalentProofs()) { -// for (ProofSkill proofSkill : talentProof.getProofSkills()) { -// for (Kudos kudos : proofSkill.getKudos()) { -// if (max < kudos.getAmount()) { -// rez.put(proofSkill.getSkill().getSkill(), kudos.getAmount()); -// max = kudos.getAmount(); -// } -// } -// } -// } - return rez; + Map numberKudosOnSkill = new HashMap<>(); + for (TalentProof talentProof : talent.getTalentProofs()) { + for (ProofSkill proofSkill : talentProof.getProofSkills()) { + for (Kudos kudos : proofSkill.getKudos()) { + if (numberKudosOnSkill.containsKey(proofSkill.getSkill().getSkill())) { + Long amountKudosOnSkill = numberKudosOnSkill.get(proofSkill.getSkill().getSkill()); + numberKudosOnSkill.remove(proofSkill.getSkill().getSkill()); + numberKudosOnSkill.put(proofSkill.getSkill().getSkill(), amountKudosOnSkill + kudos.getAmount()); + } else { + numberKudosOnSkill.put(proofSkill.getSkill().getSkill(), kudos.getAmount()); + } + } + } + } + Long max = Collections.max(numberKudosOnSkill.values()); + Map result = new HashMap<>(); + for (Map.Entry entry : numberKudosOnSkill.entrySet()) { + if (entry.getValue().equals(max)) { + result.put(entry.getKey(), entry.getValue()); + } + } + + return result; } public Map getProofWithLargestNumberOfKudos(Talent talent) { From 625246e8ab03e4bec4796ea3b7cb99bc84f13375 Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Sat, 20 May 2023 23:13:59 +0300 Subject: [PATCH 6/6] refactor addKudosToProof: you can give kudos even if you gave not a multiple of the amount --- .../com/provedcode/kudos/service/KudosService.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/provedcode/kudos/service/KudosService.java b/src/main/java/com/provedcode/kudos/service/KudosService.java index 051b126..595396e 100644 --- a/src/main/java/com/provedcode/kudos/service/KudosService.java +++ b/src/main/java/com/provedcode/kudos/service/KudosService.java @@ -89,10 +89,10 @@ public KudosAmountWithSponsor getProofKudos(long proofId, Authentication authent .collect(Collectors.toMap( Kudos::getAmount, proof -> proof.getSponsor() != null - ? sponsorMapper.toDto(proof.getSponsor()) - : SponsorDTO.builder().build(), - (prev, next) -> next, - HashMap::new)); + ? sponsorMapper.toDto(proof.getSponsor()) + : SponsorDTO.builder().build(), + (prev, next) -> next, + HashMap::new)); skillsMap.put(skill, kudosFromSponsor); }); return KudosAmountWithSponsor.builder() @@ -127,9 +127,9 @@ public void addKudosToProof(long proofId, SetAmountKudos amountOfKudoses, Authen if (sponsor.getAmountKudos() < obtainedAmount) { throw new ResponseStatusException(FORBIDDEN, "The sponsor cannot give more kudos than he has"); } - if (obtainedAmount % talentProof.getProofSkills().size() != 0) { - throw new ResponseStatusException(BAD_REQUEST, - "Sponsor cannot add amount of kudos that multiple of amount of skills"); + Long modula = obtainedAmount % talentProof.getProofSkills().size(); + if (modula != 0) { + obtainedAmount -= modula; } sponsor.setAmountKudos(sponsor.getAmountKudos() - obtainedAmount);