Skip to content
Closed
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: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
<testcontainers.version>2.0.4</testcontainers.version>
<skipDocker>false</skipDocker>
<sonar.coverage.exclusions>**/*Application.java</sonar.coverage.exclusions>
<sonar.test.exclusions>**/feature/SpringIntegrationTest.java</sonar.test.exclusions>
<sonar.test.exclusions>**/features/SpringIntegrationTest.java</sonar.test.exclusions>
<sonar.coverage.jacoco.xmlReportPaths>${project.build.directory}/site/jacoco/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>
</properties>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.xpeho.spring_boot_java_random_user.config;

import com.xpeho.spring_boot_java_random_user.domain.services.RemoteUserService;
import com.xpeho.spring_boot_java_random_user.domain.services.UserService;
import com.xpeho.spring_boot_java_random_user.domain.usecases.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.List;

@Configuration
public class UseCaseConfig {

@Bean
public CreateUserUseCase createUserUseCase(UserService userService) {
return new CreateUserUseCase(userService);
}

@Bean
public DeleteUserByIdUseCase deleteUserByIdUseCase(UserService userService) {
return new DeleteUserByIdUseCase(userService);
}

@Bean
public FetchAndSaveRandomUsersUseCase fetchAndSaveRandomUsersUseCase(
UserService userService,
List<RemoteUserService> remoteUserServices) {
return new FetchAndSaveRandomUsersUseCase(userService, remoteUserServices);
}

@Bean
public FilterUsersUseCase filterUsersUseCase(UserService userService) {
return new FilterUsersUseCase(userService);
}

@Bean
public GetUserByIdUseCase getUserByIdUseCase(UserService userService) {
return new GetUserByIdUseCase(userService);
}

@Bean
public UpdateRandomUserUseCase updateRandomUserUseCase(UserService userService) {
return new UpdateRandomUserUseCase(userService);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@

import com.xpeho.spring_boot_java_random_user.data.models.api.dummy.DummyUserResultDTO;
import com.xpeho.spring_boot_java_random_user.data.models.api.randomuser.RandomUserResultDTO;
import com.xpeho.spring_boot_java_random_user.data.models.database.User;
import com.xpeho.spring_boot_java_random_user.data.models.database.UserDao;
import com.xpeho.spring_boot_java_random_user.domain.entities.UserEntity;
import org.springframework.stereotype.Service;


@Service
public class UserConverter {
// Domain -> DAO
public User toDao(UserEntity entity) {
User user = new User();
public UserDao toDao(UserEntity entity) {
UserDao user = new UserDao();
user.setId(entity.id());
user.setGender(entity.gender());
user.setFirstname(entity.firstname());
Expand All @@ -25,7 +25,7 @@ public User toDao(UserEntity entity) {
}

// DAO -> Domain
public UserEntity toDomain(User user) {
public UserEntity toDomain(UserDao user) {
return new UserEntity(
user.getId(),
user.getGender(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

@Entity
@Table(name = "users")
public class User {
public class UserDao {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
Expand All @@ -32,7 +32,7 @@ public class User {
private String nationality;

// Required by JPA
public User() {
public UserDao() {
// No initialization needed
}

Expand Down Expand Up @@ -108,3 +108,4 @@ public void setNationality(String nationality) {
this.nationality = nationality;
}
}

Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
package com.xpeho.spring_boot_java_random_user.data.services;

import com.xpeho.spring_boot_java_random_user.data.converters.UserConverter;
import com.xpeho.spring_boot_java_random_user.data.models.database.User;
import com.xpeho.spring_boot_java_random_user.data.models.database.UserDao;
import com.xpeho.spring_boot_java_random_user.data.sources.database.UserRepository;
import com.xpeho.spring_boot_java_random_user.data.sources.database.UserSpecifications;
import com.xpeho.spring_boot_java_random_user.domain.entities.PaginatedUsers;
import com.xpeho.spring_boot_java_random_user.domain.entities.UserEntity;
import com.xpeho.spring_boot_java_random_user.domain.entities.UserFilter;
import com.xpeho.spring_boot_java_random_user.domain.services.LocalUserService;
import com.xpeho.spring_boot_java_random_user.domain.services.UserService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.stereotype.Service;

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

@Service

public class UserServiceImpl implements LocalUserService {
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
private final UserConverter userConverter;

Expand All @@ -26,8 +28,8 @@ public UserServiceImpl(UserRepository userRepository, UserConverter userConverte

@Override
public List<UserEntity> saveAll(List<UserEntity> users) {
List<User> daoUsers = users.stream().map(userConverter::toDao).toList();
Iterable<User> saved = userRepository.saveAll(daoUsers);
List<UserDao> daoUsers = users.stream().map(userConverter::toDao).toList();
Iterable<UserDao> saved = userRepository.saveAll(daoUsers);
return StreamSupport.stream(saved.spliterator(), false)
.map(userConverter::toDomain)
.toList();
Expand All @@ -41,7 +43,7 @@ public Optional<UserEntity> getById(long id) {

@Override
public UserEntity save(UserEntity user) {
User savedUser = userRepository.save(userConverter.toDao(user));
UserDao savedUser = userRepository.save(userConverter.toDao(user));
return userConverter.toDomain(savedUser);
}

Expand All @@ -51,9 +53,13 @@ public void deleteById(long id) {
}

@Override
public List<UserEntity> filterUsers(UserFilter filter) {
return userRepository.findAll(UserSpecifications.byFilter(filter)).stream()
public PaginatedUsers filterUsers(UserFilter filter, int page, int size) {
PageRequest pageable = PageRequest.of(page - 1, size);
Page<UserDao> result = userRepository.findAll(UserSpecifications.byFilter(filter), pageable);
List<UserEntity> entities = result.getContent().stream()
.map(userConverter::toDomain)
.toList();
int skip = (page - 1) * size;
return new PaginatedUsers(entities, (int) result.getTotalElements(), skip, size);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.xpeho.spring_boot_java_random_user.data.sources.api.randomuser;
package com.xpeho.spring_boot_java_random_user.data.sources.api;

import com.xpeho.spring_boot_java_random_user.data.sources.api.dummy.DummyUserApi;
import com.xpeho.spring_boot_java_random_user.data.sources.api.randomuser.RandomUserApi;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand All @@ -8,7 +10,21 @@
import retrofit2.converter.gson.GsonConverterFactory;

@Configuration
public class RandomUserApiConfig {
public class UserApiConfig {

@Bean(name = "dummyUserRetrofit")
public Retrofit dummyUserRetrofit(Environment env) {
return new Retrofit.Builder()
.baseUrl(env.getRequiredProperty("dummy.api.base-url"))
.addConverterFactory(GsonConverterFactory.create())
.build();
}

@Bean
public DummyUserApi dummyUserApi(@Qualifier("dummyUserRetrofit") Retrofit dummyUserRetrofit) {
return dummyUserRetrofit.create(DummyUserApi.class);
}

@Bean(name = "randomUserRetrofit")
public Retrofit randomUserRetrofit(Environment env) {
return new Retrofit.Builder()
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.xpeho.spring_boot_java_random_user.data.sources.database;

import com.xpeho.spring_boot_java_random_user.data.models.database.User;
import com.xpeho.spring_boot_java_random_user.data.models.database.UserDao;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
public interface UserRepository extends JpaRepository<UserDao, Long>, JpaSpecificationExecutor<UserDao> {
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.xpeho.spring_boot_java_random_user.data.sources.database;

import com.xpeho.spring_boot_java_random_user.data.models.database.User;
import com.xpeho.spring_boot_java_random_user.data.models.database.UserDao;
import com.xpeho.spring_boot_java_random_user.domain.entities.UserFilter;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.Path;
Expand All @@ -15,7 +15,7 @@ public final class UserSpecifications {
private UserSpecifications() {
}

public static Specification<User> byFilter(UserFilter filter) {
public static Specification<UserDao> byFilter(UserFilter filter) {
return (user, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package com.xpeho.spring_boot_java_random_user.domain.services;

import com.xpeho.spring_boot_java_random_user.domain.entities.PaginatedUsers;
import com.xpeho.spring_boot_java_random_user.domain.entities.UserEntity;
import com.xpeho.spring_boot_java_random_user.domain.entities.UserFilter;

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

public interface LocalUserService {
public interface UserService {
List<UserEntity> saveAll(List<UserEntity> users);

Optional<UserEntity> getById(long id);
Expand All @@ -15,6 +16,7 @@ public interface LocalUserService {

void deleteById(long id);

List<UserEntity> filterUsers(UserFilter filter);
PaginatedUsers filterUsers(UserFilter filter, int page, int size);
}


Original file line number Diff line number Diff line change
@@ -1,31 +1,16 @@
package com.xpeho.spring_boot_java_random_user.domain.usecases;

import com.xpeho.spring_boot_java_random_user.domain.entities.UserEntity;
import com.xpeho.spring_boot_java_random_user.domain.entities.UserRequest;
import com.xpeho.spring_boot_java_random_user.domain.services.LocalUserService;
import org.springframework.stereotype.Service;
import com.xpeho.spring_boot_java_random_user.domain.services.UserService;

@Service
public class CreateUserUseCase {
private final LocalUserService userService;
private final UserService userService;

public CreateUserUseCase(LocalUserService userService) {
public CreateUserUseCase(UserService userService) {
this.userService = userService;
}

public UserEntity execute(UserRequest user) {
UserEntity userToCreate = new UserEntity(
null,
user.gender(),
user.firstname(),
user.lastname(),
user.civility(),
user.email(),
user.phone(),
user.picture(),
user.nat()
);

return userService.save(userToCreate);
public UserEntity execute(UserEntity user) {
return userService.save(user);
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package com.xpeho.spring_boot_java_random_user.domain.usecases;

import com.xpeho.spring_boot_java_random_user.domain.services.LocalUserService;
import org.springframework.stereotype.Service;
import com.xpeho.spring_boot_java_random_user.domain.services.UserService;

@Service
public class DeleteUserByIdUseCase {
private final LocalUserService userService;
private final UserService userService;

public DeleteUserByIdUseCase(LocalUserService userService) {
public DeleteUserByIdUseCase(UserService userService) {
this.userService = userService;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,24 +2,22 @@

import com.xpeho.spring_boot_java_random_user.domain.entities.PaginatedUsers;
import com.xpeho.spring_boot_java_random_user.domain.enums.UserSource;
import com.xpeho.spring_boot_java_random_user.domain.services.LocalUserService;
import com.xpeho.spring_boot_java_random_user.domain.services.RemoteUserService;
import org.springframework.stereotype.Service;
import com.xpeho.spring_boot_java_random_user.domain.services.UserService;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

@Service
public class FetchAndSaveRandomUsersUseCase {

private final LocalUserService localUserService;
private final UserService userService;
private final Map<UserSource, RemoteUserService> remoteUserServices;

public FetchAndSaveRandomUsersUseCase(LocalUserService localUserService, List<RemoteUserService> remoteUserServices) {
this.localUserService = localUserService;
public FetchAndSaveRandomUsersUseCase(UserService userService, List<RemoteUserService> remoteUserServices) {
this.userService = userService;
this.remoteUserServices = remoteUserServices.stream()
.collect(Collectors.toMap(RemoteUserService::getSource, Function.identity()));
}
Expand All @@ -30,7 +28,7 @@ public PaginatedUsers execute(int page, int size, UserSource source) throws IOEx
throw new IllegalStateException("No remote service configured for source: " + source);
}
PaginatedUsers response = remoteUserService.fetchUsers(page, size);
localUserService.saveAll(response.data());
userService.saveAll(response.data());
return response;
}
}
Loading
Loading