Skip to content

Commit 5a7152f

Browse files
committed
feat(postUser): create an endpoint for creating a new user
1 parent 8435e14 commit 5a7152f

6 files changed

Lines changed: 121 additions & 5 deletions

File tree

README.md

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,11 +164,28 @@ GET /random-users?count=500
164164

165165
```http
166166
PUT /random-users/{id}
167-
Content-Type: application/json
168167
```
169168

170169
Example body:
171170

171+
```json
172+
{
173+
"gender": "female",
174+
"firstname": "Albert",
175+
"lastname": "Bing",
176+
"civility": "Mrs",
177+
"email": "albert.bing@example.com",
178+
"phone": "123456789",
179+
"picture": "pic.jpg",
180+
"nat": "FR"
181+
}
182+
```
183+
#### Create a new user
184+
```http
185+
POST /random-users
186+
```
187+
Example body:
188+
172189
```json
173190
{
174191
"gender": "female",
@@ -317,7 +334,7 @@ This project consumes the public **Random User Generator** API:
317334
- [ ] [Add this endpoint get /user/{id}](https://github.com/XPEHO/spring_boot_java_random_user/issues/8)
318335
- [X] [Add this endpoint put /user/{id}](https://github.com/XPEHO/spring_boot_java_random_user/issues/9)
319336
- [ ] [Add this endpoint delete /user/{id}](https://github.com/XPEHO/spring_boot_java_random_user/issues/10)
320-
- [ ] [Add this endpoint post /user](https://github.com/XPEHO/spring_boot_java_random_user/issues/11)
337+
- [x] [Add this endpoint post /user](https://github.com/XPEHO/spring_boot_java_random_user/issues/11)
321338

322339
---
323340

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.xpeho.spring_boot_java_random_user.domain.usecases;
2+
3+
import com.xpeho.spring_boot_java_random_user.domain.entities.UserEntity;
4+
import com.xpeho.spring_boot_java_random_user.domain.entities.UserRequest;
5+
import com.xpeho.spring_boot_java_random_user.domain.services.UserService;
6+
import org.springframework.stereotype.Service;
7+
8+
@Service
9+
public class CreateUserUseCase {
10+
private final UserService userService;
11+
12+
public CreateUserUseCase(UserService userService) {
13+
this.userService = userService;
14+
}
15+
16+
public UserEntity execute(UserRequest user) {
17+
UserEntity userToCreate = new UserEntity(
18+
null,
19+
user.gender(),
20+
user.firstname(),
21+
user.lastname(),
22+
user.civility(),
23+
user.email(),
24+
user.phone(),
25+
user.picture(),
26+
user.nat()
27+
);
28+
29+
return userService.save(userToCreate);
30+
}
31+
}

src/main/java/com/xpeho/spring_boot_java_random_user/presentation/controllers/UserController.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.springframework.web.bind.annotation.GetMapping;
1010
import org.springframework.web.bind.annotation.PathVariable;
1111
import org.springframework.web.bind.annotation.PutMapping;
12+
import org.springframework.web.bind.annotation.PostMapping;
1213
import org.springframework.web.bind.annotation.RequestBody;
1314
import org.springframework.web.bind.annotation.RequestMapping;
1415
import org.springframework.web.bind.annotation.RequestParam;
@@ -59,4 +60,16 @@ ResponseEntity<UserEntity> updateRandomUser(
5960
@RequestBody
6061
UserRequest user
6162
);
63+
64+
@PostMapping("")
65+
@Operation(
66+
summary = "Create a user",
67+
description = "Creates a new user in the database.",
68+
parameters = {
69+
@Parameter(name = "UserRequest", description = "User data to persist")
70+
}
71+
)
72+
@ApiResponse(responseCode = "201", description = "User successfully created")
73+
@ApiResponse(responseCode = "500", description = "Internal server error")
74+
ResponseEntity<UserEntity> createUser(@RequestBody UserRequest user);
6275
}

src/main/java/com/xpeho/spring_boot_java_random_user/presentation/handlers/UserHandler.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
import com.xpeho.spring_boot_java_random_user.domain.entities.UserEntity;
44
import com.xpeho.spring_boot_java_random_user.domain.entities.UserRequest;
55
import com.xpeho.spring_boot_java_random_user.domain.exceptions.UserNotFoundException;
6+
import com.xpeho.spring_boot_java_random_user.domain.usecases.CreateUserUseCase;
67
import com.xpeho.spring_boot_java_random_user.domain.usecases.FetchAndSaveRandomUsersUseCase;
78
import com.xpeho.spring_boot_java_random_user.domain.usecases.UpdateRandomUserUseCase;
89
import com.xpeho.spring_boot_java_random_user.presentation.controllers.UserController;
910
import org.slf4j.Logger;
1011
import org.slf4j.LoggerFactory;
1112
import org.springframework.http.HttpStatus;
1213
import org.springframework.http.ResponseEntity;
14+
import org.springframework.web.bind.annotation.RequestBody;
1315
import org.springframework.web.bind.annotation.RestController;
1416

1517
import java.io.IOException;
@@ -24,14 +26,17 @@ public class UserHandler implements UserController {
2426

2527
private final FetchAndSaveRandomUsersUseCase fetchAndSaveRandomUsersUseCase;
2628
private final UpdateRandomUserUseCase updateRandomUserUseCase;
27-
29+
private final CreateUserUseCase createUserUseCase;
2830
public UserHandler(
2931
FetchAndSaveRandomUsersUseCase fetchAndSaveRandomUsersUseCase,
30-
UpdateRandomUserUseCase updateRandomUserUseCase
32+
UpdateRandomUserUseCase updateRandomUserUseCase,
33+
CreateUserUseCase createUserUseCase
3134
) {
3235
this.fetchAndSaveRandomUsersUseCase = fetchAndSaveRandomUsersUseCase;
3336
this.updateRandomUserUseCase = updateRandomUserUseCase;
37+
this.createUserUseCase = createUserUseCase;
3438
}
39+
3540

3641
@Override
3742
public ResponseEntity<List<UserEntity>> getRandomUsers(int count) {
@@ -55,4 +60,10 @@ public ResponseEntity<UserEntity> updateRandomUser(int id, UserRequest user) {
5560
}
5661
}
5762

63+
64+
@Override
65+
public ResponseEntity<UserEntity> createUser(@RequestBody UserRequest user) {
66+
UserEntity createdUser = createUserUseCase.execute(user);
67+
return ResponseEntity.status(HttpStatus.CREATED).body(createdUser);
68+
}
5869
}

src/test/java/com/xpeho/spring_boot_java_random_user/data/services/UserServiceImplTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ void shouldSaveMappedUserAndReturnMappedDomainEntity() {
6565
UserEntity input = new UserEntity(3L, "female", "Alice", "Smith", "Mrs", "alice@smith.com", "5678", "new-pic.jpg", "US");
6666

6767
User daoToSave = new User();
68-
daoToSave.setId(3L);
6968
daoToSave.setFirstname("Alice");
7069

7170
User savedDao = new User();
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.domain.usecases;
2+
3+
import com.xpeho.spring_boot_java_random_user.domain.entities.UserEntity;
4+
import com.xpeho.spring_boot_java_random_user.domain.entities.UserRequest;
5+
import com.xpeho.spring_boot_java_random_user.domain.services.UserService;
6+
import org.junit.jupiter.api.BeforeEach;
7+
import org.junit.jupiter.api.DisplayName;
8+
import org.junit.jupiter.api.Test;
9+
10+
import static org.junit.jupiter.api.Assertions.assertEquals;
11+
import static org.mockito.Mockito.mock;
12+
import static org.mockito.Mockito.verify;
13+
import static org.mockito.Mockito.when;
14+
15+
class CreateUserUseCaseTest {
16+
private UserService userService;
17+
private CreateUserUseCase useCase;
18+
19+
@BeforeEach
20+
void setUp() {
21+
userService = mock(UserService.class);
22+
useCase = new CreateUserUseCase(userService);
23+
}
24+
25+
@Test
26+
@DisplayName("Should create a user without keeping the input id")
27+
void shouldCreateUserWithoutKeepingInputId() {
28+
UserRequest payload = new UserRequest(
29+
"female", "Alice", "Smith", "Mrs", "alice@smith.com", "5678", "new-pic.jpg", "US"
30+
);
31+
UserEntity createdUser = new UserEntity(
32+
1L, "female", "Alice", "Smith", "Mrs", "alice@smith.com", "5678", "new-pic.jpg", "US"
33+
);
34+
UserEntity expectedSavedUser = new UserEntity(
35+
null, "female", "Alice", "Smith", "Mrs", "alice@smith.com", "5678", "new-pic.jpg", "US"
36+
);
37+
38+
when(userService.save(expectedSavedUser)).thenReturn(createdUser);
39+
40+
UserEntity result = useCase.execute(payload);
41+
42+
assertEquals(createdUser, result);
43+
verify(userService).save(expectedSavedUser);
44+
}
45+
}

0 commit comments

Comments
 (0)