Skip to content

Commit 429719c

Browse files
committed
WIP on feat/random_user
1 parent 23396a0 commit 429719c

30 files changed

Lines changed: 700 additions & 30 deletions

README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ dummy.api.base-url=https://dummyjson.com/
8383

8484
| Method | Path | Description | Status |
8585
|--------|--------------------------|-------------|--------|
86-
| `GET` | `/random-users?count=30` | Fetch and save users from external API ||
86+
| `GET` | `/random-users?page=1&size=10&source=DUMMY` | Fetch and save users from selected external API source ||
8787
| `GET` | `/random-users/{id}` | Get user by ID ||
8888
| `POST` | `/random-users` | Create a new user ||
8989
| `PUT` | `/random-users/{id}` | Update user ||
@@ -93,7 +93,10 @@ dummy.api.base-url=https://dummyjson.com/
9393

9494
```bash
9595
# Fetch 10 users from external API and store them
96-
curl -X GET "http://localhost:8080/random-users?count=10"
96+
curl -X GET "http://localhost:8080/random-users?page=1&size=10&source=DUMMY"
97+
98+
# Fetch 10 users from randomuser.me and store them
99+
curl -X GET "http://localhost:8080/random-users?page=1&size=10&source=RANDOM_USER"
97100

98101
# Get user by ID
99102
curl -X GET "http://localhost:8080/random-users/1"
@@ -185,6 +188,8 @@ curl -X PUT "http://localhost:8080/random-users/1" \
185188

186189
- `DummyUserApi`: Retrofit client contract for DummyJSON endpoints.
187190
- `DummyUserServiceImpl`: adapter that calls `DummyUserApi`, maps DTOs, and returns `PaginatedUsers`.
191+
- `RandomUserApi`: Retrofit client contract for randomuser.me endpoints.
192+
- `RandomUserServiceImpl`: adapter that calls `RandomUserApi`, maps DTOs, and returns `PaginatedUsers`.
188193

189194
### Project Structure
190195

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.xpeho.spring_boot_java_random_user.data.converters;
22

33
import com.xpeho.spring_boot_java_random_user.data.models.api.dummy.DummyUserResultDTO;
4+
import com.xpeho.spring_boot_java_random_user.data.models.api.randomuser.RandomUserResultDTO;
45
import com.xpeho.spring_boot_java_random_user.data.models.db.User;
56
import com.xpeho.spring_boot_java_random_user.domain.entities.UserEntity;
67
import org.springframework.stereotype.Service;
@@ -52,4 +53,24 @@ public UserEntity fromApiModel(DummyUserResultDTO model) {
5253
null
5354
);
5455
}
56+
57+
// RandomUser API DTO -> Domain
58+
public UserEntity fromRandomUserApiModel(RandomUserResultDTO model) {
59+
String title = model.getName() != null ? model.getName().getTitle() : null;
60+
String first = model.getName() != null ? model.getName().getFirst() : null;
61+
String last = model.getName() != null ? model.getName().getLast() : null;
62+
String picture = model.getPicture() != null ? model.getPicture().getMedium() : null;
63+
64+
return new UserEntity(
65+
null,
66+
model.getGender(),
67+
first,
68+
last,
69+
title,
70+
model.getEmail(),
71+
model.getPhone(),
72+
picture,
73+
model.getNat()
74+
);
75+
}
5576
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.xpeho.spring_boot_java_random_user.data.models.api.randomuser;
2+
3+
public class RandomUserNameDTO {
4+
private String title;
5+
private String first;
6+
private String last;
7+
8+
public String getTitle() {
9+
return title;
10+
}
11+
12+
public void setTitle(String title) {
13+
this.title = title;
14+
}
15+
16+
public String getFirst() {
17+
return first;
18+
}
19+
20+
public void setFirst(String first) {
21+
this.first = first;
22+
}
23+
24+
public String getLast() {
25+
return last;
26+
}
27+
28+
public void setLast(String last) {
29+
this.last = last;
30+
}
31+
}
32+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.xpeho.spring_boot_java_random_user.data.models.api.randomuser;
2+
3+
public class RandomUserPictureDTO {
4+
private String medium;
5+
6+
public String getMedium() {
7+
return medium;
8+
}
9+
10+
public void setMedium(String medium) {
11+
this.medium = medium;
12+
}
13+
}
14+
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.xpeho.spring_boot_java_random_user.data.models.api.randomuser;
2+
3+
import java.util.List;
4+
5+
public class RandomUserResponseDTO {
6+
private List<RandomUserResultDTO> results;
7+
8+
public List<RandomUserResultDTO> getResults() {
9+
return results;
10+
}
11+
12+
public void setResults(List<RandomUserResultDTO> results) {
13+
this.results = results;
14+
}
15+
}
16+
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.xpeho.spring_boot_java_random_user.data.models.api.randomuser;
2+
3+
public class RandomUserResultDTO {
4+
private String gender;
5+
private RandomUserNameDTO name;
6+
private String email;
7+
private String phone;
8+
private RandomUserPictureDTO picture;
9+
private String nat;
10+
11+
public String getGender() {
12+
return gender;
13+
}
14+
15+
public void setGender(String gender) {
16+
this.gender = gender;
17+
}
18+
19+
public RandomUserNameDTO getName() {
20+
return name;
21+
}
22+
23+
public void setName(RandomUserNameDTO name) {
24+
this.name = name;
25+
}
26+
27+
public String getEmail() {
28+
return email;
29+
}
30+
31+
public void setEmail(String email) {
32+
this.email = email;
33+
}
34+
35+
public String getPhone() {
36+
return phone;
37+
}
38+
39+
public void setPhone(String phone) {
40+
this.phone = phone;
41+
}
42+
43+
public RandomUserPictureDTO getPicture() {
44+
return picture;
45+
}
46+
47+
public void setPicture(RandomUserPictureDTO picture) {
48+
this.picture = picture;
49+
}
50+
51+
public String getNat() {
52+
return nat;
53+
}
54+
55+
public void setNat(String nat) {
56+
this.nat = nat;
57+
}
58+
}
59+

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

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

33
import okhttp3.OkHttpClient;
4+
import org.springframework.beans.factory.annotation.Qualifier;
45
import org.springframework.context.annotation.Bean;
56
import org.springframework.context.annotation.Configuration;
67
import org.springframework.core.env.Environment;
@@ -9,7 +10,7 @@
910

1011
@Configuration
1112
public class DummyUserApiConfig {
12-
@Bean
13+
@Bean(name = "dummyUserRetrofit")
1314
public Retrofit dummyUserRetrofit(Environment env) {
1415
String baseUrl = env.getRequiredProperty("dummy.api.base-url");
1516
OkHttpClient client = new OkHttpClient.Builder().build();
@@ -21,7 +22,7 @@ public Retrofit dummyUserRetrofit(Environment env) {
2122
}
2223

2324
@Bean
24-
public DummyUserApi dummyUserApi(Retrofit dummyUserRetrofit) {
25+
public DummyUserApi dummyUserApi(@Qualifier("dummyUserRetrofit") Retrofit dummyUserRetrofit) {
2526
return dummyUserRetrofit.create(DummyUserApi.class);
2627
}
2728
}

src/main/java/com/xpeho/spring_boot_java_random_user/data/sources/api/DummyUserServiceImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.xpeho.spring_boot_java_random_user.data.models.api.dummy.DummyUserResponse;
55
import com.xpeho.spring_boot_java_random_user.data.models.api.dummy.DummyUserResultDTO;
66
import com.xpeho.spring_boot_java_random_user.domain.entities.PaginatedUsers;
7+
import com.xpeho.spring_boot_java_random_user.domain.entities.UserSource;
78
import com.xpeho.spring_boot_java_random_user.domain.entities.UserEntity;
89
import com.xpeho.spring_boot_java_random_user.domain.services.RemoteUserService;
910
import org.springframework.stereotype.Service;
@@ -22,6 +23,11 @@ public DummyUserServiceImpl(DummyUserApi dummyUserApi, UserConverter userConvert
2223
this.userConverter = userConverter;
2324
}
2425

26+
@Override
27+
public UserSource getSource() {
28+
return UserSource.DUMMY;
29+
}
30+
2531
@Override
2632
public PaginatedUsers fetchUsers(int page, int size) throws IOException {
2733
// Convert 1-based page index to 0-based skip offset
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.xpeho.spring_boot_java_random_user.data.sources.api;
2+
3+
import com.xpeho.spring_boot_java_random_user.data.models.api.randomuser.RandomUserResponseDTO;
4+
import retrofit2.Call;
5+
import retrofit2.http.GET;
6+
import retrofit2.http.Query;
7+
8+
public interface RandomUserApi {
9+
@GET(".")
10+
Call<RandomUserResponseDTO> getUsers(@Query("results") int results, @Query("page") int page);
11+
}
12+
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.xpeho.spring_boot_java_random_user.data.sources.api;
2+
3+
import okhttp3.OkHttpClient;
4+
import org.springframework.beans.factory.annotation.Qualifier;
5+
import org.springframework.context.annotation.Bean;
6+
import org.springframework.context.annotation.Configuration;
7+
import org.springframework.core.env.Environment;
8+
import retrofit2.Retrofit;
9+
import retrofit2.converter.gson.GsonConverterFactory;
10+
11+
@Configuration
12+
public class RandomUserApiConfig {
13+
@Bean(name = "randomUserRetrofit")
14+
public Retrofit randomUserRetrofit(Environment env) {
15+
String baseUrl = env.getRequiredProperty("randomuser.api.base-url");
16+
OkHttpClient client = new OkHttpClient.Builder().build();
17+
return new Retrofit.Builder()
18+
.baseUrl(baseUrl)
19+
.addConverterFactory(GsonConverterFactory.create())
20+
.client(client)
21+
.build();
22+
}
23+
24+
@Bean
25+
public RandomUserApi randomUserApi(@Qualifier("randomUserRetrofit") Retrofit randomUserRetrofit) {
26+
return randomUserRetrofit.create(RandomUserApi.class);
27+
}
28+
}
29+

0 commit comments

Comments
 (0)