From b574767d35b0043ba6d897eb114be3a24590e161 Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Wed, 19 Apr 2023 13:28:31 +0300 Subject: [PATCH 1/2] Task#3 As a talent I want to estimate proofs of other talents by giving "kudos" --- .../com/provedcode/kudos/KudosController.java | 12 ++++-- .../com/provedcode/kudos/KudosRepository.java | 5 +++ .../com/provedcode/kudos/KudosService.java | 40 +++++++++++++++++++ 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/provedcode/kudos/KudosController.java b/src/main/java/com/provedcode/kudos/KudosController.java index b25a332..2121e3e 100644 --- a/src/main/java/com/provedcode/kudos/KudosController.java +++ b/src/main/java/com/provedcode/kudos/KudosController.java @@ -3,10 +3,8 @@ import com.provedcode.kudos.model.response.KudosAmount; import lombok.AllArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.security.core.Authentication; +import org.springframework.web.bind.annotation.*; @RestController @AllArgsConstructor @@ -19,4 +17,10 @@ public class KudosController { KudosAmount getKudosProof(@PathVariable("proof-id") long id) { return kudosService.getAmountKudosProof(id); } + + @PreAuthorize("hasRole('TALENT')") + @PostMapping("/proofs/{proof-id}/kudos") + void addKudosToProof(@PathVariable("proof-id") long id, Authentication authentication) { + kudosService.addKudosToProof(id, authentication); + } } \ No newline at end of file diff --git a/src/main/java/com/provedcode/kudos/KudosRepository.java b/src/main/java/com/provedcode/kudos/KudosRepository.java index dc68dbb..27ce462 100644 --- a/src/main/java/com/provedcode/kudos/KudosRepository.java +++ b/src/main/java/com/provedcode/kudos/KudosRepository.java @@ -1,8 +1,13 @@ package com.provedcode.kudos; import com.provedcode.kudos.model.entity.Kudos; +import com.provedcode.talent.model.entity.Talent; import org.springframework.data.jpa.repository.JpaRepository; public interface KudosRepository extends JpaRepository { long countByProof_Id(Long id); + + boolean existsByTalent(Talent talent); + + } \ No newline at end of file diff --git a/src/main/java/com/provedcode/kudos/KudosService.java b/src/main/java/com/provedcode/kudos/KudosService.java index 1338d8f..dac2202 100644 --- a/src/main/java/com/provedcode/kudos/KudosService.java +++ b/src/main/java/com/provedcode/kudos/KudosService.java @@ -1,16 +1,56 @@ package com.provedcode.kudos; +import com.provedcode.kudos.model.entity.Kudos; import com.provedcode.kudos.model.response.KudosAmount; +import com.provedcode.talent.model.entity.Talent; +import com.provedcode.talent.model.entity.TalentProof; +import com.provedcode.talent.repo.TalentProofRepository; +import com.provedcode.talent.repo.TalentRepository; +import com.provedcode.user.model.entity.UserInfo; +import com.provedcode.user.repo.UserInfoRepository; import lombok.AllArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.Authentication; import org.springframework.stereotype.Service; +import org.springframework.web.server.ResponseStatusException; @Service @AllArgsConstructor public class KudosService { KudosRepository kudosRepository; + TalentRepository talentRepository; + TalentProofRepository talentProofRepository; + UserInfoRepository userInfoRepository; public KudosAmount getAmountKudosProof(long id) { long count = kudosRepository.countByProof_Id(id); return new KudosAmount(count); } + + public void addKudosToProof(long id, Authentication authentication) { + UserInfo userInfo = userInfoRepository.findByLogin(authentication.getName()) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, + "Talent with id = %s not found".formatted(id))); + + Talent talent = userInfo.getTalent(); + + TalentProof talentProof = talentProofRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, + "Proof with id = %s not found".formatted(id))); + + if (talent.getId() == talentProof.getTalent().getId()) { + throw new ResponseStatusException(HttpStatus.FORBIDDEN, + "Talent can’t give “kudos“ to himself"); + } + + if (kudosRepository.existsByTalent(talent)) { + throw new ResponseStatusException(HttpStatus.FORBIDDEN, + "Talent can give only one “kudos“ for one proof"); + } + + kudosRepository.save(Kudos.builder() + .proof(talentProof) + .talent(talent) + .build()); + } } \ No newline at end of file From 75c6a08e2fea2f55ec2963709ed6560351fa7e98 Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Wed, 19 Apr 2023 17:25:26 +0300 Subject: [PATCH 2/2] bug fix --- src/main/java/com/provedcode/kudos/KudosService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/provedcode/kudos/KudosService.java b/src/main/java/com/provedcode/kudos/KudosService.java index dac2202..3cb1f1f 100644 --- a/src/main/java/com/provedcode/kudos/KudosService.java +++ b/src/main/java/com/provedcode/kudos/KudosService.java @@ -44,7 +44,7 @@ public void addKudosToProof(long id, Authentication authentication) { } if (kudosRepository.existsByTalent(talent)) { - throw new ResponseStatusException(HttpStatus.FORBIDDEN, + throw new ResponseStatusException(HttpStatus.CONFLICT, "Talent can give only one “kudos“ for one proof"); }