From 287394d98b428831099a899a61cdb246efd3e06c Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Sun, 9 Apr 2023 16:33:07 +0300 Subject: [PATCH 1/2] add @GetMapping("/{talent-id}/proofs/{proof-id}") --- .../controller/TalentProofController.java | 10 +- .../provedcode/talent/model/dto/ProofDTO.java | 3 - .../talent/service/TalentProofService.java | 98 +++++++++++-------- 3 files changed, 65 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/provedcode/talent/controller/TalentProofController.java b/src/main/java/com/provedcode/talent/controller/TalentProofController.java index 7d8d8ee..b12362b 100644 --- a/src/main/java/com/provedcode/talent/controller/TalentProofController.java +++ b/src/main/java/com/provedcode/talent/controller/TalentProofController.java @@ -12,9 +12,6 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.Authentication; import org.springframework.web.bind.annotation.*; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.security.core.Authentication; -import org.springframework.web.bind.annotation.*; import java.util.Optional; @@ -58,4 +55,11 @@ FullProofDTO getTalentInformationWithProofs(Authentication authentication, @RequestParam(value = "sort", defaultValue = "created") String... sort) { return talentProofService.getTalentProofs(talentId, page, size, direction, authentication, sort); } + + @PreAuthorize("hasRole('TALENT')") + @GetMapping("/{talent-id}/proofs/{proof-id}") + ProofDTO getTalentProof(@PathVariable(value = "talent-id") long talentId, + @PathVariable(value = "proof-id") long proofId) { + return talentProofService.getTalentProof(talentId, proofId); + } } diff --git a/src/main/java/com/provedcode/talent/model/dto/ProofDTO.java b/src/main/java/com/provedcode/talent/model/dto/ProofDTO.java index b88739a..e5036cf 100644 --- a/src/main/java/com/provedcode/talent/model/dto/ProofDTO.java +++ b/src/main/java/com/provedcode/talent/model/dto/ProofDTO.java @@ -3,9 +3,6 @@ import com.provedcode.talent.model.ProofStatus; import lombok.Builder; -import java.time.LocalDateTime; -import java.util.Date; - @Builder public record ProofDTO( long id, diff --git a/src/main/java/com/provedcode/talent/service/TalentProofService.java b/src/main/java/com/provedcode/talent/service/TalentProofService.java index 772133b..d20d599 100644 --- a/src/main/java/com/provedcode/talent/service/TalentProofService.java +++ b/src/main/java/com/provedcode/talent/service/TalentProofService.java @@ -30,8 +30,7 @@ import java.time.LocalDateTime; import java.util.Optional; -import static org.springframework.http.HttpStatus.BAD_REQUEST; -import static org.springframework.http.HttpStatus.NOT_IMPLEMENTED; +import static org.springframework.http.HttpStatus.*; @Service @AllArgsConstructor @@ -54,25 +53,25 @@ public Page getAllProofsPage(Optional page, Optional addProof(AddProofDTO addProofDTO, long talentId, Authen validateTalentForCompliance.userVerification(talent, userInfo, talentId); TalentProof talentProof = TalentProof.builder() - .talent(talent.get()) - .talentId(talentId) - .link(addProofDTO.link()) - .text(addProofDTO.text()) - .status(ProofStatus.DRAFT) - .created(LocalDateTime.now()) - .build(); + .talent(talent.get()) + .talentId(talentId) + .link(addProofDTO.link()) + .text(addProofDTO.text()) + .status(ProofStatus.DRAFT) + .created(LocalDateTime.now()) + .build(); talentProofRepository.save(talentProof); @@ -117,13 +116,13 @@ public FullProofDTO getTalentProofs(Long talentId, Optional page, Optio Optional direction, Authentication authentication, String... sortProperties) { Talent talent = talentRepository.findById(talentId) - .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, - "Talent with id = %s not found".formatted( - talentId))); + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, + "Talent with id = %s not found".formatted( + talentId))); UserInfo userInfo = userInfoRepository.findByLogin(authentication.getName()) - .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, - "Talent with id = %s not found".formatted( - talentId))); + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, + "Talent with id = %s not found".formatted( + talentId))); Page proofs; PageRequest pageRequest; String sortDirection = direction.orElseGet(Sort.DEFAULT_DIRECTION::name); @@ -135,7 +134,7 @@ public FullProofDTO getTalentProofs(Long talentId, Optional page, Optio throw new ResponseStatusException(BAD_REQUEST, "'size' query parameter must be greater than or equal to 1"); } if (!sortDirection.equalsIgnoreCase(Sort.Direction.ASC.name()) && - !sortDirection.equalsIgnoreCase(Sort.Direction.DESC.name())) { + !sortDirection.equalsIgnoreCase(Sort.Direction.DESC.name())) { throw new ResponseStatusException(BAD_REQUEST, "'direction' query param must be equals ASC or DESC"); } @@ -156,17 +155,36 @@ public FullProofDTO getTalentProofs(Long talentId, Optional page, Optio } return FullProofDTO.builder() - .id(talent.getId()) - .image(talent.getImage()) - .firstName(talent.getFirstName()) - .lastName(talent.getLastName()) - .specialization(talent.getSpecialization()) - .proofs(proofs.map(i -> ProofDTO.builder() - .id(i.getId()) - .created(i.getCreated().toString()) - .link(i.getLink()) - .text(i.getText()) - .status(i.getStatus()).build())) - .build(); + .id(talent.getId()) + .image(talent.getImage()) + .firstName(talent.getFirstName()) + .lastName(talent.getLastName()) + .specialization(talent.getSpecialization()) + .proofs(proofs.map(i -> ProofDTO.builder() + .id(i.getId()) + .created(i.getCreated().toString()) + .link(i.getLink()) + .text(i.getText()) + .status(i.getStatus()).build())) + .build(); + } + + public ProofDTO getTalentProof(long talentId, long proofId) { + Optional talentProof = talentProofRepository.findById(proofId); + if (talentProof.isPresent()) { + if (talentProof.get().getTalentId() != talentId) { + throw new ResponseStatusException(BAD_REQUEST, + String.format("proof with id = %d not equal to talent id = %d", proofId, talentId)); + } + } else { + throw new ResponseStatusException(NOT_FOUND, String.format("proof with id = %d not found", proofId)); + } + return ProofDTO.builder() + .id(talentProof.get().getTalentId()) + .link(talentProof.get().getLink()) + .status(talentProof.get().getStatus()) + .created(talentProof.get().getCreated().toString()) + .text(talentProof.get().getText()) + .build(); } } \ No newline at end of file From a078db5f1b5877f892cc3bd0c630a98c70a7df6f Mon Sep 17 00:00:00 2001 From: Denis Boyko Date: Sun, 9 Apr 2023 17:28:32 +0300 Subject: [PATCH 2/2] add some error processing --- .../controller/TalentProofController.java | 5 ++-- .../talent/service/TalentProofService.java | 24 ++++++++++++------- .../service/impl/TalentServiceImpl.java | 2 +- .../utill/ValidateTalentForCompliance.java | 4 ++-- src/main/resources/application.properties | 2 +- 5 files changed, 22 insertions(+), 15 deletions(-) rename src/main/java/com/provedcode/{ => talent}/utill/ValidateTalentForCompliance.java (93%) diff --git a/src/main/java/com/provedcode/talent/controller/TalentProofController.java b/src/main/java/com/provedcode/talent/controller/TalentProofController.java index b12362b..8fc91ee 100644 --- a/src/main/java/com/provedcode/talent/controller/TalentProofController.java +++ b/src/main/java/com/provedcode/talent/controller/TalentProofController.java @@ -59,7 +59,8 @@ FullProofDTO getTalentInformationWithProofs(Authentication authentication, @PreAuthorize("hasRole('TALENT')") @GetMapping("/{talent-id}/proofs/{proof-id}") ProofDTO getTalentProof(@PathVariable(value = "talent-id") long talentId, - @PathVariable(value = "proof-id") long proofId) { - return talentProofService.getTalentProof(talentId, proofId); + @PathVariable(value = "proof-id") long proofId, + Authentication authentication) { + return talentProofService.getTalentProof(talentId, proofId, authentication); } } diff --git a/src/main/java/com/provedcode/talent/service/TalentProofService.java b/src/main/java/com/provedcode/talent/service/TalentProofService.java index d20d599..24de23c 100644 --- a/src/main/java/com/provedcode/talent/service/TalentProofService.java +++ b/src/main/java/com/provedcode/talent/service/TalentProofService.java @@ -12,7 +12,7 @@ import com.provedcode.user.model.dto.SessionInfoDTO; import com.provedcode.user.model.entity.UserInfo; import com.provedcode.user.repo.UserInfoRepository; -import com.provedcode.utill.ValidateTalentForCompliance; +import com.provedcode.talent.utill.ValidateTalentForCompliance; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -169,7 +169,7 @@ public FullProofDTO getTalentProofs(Long talentId, Optional page, Optio .build(); } - public ProofDTO getTalentProof(long talentId, long proofId) { + public ProofDTO getTalentProof(long talentId, long proofId, Authentication authentication) { Optional talentProof = talentProofRepository.findById(proofId); if (talentProof.isPresent()) { if (talentProof.get().getTalentId() != talentId) { @@ -179,12 +179,18 @@ public ProofDTO getTalentProof(long talentId, long proofId) { } else { throw new ResponseStatusException(NOT_FOUND, String.format("proof with id = %d not found", proofId)); } - return ProofDTO.builder() - .id(talentProof.get().getTalentId()) - .link(talentProof.get().getLink()) - .status(talentProof.get().getStatus()) - .created(talentProof.get().getCreated().toString()) - .text(talentProof.get().getText()) - .build(); + Optional userInfo = userInfoRepository.findByLogin(authentication.getName()); + if (userInfo.get().getTalentId() == talentId || + talentProof.get().getStatus().equals(ProofStatus.PUBLISHED)) { + return ProofDTO.builder() + .id(talentProof.get().getTalentId()) + .link(talentProof.get().getLink()) + .status(talentProof.get().getStatus()) + .created(talentProof.get().getCreated().toString()) + .text(talentProof.get().getText()) + .build(); + } else { + throw new ResponseStatusException(FORBIDDEN); + } } } \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/service/impl/TalentServiceImpl.java b/src/main/java/com/provedcode/talent/service/impl/TalentServiceImpl.java index d472df5..92c341f 100644 --- a/src/main/java/com/provedcode/talent/service/impl/TalentServiceImpl.java +++ b/src/main/java/com/provedcode/talent/service/impl/TalentServiceImpl.java @@ -8,7 +8,7 @@ import com.provedcode.user.model.dto.SessionInfoDTO; import com.provedcode.user.model.entity.UserInfo; import com.provedcode.user.repo.UserInfoRepository; -import com.provedcode.utill.ValidateTalentForCompliance; +import com.provedcode.talent.utill.ValidateTalentForCompliance; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; diff --git a/src/main/java/com/provedcode/utill/ValidateTalentForCompliance.java b/src/main/java/com/provedcode/talent/utill/ValidateTalentForCompliance.java similarity index 93% rename from src/main/java/com/provedcode/utill/ValidateTalentForCompliance.java rename to src/main/java/com/provedcode/talent/utill/ValidateTalentForCompliance.java index b6103e0..3f2d486 100644 --- a/src/main/java/com/provedcode/utill/ValidateTalentForCompliance.java +++ b/src/main/java/com/provedcode/talent/utill/ValidateTalentForCompliance.java @@ -1,4 +1,4 @@ -package com.provedcode.utill; +package com.provedcode.talent.utill; import com.provedcode.talent.model.entity.Talent; import com.provedcode.talent.model.entity.TalentProof; @@ -19,7 +19,7 @@ public void userVerification(Optional talent, Optional userInf throw new ResponseStatusException(NOT_FOUND, String.format("talent with id = %d not found", id)); } if (userInfo.get().getTalent().getId() != id) { - throw new ResponseStatusException(FORBIDDEN, "you can`t add proof another user"); + throw new ResponseStatusException(FORBIDDEN); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 943468c..e77985f 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,7 +4,7 @@ server.port=8080 ## spring.jackson.property-naming-strategy=SNAKE_CASE ## -spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL95Dialect +spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect spring.h2.console.enabled=true spring.h2.console.path=/h2 spring.jpa.hibernate.ddl-auto=create-drop