Skip to content

Commit 593eca8

Browse files
committed
fix: явные мапперы dto в entity и строгий парсинг
Closes #19
1 parent 00ac0eb commit 593eca8

13 files changed

Lines changed: 223 additions & 44 deletions

File tree

‎src/main/java/com/DesktopApplicationClientJava/Api/ApiClient.java‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import com.DesktopApplicationClientJava.Api.Dto.response.ResourceDto;
1515
import com.DesktopApplicationClientJava.Api.Dto.response.UserDto;
1616
import com.DesktopApplicationClientJava.session.Session;
17-
import com.fasterxml.jackson.databind.DeserializationFeature;
1817
import com.fasterxml.jackson.databind.ObjectMapper;
1918
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
2019
import java.io.ByteArrayOutputStream;
@@ -50,9 +49,6 @@ public ApiClient(Session session) {
5049
.build();
5150
this.objectMapper = new ObjectMapper();
5251
this.objectMapper.registerModule(new JavaTimeModule());
53-
// FIXME: temporary — backend returns firstname/lastname instead of firstName/lastName.
54-
// Remove once backend uses camelCase; then unknown properties should fail fast again.
55-
this.objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
5652
}
5753

5854
// ======================== AUTH ========================

‎src/main/java/com/DesktopApplicationClientJava/Api/Dto/response/UserDto.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ public record UserDto(
88
UUID uuid,
99
String email,
1010
Role role,
11-
String firstName,
12-
String lastName,
11+
String firstname,
12+
String lastname,
1313
Boolean enabled,
1414
LocalDateTime createdAt,
1515
LocalDateTime updatedAt) {}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.DesktopApplicationClientJava.mapper;
2+
3+
import com.DesktopApplicationClientJava.Api.Dto.response.FileDto;
4+
import com.DesktopApplicationClientJava.entities.FileInfo;
5+
6+
public final class FileMapper {
7+
8+
private FileMapper() {}
9+
10+
public static FileInfo toEntity(FileDto dto) {
11+
return new FileInfo(dto.uuid(), dto.name(), dto.contentType(), dto.size());
12+
}
13+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.DesktopApplicationClientJava.mapper;
2+
3+
import com.DesktopApplicationClientJava.Api.Dto.response.ResourceDto;
4+
import com.DesktopApplicationClientJava.entities.FileInfo;
5+
import com.DesktopApplicationClientJava.entities.Resource;
6+
import java.util.List;
7+
8+
public final class ResourceMapper {
9+
10+
private ResourceMapper() {}
11+
12+
public static Resource toEntity(ResourceDto dto) {
13+
List<FileInfo> files =
14+
dto.files() == null ? List.of() : dto.files().stream().map(FileMapper::toEntity).toList();
15+
return new Resource(
16+
dto.uuid(), dto.title(), dto.description(), dto.createdAt(), dto.updatedAt(), files);
17+
}
18+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.DesktopApplicationClientJava.mapper;
2+
3+
import com.DesktopApplicationClientJava.Api.Dto.response.UserDto;
4+
import com.DesktopApplicationClientJava.entities.User;
5+
6+
public final class UserMapper {
7+
8+
private UserMapper() {}
9+
10+
public static User toEntity(UserDto dto) {
11+
return new User(
12+
dto.uuid(), dto.email(), dto.role(), dto.firstname(), dto.lastname(), dto.enabled());
13+
}
14+
}

‎src/main/java/com/DesktopApplicationClientJava/services/impl/AuthServiceImpl.java‎

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
import com.DesktopApplicationClientJava.Api.ApiClient;
44
import com.DesktopApplicationClientJava.Api.ApiException;
55
import com.DesktopApplicationClientJava.Api.Dto.request.Auth.LoginRequest;
6-
import com.DesktopApplicationClientJava.Api.Dto.response.UserDto;
76
import com.DesktopApplicationClientJava.entities.Role;
87
import com.DesktopApplicationClientJava.entities.User;
8+
import com.DesktopApplicationClientJava.mapper.UserMapper;
99
import com.DesktopApplicationClientJava.services.AuthService;
1010
import com.DesktopApplicationClientJava.services.ServiceException;
1111
import com.DesktopApplicationClientJava.session.Session;
@@ -25,8 +25,7 @@ public AuthServiceImpl(ApiClient apiClient, Session session) {
2525
public User login(String email, String password) {
2626
try {
2727
apiClient.login(new LoginRequest(email, password));
28-
UserDto me = apiClient.getMe();
29-
User user = toEntity(me);
28+
User user = UserMapper.toEntity(apiClient.getMe());
3029
session.setCurrentUser(user);
3130
return user;
3231
} catch (ApiException e) {
@@ -70,11 +69,6 @@ public boolean isModerator() {
7069
return hasRole(Role.MODER);
7170
}
7271

73-
private User toEntity(UserDto dto) {
74-
return new User(
75-
dto.uuid(), dto.email(), dto.role(), dto.firstName(), dto.lastName(), dto.enabled());
76-
}
77-
7872
private static int level(Role role) {
7973
return switch (role) {
8074
case USER -> 0;

‎src/main/java/com/DesktopApplicationClientJava/services/impl/FileServiceImpl.java‎

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

33
import com.DesktopApplicationClientJava.Api.ApiClient;
44
import com.DesktopApplicationClientJava.Api.ApiException;
5-
import com.DesktopApplicationClientJava.Api.Dto.response.FileDto;
65
import com.DesktopApplicationClientJava.entities.FileInfo;
6+
import com.DesktopApplicationClientJava.mapper.FileMapper;
77
import com.DesktopApplicationClientJava.services.FileService;
88
import com.DesktopApplicationClientJava.services.ServiceException;
99
import java.io.IOException;
@@ -20,8 +20,7 @@ public FileServiceImpl(ApiClient apiClient) {
2020

2121
public FileInfo uploadFile(UUID resourceId, Path file) {
2222
try {
23-
FileDto dto = apiClient.uploadFile(resourceId, file);
24-
return new FileInfo(dto.uuid(), dto.name(), dto.contentType(), dto.size());
23+
return FileMapper.toEntity(apiClient.uploadFile(resourceId, file));
2524
} catch (ApiException e) {
2625
throw new ServiceException(e.getMessage(), e.getStatus());
2726
} catch (IOException | InterruptedException e) {

‎src/main/java/com/DesktopApplicationClientJava/services/impl/ResourceServiceImpl.java‎

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@
55
import com.DesktopApplicationClientJava.Api.Dto.request.Resource.CreateResourceRequest;
66
import com.DesktopApplicationClientJava.Api.Dto.request.Resource.ResourceFilterRequest;
77
import com.DesktopApplicationClientJava.Api.Dto.request.Resource.UpdateResourceRequest;
8-
import com.DesktopApplicationClientJava.Api.Dto.response.ResourceDto;
9-
import com.DesktopApplicationClientJava.entities.FileInfo;
108
import com.DesktopApplicationClientJava.entities.Resource;
9+
import com.DesktopApplicationClientJava.mapper.ResourceMapper;
1110
import com.DesktopApplicationClientJava.services.ResourceService;
1211
import com.DesktopApplicationClientJava.services.ServiceException;
1312
import com.DesktopApplicationClientJava.services.filter.ResourceFilter;
@@ -29,7 +28,7 @@ public List<Resource> search(ResourceFilter filter, long offset, long count) {
2928
new ResourceFilterRequest(filter.getTitle(), filter.getDescription(), null, null);
3029
try {
3130
return apiClient.findResourcesByFilters(req, offset, count, "createdAt", "desc").stream()
32-
.map(this::toEntity)
31+
.map(ResourceMapper::toEntity)
3332
.toList();
3433
} catch (ApiException e) {
3534
throw new ServiceException(e.getMessage(), e.getStatus());
@@ -41,7 +40,8 @@ public List<Resource> search(ResourceFilter filter, long offset, long count) {
4140
@Override
4241
public Resource create(String title, String description) {
4342
try {
44-
return toEntity(apiClient.createResource(new CreateResourceRequest(title, description)));
43+
return ResourceMapper.toEntity(
44+
apiClient.createResource(new CreateResourceRequest(title, description)));
4545
} catch (ApiException e) {
4646
throw new ServiceException(e.getMessage(), e.getStatus());
4747
} catch (IOException | InterruptedException e) {
@@ -52,7 +52,7 @@ public Resource create(String title, String description) {
5252
@Override
5353
public Resource getById(UUID resourceId) {
5454
try {
55-
return toEntity(apiClient.findResourceById(resourceId));
55+
return ResourceMapper.toEntity(apiClient.findResourceById(resourceId));
5656
} catch (ApiException e) {
5757
throw new ServiceException(e.getMessage(), e.getStatus());
5858
} catch (IOException | InterruptedException e) {
@@ -64,7 +64,7 @@ public Resource getById(UUID resourceId) {
6464
public Resource update(UUID resourceId, String title, String description) {
6565
UpdateResourceRequest req = new UpdateResourceRequest(title, description);
6666
try {
67-
return toEntity(apiClient.updateResource(resourceId, req));
67+
return ResourceMapper.toEntity(apiClient.updateResource(resourceId, req));
6868
} catch (ApiException e) {
6969
throw new ServiceException(e.getMessage(), e.getStatus());
7070
} catch (IOException | InterruptedException e) {
@@ -82,15 +82,4 @@ public void delete(UUID resourceId) {
8282
throw new ServiceException("Ошибка соединения с сервером");
8383
}
8484
}
85-
86-
private Resource toEntity(ResourceDto dto) {
87-
List<FileInfo> files =
88-
dto.files() == null
89-
? List.of()
90-
: dto.files().stream()
91-
.map(f -> new FileInfo(f.uuid(), f.name(), f.contentType(), f.size()))
92-
.toList();
93-
return new Resource(
94-
dto.uuid(), dto.title(), dto.description(), dto.createdAt(), dto.updatedAt(), files);
95-
}
9685
}

‎src/main/java/com/DesktopApplicationClientJava/services/impl/UsersServiceImpl.java‎

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import com.DesktopApplicationClientJava.Api.Dto.request.Admin.RegisterRequest;
66
import com.DesktopApplicationClientJava.Api.Dto.request.Admin.UpdateUserRequest;
77
import com.DesktopApplicationClientJava.Api.Dto.request.Admin.UserFilterRequest;
8-
import com.DesktopApplicationClientJava.Api.Dto.response.UserDto;
98
import com.DesktopApplicationClientJava.entities.User;
9+
import com.DesktopApplicationClientJava.mapper.UserMapper;
1010
import com.DesktopApplicationClientJava.services.ServiceException;
1111
import com.DesktopApplicationClientJava.services.UsersService;
1212
import com.DesktopApplicationClientJava.services.data.RegisterData;
@@ -37,7 +37,7 @@ public List<User> search(UserFilter filter, long offset, long count) {
3737

3838
try {
3939
return apiClient.getUsersByFilters(req, offset, count, "createdAt", "desc").stream()
40-
.map(this::toEntity)
40+
.map(UserMapper::toEntity)
4141
.toList();
4242
} catch (ApiException e) {
4343
throw new ServiceException(e.getMessage(), e.getStatus());
@@ -49,7 +49,7 @@ public List<User> search(UserFilter filter, long offset, long count) {
4949
@Override
5050
public User getById(UUID uuid) {
5151
try {
52-
return toEntity(apiClient.getUserById(uuid));
52+
return UserMapper.toEntity(apiClient.getUserById(uuid));
5353
} catch (ApiException e) {
5454
throw new ServiceException(e.getMessage(), e.getStatus());
5555
} catch (IOException | InterruptedException e) {
@@ -67,7 +67,7 @@ public User create(RegisterData data) {
6767
data.getFirstName(),
6868
data.getLastName());
6969
try {
70-
return toEntity(apiClient.createUser(req));
70+
return UserMapper.toEntity(apiClient.createUser(req));
7171
} catch (ApiException e) {
7272
throw new ServiceException(e.getMessage(), e.getStatus());
7373
} catch (IOException | InterruptedException e) {
@@ -86,7 +86,7 @@ public User update(UUID uuid, UpdateUserData data) {
8686
data.getLastName());
8787

8888
try {
89-
return toEntity(apiClient.updateUser(uuid, req));
89+
return UserMapper.toEntity(apiClient.updateUser(uuid, req));
9090
} catch (ApiException e) {
9191
throw new ServiceException(e.getMessage(), e.getStatus());
9292
} catch (IOException | InterruptedException e) {
@@ -104,9 +104,4 @@ public void delete(UUID uuid) {
104104
throw new ServiceException("Ошибка соединения с сервером");
105105
}
106106
}
107-
108-
private User toEntity(UserDto dto) {
109-
return new User(
110-
dto.uuid(), dto.email(), dto.role(), dto.firstName(), dto.lastName(), dto.enabled());
111-
}
112107
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package mapper;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import com.DesktopApplicationClientJava.Api.Dto.response.FileDto;
6+
import com.DesktopApplicationClientJava.entities.FileInfo;
7+
import com.DesktopApplicationClientJava.mapper.FileMapper;
8+
import java.util.UUID;
9+
import org.junit.jupiter.api.Test;
10+
11+
class FileMapperTest {
12+
13+
@Test
14+
void mapsAllFields() {
15+
UUID uuid = UUID.randomUUID();
16+
FileDto dto = new FileDto(uuid, "отчёт.pdf", "application/pdf", 12345L);
17+
18+
FileInfo file = FileMapper.toEntity(dto);
19+
20+
assertEquals(uuid, file.getUuid());
21+
assertEquals("отчёт.pdf", file.getName());
22+
assertEquals("application/pdf", file.getContentType());
23+
assertEquals(12345L, file.getSize());
24+
}
25+
}

0 commit comments

Comments
 (0)