11package com .xpeho .spring_boot_java_random_user .data .services ;
22
33import 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 ;
5+ import com .xpeho .spring_boot_java_random_user .data .sources .api .RemoteUserService ;
56import com .xpeho .spring_boot_java_random_user .data .sources .database .UserRepository ;
67import com .xpeho .spring_boot_java_random_user .data .sources .database .UserSpecifications ;
8+ import com .xpeho .spring_boot_java_random_user .domain .entities .PaginatedUsers ;
79import com .xpeho .spring_boot_java_random_user .domain .entities .UserEntity ;
810import com .xpeho .spring_boot_java_random_user .domain .entities .UserFilter ;
9- import com .xpeho .spring_boot_java_random_user .domain .services .LocalUserService ;
11+ import com .xpeho .spring_boot_java_random_user .domain .enums .UserSource ;
12+ import com .xpeho .spring_boot_java_random_user .domain .services .UserService ;
13+ import org .springframework .data .domain .Page ;
14+ import org .springframework .data .domain .Pageable ;
1015import org .springframework .stereotype .Service ;
1116
17+ import java .io .IOException ;
1218import java .util .List ;
19+ import java .util .Map ;
1320import java .util .Optional ;
21+ import java .util .function .Function ;
22+ import java .util .stream .Collectors ;
1423import java .util .stream .StreamSupport ;
1524
1625@ Service
17-
18- public class UserServiceImpl implements LocalUserService {
26+ public class UserServiceImpl implements UserService {
1927 private final UserRepository userRepository ;
2028 private final UserConverter userConverter ;
29+ private final Map <UserSource , RemoteUserService > remoteUserServices ;
2130
22- public UserServiceImpl (UserRepository userRepository , UserConverter userConverter ) {
31+ public UserServiceImpl (
32+ UserRepository userRepository ,
33+ UserConverter userConverter ,
34+ List <RemoteUserService > remoteUserServices
35+ ) {
2336 this .userRepository = userRepository ;
2437 this .userConverter = userConverter ;
38+ this .remoteUserServices = remoteUserServices .stream ()
39+ .collect (Collectors .toMap (RemoteUserService ::getSource , Function .identity ()));
2540 }
2641
2742 @ Override
2843 public List <UserEntity > saveAll (List <UserEntity > users ) {
29- List <User > daoUsers = users .stream ().map (userConverter ::toDao ).toList ();
30- Iterable <User > saved = userRepository .saveAll (daoUsers );
44+ List <UserDAO > daoUserDAOS = users .stream ().map (userConverter ::toDao ).toList ();
45+ Iterable <UserDAO > saved = userRepository .saveAll (daoUserDAOS );
3146 return StreamSupport .stream (saved .spliterator (), false )
3247 .map (userConverter ::toDomain )
3348 .toList ();
@@ -41,8 +56,8 @@ public Optional<UserEntity> getById(long id) {
4156
4257 @ Override
4358 public UserEntity save (UserEntity user ) {
44- User savedUser = userRepository .save (userConverter .toDao (user ));
45- return userConverter .toDomain (savedUser );
59+ UserDAO savedUserDAO = userRepository .save (userConverter .toDao (user ));
60+ return userConverter .toDomain (savedUserDAO );
4661 }
4762
4863 @ Override
@@ -51,9 +66,19 @@ public void deleteById(long id) {
5166 }
5267
5368 @ Override
54- public List <UserEntity > filterUsers (UserFilter filter ) {
55- return userRepository .findAll (UserSpecifications .byFilter (filter )).stream ()
56- .map (userConverter ::toDomain )
57- .toList ();
69+ public Page <UserEntity > filterUsers (UserFilter filter , Pageable pageable ) {
70+ return userRepository .findAll (UserSpecifications .byFilter (filter ), pageable )
71+ .map (userConverter ::toDomain );
72+ }
73+
74+ @ Override
75+ public PaginatedUsers fetchAndSaveUsers (int page , int size , UserSource source ) throws IOException {
76+ RemoteUserService remoteService = remoteUserServices .get (source );
77+ if (remoteService == null ) {
78+ throw new IllegalStateException ("No remote service configured for source: " + source );
79+ }
80+ PaginatedUsers response = remoteService .fetchUsers (page , size );
81+ saveAll (response .data ());
82+ return response ;
5883 }
5984}
0 commit comments