From 1d52efb996c5cee5f24b73a8863e36bd0da9c16a Mon Sep 17 00:00:00 2001 From: Maslyna Date: Tue, 21 Mar 2023 01:07:50 +0100 Subject: [PATCH 1/4] Updated TalentController Created TalentEntityRepository Updated TalentRepository Created PageConfig, that takes config from application.properties Created ShortTalentDTO Created TalentMapper and his impl Created TalentService and his impl ------------ Added `GET(/api/talents)` endpoint, that returns us the `List` Added pagination to `GET(/api/talents)` endpoint - To use pagination you may use RequestParams: - page (gives us requested page) - size (gives us requested size of page) --- .../com/provedcode/ProvedCodeApplication.java | 2 ++ .../com/provedcode/config/PageConfig.java | 9 ++++++ .../com/provedcode/service/TalentService.java | 12 +++++++ .../service/impl/TalentServiceImpl.java | 32 +++++++++++++++++++ .../provedcode/talent/TalentController.java | 20 +++++++++--- .../talent/mapper/TalentMapper.java | 18 +++++++++++ .../talent/mapper/impl/TalentMapperImpl.java | 8 +++++ .../talent/model/dto/ShortTalentDTO.java | 16 ++++++++++ .../talent/repo/TalentRepository.java | 8 ++++- .../repo/db/TalentEntityRepository.java | 24 ++++++++++++++ src/main/resources/application.properties | 3 ++ 11 files changed, 147 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/provedcode/config/PageConfig.java create mode 100644 src/main/java/com/provedcode/service/TalentService.java create mode 100644 src/main/java/com/provedcode/service/impl/TalentServiceImpl.java create mode 100644 src/main/java/com/provedcode/talent/mapper/TalentMapper.java create mode 100644 src/main/java/com/provedcode/talent/mapper/impl/TalentMapperImpl.java create mode 100644 src/main/java/com/provedcode/talent/model/dto/ShortTalentDTO.java create mode 100644 src/main/java/com/provedcode/talent/repo/db/TalentEntityRepository.java diff --git a/src/main/java/com/provedcode/ProvedCodeApplication.java b/src/main/java/com/provedcode/ProvedCodeApplication.java index 9267230..fc86627 100644 --- a/src/main/java/com/provedcode/ProvedCodeApplication.java +++ b/src/main/java/com/provedcode/ProvedCodeApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.ConfigurationPropertiesScan; @SpringBootApplication +@ConfigurationPropertiesScan public class ProvedCodeApplication { public static void main(String[] args) { diff --git a/src/main/java/com/provedcode/config/PageConfig.java b/src/main/java/com/provedcode/config/PageConfig.java new file mode 100644 index 0000000..a93f385 --- /dev/null +++ b/src/main/java/com/provedcode/config/PageConfig.java @@ -0,0 +1,9 @@ +package com.provedcode.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties(prefix = "page-config") +public record PageConfig( + int defaultPageNum, + int defaultPageSize +) {} diff --git a/src/main/java/com/provedcode/service/TalentService.java b/src/main/java/com/provedcode/service/TalentService.java new file mode 100644 index 0000000..1519b59 --- /dev/null +++ b/src/main/java/com/provedcode/service/TalentService.java @@ -0,0 +1,12 @@ +package com.provedcode.service; + +import com.provedcode.talent.model.dto.ShortTalentDTO; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +public interface TalentService { + List getTalentsPage(Optional page, Optional size); +} \ No newline at end of file diff --git a/src/main/java/com/provedcode/service/impl/TalentServiceImpl.java b/src/main/java/com/provedcode/service/impl/TalentServiceImpl.java new file mode 100644 index 0000000..88b1960 --- /dev/null +++ b/src/main/java/com/provedcode/service/impl/TalentServiceImpl.java @@ -0,0 +1,32 @@ +package com.provedcode.service.impl; + +import com.provedcode.config.PageConfig; +import com.provedcode.service.TalentService; +import com.provedcode.talent.mapper.TalentMapper; +import com.provedcode.talent.model.dto.ShortTalentDTO; +import com.provedcode.talent.repo.TalentRepository; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +@Slf4j +@AllArgsConstructor +public class TalentServiceImpl implements TalentService { + TalentMapper talentMapper; + TalentRepository talentRepository; + PageConfig pageConfig; + + @Override + public List getTalentsPage(Optional page, Optional size) { + log.info("page = {}", pageConfig); + return talentRepository.getTalentsPage( + PageRequest.of(page.orElse(pageConfig.defaultPageNum()), size.orElse(pageConfig.defaultPageSize()))) + .stream().map(i -> talentMapper.talentToShortTalentDTO(i)) + .toList(); + } +} diff --git a/src/main/java/com/provedcode/talent/TalentController.java b/src/main/java/com/provedcode/talent/TalentController.java index 4ef750d..fb6c1ab 100644 --- a/src/main/java/com/provedcode/talent/TalentController.java +++ b/src/main/java/com/provedcode/talent/TalentController.java @@ -1,21 +1,26 @@ package com.provedcode.talent; +import com.provedcode.service.TalentService; +import com.provedcode.talent.model.dto.ShortTalentDTO; import com.provedcode.talent.model.entity.Talent; import com.provedcode.talent.model.entity.TalentSkill; import com.provedcode.talent.model.response.ShortTalent; import com.provedcode.talent.repo.TalentRepository; +import com.provedcode.talent.repo.db.TalentEntityRepository; import lombok.AllArgsConstructor; +import org.springframework.http.HttpStatus; import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; @RestController @AllArgsConstructor public class TalentController { - TalentRepository talentRepository; + TalentEntityRepository talentRepository; + TalentService talentService; @GetMapping("/api/talent/{id}") ShortTalent getTalent(@PathVariable("id") long id) { @@ -32,4 +37,11 @@ ShortTalent getTalent(@PathVariable("id") long id) { talent.getTalentSkills().stream().map(TalentSkill::getSkill).collect(Collectors.toList()) ); } + + @GetMapping("/api/talents") + @ResponseStatus(HttpStatus.OK) + List getTalents(@RequestParam(value = "page") Optional page, + @RequestParam(value = "size") Optional size) { + return talentService.getTalentsPage(page, size); + } } diff --git a/src/main/java/com/provedcode/talent/mapper/TalentMapper.java b/src/main/java/com/provedcode/talent/mapper/TalentMapper.java new file mode 100644 index 0000000..1597081 --- /dev/null +++ b/src/main/java/com/provedcode/talent/mapper/TalentMapper.java @@ -0,0 +1,18 @@ +package com.provedcode.talent.mapper; + +import com.provedcode.talent.model.dto.ShortTalentDTO; +import com.provedcode.talent.model.entity.Talent; +import com.provedcode.talent.model.entity.TalentSkill; + +public interface TalentMapper { + default ShortTalentDTO talentToShortTalentDTO(Talent talent) { + return ShortTalentDTO.builder() + .id(talent.getId()) + .image(talent.getImage()) + .firstname(talent.getFirstName()) + .lastname(talent.getLastName()) + .specialization(talent.getSpecialization()) + .skills(talent.getTalentSkills().stream().map(TalentSkill::getSkill).toList()) + .build(); + } +} diff --git a/src/main/java/com/provedcode/talent/mapper/impl/TalentMapperImpl.java b/src/main/java/com/provedcode/talent/mapper/impl/TalentMapperImpl.java new file mode 100644 index 0000000..6dc6a03 --- /dev/null +++ b/src/main/java/com/provedcode/talent/mapper/impl/TalentMapperImpl.java @@ -0,0 +1,8 @@ +package com.provedcode.talent.mapper.impl; + +import com.provedcode.talent.mapper.TalentMapper; +import org.springframework.stereotype.Component; + +@Component +public class TalentMapperImpl implements TalentMapper { +} diff --git a/src/main/java/com/provedcode/talent/model/dto/ShortTalentDTO.java b/src/main/java/com/provedcode/talent/model/dto/ShortTalentDTO.java new file mode 100644 index 0000000..a9ca9a7 --- /dev/null +++ b/src/main/java/com/provedcode/talent/model/dto/ShortTalentDTO.java @@ -0,0 +1,16 @@ +package com.provedcode.talent.model.dto; + +import lombok.Builder; + +import java.util.List; + +@Builder +public record ShortTalentDTO( + Long id, + String image, + String firstname, + String lastname, + String specialization, + List skills +) { +} diff --git a/src/main/java/com/provedcode/talent/repo/TalentRepository.java b/src/main/java/com/provedcode/talent/repo/TalentRepository.java index b2bac22..9dcd4fc 100644 --- a/src/main/java/com/provedcode/talent/repo/TalentRepository.java +++ b/src/main/java/com/provedcode/talent/repo/TalentRepository.java @@ -1,7 +1,13 @@ package com.provedcode.talent.repo; import com.provedcode.talent.model.entity.Talent; +import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.transaction.annotation.Transactional; -public interface TalentRepository extends JpaRepository { +import java.util.List; + +public interface TalentRepository { + + List getTalentsPage(PageRequest page); } \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/repo/db/TalentEntityRepository.java b/src/main/java/com/provedcode/talent/repo/db/TalentEntityRepository.java new file mode 100644 index 0000000..5781984 --- /dev/null +++ b/src/main/java/com/provedcode/talent/repo/db/TalentEntityRepository.java @@ -0,0 +1,24 @@ +package com.provedcode.talent.repo.db; + +import com.provedcode.talent.model.entity.Talent; +import com.provedcode.talent.repo.TalentRepository; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +public interface TalentEntityRepository extends + JpaRepository, + TalentRepository { + @Transactional(readOnly = true) + default List getTalents() { + return findAll(); + } + + @Override + @Transactional(readOnly = true) + default List getTalentsPage(PageRequest page) { + return findAll(page).stream().toList(); + } +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 9541894..14daa19 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -12,3 +12,6 @@ spring.h2.console.enabled=true spring.h2.console.path=/h2 ## spring.jpa.hibernate.ddl-auto=none +## +page-config.default-page-num=0 +page-config.default-page-size=5 \ No newline at end of file From badfc53b2f63a0258691e630232f188807cb8304 Mon Sep 17 00:00:00 2001 From: Maslyna Date: Tue, 21 Mar 2023 11:59:52 +0100 Subject: [PATCH 2/4] Created TalentExceptionHandler Updated TalentController Updated TalentRepository Created TalentEntityRepository Created FullTalentDTO Created TalentServiceMock Created PageConfig, that takes config from application.properties Created ShortTalentDTO Created TalentMapper and his impl Created TalentService and his impl ------------ Added `GET(/api/talents)` endpoint, that returns us the `List` Added pagination to `GET(/api/talents)` endpoint - To use pagination you may use RequestParams: - page (gives us requested page) - size (gives us requested size of page) Added simple exception handling --- .../handlers/TalentExceptionHandler.java | 14 ++++++ .../com/provedcode/service/TalentService.java | 5 +- .../service/impl/TalentServiceImpl.java | 24 ++++++++- .../service/mock/TalentServiceMock.java | 50 +++++++++++++++++++ .../provedcode/talent/TalentController.java | 24 ++------- .../talent/mapper/TalentMapper.java | 1 + .../talent/model/dto/FullTalentDTO.java | 6 +++ .../talent/model/entity/Talent.java | 1 + .../talent/repo/TalentRepository.java | 3 ++ .../repo/db/TalentEntityRepository.java | 4 ++ 10 files changed, 108 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/provedcode/handlers/TalentExceptionHandler.java create mode 100644 src/main/java/com/provedcode/service/mock/TalentServiceMock.java create mode 100644 src/main/java/com/provedcode/talent/model/dto/FullTalentDTO.java diff --git a/src/main/java/com/provedcode/handlers/TalentExceptionHandler.java b/src/main/java/com/provedcode/handlers/TalentExceptionHandler.java new file mode 100644 index 0000000..86300b8 --- /dev/null +++ b/src/main/java/com/provedcode/handlers/TalentExceptionHandler.java @@ -0,0 +1,14 @@ +package com.provedcode.handlers; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.server.ResponseStatusException; + +@ControllerAdvice +public class TalentExceptionHandler { + @ExceptionHandler(ResponseStatusException.class) + private ResponseEntity responseStatusExceptionHandler(ResponseStatusException exception) { + return ResponseEntity.status(exception.getStatusCode()).body(exception.getBody()); + } +} diff --git a/src/main/java/com/provedcode/service/TalentService.java b/src/main/java/com/provedcode/service/TalentService.java index 1519b59..271b4e3 100644 --- a/src/main/java/com/provedcode/service/TalentService.java +++ b/src/main/java/com/provedcode/service/TalentService.java @@ -1,12 +1,15 @@ package com.provedcode.service; import com.provedcode.talent.model.dto.ShortTalentDTO; +import com.provedcode.talent.model.entity.Talent; import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; -@Service + public interface TalentService { List getTalentsPage(Optional page, Optional size); + + Talent getTalentById(long id); } \ No newline at end of file diff --git a/src/main/java/com/provedcode/service/impl/TalentServiceImpl.java b/src/main/java/com/provedcode/service/impl/TalentServiceImpl.java index 88b1960..a0727b5 100644 --- a/src/main/java/com/provedcode/service/impl/TalentServiceImpl.java +++ b/src/main/java/com/provedcode/service/impl/TalentServiceImpl.java @@ -2,17 +2,23 @@ import com.provedcode.config.PageConfig; import com.provedcode.service.TalentService; +import com.provedcode.talent.TalentController; import com.provedcode.talent.mapper.TalentMapper; import com.provedcode.talent.model.dto.ShortTalentDTO; +import com.provedcode.talent.model.entity.Talent; import com.provedcode.talent.repo.TalentRepository; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; +import org.springframework.web.server.ResponseStatusException; import java.util.List; import java.util.Optional; +import static org.springframework.http.HttpStatus.BAD_REQUEST; +import static org.springframework.http.HttpStatus.NOT_FOUND; + @Service @Slf4j @AllArgsConstructor @@ -23,10 +29,24 @@ public class TalentServiceImpl implements TalentService { @Override public List getTalentsPage(Optional page, Optional size) { - log.info("page = {}", pageConfig); + if (page.orElse(pageConfig.defaultPageNum()) < 0) { + throw new ResponseStatusException(BAD_REQUEST, "'page' query parameter must be greater than or equal to 0"); + } + if (size.orElse(pageConfig.defaultPageSize()) <= 0) { + throw new ResponseStatusException(BAD_REQUEST, "'size' query parameter must be greater than or equal to 1"); + } return talentRepository.getTalentsPage( - PageRequest.of(page.orElse(pageConfig.defaultPageNum()), size.orElse(pageConfig.defaultPageSize()))) + PageRequest.of(page.orElse(pageConfig.defaultPageNum()), size.orElse(pageConfig.defaultPageSize()))) .stream().map(i -> talentMapper.talentToShortTalentDTO(i)) .toList(); } + + @Override + public Talent getTalentById(long id) { + Optional talent = talentRepository.findById(id); + if (talent.isEmpty()){ + throw new ResponseStatusException(NOT_FOUND, String.format("talent with id = %d not found", id)); + } + return null; + } } diff --git a/src/main/java/com/provedcode/service/mock/TalentServiceMock.java b/src/main/java/com/provedcode/service/mock/TalentServiceMock.java new file mode 100644 index 0000000..dc080b3 --- /dev/null +++ b/src/main/java/com/provedcode/service/mock/TalentServiceMock.java @@ -0,0 +1,50 @@ +package com.provedcode.service.mock; + +import com.provedcode.config.PageConfig; +import com.provedcode.service.TalentService; +import com.provedcode.talent.mapper.TalentMapper; +import com.provedcode.talent.model.dto.ShortTalentDTO; +import com.provedcode.talent.model.entity.Talent; +import com.provedcode.talent.repo.TalentRepository; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.PageRequest; +import org.springframework.web.server.ResponseStatusException; + +import java.util.List; +import java.util.Optional; + +import static org.springframework.http.HttpStatus.BAD_REQUEST; +import static org.springframework.http.HttpStatus.NOT_FOUND; + +//@Service +@Slf4j +@AllArgsConstructor +public class TalentServiceMock implements TalentService { + TalentMapper talentMapper; + TalentRepository talentRepository; + PageConfig pageConfig; + + @Override + public List getTalentsPage(Optional page, Optional size) { + if (page.orElse(pageConfig.defaultPageNum()) < 0) { + throw new ResponseStatusException(BAD_REQUEST, "'page' query parameter must be greater than or equal to 0"); + } + if (size.orElse(pageConfig.defaultPageSize()) <= 0) { + throw new ResponseStatusException(BAD_REQUEST, "'size' query parameter must be greater than or equal to 1"); + } + return talentRepository.getTalentsPage( + PageRequest.of(page.orElse(pageConfig.defaultPageNum()), size.orElse(pageConfig.defaultPageSize()))) + .stream().map(i -> talentMapper.talentToShortTalentDTO(i)) + .toList(); + } + + @Override + public Talent getTalentById(long id) { + Optional talent = talentRepository.findById(id); + if (talent.isEmpty()){ + throw new ResponseStatusException(NOT_FOUND, String.format("talent with id = %d not found", id)); + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/TalentController.java b/src/main/java/com/provedcode/talent/TalentController.java index fb6c1ab..8a608e1 100644 --- a/src/main/java/com/provedcode/talent/TalentController.java +++ b/src/main/java/com/provedcode/talent/TalentController.java @@ -3,39 +3,21 @@ import com.provedcode.service.TalentService; import com.provedcode.talent.model.dto.ShortTalentDTO; import com.provedcode.talent.model.entity.Talent; -import com.provedcode.talent.model.entity.TalentSkill; -import com.provedcode.talent.model.response.ShortTalent; -import com.provedcode.talent.repo.TalentRepository; -import com.provedcode.talent.repo.db.TalentEntityRepository; import lombok.AllArgsConstructor; import org.springframework.http.HttpStatus; -import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; @RestController @AllArgsConstructor public class TalentController { - TalentEntityRepository talentRepository; TalentService talentService; - @GetMapping("/api/talent/{id}") - ShortTalent getTalent(@PathVariable("id") long id) { - Talent talent = talentRepository.findById(id) - .orElseThrow( - () -> new UsernameNotFoundException( - "id " + id + " not found")); - return new ShortTalent( - talent.getId(), - talent.getImage(), - talent.getFirstName(), - talent.getLastName(), - talent.getSpecialization(), - talent.getTalentSkills().stream().map(TalentSkill::getSkill).collect(Collectors.toList()) - ); + @GetMapping("/api/talents/{id}") + Talent getTalent(@PathVariable("id") long id) { + return talentService.getTalentById(id); } @GetMapping("/api/talents") diff --git a/src/main/java/com/provedcode/talent/mapper/TalentMapper.java b/src/main/java/com/provedcode/talent/mapper/TalentMapper.java index 1597081..0a860a1 100644 --- a/src/main/java/com/provedcode/talent/mapper/TalentMapper.java +++ b/src/main/java/com/provedcode/talent/mapper/TalentMapper.java @@ -15,4 +15,5 @@ default ShortTalentDTO talentToShortTalentDTO(Talent talent) { .skills(talent.getTalentSkills().stream().map(TalentSkill::getSkill).toList()) .build(); } + } diff --git a/src/main/java/com/provedcode/talent/model/dto/FullTalentDTO.java b/src/main/java/com/provedcode/talent/model/dto/FullTalentDTO.java new file mode 100644 index 0000000..750c766 --- /dev/null +++ b/src/main/java/com/provedcode/talent/model/dto/FullTalentDTO.java @@ -0,0 +1,6 @@ +package com.provedcode.talent.model.dto; + +public record FullTalentDTO( + +) { +} 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 232de47..f52f6f1 100644 --- a/src/main/java/com/provedcode/talent/model/entity/Talent.java +++ b/src/main/java/com/provedcode/talent/model/entity/Talent.java @@ -46,4 +46,5 @@ public class Talent { private List talentContacts = new ArrayList<>(); @OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", orphanRemoval = true) private List talentAttachedFiles = new ArrayList<>(); + } \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/repo/TalentRepository.java b/src/main/java/com/provedcode/talent/repo/TalentRepository.java index 9dcd4fc..b2fe0de 100644 --- a/src/main/java/com/provedcode/talent/repo/TalentRepository.java +++ b/src/main/java/com/provedcode/talent/repo/TalentRepository.java @@ -6,8 +6,11 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Optional; public interface TalentRepository { List getTalentsPage(PageRequest page); + + Optional findById(Long aLong); } \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/repo/db/TalentEntityRepository.java b/src/main/java/com/provedcode/talent/repo/db/TalentEntityRepository.java index 5781984..aaa9688 100644 --- a/src/main/java/com/provedcode/talent/repo/db/TalentEntityRepository.java +++ b/src/main/java/com/provedcode/talent/repo/db/TalentEntityRepository.java @@ -7,6 +7,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.Optional; public interface TalentEntityRepository extends JpaRepository, @@ -21,4 +22,7 @@ default List getTalents() { default List getTalentsPage(PageRequest page) { return findAll(page).stream().toList(); } + + @Override + Optional findById(Long aLong); } \ No newline at end of file From 2fb094232526c2ea4c1a368ca83188e0a6e3669a Mon Sep 17 00:00:00 2001 From: Maslyna Date: Tue, 21 Mar 2023 14:49:57 +0100 Subject: [PATCH 3/4] Updated TalentController: Added new endpoint `GET(/talents/{id})`, that returns to us the FullTalentDTO Updated FullTalentDTO Updated TalentMapper Updated TalentService --- .../com/provedcode/service/TalentService.java | 5 ++--- .../service/impl/TalentServiceImpl.java | 6 +++--- .../service/mock/TalentServiceMock.java | 5 +++-- .../provedcode/talent/TalentController.java | 3 ++- .../talent/mapper/TalentMapper.java | 20 +++++++++++++++++-- .../talent/model/dto/FullTalentDTO.java | 20 ++++++++++++++++--- 6 files changed, 45 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/provedcode/service/TalentService.java b/src/main/java/com/provedcode/service/TalentService.java index 271b4e3..a7915ca 100644 --- a/src/main/java/com/provedcode/service/TalentService.java +++ b/src/main/java/com/provedcode/service/TalentService.java @@ -1,8 +1,7 @@ package com.provedcode.service; +import com.provedcode.talent.model.dto.FullTalentDTO; import com.provedcode.talent.model.dto.ShortTalentDTO; -import com.provedcode.talent.model.entity.Talent; -import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; @@ -11,5 +10,5 @@ public interface TalentService { List getTalentsPage(Optional page, Optional size); - Talent getTalentById(long id); + FullTalentDTO getTalentById(long id); } \ No newline at end of file diff --git a/src/main/java/com/provedcode/service/impl/TalentServiceImpl.java b/src/main/java/com/provedcode/service/impl/TalentServiceImpl.java index a0727b5..0d7443f 100644 --- a/src/main/java/com/provedcode/service/impl/TalentServiceImpl.java +++ b/src/main/java/com/provedcode/service/impl/TalentServiceImpl.java @@ -2,8 +2,8 @@ import com.provedcode.config.PageConfig; import com.provedcode.service.TalentService; -import com.provedcode.talent.TalentController; 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.entity.Talent; import com.provedcode.talent.repo.TalentRepository; @@ -42,11 +42,11 @@ public List getTalentsPage(Optional page, Optional talent = talentRepository.findById(id); if (talent.isEmpty()){ throw new ResponseStatusException(NOT_FOUND, String.format("talent with id = %d not found", id)); } - return null; + return talentMapper.talentToFullTalentDTO(talent.get()); } } diff --git a/src/main/java/com/provedcode/service/mock/TalentServiceMock.java b/src/main/java/com/provedcode/service/mock/TalentServiceMock.java index dc080b3..39471e7 100644 --- a/src/main/java/com/provedcode/service/mock/TalentServiceMock.java +++ b/src/main/java/com/provedcode/service/mock/TalentServiceMock.java @@ -3,6 +3,7 @@ import com.provedcode.config.PageConfig; import com.provedcode.service.TalentService; 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.entity.Talent; import com.provedcode.talent.repo.TalentRepository; @@ -40,11 +41,11 @@ public List getTalentsPage(Optional page, Optional talent = talentRepository.findById(id); if (talent.isEmpty()){ throw new ResponseStatusException(NOT_FOUND, String.format("talent with id = %d not found", id)); } - return null; + return talentMapper.talentToFullTalentDTO(talent.get()); } } \ No newline at end of file diff --git a/src/main/java/com/provedcode/talent/TalentController.java b/src/main/java/com/provedcode/talent/TalentController.java index 8a608e1..382fe85 100644 --- a/src/main/java/com/provedcode/talent/TalentController.java +++ b/src/main/java/com/provedcode/talent/TalentController.java @@ -1,6 +1,7 @@ package com.provedcode.talent; import com.provedcode.service.TalentService; +import com.provedcode.talent.model.dto.FullTalentDTO; import com.provedcode.talent.model.dto.ShortTalentDTO; import com.provedcode.talent.model.entity.Talent; import lombok.AllArgsConstructor; @@ -16,7 +17,7 @@ public class TalentController { TalentService talentService; @GetMapping("/api/talents/{id}") - Talent getTalent(@PathVariable("id") long id) { + FullTalentDTO getTalent(@PathVariable("id") long id) { return talentService.getTalentById(id); } diff --git a/src/main/java/com/provedcode/talent/mapper/TalentMapper.java b/src/main/java/com/provedcode/talent/mapper/TalentMapper.java index 0a860a1..ca767a4 100644 --- a/src/main/java/com/provedcode/talent/mapper/TalentMapper.java +++ b/src/main/java/com/provedcode/talent/mapper/TalentMapper.java @@ -1,8 +1,8 @@ package com.provedcode.talent.mapper; +import com.provedcode.talent.model.dto.FullTalentDTO; import com.provedcode.talent.model.dto.ShortTalentDTO; -import com.provedcode.talent.model.entity.Talent; -import com.provedcode.talent.model.entity.TalentSkill; +import com.provedcode.talent.model.entity.*; public interface TalentMapper { default ShortTalentDTO talentToShortTalentDTO(Talent talent) { @@ -16,4 +16,20 @@ default ShortTalentDTO talentToShortTalentDTO(Talent talent) { .build(); } + default FullTalentDTO talentToFullTalentDTO(Talent talent) { + return FullTalentDTO.builder() + .id(talent.getId()) + .firstname(talent.getFirstName()) + .lastname(talent.getLastName()) + .bio(talent.getTalentDescription().getBio()) + .additionalInfo(talent.getTalentDescription().getAdditionalInfo()) + .image(talent.getImage()) + .specialization(talent.getSpecialization()) + .links(talent.getTalentLinks().stream().map(TalentLink::getLink).toList()) + .contacts(talent.getTalentContacts().stream().map(TalentContact::getContact).toList()) + .skills(talent.getTalentSkills().stream().map(TalentSkill::getSkill).toList()) + .attachedFiles(talent.getTalentAttachedFiles().stream().map(TalentAttachedFile::getAttachedFile).toList()) + .build(); + } + } 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 750c766..a8a72c2 100644 --- a/src/main/java/com/provedcode/talent/model/dto/FullTalentDTO.java +++ b/src/main/java/com/provedcode/talent/model/dto/FullTalentDTO.java @@ -1,6 +1,20 @@ package com.provedcode.talent.model.dto; -public record FullTalentDTO( +import lombok.Builder; -) { -} +import java.util.List; + +@Builder +public record FullTalentDTO ( + Long id, + String firstname, + String lastname, + String image, + String specialization, + String additionalInfo, + String bio, + List skills, + List links, + List contacts, + List attachedFiles +) {} From 775886e9d2b1951f948796e10fed52325ccb9e46 Mon Sep 17 00:00:00 2001 From: Maslyna Date: Tue, 21 Mar 2023 15:21:35 +0100 Subject: [PATCH 4/4] Refactored project structure Created pagination.properties --- .../java/com/provedcode/config/PageConfig.java | 14 +++++++++++++- .../com/provedcode/talent/TalentController.java | 3 +-- .../{ => talent}/service/TalentService.java | 2 +- .../service/impl/TalentServiceImpl.java | 4 ++-- .../service/mock/TalentServiceMock.java | 4 ++-- src/main/resources/application.properties | 3 --- src/main/resources/pagination.properties | 3 +++ 7 files changed, 22 insertions(+), 11 deletions(-) rename src/main/java/com/provedcode/{ => talent}/service/TalentService.java (89%) rename src/main/java/com/provedcode/{ => talent}/service/impl/TalentServiceImpl.java (95%) rename src/main/java/com/provedcode/{ => talent}/service/mock/TalentServiceMock.java (95%) create mode 100644 src/main/resources/pagination.properties diff --git a/src/main/java/com/provedcode/config/PageConfig.java b/src/main/java/com/provedcode/config/PageConfig.java index a93f385..ed70939 100644 --- a/src/main/java/com/provedcode/config/PageConfig.java +++ b/src/main/java/com/provedcode/config/PageConfig.java @@ -1,9 +1,21 @@ package com.provedcode.config; +import jakarta.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.PropertySource; +@EnableConfigurationProperties +@PropertySource("pagination.properties") @ConfigurationProperties(prefix = "page-config") +@Slf4j public record PageConfig( int defaultPageNum, int defaultPageSize -) {} +) { + @PostConstruct + void print() { + log.info("page-props = {} ", this); + } +} diff --git a/src/main/java/com/provedcode/talent/TalentController.java b/src/main/java/com/provedcode/talent/TalentController.java index 382fe85..0ca8e61 100644 --- a/src/main/java/com/provedcode/talent/TalentController.java +++ b/src/main/java/com/provedcode/talent/TalentController.java @@ -1,9 +1,8 @@ package com.provedcode.talent; -import com.provedcode.service.TalentService; +import com.provedcode.talent.service.TalentService; import com.provedcode.talent.model.dto.FullTalentDTO; import com.provedcode.talent.model.dto.ShortTalentDTO; -import com.provedcode.talent.model.entity.Talent; import lombok.AllArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; diff --git a/src/main/java/com/provedcode/service/TalentService.java b/src/main/java/com/provedcode/talent/service/TalentService.java similarity index 89% rename from src/main/java/com/provedcode/service/TalentService.java rename to src/main/java/com/provedcode/talent/service/TalentService.java index a7915ca..3b1147a 100644 --- a/src/main/java/com/provedcode/service/TalentService.java +++ b/src/main/java/com/provedcode/talent/service/TalentService.java @@ -1,4 +1,4 @@ -package com.provedcode.service; +package com.provedcode.talent.service; import com.provedcode.talent.model.dto.FullTalentDTO; import com.provedcode.talent.model.dto.ShortTalentDTO; diff --git a/src/main/java/com/provedcode/service/impl/TalentServiceImpl.java b/src/main/java/com/provedcode/talent/service/impl/TalentServiceImpl.java similarity index 95% rename from src/main/java/com/provedcode/service/impl/TalentServiceImpl.java rename to src/main/java/com/provedcode/talent/service/impl/TalentServiceImpl.java index 0d7443f..5f23955 100644 --- a/src/main/java/com/provedcode/service/impl/TalentServiceImpl.java +++ b/src/main/java/com/provedcode/talent/service/impl/TalentServiceImpl.java @@ -1,7 +1,7 @@ -package com.provedcode.service.impl; +package com.provedcode.talent.service.impl; import com.provedcode.config.PageConfig; -import com.provedcode.service.TalentService; +import com.provedcode.talent.service.TalentService; import com.provedcode.talent.mapper.TalentMapper; import com.provedcode.talent.model.dto.FullTalentDTO; import com.provedcode.talent.model.dto.ShortTalentDTO; diff --git a/src/main/java/com/provedcode/service/mock/TalentServiceMock.java b/src/main/java/com/provedcode/talent/service/mock/TalentServiceMock.java similarity index 95% rename from src/main/java/com/provedcode/service/mock/TalentServiceMock.java rename to src/main/java/com/provedcode/talent/service/mock/TalentServiceMock.java index 39471e7..84ba719 100644 --- a/src/main/java/com/provedcode/service/mock/TalentServiceMock.java +++ b/src/main/java/com/provedcode/talent/service/mock/TalentServiceMock.java @@ -1,7 +1,7 @@ -package com.provedcode.service.mock; +package com.provedcode.talent.service.mock; import com.provedcode.config.PageConfig; -import com.provedcode.service.TalentService; +import com.provedcode.talent.service.TalentService; import com.provedcode.talent.mapper.TalentMapper; import com.provedcode.talent.model.dto.FullTalentDTO; import com.provedcode.talent.model.dto.ShortTalentDTO; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 14daa19..9541894 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -12,6 +12,3 @@ spring.h2.console.enabled=true spring.h2.console.path=/h2 ## spring.jpa.hibernate.ddl-auto=none -## -page-config.default-page-num=0 -page-config.default-page-size=5 \ No newline at end of file diff --git a/src/main/resources/pagination.properties b/src/main/resources/pagination.properties new file mode 100644 index 0000000..7ba1262 --- /dev/null +++ b/src/main/resources/pagination.properties @@ -0,0 +1,3 @@ +## +page-config.default-page-num=0 +page-config.default-page-size=5 \ No newline at end of file