Skip to content

Commit 514c7a3

Browse files
committed
fix(architecture): adapt for clean architecture
1 parent b57bea2 commit 514c7a3

37 files changed

Lines changed: 373 additions & 330 deletions

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
<testcontainers.version>2.0.4</testcontainers.version>
3232
<skipDocker>false</skipDocker>
3333
<sonar.coverage.exclusions>**/*Application.java</sonar.coverage.exclusions>
34-
<sonar.test.exclusions>**/feature/SpringIntegrationTest.java</sonar.test.exclusions>
34+
<sonar.test.exclusions>**/features/SpringIntegrationTest.java</sonar.test.exclusions>
3535
<sonar.coverage.jacoco.xmlReportPaths>${project.build.directory}/site/jacoco/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths>
3636
</properties>
3737

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.xpeho.spring_boot_java_random_user.config;
2+
3+
import com.xpeho.spring_boot_java_random_user.domain.services.RemoteUserService;
4+
import com.xpeho.spring_boot_java_random_user.domain.services.UserService;
5+
import com.xpeho.spring_boot_java_random_user.domain.usecases.*;
6+
import org.springframework.context.annotation.Bean;
7+
import org.springframework.context.annotation.Configuration;
8+
9+
import java.util.List;
10+
11+
@Configuration
12+
public class UseCaseConfig {
13+
14+
@Bean
15+
public CreateUserUseCase createUserUseCase(UserService userService) {
16+
return new CreateUserUseCase(userService);
17+
}
18+
19+
@Bean
20+
public DeleteUserByIdUseCase deleteUserByIdUseCase(UserService userService) {
21+
return new DeleteUserByIdUseCase(userService);
22+
}
23+
24+
@Bean
25+
public FetchAndSaveRandomUsersUseCase fetchAndSaveRandomUsersUseCase(
26+
UserService userService,
27+
List<RemoteUserService> remoteUserServices) {
28+
return new FetchAndSaveRandomUsersUseCase(userService, remoteUserServices);
29+
}
30+
31+
@Bean
32+
public FilterUsersUseCase filterUsersUseCase(UserService userService) {
33+
return new FilterUsersUseCase(userService);
34+
}
35+
36+
@Bean
37+
public GetUserByIdUseCase getUserByIdUseCase(UserService userService) {
38+
return new GetUserByIdUseCase(userService);
39+
}
40+
41+
@Bean
42+
public UpdateRandomUserUseCase updateRandomUserUseCase(UserService userService) {
43+
return new UpdateRandomUserUseCase(userService);
44+
}
45+
}

src/main/java/com/xpeho/spring_boot_java_random_user/data/converters/UserConverter.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22

33
import com.xpeho.spring_boot_java_random_user.data.models.api.dummy.DummyUserResultDTO;
44
import com.xpeho.spring_boot_java_random_user.data.models.api.randomuser.RandomUserResultDTO;
5-
import com.xpeho.spring_boot_java_random_user.data.models.database.User;
5+
import com.xpeho.spring_boot_java_random_user.data.models.database.UserDao;
66
import com.xpeho.spring_boot_java_random_user.domain.entities.UserEntity;
77
import org.springframework.stereotype.Service;
88

99

