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
1 change: 0 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
package com.provedcode.config;

import jakarta.annotation.PostConstruct;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

@EnableConfigurationProperties
@Validated
@ConfigurationProperties(prefix = "page-config")
@Slf4j
public record PageConfig(
public record PageProperties(
int defaultPageNum,
int defaultPageSize
) {
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/com/provedcode/config/PropsConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.provedcode.config;

import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@EnableConfigurationProperties(PageProperties.class)
@PropertySource("pagination.properties")
@Configuration
public class PropsConfig {
}
1 change: 1 addition & 0 deletions src/main/java/com/provedcode/config/SecurityConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(c -> c
.requestMatchers("/actuator/health").permitAll() // for DevOps
.requestMatchers(antMatcher("/h2/**")).permitAll()
.requestMatchers(antMatcher("/api/**")).permitAll()
.anyRequest().denyAll()
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/provedcode/talent/TalentController.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
import com.provedcode.talent.model.dto.FullTalentDTO;
import com.provedcode.talent.model.dto.ShortTalentDTO;
import lombok.AllArgsConstructor;
import org.springframework.data.domain.Page;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

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

@RestController
Expand All @@ -22,7 +22,7 @@ FullTalentDTO getTalent(@PathVariable("id") long id) {

@GetMapping("/api/talents")
@ResponseStatus(HttpStatus.OK)
List<ShortTalentDTO> getTalents(@RequestParam(value = "page") Optional<Integer> page,
Page<ShortTalentDTO> getTalents(@RequestParam(value = "page") Optional<Integer> page,
@RequestParam(value = "size") Optional<Integer> size) {
return talentService.getTalentsPage(page, size);
}
Expand Down
27 changes: 2 additions & 25 deletions src/main/java/com/provedcode/talent/mapper/TalentMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,31 +5,8 @@
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();
}
ShortTalentDTO talentToShortTalentDTO(Talent talent);
FullTalentDTO talentToFullTalentDTO(Talent talent);

}
Original file line number Diff line number Diff line change
@@ -1,8 +1,38 @@
package com.provedcode.talent.mapper.impl;

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.*;
import org.springframework.stereotype.Component;

@Component
public class TalentMapperImpl implements TalentMapper {
@Override
public 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();
}
@Override
public 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
@@ -1,16 +1,14 @@
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;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

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

public interface TalentRepository {

List<Talent> getTalentsPage(PageRequest page);
Page<Talent> findAll(Pageable pageable);

Optional<Talent> findById(Long aLong);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,19 @@

import com.provedcode.talent.model.entity.Talent;
import com.provedcode.talent.repo.TalentRepository;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
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();
}

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

@Override
Optional<Talent> findById(Long aLong);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@

import com.provedcode.talent.model.dto.FullTalentDTO;
import com.provedcode.talent.model.dto.ShortTalentDTO;
import org.springframework.data.domain.Page;

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


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

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

import com.provedcode.config.PageConfig;
import com.provedcode.config.PageProperties;
import com.provedcode.talent.service.TalentService;
import com.provedcode.talent.mapper.TalentMapper;
import com.provedcode.talent.model.dto.FullTalentDTO;
Expand All @@ -9,12 +9,15 @@
import com.provedcode.talent.repo.TalentRepository;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
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 java.util.stream.Collectors;

import static org.springframework.http.HttpStatus.BAD_REQUEST;
import static org.springframework.http.HttpStatus.NOT_FOUND;
Expand All @@ -25,20 +28,19 @@
public class TalentServiceImpl implements TalentService {
TalentMapper talentMapper;
TalentRepository talentRepository;
PageConfig pageConfig;
PageProperties pageProperties;

@Override
public List<ShortTalentDTO> getTalentsPage(Optional<Integer> page, Optional<Integer> size) {
if (page.orElse(pageConfig.defaultPageNum()) < 0) {
public Page<ShortTalentDTO> getTalentsPage(Optional<Integer> page, Optional<Integer> size) {
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(pageConfig.defaultPageSize()) <= 0) {
if (size.orElse(pageProperties.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();
return talentRepository.findAll(PageRequest.of(page.orElse(pageProperties.defaultPageNum()), size.orElse(pageProperties.defaultPageSize())))
.map(talentMapper::talentToShortTalentDTO);

}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.provedcode.talent.service.mock;

import com.provedcode.config.PageConfig;
import com.provedcode.config.PageProperties;
import com.provedcode.talent.service.TalentService;
import com.provedcode.talent.mapper.TalentMapper;
import com.provedcode.talent.model.dto.FullTalentDTO;
Expand All @@ -9,10 +9,11 @@
import com.provedcode.talent.repo.TalentRepository;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
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;
Expand All @@ -24,20 +25,20 @@
public class TalentServiceMock implements TalentService {
TalentMapper talentMapper;
TalentRepository talentRepository;
PageConfig pageConfig;
PageProperties pageProperties;

@Override
public List<ShortTalentDTO> getTalentsPage(Optional<Integer> page, Optional<Integer> size) {
if (page.orElse(pageConfig.defaultPageNum()) < 0) {
public Page<ShortTalentDTO> getTalentsPage(Optional<Integer> page, Optional<Integer> size) {
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(pageConfig.defaultPageSize()) <= 0) {
if (size.orElse(pageProperties.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();
return new PageImpl<>(talentRepository.findAll(
PageRequest.of(page.orElse(pageProperties.defaultPageNum()), size.orElse(pageProperties.defaultPageSize())))
.stream().map(talentMapper::talentToShortTalentDTO)
.toList());
}

@Override
Expand Down
2 changes: 2 additions & 0 deletions src/main/resources/application-dev.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
spring.datasource.username=sa
spring.datasource.url=jdbc:h2:mem:../sampleDB
6 changes: 6 additions & 0 deletions src/main/resources/application-prod.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
spring.datasource.username=${DB_LOGIN}
spring.datasource.password=${DB_PASSWORD}
spring.datasource.url=${DB_URL}
spring.jpa.hibernate.ddl-auto=none
spring.sql.init.mode=always
spring.sql.init.platform=h2
13 changes: 4 additions & 9 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
server.port=28852
management.endpoints.web.exposure.include=*
management.endpoint.shutdown.enabled=true
spring.profiles.active=${SPRING_PROFILES_ACTIVE:dev}
##
server.port=8080
##
spring.jackson.property-naming-strategy=SNAKE_CASE
##
logging.level.cinema.controller=info
##
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:/sampleDB
spring.h2.console.enabled=true
spring.h2.console.path=/h2
##
spring.jpa.hibernate.ddl-auto=none
## BUG WAS HERE
page-config.default-page-num=0
page-config.default-page-size=5
spring.jpa.hibernate.ddl-auto=update
Loading