From 8a5a29a43c785b61282ceac29b10eb8a21c53658 Mon Sep 17 00:00:00 2001 From: Maslyna Date: Wed, 19 Apr 2023 18:54:13 +0200 Subject: [PATCH 1/5] Added don`t working service --- .../{ => controller}/KudosController.java | 9 ++++- .../{ => repository}/KudosRepository.java | 5 +-- .../kudos/{ => service}/KudosService.java | 38 +++++++++++++------ 3 files changed, 37 insertions(+), 15 deletions(-) rename src/main/java/com/provedcode/kudos/{ => controller}/KudosController.java (71%) rename src/main/java/com/provedcode/kudos/{ => repository}/KudosRepository.java (76%) rename src/main/java/com/provedcode/kudos/{ => service}/KudosService.java (51%) diff --git a/src/main/java/com/provedcode/kudos/KudosController.java b/src/main/java/com/provedcode/kudos/controller/KudosController.java similarity index 71% rename from src/main/java/com/provedcode/kudos/KudosController.java rename to src/main/java/com/provedcode/kudos/controller/KudosController.java index 2121e3e..5d93d07 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; @@ -23,4 +24,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/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/KudosService.java b/src/main/java/com/provedcode/kudos/service/KudosService.java similarity index 51% rename from src/main/java/com/provedcode/kudos/KudosService.java rename to src/main/java/com/provedcode/kudos/service/KudosService.java index 3cb1f1f..d293f8e 100644 --- a/src/main/java/com/provedcode/kudos/KudosService.java +++ b/src/main/java/com/provedcode/kudos/service/KudosService.java @@ -1,7 +1,8 @@ -package com.provedcode.kudos; +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.entity.Talent; import com.provedcode.talent.model.entity.TalentProof; import com.provedcode.talent.repo.TalentProofRepository; @@ -14,6 +15,9 @@ import org.springframework.stereotype.Service; import org.springframework.web.server.ResponseStatusException; +import static org.springframework.http.HttpStatus.CONFLICT; +import static org.springframework.http.HttpStatus.NOT_FOUND; + @Service @AllArgsConstructor public class KudosService { @@ -29,23 +33,18 @@ public KudosAmount getAmountKudosProof(long id) { 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))); + .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(HttpStatus.NOT_FOUND, - "Proof with id = %s not found".formatted(id))); + .orElseThrow(() -> new ResponseStatusException(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 (talent.getId().equals(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"); + throw new ResponseStatusException(CONFLICT, "Talent can give only one “kudos“ for one proof"); } kudosRepository.save(Kudos.builder() @@ -53,4 +52,21 @@ public void addKudosToProof(long id, Authentication authentication) { .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 = talentProof.getKudos(); + kudos.setProof(null); + talentProof.setKudos(null); + talentProofRepository.save(talentProof); + } } \ No newline at end of file From c0cd7761f09375cbf4bad09e4e919b396e0001cc Mon Sep 17 00:00:00 2001 From: Maslyna Date: Wed, 19 Apr 2023 20:03:27 +0200 Subject: [PATCH 2/5] Added don`t working service --- .../com/provedcode/kudos/service/KudosService.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/provedcode/kudos/service/KudosService.java b/src/main/java/com/provedcode/kudos/service/KudosService.java index d293f8e..925b03b 100644 --- a/src/main/java/com/provedcode/kudos/service/KudosService.java +++ b/src/main/java/com/provedcode/kudos/service/KudosService.java @@ -15,6 +15,8 @@ import org.springframework.stereotype.Service; import org.springframework.web.server.ResponseStatusException; +import java.util.List; + import static org.springframework.http.HttpStatus.CONFLICT; import static org.springframework.http.HttpStatus.NOT_FOUND; @@ -64,9 +66,12 @@ public void deleteKudosFromProof(long id, Authentication authentication) { if (!kudosRepository.existsByTalent(talent)) { throw new ResponseStatusException(CONFLICT, "kudos don`t exist"); } - Kudos kudos = talentProof.getKudos(); - kudos.setProof(null); - talentProof.setKudos(null); - talentProofRepository.save(talentProof); + + List talentKudos = talent.getCudoses(); + Kudos removableKudos = talentKudos.stream().filter(i -> i.getProof().equals(talentProof)).findFirst().orElseThrow(); + talentKudos.remove(removableKudos); + talent.setCudoses(talentKudos); + + talentRepository.save(talent); } } \ No newline at end of file From e634b3e3f1006246a9634c823f8a55f0247eb550 Mon Sep 17 00:00:00 2001 From: Maslyna Date: Wed, 19 Apr 2023 20:19:29 +0200 Subject: [PATCH 3/5] @ManyToOne relationSHIT --- src/main/java/com/provedcode/kudos/model/entity/Kudos.java | 4 +++- .../java/com/provedcode/kudos/service/KudosService.java | 7 +++---- .../com/provedcode/talent/model/entity/TalentProof.java | 5 +++-- 3 files changed, 9 insertions(+), 7 deletions(-) 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/service/KudosService.java b/src/main/java/com/provedcode/kudos/service/KudosService.java index 925b03b..88b42ed 100644 --- a/src/main/java/com/provedcode/kudos/service/KudosService.java +++ b/src/main/java/com/provedcode/kudos/service/KudosService.java @@ -67,10 +67,9 @@ public void deleteKudosFromProof(long id, Authentication authentication) { throw new ResponseStatusException(CONFLICT, "kudos don`t exist"); } - List talentKudos = talent.getCudoses(); - Kudos removableKudos = talentKudos.stream().filter(i -> i.getProof().equals(talentProof)).findFirst().orElseThrow(); - talentKudos.remove(removableKudos); - talent.setCudoses(talentKudos); + 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); } 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 From c3419e728fc2ade2819411a6320729d3f0ee1ae0 Mon Sep 17 00:00:00 2001 From: Maslyna Date: Wed, 19 Apr 2023 20:38:35 +0200 Subject: [PATCH 4/5] Code refactor and bugfix --- .../kudos/controller/KudosController.java | 1 - .../provedcode/kudos/service/KudosService.java | 18 ++++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/provedcode/kudos/controller/KudosController.java b/src/main/java/com/provedcode/kudos/controller/KudosController.java index 5d93d07..101de0c 100644 --- a/src/main/java/com/provedcode/kudos/controller/KudosController.java +++ b/src/main/java/com/provedcode/kudos/controller/KudosController.java @@ -13,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); diff --git a/src/main/java/com/provedcode/kudos/service/KudosService.java b/src/main/java/com/provedcode/kudos/service/KudosService.java index 88b42ed..140d887 100644 --- a/src/main/java/com/provedcode/kudos/service/KudosService.java +++ b/src/main/java/com/provedcode/kudos/service/KudosService.java @@ -3,6 +3,7 @@ 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; @@ -17,8 +18,7 @@ import java.util.List; -import static org.springframework.http.HttpStatus.CONFLICT; -import static org.springframework.http.HttpStatus.NOT_FOUND; +import static org.springframework.http.HttpStatus.*; @Service @AllArgsConstructor @@ -29,6 +29,13 @@ public class KudosService { UserInfoRepository userInfoRepository; 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); } @@ -43,10 +50,13 @@ public void addKudosToProof(long id, Authentication authentication) { .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, "Proof with id = %s not found".formatted(id))); if (talent.getId().equals(talentProof.getTalent().getId())) { - throw new ResponseStatusException(HttpStatus.FORBIDDEN, "Talent can’t give “kudos“ to himself"); + 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"); + 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() From 206bc9e3465342d02b153e76e84d8ded4014cdb4 Mon Sep 17 00:00:00 2001 From: Maslyna Date: Wed, 19 Apr 2023 20:40:44 +0200 Subject: [PATCH 5/5] Transactional --- src/main/java/com/provedcode/kudos/service/KudosService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/provedcode/kudos/service/KudosService.java b/src/main/java/com/provedcode/kudos/service/KudosService.java index 140d887..79056ae 100644 --- a/src/main/java/com/provedcode/kudos/service/KudosService.java +++ b/src/main/java/com/provedcode/kudos/service/KudosService.java @@ -14,6 +14,7 @@ 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; @@ -22,12 +23,14 @@ @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)));