Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/main/java/com/provedcode/ProvedCodeApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
21 changes: 21 additions & 0 deletions src/main/java/com/provedcode/config/PageConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +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);
}
}
14 changes: 14 additions & 0 deletions src/main/java/com/provedcode/handlers/TalentExceptionHandler.java
Original file line number Diff line number Diff line change
@@ -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());
}
}
42 changes: 18 additions & 24 deletions src/main/java/com/provedcode/talent/TalentController.java
Original file line number Diff line number Diff line change
@@ -1,35 +1,29 @@
package com.provedcode.talent;

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.service.TalentService;
import com.provedcode.talent.model.dto.FullTalentDTO;
import com.provedcode.talent.model.dto.ShortTalentDTO;
import lombok.AllArgsConstructor;
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.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import java.util.stream.Collectors;
import java.util.List;
import java.util.Optional;

@RestController
@AllArgsConstructor
public class TalentController {
TalentRepository 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}")
FullTalentDTO getTalent(@PathVariable("id") long id) {
return talentService.getTalentById(id);
}

@GetMapping("/api/talents")
@ResponseStatus(HttpStatus.OK)
List<ShortTalentDTO> getTalents(@RequestParam(value = "page") Optional<Integer> page,
@RequestParam(value = "size") Optional<Integer> size) {
return talentService.getTalentsPage(page, size);
}
}
35 changes: 35 additions & 0 deletions src/main/java/com/provedcode/talent/mapper/TalentMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
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.*;

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();
}

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();
}

}
Original file line number Diff line number Diff line change
@@ -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 {
}
20 changes: 20 additions & 0 deletions src/main/java/com/provedcode/talent/model/dto/FullTalentDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.provedcode.talent.model.dto;

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<String> skills,
List<String> links,
List<String> contacts,
List<String> attachedFiles
) {}
16 changes: 16 additions & 0 deletions src/main/java/com/provedcode/talent/model/dto/ShortTalentDTO.java
Original file line number Diff line number Diff line change
@@ -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<String> skills
) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,5 @@ public class Talent {
private List<TalentContact> talentContacts = new ArrayList<>();
@OneToMany(fetch = FetchType.EAGER, mappedBy = "talent", orphanRemoval = true)
private List<TalentAttachedFile> talentAttachedFiles = new ArrayList<>();

}
11 changes: 10 additions & 1 deletion src/main/java/com/provedcode/talent/repo/TalentRepository.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,16 @@
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<Talent, Long> {
import java.util.List;
import java.util.Optional;

public interface TalentRepository {

List<Talent> getTalentsPage(PageRequest page);

Optional<Talent> findById(Long aLong);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
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;
import java.util.Optional;

public interface TalentEntityRepository extends
JpaRepository<Talent, Long>,
TalentRepository {
@Transactional(readOnly = true)
default List<Talent> getTalents() {
return findAll();
}

@Override
@Transactional(readOnly = true)
default List<Talent> getTalentsPage(PageRequest page) {
return findAll(page).stream().toList();
}

@Override
Optional<Talent> findById(Long aLong);
}
14 changes: 14 additions & 0 deletions src/main/java/com/provedcode/talent/service/TalentService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.provedcode.talent.service;

import com.provedcode.talent.model.dto.FullTalentDTO;
import com.provedcode.talent.model.dto.ShortTalentDTO;

import java.util.List;
import java.util.Optional;


public interface TalentService {
List<ShortTalentDTO> getTalentsPage(Optional<Integer> page, Optional<Integer> size);

FullTalentDTO getTalentById(long id);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.provedcode.talent.service.impl;

import com.provedcode.config.PageConfig;
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;
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
public class TalentServiceImpl implements TalentService {
TalentMapper talentMapper;
TalentRepository talentRepository;
PageConfig pageConfig;

@Override
public List<ShortTalentDTO> getTalentsPage(Optional<Integer> page, Optional<Integer> 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 FullTalentDTO getTalentById(long id) {
Optional<Talent> talent = talentRepository.findById(id);
if (talent.isEmpty()){
throw new ResponseStatusException(NOT_FOUND, String.format("talent with id = %d not found", id));
}
return talentMapper.talentToFullTalentDTO(talent.get());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package com.provedcode.talent.service.mock;

import com.provedcode.config.PageConfig;
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;
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<ShortTalentDTO> getTalentsPage(Optional<Integer> page, Optional<Integer> 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 FullTalentDTO getTalentById(long id) {
Optional<Talent> talent = talentRepository.findById(id);
if (talent.isEmpty()){
throw new ResponseStatusException(NOT_FOUND, String.format("talent with id = %d not found", id));
}
return talentMapper.talentToFullTalentDTO(talent.get());
}
}
3 changes: 3 additions & 0 deletions src/main/resources/pagination.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
##
page-config.default-page-num=0
page-config.default-page-size=5