1010
@Service
1111
public class UserConverter {
1212
// Domain -> DAO
13-
public User toDao(UserEntity entity) {
14-
User user = new User();
13+
public UserDao toDao(UserEntity entity) {
14+
UserDao user = new UserDao();
1515
user.setId(entity.id());
1616
user.setGender(entity.gender());
1717
user.setFirstname(entity.firstname());
@@ -25,7 +25,7 @@ public User toDao(UserEntity entity) {
2525
}
2626

2727
// DAO -> Domain
28-
public UserEntity toDomain(User user) {
28+
public UserEntity toDomain(UserDao user) {
2929
return new UserEntity(
3030
user.getId(),
3131
user.getGender(),

src/main/java/com/xpeho/spring_boot_java_random_user/data/models/database/User.java renamed to src/main/java/com/xpeho/spring_boot_java_random_user/data/models/database/UserDao.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
@Entity
1111
@Table(name = "users")
12-
public class User {
12+
public class UserDao {
1313
@Id
1414
@GeneratedValue(strategy = GenerationType.IDENTITY)
1515
@Column(name = "id")
@@ -32,7 +32,7 @@ public class User {
3232
private String nationality;
3333

3434
// Required by JPA
35-
public User() {
35+
public UserDao() {
3636
// No initialization needed
3737
}
3838

@@ -108,3 +108,4 @@ public void setNationality(String nationality) {
108108
this.nationality = nationality;
109109
}
110110
}
111+

src/main/java/com/xpeho/spring_boot_java_random_user/data/services/UserServiceImpl.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
package com.xpeho.spring_boot_java_random_user.data.services;
22

33
import com.xpeho.spring_boot_java_random_user.data.converters.UserConverter;
4-
import com.xpeho.spring_boot_java_random_user.data.models.database.User;
4+
import com.xpeho.spring_boot_java_random_user.data.models.database.UserDao;
55
import com.xpeho.spring_boot_java_random_user.data.sources.database.UserRepository;
66
import com.xpeho.spring_boot_java_random_user.data.sources.database.UserSpecifications;
7+
import com.xpeho.spring_boot_java_random_user.domain.entities.PaginatedUsers;
78
import com.xpeho.spring_boot_java_random_user.domain.entities.UserEntity;
89
import com.xpeho.spring_boot_java_random_user.domain.entities.UserFilter;
9-
import com.xpeho.spring_boot_java_random_user.domain.services.LocalUserService;
10+
import com.xpeho.spring_boot_java_random_user.domain.services.UserService;
11+
import org.springframework.data.domain.Page;
12+
import org.springframework.data.domain.PageRequest;
1013
import org.springframework.stereotype.Service;
1114

1215
import java.util.List;
1316
import java.util.Optional;
1417
import java.util.stream.StreamSupport;
1518

1619
@Service
17-
18-
public class UserServiceImpl implements LocalUserService {
20+
public class UserServiceImpl implements UserService {
1921
private final UserRepository userRepository;
2022
private final UserConverter userConverter;
2123

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

2729
@Override
2830
public List<UserEntity> saveAll(List<UserEntity> users) {
29-
List<User> daoUsers = users.stream().map(userConverter::toDao).toList();
30-
Iterable<User> saved = userRepository.saveAll(daoUsers);
31+
List<UserDao> daoUsers = users.stream().map(userConverter::toDao).toList();
32+
Iterable<UserDao> saved = userRepository.saveAll(daoUsers);
3133
return StreamSupport.stream(saved.spliterator(), false)
3234
.map(userConverter::toDomain)
3335
.toList();
@@ -41,7 +43,7 @@ public Optional<UserEntity> getById(long id) {
4143

4244
@Override
4345
public UserEntity save(UserEntity user) {
44-
User savedUser = userRepository.save(userConverter.toDao(user));
46+
UserDao savedUser = userRepository.save(userConverter.toDao(user));
4547
return userConverter.toDomain(savedUser);
4648
}
4749

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

5355
@Override
54-
public List<UserEntity> filterUsers(UserFilter filter) {
55-
return userRepository.findAll(UserSpecifications.byFilter(filter)).stream()
56+
public PaginatedUsers filterUsers(UserFilter filter, int page, int size) {
57+
PageRequest pageable = PageRequest.of(page - 1, size);
58+
Page<UserDao> result = userRepository.findAll(UserSpecifications.byFilter(filter), pageable);
59+
List<UserEntity> entities = result.getContent().stream()
5660
.map(userConverter::toDomain)
5761
.toList();
62+
int skip = (page - 1) * size;
63+
return new PaginatedUsers(entities, (int) result.getTotalElements(), skip, size);
5864
}
5965
}

src/main/java/com/xpeho/spring_boot_java_random_user/data/sources/api/randomuser/RandomUserApiConfig.java renamed to src/main/java/com/xpeho/spring_boot_java_random_user/data/sources/api/UserApiConfig.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
package com.xpeho.spring_boot_java_random_user.data.sources.api.randomuser;
1+
package com.xpeho.spring_boot_java_random_user.data.sources.api;
22

3+
import com.xpeho.spring_boot_java_random_user.data.sources.api.dummy.DummyUserApi;
4+
import com.xpeho.spring_boot_java_random_user.data.sources.api.randomuser.RandomUserApi;
35
import org.springframework.beans.factory.annotation.Qualifier;
46
import org.springframework.context.annotation.Bean;
57
import org.springframework.context.annotation.Configuration;
@@ -8,7 +10,21 @@
810
import retrofit2.converter.gson.GsonConverterFactory;
911

1012
@Configuration
11-
public class RandomUserApiConfig {
13+
public class UserApiConfig {
14+
15+
@Bean(name = "dummyUserRetrofit")
16+
public Retrofit dummyUserRetrofit(Environment env) {
17+
return new Retrofit.Builder()
18+
.baseUrl(env.getRequiredProperty("dummy.api.base-url"))
19+
.addConverterFactory(GsonConverterFactory.create())
20+
.build();
21+
}
22+
23+
@Bean
24+
public DummyUserApi dummyUserApi(@Qualifier("dummyUserRetrofit") Retrofit dummyUserRetrofit) {
25+
return dummyUserRetrofit.create(DummyUserApi.class);
26+
}
27+
1228
@Bean(name = "randomUserRetrofit")
1329
public Retrofit randomUserRetrofit(Environment env) {
1430
return new Retrofit.Builder()

src/main/java/com/xpeho/spring_boot_java_random_user/data/sources/api/dummy/DummyUserApiConfig.java

Lines changed: 0 additions & 25 deletions
This file was deleted.
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.xpeho.spring_boot_java_random_user.data.sources.database;
22

3-
import com.xpeho.spring_boot_java_random_user.data.models.database.User;
3+
import com.xpeho.spring_boot_java_random_user.data.models.database.UserDao;
44
import org.springframework.data.jpa.repository.JpaRepository;
55
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
66

7-
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
7+
public interface UserRepository extends JpaRepository<UserDao, Long>, JpaSpecificationExecutor<UserDao> {
88
}

src/main/java/com/xpeho/spring_boot_java_random_user/data/sources/database/UserSpecifications.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.xpeho.spring_boot_java_random_user.data.sources.database;
22

3-
import com.xpeho.spring_boot_java_random_user.data.models.database.User;
3+
import com.xpeho.spring_boot_java_random_user.data.models.database.UserDao;
44
import com.xpeho.spring_boot_java_random_user.domain.entities.UserFilter;
55
import jakarta.persistence.criteria.CriteriaBuilder;
66
import jakarta.persistence.criteria.Path;
@@ -15,7 +15,7 @@ public final class UserSpecifications {
1515
private UserSpecifications() {
1616
}
1717

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

src/main/java/com/xpeho/spring_boot_java_random_user/domain/services/LocalUserService.java renamed to src/main/java/com/xpeho/spring_boot_java_random_user/domain/services/UserService.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package com.xpeho.spring_boot_java_random_user.domain.services;
22

3+
import com.xpeho.spring_boot_java_random_user.domain.entities.PaginatedUsers;
34
import com.xpeho.spring_boot_java_random_user.domain.entities.UserEntity;
45
import com.xpeho.spring_boot_java_random_user.domain.entities.UserFilter;
56

67
import java.util.List;
78
import java.util.Optional;
89

9-
public interface LocalUserService {
10+
public interface UserService {
1011
List<UserEntity> saveAll(List<UserEntity> users);
1112

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

1617
void deleteById(long id);
1718

18-
List<UserEntity> filterUsers(UserFilter filter);
19+
PaginatedUsers filterUsers(UserFilter filter, int page, int size);
1920
}
2021

22+

0 commit comments

Comments
 (0)