diff --git a/src/main/java/com/provedcode/kudos/KudosService.java b/src/main/java/com/provedcode/kudos/KudosService.java deleted file mode 100644 index 3cb1f1f..0000000 --- a/src/main/java/com/provedcode/kudos/KudosService.java +++ /dev/null @@ -1,56 +0,0 @@ -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.CONFLICT, - "Talent can give only one “kudos“ for one proof"); - } - - kudosRepository.save(Kudos.builder() - .proof(talentProof) - .talent(talent) - .build()); - } -} \ No newline at end of file diff --git a/src/main/java/com/provedcode/kudos/KudosController.java b/src/main/java/com/provedcode/kudos/controller/KudosController.java similarity index 73% rename from src/main/java/com/provedcode/kudos/KudosController.java rename to src/main/java/com/provedcode/kudos/controller/KudosController.java index 2121e3e..101de0c 100644 --- a/src/main/java/com/provedcode/kudos/KudosController.java +++ b/src/main/java/com/provedcode/kudos/controller/KudosController.java @@ -1,5 +1,6 @@ -package com.provedcode.kudos; +package com.provedcode.kudos.controller; +import com.provedcode.kudos.service.KudosService; import com.provedcode.kudos.model.response.KudosAmount; import lombok.AllArgsConstructor; import org.springframework.security.access.prepost.PreAuthorize; @@ -12,7 +13,6 @@ public class KudosController { KudosService kudosService; - @PreAuthorize("hasRole('TALENT')") @GetMapping("/proofs/{proof-id}/kudos") KudosAmount getKudosProof(@PathVariable("proof-id") long id) { return kudosService.getAmountKudosProof(id); @@ -23,4 +23,10 @@ KudosAmount getKudosProof(@PathVariable("proof-id") long id) { void addKudosToProof(@PathVariable("proof-id") long id, Authentication authentication) { kudosService.addKudosToProof(id, authentication); } + + @PreAuthorize("hasRole('TALENT')") + @DeleteMapping("/proofs/{proof-id}/kudos") + void deleteKudosFromProof(@PathVariable("proof-id") long id, Authentication authentication) { + kudosService.deleteKudosFromProof(id, authentication); + } } \ No newline at end of file diff --git a/src/main/java/com/provedcode/kudos/model/entity/Kudos.java b/src/main/java/com/provedcode/kudos/model/entity/Kudos.java index 34d98ae..e73bbea 100644 --- a/src/main/java/com/provedcode/kudos/model/entity/Kudos.java +++ b/src/main/java/com/provedcode/kudos/model/entity/Kudos.java @@ -5,6 +5,8 @@ import jakarta.persistence.*; import lombok.*; +import java.util.List; + @Getter @Setter @Entity @@ -20,7 +22,7 @@ public class Kudos { @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "talent_id") private Talent talent; - @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true) + @ManyToOne @JoinColumn(name = "proof_id") private TalentProof proof; } \ No newline at end of file diff --git a/src/main/java/com/provedcode/kudos/KudosRepository.java b/src/main/java/com/provedcode/kudos/repository/KudosRepository.java similarity index 76% rename from src/main/java/com/provedcode/kudos/KudosRepository.java rename to src/main/java/com/provedcode/kudos/repository/KudosRepository.java index 27ce462..4338d6b 100644 --- a/src/main/java/com/provedcode/kudos/KudosRepository.java +++ b/src/main/java/com/provedcode/kudos/repository/KudosRepository.java @@ -1,13 +1,12 @@ -package com.provedcode.kudos; +package com.provedcode.kudos.repository; import com.provedcode.kudos.model.entity.Kudos; import com.provedcode.talent.model.entity.Talent; +import com.provedcode.talent.model.entity.TalentProof; 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/service/KudosService.java b/src/main/java/com/provedcode/kudos/service/KudosService.java new file mode 100644 index 0000000..79056ae --- /dev/null +++ b/src/main/java/com/provedcode/kudos/service/KudosService.java @@ -0,0 +1,89 @@ +package com.provedcode.kudos.service; + +import com.provedcode.kudos.model.entity.Kudos; +import com.provedcode.kudos.model.response.KudosAmount; +import com.provedcode.kudos.repository.KudosRepository; +import com.provedcode.talent.model.ProofStatus; +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.transaction.annotation.Transactional; +import org.springframework.web.server.ResponseStatusException; + +import java.util.List; + +import static org.springframework.http.HttpStatus.*; + +@Service +@AllArgsConstructor +@Transactional +public class KudosService { + KudosRepository kudosRepository; + TalentRepository talentRepository; + TalentProofRepository talentProofRepository; + UserInfoRepository userInfoRepository; + + @Transactional(readOnly = true) + public KudosAmount getAmountKudosProof(long id) { + TalentProof talentProof = talentProofRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, "proof with id = %s not found".formatted(id))); + + if (!talentProof.getStatus().equals(ProofStatus.PUBLISHED)) { + throw new ResponseStatusException(FORBIDDEN); + } + + 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(NOT_FOUND, "Talent with id = %s not found".formatted(id))); + + Talent talent = userInfo.getTalent(); + + TalentProof talentProof = talentProofRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, "Proof with id = %s not found".formatted(id))); + + if (talent.getId().equals(talentProof.getTalent().getId())) { + throw new ResponseStatusException(FORBIDDEN, "Talent can’t give `kudos` to himself"); + } + if (kudosRepository.existsByTalent(talent)) { + throw new ResponseStatusException(CONFLICT, "Talent can give only one `kudos` for one proof"); + } + if (!talentProof.getStatus().equals(ProofStatus.PUBLISHED)) { + throw new ResponseStatusException(FORBIDDEN); + } + + kudosRepository.save(Kudos.builder() + .proof(talentProof) + .talent(talent) + .build()); + } + + public void deleteKudosFromProof(long id, Authentication authentication) { + UserInfo userInfo = userInfoRepository.findByLogin(authentication.getName()) + .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, "Talent with id = %s not found".formatted(id))); + Talent talent = userInfo.getTalent(); + + TalentProof talentProof = talentProofRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, "Proof with id = %s not found".formatted(id))); + + if (!kudosRepository.existsByTalent(talent)) { + throw new ResponseStatusException(CONFLICT, "kudos don`t exist"); + } + + Kudos kudos = talent.getCudoses().stream().filter(i -> i.getProof().getId().equals(id)).findFirst().orElseThrow(); + talentProof.getKudos().remove(kudos); + talent.getCudoses().remove(kudos); + + talentRepository.save(talent); + } +} \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/model/entity/TalentProof.java b/src/main/java/com/provedcode/talent/model/entity/TalentProof.java index cad83f9..0650310 100644 --- a/src/main/java/com/provedcode/talent/model/entity/TalentProof.java +++ b/src/main/java/com/provedcode/talent/model/entity/TalentProof.java @@ -10,6 +10,7 @@ import org.hibernate.validator.constraints.URL; import java.time.LocalDateTime; +import java.util.List; @Accessors(chain = true) @NoArgsConstructor @@ -38,6 +39,6 @@ public class TalentProof { @Column(length = 20) private ProofStatus status; private LocalDateTime created; - @OneToOne(mappedBy = "proof", cascade = CascadeType.ALL, orphanRemoval = true) - private Kudos kudos; + @OneToMany(fetch = FetchType.EAGER, mappedBy = "proof", cascade = CascadeType.ALL, orphanRemoval = true) + private List kudos; } \ No newline at end of file