From e498d24f5a7ee6fb49749b17d8a0e18d25dde00b Mon Sep 17 00:00:00 2001 From: Ren Date: Sun, 16 Apr 2023 16:08:52 +0300 Subject: [PATCH 1/9] remove unused files --- .../java/com/provedcode/config/PropsConfig.java | 4 ---- .../talent/model/response/FullTalent.java | 16 ---------------- .../talent/model/response/ShortTalent.java | 13 ------------- 3 files changed, 33 deletions(-) delete mode 100644 src/main/java/com/provedcode/config/PropsConfig.java delete mode 100644 src/main/java/com/provedcode/talent/model/response/FullTalent.java delete mode 100644 src/main/java/com/provedcode/talent/model/response/ShortTalent.java diff --git a/src/main/java/com/provedcode/config/PropsConfig.java b/src/main/java/com/provedcode/config/PropsConfig.java deleted file mode 100644 index febe40f..0000000 --- a/src/main/java/com/provedcode/config/PropsConfig.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.provedcode.config; - -public class PropsConfig { -} \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/model/response/FullTalent.java b/src/main/java/com/provedcode/talent/model/response/FullTalent.java deleted file mode 100644 index b53716f..0000000 --- a/src/main/java/com/provedcode/talent/model/response/FullTalent.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.provedcode.talent.model.response; - -import java.util.List; - -public record FullTalent( - String image, - String firstName, - String lastName, - String specialization, - List fullSkills, - String bio, - List contacts, - List links, - List attachedFiles -) { -} diff --git a/src/main/java/com/provedcode/talent/model/response/ShortTalent.java b/src/main/java/com/provedcode/talent/model/response/ShortTalent.java deleted file mode 100644 index c8f5e93..0000000 --- a/src/main/java/com/provedcode/talent/model/response/ShortTalent.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.provedcode.talent.model.response; - -import java.util.List; - -public record ShortTalent( - long id, - String image, - String firstName, - String lastName, - String specialization, - List shortDescription -) { -} From 237732fac8a846c0130f00c63be191fcd4b31ecf Mon Sep 17 00:00:00 2001 From: Ren Date: Sun, 16 Apr 2023 16:09:36 +0300 Subject: [PATCH 2/9] Clean up code --- .../aws/controller/S3Controller.java | 3 +- .../com/provedcode/config/AWSProperties.java | 2 +- .../java/com/provedcode/config/S3Config.java | 3 +- .../com/provedcode/config/SecurityConfig.java | 2 +- .../talent/mapper/TalentMapper.java | 29 ++++++------------- .../talent/mapper/TalentProofMapper.java | 2 +- .../talent/model/dto/FullTalentDTO.java | 2 +- src/main/resources/application-dev.properties | 6 ++-- src/main/resources/application.properties | 4 +-- 9 files changed, 20 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/provedcode/aws/controller/S3Controller.java b/src/main/java/com/provedcode/aws/controller/S3Controller.java index 7e5ad35..c5b8163 100644 --- a/src/main/java/com/provedcode/aws/controller/S3Controller.java +++ b/src/main/java/com/provedcode/aws/controller/S3Controller.java @@ -37,5 +37,4 @@ public String delete(@PathVariable String filename) { public List getAllFiles() { return s3Service.listAllFiles(); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/provedcode/config/AWSProperties.java b/src/main/java/com/provedcode/config/AWSProperties.java index 0a9a847..d73ea30 100644 --- a/src/main/java/com/provedcode/config/AWSProperties.java +++ b/src/main/java/com/provedcode/config/AWSProperties.java @@ -18,4 +18,4 @@ public record AWSProperties( void postCreate() { log.info("aws-props = {}", this); } -} +} \ No newline at end of file diff --git a/src/main/java/com/provedcode/config/S3Config.java b/src/main/java/com/provedcode/config/S3Config.java index 983b74c..5892327 100644 --- a/src/main/java/com/provedcode/config/S3Config.java +++ b/src/main/java/com/provedcode/config/S3Config.java @@ -7,7 +7,6 @@ import com.amazonaws.services.s3.AmazonS3ClientBuilder; import jakarta.annotation.PostConstruct; import lombok.AllArgsConstructor; -import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -31,4 +30,4 @@ public AmazonS3 s3() { void test() { log.info("S3Config: %s %s %s".formatted(awsProperties.accessKey(), awsProperties.secretKey(), awsProperties.region())); } -} +} \ No newline at end of file diff --git a/src/main/java/com/provedcode/config/SecurityConfig.java b/src/main/java/com/provedcode/config/SecurityConfig.java index da00f3b..9b763d8 100644 --- a/src/main/java/com/provedcode/config/SecurityConfig.java +++ b/src/main/java/com/provedcode/config/SecurityConfig.java @@ -50,7 +50,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti http.authorizeHttpRequests(c -> c .requestMatchers("/actuator/health").permitAll() // for DevOps .requestMatchers(antMatcher("/h2/**")).permitAll() - .requestMatchers(antMatcher("/api/talents/**")).permitAll() + .requestMatchers(antMatcher("/talents/**")).permitAll() .requestMatchers(antMatcher("/error")).permitAll() .requestMatchers(antMatcher("/v3/api-docs/**")).permitAll() // for openAPI .requestMatchers(antMatcher("/swagger-ui/**")).permitAll() // for openAPI diff --git a/src/main/java/com/provedcode/talent/mapper/TalentMapper.java b/src/main/java/com/provedcode/talent/mapper/TalentMapper.java index 43bcc88..795ac61 100644 --- a/src/main/java/com/provedcode/talent/mapper/TalentMapper.java +++ b/src/main/java/com/provedcode/talent/mapper/TalentMapper.java @@ -2,7 +2,7 @@ import com.provedcode.talent.model.dto.FullTalentDTO; import com.provedcode.talent.model.dto.ShortTalentDTO; -import com.provedcode.talent.model.entity.*; +import com.provedcode.talent.model.entity.Talent; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.MappingConstants; @@ -10,25 +10,14 @@ @Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, componentModel = MappingConstants.ComponentModel.SPRING) public interface TalentMapper { - default FullTalentDTO talentToFullTalentDTO(Talent talent) { - return FullTalentDTO.builder() - .id(talent.getId()) - .firstName(talent.getFirstName()) - .lastName(talent.getLastName()) - .bio(talent.getTalentDescription() != null ? talent.getTalentDescription().getBio() : null) - .additionalInfo(talent.getTalentDescription() != null ? talent.getTalentDescription() - .getAdditionalInfo() : null) - .image(talent.getImage()) - .specialization(talent.getSpecialization()) - .links(talent.getTalentLinks().stream().map(TalentLink::getLink).toList()) - .contacts(talent.getTalentContacts().stream().map(TalentContact::getContact).toList()) - .talents(talent.getTalentTalents().stream().map(TalentTalents::getTalentName).toList()) - .attachedFiles( - talent.getTalentAttachedFiles().stream().map(TalentAttachedFile::getAttachedFile) - .toList()) - .build(); - } + @Mapping(target = "bio", expression = "java(talent.getTalentDescription() != null ? talent.getTalentDescription().getBio() : null)") + @Mapping(target = "additionalInfo", expression = "java(talent.getTalentDescription() != null ? talent.getTalentDescription().getAdditionalInfo() : null)") + @Mapping(target = "links", expression = "java(talent.getTalentLinks().stream().map(l -> l.getLink()).toList())") + @Mapping(target = "contacts", expression = "java(talent.getTalentContacts().stream().map(c -> c.getContact()).toList())") + @Mapping(target = "talents", expression = "java(talent.getTalentTalents().stream().map(t -> t.getTalentName()).toList())") + @Mapping(target = "attachedFiles", expression = "java(talent.getTalentAttachedFiles().stream().map(a -> a.getAttachedFile()).toList())") + FullTalentDTO talentToFullTalentDTO(Talent talent); - @Mapping(target = "talents", expression = "java(talent.getTalentTalents().stream().map(t->t.getTalentName()).toList())") + @Mapping(target = "talents", expression = "java(talent.getTalentTalents().stream().map(t -> t.getTalentName()).toList())") ShortTalentDTO talentToShortTalentDTO(Talent talent); } \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/mapper/TalentProofMapper.java b/src/main/java/com/provedcode/talent/mapper/TalentProofMapper.java index 5dbcffc..53e869f 100644 --- a/src/main/java/com/provedcode/talent/mapper/TalentProofMapper.java +++ b/src/main/java/com/provedcode/talent/mapper/TalentProofMapper.java @@ -15,4 +15,4 @@ public interface TalentProofMapper { @Mapping(target = "id", ignore = true) @Mapping(source = "created", target = "created", dateFormat = "dd-MM-yyyy HH:mm:ss") TalentProof toTalentProof(ProofDTO proofDTO); -} +} \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/model/dto/FullTalentDTO.java b/src/main/java/com/provedcode/talent/model/dto/FullTalentDTO.java index 54fb184..10d8885 100644 --- a/src/main/java/com/provedcode/talent/model/dto/FullTalentDTO.java +++ b/src/main/java/com/provedcode/talent/model/dto/FullTalentDTO.java @@ -30,4 +30,4 @@ public record FullTalentDTO( @JsonProperty("attached_files") List attachedFiles ) { -} +} \ No newline at end of file diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 94a5005..4b8f38f 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -1,7 +1,7 @@ spring.datasource.driver-class-name=org.h2.Driver spring.datasource.username=sa -spring.datasource.url=jdbc:h2:file:./testdb;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;DEFAULT_NULL_ORDERING=HIGH +spring.datasource.url=jdbc:h2:mem:./testdb;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;DEFAULT_NULL_ORDERING=HIGH spring.jpa.hibernate.ddl-auto=none spring.sql.init.mode=always -logging.level.web=DEBUG -logging.level.sql=DEBUG \ No newline at end of file +#logging.level.web=DEBUG +#logging.level.sql=DEBUG \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6b9f31e..03707b8 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -5,8 +5,8 @@ server.port=8080 ## spring.jackson.property-naming-strategy=SNAKE_CASE ## -## ## Database configuration +## spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect spring.datasource.driver-class-name=org.postgresql.Driver spring.h2.console.enabled=true @@ -35,4 +35,4 @@ spring.jpa.properties.javax.persistence.schema-generation.scripts.drop-source=me ## page-config.default-page-num=0 page-config.default-page-size=5 -page-config.default-sort-by=created +page-config.default-sort-by=created \ No newline at end of file From d8489bd9a77cab3722aac6a51211c1051af0553f Mon Sep 17 00:00:00 2001 From: Ren Date: Sun, 16 Apr 2023 16:20:43 +0300 Subject: [PATCH 3/9] Refactored TalentService: * changed 'editTalent' method to use old values if no new values have been sent * added new model 'EditTalent' for mapping inform for editing a talent --- .../com/provedcode/config/SecurityConfig.java | 2 +- .../talent/controller/TalentController.java | 55 +++---- .../talent/model/request/EditTalent.java | 29 ++++ .../talent/service/TalentService.java | 3 +- .../service/impl/TalentServiceImpl.java | 135 +++++++++--------- 5 files changed, 131 insertions(+), 93 deletions(-) create mode 100644 src/main/java/com/provedcode/talent/model/request/EditTalent.java diff --git a/src/main/java/com/provedcode/config/SecurityConfig.java b/src/main/java/com/provedcode/config/SecurityConfig.java index 9b763d8..f725d5c 100644 --- a/src/main/java/com/provedcode/config/SecurityConfig.java +++ b/src/main/java/com/provedcode/config/SecurityConfig.java @@ -50,7 +50,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti http.authorizeHttpRequests(c -> c .requestMatchers("/actuator/health").permitAll() // for DevOps .requestMatchers(antMatcher("/h2/**")).permitAll() - .requestMatchers(antMatcher("/talents/**")).permitAll() + .requestMatchers(antMatcher("/api/*/talents/**")).permitAll() .requestMatchers(antMatcher("/error")).permitAll() .requestMatchers(antMatcher("/v3/api-docs/**")).permitAll() // for openAPI .requestMatchers(antMatcher("/swagger-ui/**")).permitAll() // for openAPI diff --git a/src/main/java/com/provedcode/talent/controller/TalentController.java b/src/main/java/com/provedcode/talent/controller/TalentController.java index 501fef2..4c8ea81 100644 --- a/src/main/java/com/provedcode/talent/controller/TalentController.java +++ b/src/main/java/com/provedcode/talent/controller/TalentController.java @@ -3,6 +3,7 @@ import com.provedcode.talent.mapper.TalentMapper; import com.provedcode.talent.model.dto.FullTalentDTO; import com.provedcode.talent.model.dto.ShortTalentDTO; +import com.provedcode.talent.model.request.EditTalent; import com.provedcode.talent.service.TalentService; import com.provedcode.user.model.dto.SessionInfoDTO; import io.swagger.v3.oas.annotations.Operation; @@ -26,59 +27,59 @@ @Slf4j @RestController @AllArgsConstructor -@RequestMapping("/api") +@RequestMapping("/api/v2") @Tag(name = "talent", description = "Talent API") public class TalentController { TalentService talentService; TalentMapper talentMapper; - @Operation(summary = "Get talent", - description = "As a talent I want to have an opportunity to see the full information about the talent") + @Operation(summary = "Get all talents", + description = "As a guest I want to see a page with a list of all “talents” cards displayed with a short description about them") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "SUCCESS", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, - schema = @Schema(implementation = FullTalentDTO.class))), + schema = @Schema(implementation = Page.class, subTypes = {ShortTalentDTO.class}))), @ApiResponse(responseCode = "404", description = "NOT FOUND", content = @Content), @ApiResponse( - responseCode = "401", - description = "UNAUTHORIZED", - content = @Content), + responseCode = "400", + description = "BAD_REQUEST (parameter: page or size are incorrect)", + content = @Content) }) - @PreAuthorize("hasRole('TALENT')") - @GetMapping("/talents/{id}") - FullTalentDTO getTalent(@PathVariable("id") long id, Authentication authentication) { - log.info("get-talent auth = {}", authentication); - log.info("get-talent auth.name = {}", authentication.getAuthorities()); - return talentMapper.talentToFullTalentDTO(talentService.getTalentById(id)); + @GetMapping("/talents") + @ResponseStatus(HttpStatus.OK) + Page getTalents(@RequestParam(value = "page") Optional page, + @RequestParam(value = "size") Optional size) { + return talentService.getTalentsPage(page, size).map(talentMapper::talentToShortTalentDTO); } - @Operation(summary = "Get all talents", - description = "As a guest I want to see a page with a list of all “talents” cards displayed with a short description about them") + @Operation(summary = "Get talent", + description = "As a talent I want to have an opportunity to see the full information about the talent") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "SUCCESS", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, - schema = @Schema(implementation = Page.class, subTypes = {ShortTalentDTO.class}))), + schema = @Schema(implementation = FullTalentDTO.class))), @ApiResponse(responseCode = "404", description = "NOT FOUND", content = @Content), @ApiResponse( - responseCode = "400", - description = "BAD_REQUEST (parameter: page or size are incorrect)", - content = @Content) + responseCode = "401", + description = "UNAUTHORIZED", + content = @Content), }) - @GetMapping("/talents") - @ResponseStatus(HttpStatus.OK) - Page getTalents(@RequestParam(value = "page") Optional page, - @RequestParam(value = "size") Optional size) { - return talentService.getTalentsPage(page, size).map(talentMapper::talentToShortTalentDTO); + @PreAuthorize("hasRole('TALENT')") + @GetMapping("/talents/{id}") + FullTalentDTO getTalent(@PathVariable("id") long id, Authentication authentication) { + log.info("get-talent auth = {}", authentication); + log.info("get-talent auth.name = {}", authentication.getAuthorities()); + return talentMapper.talentToFullTalentDTO(talentService.getTalentById(id)); } @Operation(summary = "Edit information about talent", - description = "As a talent I want to have an opportunity to edit my personal profile by adding new information, changing already existing information") + description = "As a talent I want to have an opportunity to edit my personal profile by adding new information, changing already existing information") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "SUCCESS", @@ -103,9 +104,9 @@ Page getTalents(@RequestParam(value = "page") Optional @PreAuthorize("hasRole('TALENT')") @PatchMapping("/talents/{talent-id}") FullTalentDTO editTalent(@PathVariable("talent-id") long id, - @RequestBody @Valid FullTalentDTO fullTalent, + @RequestBody @Valid EditTalent editTalent, Authentication authentication) { - return talentMapper.talentToFullTalentDTO(talentService.editTalent(id, fullTalent, authentication)); + return talentMapper.talentToFullTalentDTO(talentService.editTalent(id, editTalent, authentication)); } @Operation(summary = "Delete talent", diff --git a/src/main/java/com/provedcode/talent/model/request/EditTalent.java b/src/main/java/com/provedcode/talent/model/request/EditTalent.java new file mode 100644 index 0000000..1014536 --- /dev/null +++ b/src/main/java/com/provedcode/talent/model/request/EditTalent.java @@ -0,0 +1,29 @@ +package com.provedcode.talent.model.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.provedcode.annotations.UrlList; +import jakarta.validation.constraints.NotEmpty; +import lombok.Builder; + +import java.util.List; + +@Builder +public record EditTalent( + @JsonProperty("first_name") + String firstName, + @JsonProperty("last_name") + String lastName, + String image, + String specialization, + @JsonProperty("additional_info") + String additionalInfo, + String bio, + List talents, + @UrlList + List links, + List contacts, + @UrlList + @JsonProperty("attached_files") + List attachedFiles +) { +} \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/service/TalentService.java b/src/main/java/com/provedcode/talent/service/TalentService.java index afc058b..93fb180 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.talent.model.dto.ShortTalentDTO; import com.provedcode.talent.model.entity.Talent; +import com.provedcode.talent.model.request.EditTalent; import com.provedcode.user.model.dto.SessionInfoDTO; import org.springframework.security.core.Authentication; import org.springframework.data.domain.Page; @@ -15,7 +16,7 @@ public interface TalentService { Talent getTalentById(long id); - Talent editTalent(long id, FullTalentDTO fullTalent, Authentication authentication); + Talent editTalent(long id, EditTalent editTalent, Authentication authentication); SessionInfoDTO deleteTalentById(long id, Authentication authentication); } \ 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 31a33bb..cbe00cd 100644 --- a/src/main/java/com/provedcode/talent/service/impl/TalentServiceImpl.java +++ b/src/main/java/com/provedcode/talent/service/impl/TalentServiceImpl.java @@ -1,15 +1,13 @@ package com.provedcode.talent.service.impl; import com.provedcode.config.PageProperties; -import com.provedcode.talent.model.dto.FullTalentDTO; import com.provedcode.talent.model.entity.*; +import com.provedcode.talent.model.request.EditTalent; import com.provedcode.talent.repo.TalentProofRepository; import com.provedcode.talent.repo.TalentRepository; import com.provedcode.talent.service.TalentService; import com.provedcode.talent.utill.ValidateTalentForCompliance; -import com.provedcode.user.model.Role; import com.provedcode.user.model.dto.SessionInfoDTO; -import com.provedcode.user.model.entity.Authority; import com.provedcode.user.model.entity.UserInfo; import com.provedcode.user.repo.AuthorityRepository; import com.provedcode.user.repo.UserInfoRepository; @@ -39,7 +37,6 @@ public class TalentServiceImpl implements TalentService { PageProperties pageProperties; ValidateTalentForCompliance validateTalentForCompliance; - @Override @Transactional(readOnly = true) public Page getTalentsPage(Optional page, Optional size) { @@ -51,7 +48,6 @@ public Page getTalentsPage(Optional page, Optional siz } return talentRepository.findAll(PageRequest.of(page.orElse(pageProperties.defaultPageNum()), size.orElse(pageProperties.defaultPageSize()))); - } @Override @@ -65,83 +61,94 @@ public Talent getTalentById(long id) { } @Override - public Talent editTalent(long id, FullTalentDTO fullTalent, Authentication authentication) { + public Talent editTalent(long id, EditTalent editTalent, Authentication authentication) { + if (editTalent.firstName() == null && editTalent.lastName() == null && editTalent.image() == null && + editTalent.specialization() == null && editTalent.additionalInfo() == null && editTalent.bio() == null && + editTalent.talents() == null && editTalent.links() == null && editTalent.contacts() == null && + editTalent.attachedFiles() == null) + throw new ResponseStatusException(BAD_REQUEST, "you did not provide information to make changes"); + Optional talent = talentRepository.findById(id); Optional userInfo = userInfoRepository.findByLogin(authentication.getName()); validateTalentForCompliance.userVerification(talent, userInfo, id); - Talent oldTalent = talent.get(); - long oldTalentId = oldTalent.getId(); + Talent editableTalent = talent.get(); + long idEditableTalent = editableTalent.getId(); - TalentDescription oldTalentDescription = oldTalent.getTalentDescription(); - List oldTalentTalents = oldTalent.getTalentTalents(); - List oldTalentLinks = oldTalent.getTalentLinks(); - List oldTalentContacts = oldTalent.getTalentContacts(); - List oldTalentAttachedFile = oldTalent.getTalentAttachedFiles(); + TalentDescription editableTalentDescription = editableTalent.getTalentDescription(); + List editableTalentTalents = editableTalent.getTalentTalents(); + List editableTalentLinks = editableTalent.getTalentLinks(); + List editableTalentContacts = editableTalent.getTalentContacts(); + List editableTalentAttachedFile = editableTalent.getTalentAttachedFiles(); - if (oldTalentDescription != null) { - oldTalentDescription - .setAdditionalInfo(fullTalent.additionalInfo()) - .setBio(fullTalent.bio()); + if (editableTalentDescription != null) { + editableTalentDescription + .setAdditionalInfo(editTalent.additionalInfo() != null ? editTalent.additionalInfo() + : editableTalentDescription.getAdditionalInfo()) + .setBio(editTalent.bio() != null ? editTalent.bio() : editableTalentDescription.getBio()); } else { - oldTalentDescription = TalentDescription.builder() - .talentId(oldTalentId) - .additionalInfo(fullTalent.additionalInfo()) - .bio(fullTalent.bio()) - .talent(oldTalent) - .build(); + editableTalentDescription = TalentDescription.builder() + .talentId(idEditableTalent) + .additionalInfo(editTalent.additionalInfo()) + .bio(editTalent.bio()) + .talent(editableTalent) + .build(); } - oldTalentTalents.clear(); - if (fullTalent.talents() != null) { - oldTalentTalents.addAll(fullTalent.talents().stream().map(s -> TalentTalents.builder() - .talentId(oldTalentId) - .talent(oldTalent) - .talentName(s) - .build()).toList()); + if (editTalent.talents() != null) { + editableTalentTalents.clear(); + editableTalentTalents.addAll(editTalent.talents().stream().map(s -> TalentTalents.builder() + .talentId(idEditableTalent) + .talent(editableTalent) + .talentName(s) + .build()).toList()); } - oldTalentLinks.clear(); - if (fullTalent.links() != null) { - oldTalentLinks.addAll(fullTalent.links().stream().map(l -> TalentLink.builder() - .talentId(oldTalentId) - .talent(oldTalent) - .link(l) - .build()).toList()); + if (editTalent.links() != null) { + editableTalentLinks.clear(); + editableTalentLinks.addAll(editTalent.links().stream().map(l -> TalentLink.builder() + .talentId(idEditableTalent) + .talent(editableTalent) + .link(l) + .build()).toList()); } - oldTalentContacts.clear(); - if (fullTalent.contacts() != null) { - oldTalentContacts.addAll(fullTalent.contacts().stream().map(s -> TalentContact.builder() - .talentId(oldTalentId) - .talent(oldTalent) - .contact(s) - .build()).toList()); + if (editTalent.contacts() != null) { + editableTalentContacts.clear(); + editableTalentContacts.addAll(editTalent.contacts().stream().map(s -> TalentContact.builder() + .talentId( + idEditableTalent) + .talent(editableTalent) + .contact(s) + .build()).toList()); } - oldTalentAttachedFile.clear(); - if (fullTalent.attachedFiles() != null) { - oldTalentAttachedFile.addAll(fullTalent.attachedFiles().stream().map(s -> TalentAttachedFile.builder() - .talentId( - oldTalentId) - .talent(oldTalent) - .attachedFile(s) - .build()) - .toList()); + if (editTalent.attachedFiles() != null) { + editableTalentAttachedFile.clear(); + editableTalentAttachedFile.addAll(editTalent.attachedFiles().stream().map(s -> TalentAttachedFile.builder() + .talentId( + idEditableTalent) + .talent(editableTalent) + .attachedFile( + s) + .build()) + .toList()); } - oldTalent.setFirstName(fullTalent.firstName()) - .setLastName(fullTalent.lastName()) - .setSpecialization(fullTalent.specialization()) - .setImage(fullTalent.image()) - .setTalentDescription(oldTalentDescription) - .setTalentTalents(oldTalentTalents) - .setTalentLinks(oldTalentLinks) - .setTalentContacts(oldTalentContacts) - .setTalentAttachedFiles(oldTalentAttachedFile); - - return talentRepository.save(oldTalent); + editableTalent.setFirstName( + editTalent.firstName() != null ? editTalent.firstName() : editableTalent.getFirstName()) + .setLastName(editTalent.lastName() != null ? editTalent.lastName() : editableTalent.getLastName()) + .setSpecialization(editTalent.specialization() != null ? editTalent.specialization() + : editableTalent.getSpecialization()) + .setImage(editTalent.image() != null ? editTalent.image() : editableTalent.getImage()) + .setTalentDescription(editableTalentDescription) + .setTalentTalents(editableTalentTalents) + .setTalentLinks(editableTalentLinks) + .setTalentContacts(editableTalentContacts) + .setTalentAttachedFiles(editableTalentAttachedFile); + + return talentRepository.save(editableTalent); } @Override From b2f653fb5e3a7ffcbc0623b52998df144c51e171 Mon Sep 17 00:00:00 2001 From: Ren Date: Sun, 16 Apr 2023 18:08:42 +0300 Subject: [PATCH 4/9] Refactored: * remove unused files * optimized and cleanup Authentication Service and Controller --- .../controller/AuthenticationController.java | 6 +- .../user/mapper/UserInfoMapper.java | 3 +- .../user/mapper/impl/UserInfoMapperImpl.java | 24 ------- .../user/model/dto/RegistrationDTO.java | 12 ++-- .../user/model/dto/SessionInfoDTO.java | 2 +- .../user/model/dto/UserInfoDTO.java | 9 +-- .../impl/AuthenticationServiceImpl.java | 71 ++++++++----------- 7 files changed, 45 insertions(+), 82 deletions(-) delete mode 100644 src/main/java/com/provedcode/user/mapper/impl/UserInfoMapperImpl.java diff --git a/src/main/java/com/provedcode/user/controller/AuthenticationController.java b/src/main/java/com/provedcode/user/controller/AuthenticationController.java index 8349b46..2be97f2 100644 --- a/src/main/java/com/provedcode/user/controller/AuthenticationController.java +++ b/src/main/java/com/provedcode/user/controller/AuthenticationController.java @@ -19,9 +19,10 @@ @RestController @AllArgsConstructor @Slf4j -@RequestMapping("/api/talents") +@RequestMapping("/api/v2/talents") public class AuthenticationController { AuthenticationService authenticationService; + @Operation(summary = "Login") @ApiResponses(value = { @ApiResponse(responseCode = "200", @@ -64,5 +65,4 @@ UserInfoDTO login(Authentication authentication) { UserInfoDTO register(@RequestBody @Valid RegistrationDTO user) { return authenticationService.register(user); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/provedcode/user/mapper/UserInfoMapper.java b/src/main/java/com/provedcode/user/mapper/UserInfoMapper.java index 7cbca7b..fb0049a 100644 --- a/src/main/java/com/provedcode/user/mapper/UserInfoMapper.java +++ b/src/main/java/com/provedcode/user/mapper/UserInfoMapper.java @@ -5,7 +5,6 @@ import org.mapstruct.Mapper; import org.mapstruct.MappingConstants; import org.mapstruct.ReportingPolicy; -import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; @@ -20,4 +19,4 @@ default UserDetails toUserDetails(UserInfo user) { .toList()) .build(); } -} +} \ No newline at end of file diff --git a/src/main/java/com/provedcode/user/mapper/impl/UserInfoMapperImpl.java b/src/main/java/com/provedcode/user/mapper/impl/UserInfoMapperImpl.java deleted file mode 100644 index e2b6bc4..0000000 --- a/src/main/java/com/provedcode/user/mapper/impl/UserInfoMapperImpl.java +++ /dev/null @@ -1,24 +0,0 @@ -//package com.provedcode.user.mapper.impl; -// -//import com.provedcode.user.mapper.UserInfoMapper; -//import com.provedcode.user.model.entity.UserInfo; -//import lombok.extern.slf4j.Slf4j; -//import org.springframework.security.core.authority.SimpleGrantedAuthority; -//import org.springframework.security.core.userdetails.User; -//import org.springframework.security.core.userdetails.UserDetails; -//import org.springframework.stereotype.Component; -// -//@Component -//@Slf4j -//public class UserInfoMapperImpl implements UserInfoMapper { -// @Override -// public UserDetails toUserDetails(UserInfo user) { -// return User.withUsername(user.getLogin()) -// .password(user.getPassword()) -// .authorities(user.getAuthorities() -// .stream() -// .map(i -> new SimpleGrantedAuthority(i.getAuthority())) -// .toList()) -// .build(); -// } -//} diff --git a/src/main/java/com/provedcode/user/model/dto/RegistrationDTO.java b/src/main/java/com/provedcode/user/model/dto/RegistrationDTO.java index ed2e8bf..a5a4105 100644 --- a/src/main/java/com/provedcode/user/model/dto/RegistrationDTO.java +++ b/src/main/java/com/provedcode/user/model/dto/RegistrationDTO.java @@ -7,14 +7,18 @@ @Builder public record RegistrationDTO( - @NotEmpty @Email String login, - @NotEmpty String password, + @NotEmpty + @Email + String login, + @NotEmpty + String password, @JsonProperty("first_name") @NotEmpty String firstName, @JsonProperty("last_name") @NotEmpty String lastName, - @NotEmpty String specialization + @NotEmpty + String specialization ) { -} +} \ No newline at end of file diff --git a/src/main/java/com/provedcode/user/model/dto/SessionInfoDTO.java b/src/main/java/com/provedcode/user/model/dto/SessionInfoDTO.java index 17686d8..586a683 100644 --- a/src/main/java/com/provedcode/user/model/dto/SessionInfoDTO.java +++ b/src/main/java/com/provedcode/user/model/dto/SessionInfoDTO.java @@ -7,4 +7,4 @@ public record SessionInfoDTO( String status, String token ) { -} +} \ No newline at end of file diff --git a/src/main/java/com/provedcode/user/model/dto/UserInfoDTO.java b/src/main/java/com/provedcode/user/model/dto/UserInfoDTO.java index 4b2a1f1..a2423fd 100644 --- a/src/main/java/com/provedcode/user/model/dto/UserInfoDTO.java +++ b/src/main/java/com/provedcode/user/model/dto/UserInfoDTO.java @@ -5,11 +5,6 @@ @Builder public record UserInfoDTO( String token, - Long id, - String login, - String firstName, - String lastName, - String image - + Long id ) { -} +} \ No newline at end of file diff --git a/src/main/java/com/provedcode/user/service/impl/AuthenticationServiceImpl.java b/src/main/java/com/provedcode/user/service/impl/AuthenticationServiceImpl.java index 9dbaa52..b976a72 100644 --- a/src/main/java/com/provedcode/user/service/impl/AuthenticationServiceImpl.java +++ b/src/main/java/com/provedcode/user/service/impl/AuthenticationServiceImpl.java @@ -24,7 +24,6 @@ import java.time.Instant; import java.util.Collection; -import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -34,6 +33,7 @@ @Service @AllArgsConstructor @Slf4j +@Transactional public class AuthenticationServiceImpl implements AuthenticationService { JwtEncoder jwtEncoder; UserInfoRepository userInfoRepository; @@ -41,44 +41,38 @@ public class AuthenticationServiceImpl implements AuthenticationService { AuthorityRepository authorityRepository; PasswordEncoder passwordEncoder; - @Transactional + @Transactional(readOnly = true) public UserInfoDTO login(String name, Collection authorities) { UserInfo userInfo = userInfoRepository.findByLogin(name) - .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, String.format("talent with name = %s not found", name))); - - Talent talent = talentEntityRepository.findById(userInfo.getTalentId()) - .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, String.format("talent with name = %s not found", name))); + .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, String.format( + "talent with name = %s not found", name))); return UserInfoDTO.builder() - .token(generateJWTToken(name, authorities)) - .id(talent.getId()) - .login(userInfo.getLogin()) - .firstName(talent.getFirstName()) - .lastName(talent.getLastName()) - .image(talent.getImage()) - .build(); + .token(generateJWTToken(name, authorities)) + .id(userInfo.getTalentId()) + .build(); } - @Transactional + @Transactional(readOnly = true) public UserInfoDTO register(RegistrationDTO user) { if (userInfoRepository.existsByLogin(user.login())) { throw new ResponseStatusException(HttpStatus.CONFLICT, - String.format("user with login = {%s} already exists", user.login())); + String.format("user with login = {%s} already exists", user.login())); } + Talent talent = Talent.builder() - .firstName(user.firstName()) - .lastName(user.lastName()) - .specialization(user.specialization()) - .build(); + .firstName(user.firstName()) + .lastName(user.lastName()) + .specialization(user.specialization()) + .build(); talentEntityRepository.save(talent); UserInfo userInfo = UserInfo.builder() - .talentId(talent.getId()) - .login(user.login()) - .password(passwordEncoder.encode(user.password())) - .build(); - userInfo.setAuthorities(Set.of(authorityRepository.findByAuthority(Role.TALENT).orElseThrow())); - + .talentId(talent.getId()) + .login(user.login()) + .password(passwordEncoder.encode(user.password())) + .authorities(Set.of(authorityRepository.findByAuthority(Role.TALENT).orElseThrow())) + .build(); userInfoRepository.save(userInfo); String userLogin = userInfo.getLogin(); @@ -88,13 +82,9 @@ public UserInfoDTO register(RegistrationDTO user) { log.info("user with login {%s} was saved, his authorities: %s".formatted(userLogin, userAuthorities)); return UserInfoDTO.builder() - .token(generateJWTToken(userLogin, userAuthorities)) - .id(talent.getId()) - .login(userInfo.getLogin()) - .firstName(talent.getFirstName()) - .lastName(talent.getLastName()) - .image(talent.getImage()) - .build(); + .token(generateJWTToken(userLogin, userAuthorities)) + .id(talent.getId()) + .build(); } private String generateJWTToken(String name, Collection authorities) { @@ -102,14 +92,13 @@ private String generateJWTToken(String name, Collection Date: Sun, 16 Apr 2023 19:24:58 +0300 Subject: [PATCH 5/9] Refactored: * edited TalentProof Service and Controller: optimize 'getAllProofsPage' method, cleanup code --- .../controller/TalentProofController.java | 7 +-- .../talent/repo/TalentProofRepository.java | 7 +-- .../talent/service/TalentProofService.java | 48 +++++++++---------- 3 files changed, 27 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/provedcode/talent/controller/TalentProofController.java b/src/main/java/com/provedcode/talent/controller/TalentProofController.java index c20f519..8e13b41 100644 --- a/src/main/java/com/provedcode/talent/controller/TalentProofController.java +++ b/src/main/java/com/provedcode/talent/controller/TalentProofController.java @@ -22,7 +22,7 @@ @RestController @AllArgsConstructor -@RequestMapping("/api/talents") +@RequestMapping("/api/v2/talents") public class TalentProofController { TalentProofService talentProofService; TalentProofMapper talentProofMapper; @@ -45,8 +45,9 @@ public class TalentProofController { @GetMapping("/proofs") Page getAllProofs(@RequestParam(value = "page") Optional page, @RequestParam(value = "size") Optional size, - @RequestParam(value = "order-by") Optional orderBy) { - return talentProofService.getAllProofsPage(page, size, orderBy).map(talentProofMapper::toProofDTO); + @RequestParam(value = "order-by") Optional orderBy, + @RequestParam(value = "sort-by", defaultValue = "created") String... sortBy) { + return talentProofService.getAllProofsPage(page, size, orderBy, sortBy).map(talentProofMapper::toProofDTO); } @Operation(summary = "Get proof") diff --git a/src/main/java/com/provedcode/talent/repo/TalentProofRepository.java b/src/main/java/com/provedcode/talent/repo/TalentProofRepository.java index 9bf8ffb..bca2876 100644 --- a/src/main/java/com/provedcode/talent/repo/TalentProofRepository.java +++ b/src/main/java/com/provedcode/talent/repo/TalentProofRepository.java @@ -5,16 +5,11 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; - -import java.util.List; -import java.util.Optional; public interface TalentProofRepository extends JpaRepository { Page findByTalentIdAndStatus(Long talentId, ProofStatus status, Pageable pageable); - Page findByTalentId(Long talentId, Pageable pageable); - List deleteByTalentId(Long talentId); + Page findByTalentId(Long talentId, Pageable pageable); Page findByStatus(ProofStatus status, Pageable pageable); } \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/service/TalentProofService.java b/src/main/java/com/provedcode/talent/service/TalentProofService.java index cd215e8..0e9fcf3 100644 --- a/src/main/java/com/provedcode/talent/service/TalentProofService.java +++ b/src/main/java/com/provedcode/talent/service/TalentProofService.java @@ -11,7 +11,6 @@ import com.provedcode.talent.repo.TalentProofRepository; import com.provedcode.talent.repo.TalentRepository; import com.provedcode.talent.utill.ValidateTalentForCompliance; -import com.provedcode.user.model.dto.SessionInfoDTO; import com.provedcode.user.model.entity.UserInfo; import com.provedcode.user.repo.UserInfoRepository; import lombok.AllArgsConstructor; @@ -46,38 +45,36 @@ public class TalentProofService { ValidateTalentForCompliance validateTalentForCompliance; @Transactional(readOnly = true) - public Page getAllProofsPage(Optional page, Optional size, - Optional orderBy) { + public Page getAllProofsPage(Optional page, Optional size, Optional orderBy, + String... sortBy) { + PageRequest pageRequest; + String sortDirection = orderBy.orElseGet(Sort.DEFAULT_DIRECTION::name); + if (page.orElse(pageProperties.defaultPageNum()) < 0) { throw new ResponseStatusException(BAD_REQUEST, "'page' query parameter must be greater than or equal to 0"); } if (size.orElse(pageProperties.defaultPageSize()) <= 0) { 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())) { + throw new ResponseStatusException(BAD_REQUEST, "'direction' query param must be equals ASC or DESC"); + } - if (orderBy.isPresent()) { - if (!orderBy.get().equalsIgnoreCase(Sort.Direction.ASC.name()) && - !orderBy.get().equalsIgnoreCase(Sort.Direction.DESC.name())) { - throw new ResponseStatusException(BAD_REQUEST, "'orderBy' query parameter must be ASC or DESC"); - } - Sort sort = - orderBy.get().equalsIgnoreCase(Sort.Direction.ASC.name()) ? Sort.by(pageProperties.defaultSortBy()) - .ascending() - : Sort.by(pageProperties.defaultSortBy()) - .descending(); - return talentProofRepository.findByStatus(ProofStatus.PUBLISHED, - PageRequest.of(page.orElse( - pageProperties.defaultPageNum()), - size.orElse( - pageProperties.defaultPageSize()), sort)); + try { + pageRequest = PageRequest.of( + page.orElse(pageProperties.defaultPageNum()), + size.orElse(pageProperties.defaultPageSize()), + Sort.Direction.valueOf(sortDirection.toUpperCase()), + sortBy + ); + return talentProofRepository.findByStatus(ProofStatus.PUBLISHED, pageRequest); + } catch (RuntimeException exception) { + throw new ResponseStatusException(BAD_REQUEST, exception.getMessage()); } - return talentProofRepository.findByStatus(ProofStatus.PUBLISHED, - PageRequest.of(page.orElse( - pageProperties.defaultPageNum()), - size.orElse( - pageProperties.defaultPageSize()))); } + @Transactional(readOnly = true) public TalentProof getTalentProof(long proofId, Authentication authentication) { TalentProof talentProof = talentProofRepository.findById(proofId).orElseThrow( () -> new ResponseStatusException(NOT_FOUND, String.format("proof with id = %d not found", proofId))); @@ -177,7 +174,6 @@ public ResponseEntity addProof(AddProofDTO addProofDTO, long talentId, Authen return ResponseEntity.created(location).build(); } - @Transactional public TalentProof editTalentProof(long talentId, long proofId, ProofDTO proof, Authentication authentication) { Optional talent = talentRepository.findById(talentId); Optional userInfo = userInfoRepository.findByLogin(authentication.getName()); @@ -191,7 +187,8 @@ public TalentProof editTalentProof(long talentId, long proofId, ProofDTO proof, if (oldProofStatus != ProofStatus.DRAFT && proof.status() == ProofStatus.DRAFT) throw new ResponseStatusException(FORBIDDEN, "you cannot change proofs status to DRAFT"); if (oldProofStatus == ProofStatus.DRAFT && proof.status() == ProofStatus.HIDDEN) - throw new ResponseStatusException(FORBIDDEN, "you cannot change proofs status from DRAFT to HIDDEN, it should be PUBLISHED"); + throw new ResponseStatusException(FORBIDDEN, + "you cannot change proofs status from DRAFT to HIDDEN, it should be PUBLISHED"); if (proof.link() == null && proof.text() == null) { oldProof.setStatus(proof.status()); @@ -206,7 +203,6 @@ public TalentProof editTalentProof(long talentId, long proofId, ProofDTO proof, return talentProofRepository.save(oldProof); } - @Transactional public StatusDTO deleteProofById(long talentId, long proofId, Authentication authentication) { Optional talent = talentRepository.findById(talentId); Optional talentProof = talentProofRepository.findById(proofId); From 2d55bcd6188e405f9077f53cd60096be82f091b2 Mon Sep 17 00:00:00 2001 From: Ren Date: Sun, 16 Apr 2023 20:14:23 +0300 Subject: [PATCH 6/9] bugfix: * fix deleting talent proof --- .../com/provedcode/talent/model/entity/Talent.java | 12 +++++------- .../talent/service/TalentProofService.java | 1 + src/main/resources/application-dev.properties | 4 ++-- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/provedcode/talent/model/entity/Talent.java b/src/main/java/com/provedcode/talent/model/entity/Talent.java index e2c8dec..edc955b 100644 --- a/src/main/java/com/provedcode/talent/model/entity/Talent.java +++ b/src/main/java/com/provedcode/talent/model/entity/Talent.java @@ -7,9 +7,7 @@ import org.hibernate.validator.constraints.URL; import java.util.ArrayList; -import java.util.LinkedHashSet; import java.util.List; -import java.util.Set; @Builder @Accessors(chain = true) @@ -38,14 +36,14 @@ public class Talent { private String image; @OneToOne(mappedBy = "talent", cascade = CascadeType.ALL, orphanRemoval = true) private TalentDescription talentDescription; - @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", cascade = CascadeType.ALL, orphanRemoval = true) + @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", orphanRemoval = true) private List talentLinks = new ArrayList<>(); - @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", cascade = CascadeType.ALL, orphanRemoval = true) + @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", orphanRemoval = true) private List talentTalents = new ArrayList<>(); - @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", cascade = CascadeType.ALL, orphanRemoval = true) + @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", orphanRemoval = true) private List talentContacts = new ArrayList<>(); - @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", cascade = CascadeType.ALL, orphanRemoval = true) + @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", orphanRemoval = true) private List talentAttachedFiles = new ArrayList<>(); - @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", cascade = CascadeType.ALL, orphanRemoval = true) + @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", orphanRemoval = true) private List talentProofs = new ArrayList<>(); } \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/service/TalentProofService.java b/src/main/java/com/provedcode/talent/service/TalentProofService.java index 0e9fcf3..7bb212f 100644 --- a/src/main/java/com/provedcode/talent/service/TalentProofService.java +++ b/src/main/java/com/provedcode/talent/service/TalentProofService.java @@ -207,6 +207,7 @@ public StatusDTO deleteProofById(long talentId, long proofId, Authentication aut Optional talent = talentRepository.findById(talentId); Optional talentProof = talentProofRepository.findById(proofId); Optional userInfo = userInfoRepository.findByLogin(authentication.getName()); + validateTalentForCompliance.userAndProofVerification(talent, talentProof, userInfo, talentId, proofId); log.info("talentproof={}", talentProof.orElseThrow()); diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 4b8f38f..791394c 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -3,5 +3,5 @@ spring.datasource.username=sa spring.datasource.url=jdbc:h2:mem:./testdb;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;DEFAULT_NULL_ORDERING=HIGH spring.jpa.hibernate.ddl-auto=none spring.sql.init.mode=always -#logging.level.web=DEBUG -#logging.level.sql=DEBUG \ No newline at end of file +logging.level.web=DEBUG +logging.level.sql=DEBUG \ No newline at end of file From ba5fc53a2489ab7eb2981c1e291223f09c87f705 Mon Sep 17 00:00:00 2001 From: Ren Date: Sun, 16 Apr 2023 22:29:14 +0300 Subject: [PATCH 7/9] Refactor: * Rename AddProofDTO to AddProof and moved it to * fix editing proof --- .../talent/controller/TalentProofController.java | 11 +++++++---- .../provedcode/talent/model/dto/AddProofDTO.java | 10 ---------- .../com/provedcode/talent/model/dto/ProofDTO.java | 2 +- .../provedcode/talent/model/request/AddProof.java | 13 +++++++++++++ .../talent/service/TalentProofService.java | 10 +++++----- 5 files changed, 26 insertions(+), 20 deletions(-) delete mode 100644 src/main/java/com/provedcode/talent/model/dto/AddProofDTO.java create mode 100644 src/main/java/com/provedcode/talent/model/request/AddProof.java diff --git a/src/main/java/com/provedcode/talent/controller/TalentProofController.java b/src/main/java/com/provedcode/talent/controller/TalentProofController.java index 8e13b41..7cff2be 100644 --- a/src/main/java/com/provedcode/talent/controller/TalentProofController.java +++ b/src/main/java/com/provedcode/talent/controller/TalentProofController.java @@ -1,7 +1,10 @@ package com.provedcode.talent.controller; import com.provedcode.talent.mapper.TalentProofMapper; -import com.provedcode.talent.model.dto.*; +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 io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.headers.Header; @@ -135,9 +138,9 @@ FullProofDTO getTalentInformationWithProofs(Authentication authentication, @PostMapping("/{talent-id}/proofs") @PreAuthorize("hasRole('TALENT')") ResponseEntity addProof(@PathVariable(value = "talent-id") long talentId, - @RequestBody AddProofDTO addProofDTO, + @RequestBody @Valid AddProof addProof, Authentication authentication) { - return talentProofService.addProof(addProofDTO, talentId, authentication); + return talentProofService.addProof(addProof, talentId, authentication); } @Operation(summary = "Edit information about proof", @@ -194,7 +197,7 @@ ProofDTO editProof(Authentication authentication, @ApiResponse( responseCode = "403", description = "FORBIDDEN (if not the owner wants to delete the proof or " + - "impossible change proofs status from DRAFT to HIDDEN, it should be PUBLISHED)", + "impossible change proofs status from DRAFT to HIDDEN, it should be PUBLISHED)", content = @Content) }) @DeleteMapping("/{talent-id}/proofs/{proof-id}") diff --git a/src/main/java/com/provedcode/talent/model/dto/AddProofDTO.java b/src/main/java/com/provedcode/talent/model/dto/AddProofDTO.java deleted file mode 100644 index a3873bf..0000000 --- a/src/main/java/com/provedcode/talent/model/dto/AddProofDTO.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.provedcode.talent.model.dto; - -import org.hibernate.validator.constraints.URL; - -public record AddProofDTO( - @URL - String link, - String text -) { -} 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 ebb47ab..ed7318e 100644 --- a/src/main/java/com/provedcode/talent/model/dto/ProofDTO.java +++ b/src/main/java/com/provedcode/talent/model/dto/ProofDTO.java @@ -16,4 +16,4 @@ public record ProofDTO( ProofStatus status, String created ) { -} +} \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/model/request/AddProof.java b/src/main/java/com/provedcode/talent/model/request/AddProof.java new file mode 100644 index 0000000..fdbed85 --- /dev/null +++ b/src/main/java/com/provedcode/talent/model/request/AddProof.java @@ -0,0 +1,13 @@ +package com.provedcode.talent.model.request; + +import jakarta.validation.constraints.NotEmpty; +import org.hibernate.validator.constraints.URL; + +public record AddProof( + @URL + @NotEmpty + String link, + @NotEmpty + String text +) { +} \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/service/TalentProofService.java b/src/main/java/com/provedcode/talent/service/TalentProofService.java index 7bb212f..29f1256 100644 --- a/src/main/java/com/provedcode/talent/service/TalentProofService.java +++ b/src/main/java/com/provedcode/talent/service/TalentProofService.java @@ -2,12 +2,12 @@ import com.provedcode.config.PageProperties; import com.provedcode.talent.model.ProofStatus; -import com.provedcode.talent.model.dto.AddProofDTO; 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.entity.Talent; import com.provedcode.talent.model.entity.TalentProof; +import com.provedcode.talent.model.request.AddProof; import com.provedcode.talent.repo.TalentProofRepository; import com.provedcode.talent.repo.TalentRepository; import com.provedcode.talent.utill.ValidateTalentForCompliance; @@ -148,7 +148,7 @@ public FullProofDTO getTalentProofs(Long talentId, Optional page, Optio .build(); } - public ResponseEntity addProof(AddProofDTO addProofDTO, long talentId, Authentication authentication) { + public ResponseEntity addProof(AddProof addProof, long talentId, Authentication authentication) { Optional talent = talentRepository.findById(talentId); Optional userInfo = userInfoRepository.findByLogin(authentication.getName()); @@ -157,8 +157,8 @@ public ResponseEntity addProof(AddProofDTO addProofDTO, long talentId, Authen TalentProof talentProof = TalentProof.builder() .talent(talent.get()) .talentId(talentId) - .link(addProofDTO.link()) - .text(addProofDTO.text()) + .link(addProof.link()) + .text(addProof.text()) .status(ProofStatus.DRAFT) .created(LocalDateTime.now()) .build(); @@ -196,7 +196,7 @@ public TalentProof editTalentProof(long talentId, long proofId, ProofDTO proof, if (oldProofStatus != ProofStatus.DRAFT) throw new ResponseStatusException(FORBIDDEN, "you cannot edit proofs without DRAFT status"); - oldProof.setLink(proof.link()) + oldProof.setLink(proof.link() != null ? proof.link() : oldProof.getLink()) .setText(proof.text() != null ? proof.text() : oldProof.getText()) .setStatus(proof.status()); } From cc5fdb7a8502efed6ff50f816aef390dafc20b45 Mon Sep 17 00:00:00 2001 From: Ren Date: Sun, 16 Apr 2023 22:39:37 +0300 Subject: [PATCH 8/9] cleanup code --- .../com/provedcode/talent/model/entity/Talent.java | 10 +++++----- .../talent/service/TalentProofService.java | 13 ++++++++++++- src/main/resources/application-dev.properties | 4 ++-- src/main/resources/application-prod.properties | 2 +- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/provedcode/talent/model/entity/Talent.java b/src/main/java/com/provedcode/talent/model/entity/Talent.java index edc955b..bd04d3f 100644 --- a/src/main/java/com/provedcode/talent/model/entity/Talent.java +++ b/src/main/java/com/provedcode/talent/model/entity/Talent.java @@ -36,14 +36,14 @@ public class Talent { private String image; @OneToOne(mappedBy = "talent", cascade = CascadeType.ALL, orphanRemoval = true) private TalentDescription talentDescription; - @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", orphanRemoval = true) + @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", cascade = CascadeType.ALL, orphanRemoval = true) private List talentLinks = new ArrayList<>(); - @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", orphanRemoval = true) + @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", cascade = CascadeType.ALL, orphanRemoval = true) private List talentTalents = new ArrayList<>(); - @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", orphanRemoval = true) + @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", cascade = CascadeType.ALL, orphanRemoval = true) private List talentContacts = new ArrayList<>(); - @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", orphanRemoval = true) + @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", cascade = CascadeType.ALL, orphanRemoval = true) private List talentAttachedFiles = new ArrayList<>(); - @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", orphanRemoval = true) + @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", cascade = CascadeType.ALL, orphanRemoval = true) private List talentProofs = new ArrayList<>(); } \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/service/TalentProofService.java b/src/main/java/com/provedcode/talent/service/TalentProofService.java index 29f1256..ab5ea93 100644 --- a/src/main/java/com/provedcode/talent/service/TalentProofService.java +++ b/src/main/java/com/provedcode/talent/service/TalentProofService.java @@ -29,6 +29,7 @@ import java.net.URI; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.util.List; import java.util.Optional; import static org.springframework.http.HttpStatus.*; @@ -211,7 +212,17 @@ public StatusDTO deleteProofById(long talentId, long proofId, Authentication aut validateTalentForCompliance.userAndProofVerification(talent, talentProof, userInfo, talentId, proofId); log.info("talentproof={}", talentProof.orElseThrow()); - talentProofRepository.delete(talentProof.orElseThrow(() -> new ResponseStatusException(NOT_IMPLEMENTED))); + + Talent editableTalent = talent.get(); + + List proofList = editableTalent.getTalentProofs(); + List newProofList = proofList.stream().filter(p -> p.getId() != proofId).toList(); + + editableTalent.setTalentProofs(newProofList); + +// talentRepository.save(editableTalent); + +// talentProofRepository.delete(talentProof.orElseThrow(() -> new ResponseStatusException(NOT_IMPLEMENTED))); return new StatusDTO("deleted"); } } \ No newline at end of file diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 791394c..4b8f38f 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -3,5 +3,5 @@ spring.datasource.username=sa spring.datasource.url=jdbc:h2:mem:./testdb;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;DEFAULT_NULL_ORDERING=HIGH spring.jpa.hibernate.ddl-auto=none spring.sql.init.mode=always -logging.level.web=DEBUG -logging.level.sql=DEBUG \ No newline at end of file +#logging.level.web=DEBUG +#logging.level.sql=DEBUG \ No newline at end of file diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 5f92bee..810d9a1 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -2,4 +2,4 @@ spring.datasource.username=${DB_LOGIN} spring.datasource.password=${DB_PASSWORD} spring.datasource.url=jdbc:postgresql://${DB_URL} spring.jpa.hibernate.ddl-auto=none -spring.sql.init.mode=always +spring.sql.init.mode=always \ No newline at end of file From 5b14e6cfad958bbc24a3a282688229dcf22b91dd Mon Sep 17 00:00:00 2001 From: Maslyna Date: Sun, 16 Apr 2023 23:11:00 +0200 Subject: [PATCH 9/9] BUGFIX: proof didn`t delete --- .../talent/service/TalentProofService.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/main/java/com/provedcode/talent/service/TalentProofService.java b/src/main/java/com/provedcode/talent/service/TalentProofService.java index ab5ea93..0958c77 100644 --- a/src/main/java/com/provedcode/talent/service/TalentProofService.java +++ b/src/main/java/com/provedcode/talent/service/TalentProofService.java @@ -211,18 +211,7 @@ public StatusDTO deleteProofById(long talentId, long proofId, Authentication aut validateTalentForCompliance.userAndProofVerification(talent, talentProof, userInfo, talentId, proofId); - log.info("talentproof={}", talentProof.orElseThrow()); - - Talent editableTalent = talent.get(); - - List proofList = editableTalent.getTalentProofs(); - List newProofList = proofList.stream().filter(p -> p.getId() != proofId).toList(); - - editableTalent.setTalentProofs(newProofList); - -// talentRepository.save(editableTalent); - -// talentProofRepository.delete(talentProof.orElseThrow(() -> new ResponseStatusException(NOT_IMPLEMENTED))); + talent.get().getTalentProofs().remove(talentProof.get()); return new StatusDTO("deleted"); } } \ No newline at end of file