Skip to content

Commit 204ccfd

Browse files
committed
Added create, update, delete Translation. Reafctored InputFieldException
1 parent 3bfdad6 commit 204ccfd

File tree

10 files changed

+124
-7
lines changed

10 files changed

+124
-7
lines changed

user-service/src/main/java/com/gmail/merikbest2015/exception/InputFieldException.java renamed to commons/src/main/java/com/gmail/merikbest2015/commons/exception/InputFieldException.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.gmail.merikbest2015.exception;
1+
package com.gmail.merikbest2015.commons.exception;
22

33
import lombok.AllArgsConstructor;
44
import lombok.Getter;
@@ -25,7 +25,7 @@ public InputFieldException(HttpStatus status, Map<String, String> errorsMap) {
2525
this.status = status;
2626
this.errorsMap = errorsMap;
2727
}
28-
28+
2929
private Map<String, String> handleErrors(BindingResult bindingResult) {
3030
Map<String, String> errors = new HashMap<>();
3131
bindingResult.getFieldErrors().forEach(fieldError -> errors.put(fieldError.getField(), fieldError.getDefaultMessage()));

user-service/src/main/java/com/gmail/merikbest2015/exception/InputFieldExceptionHandler.java renamed to commons/src/main/java/com/gmail/merikbest2015/commons/exception/InputFieldExceptionHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.gmail.merikbest2015.exception;
1+
package com.gmail.merikbest2015.commons.exception;
22

33
import org.springframework.http.ResponseEntity;
44
import org.springframework.web.bind.annotation.ControllerAdvice;
@@ -12,7 +12,7 @@ public class InputFieldExceptionHandler {
1212
@ExceptionHandler(InputFieldException.class)
1313
public ResponseEntity<Map<String, String>> handleInputFieldException(InputFieldException exception) {
1414
InputFieldException inputFieldException;
15-
15+
1616
if (exception.getBindingResult() != null) {
1717
inputFieldException = new InputFieldException(exception.getBindingResult());
1818
} else {

localization-service/src/main/java/com/gmail/merikbest2015/constants/LocalizationErrorMessage.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
public class LocalizationErrorMessage {
44
public static final String TRANSLATION_KEY_NOT_FOUND = "Translation key not found";
5+
public static final String TRANSLATION_KEY_EXISTS = "Translation key exists";
56
public static final String EMPTY_TRANSLATION_KEY = "Translation key cannot be empty.";
67
public static final String EMPTY_TRANSLATION_VALUES = "Translation values cannot be empty.";
78
public static final String EMPTY_LANGUAGE_CODE = "Language code cannot be empty.";

localization-service/src/main/java/com/gmail/merikbest2015/controller/rest/TranslationController.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.gmail.merikbest2015.controller.rest;
22

33
import com.gmail.merikbest2015.commons.constants.PathConstants;
4+
import com.gmail.merikbest2015.dto.request.TranslationRequest;
45
import com.gmail.merikbest2015.dto.response.TranslationResponse;
56
import com.gmail.merikbest2015.mapper.TranslationMapper;
7+
import jakarta.validation.Valid;
68
import lombok.RequiredArgsConstructor;
79
import org.springframework.http.ResponseEntity;
10+
import org.springframework.validation.BindingResult;
811
import org.springframework.web.bind.annotation.*;
912

1013
import java.util.List;
@@ -25,4 +28,22 @@ public ResponseEntity<List<TranslationResponse>> getTranslations() {
2528
public ResponseEntity<TranslationResponse> getTranslation(@PathVariable("translationKey") String translationKey) {
2629
return ResponseEntity.ok(translationMapper.getTranslation(translationKey));
2730
}
31+
32+
@PostMapping(PathConstants.TRANSLATION)
33+
public ResponseEntity<TranslationResponse> createTranslation(@Valid @RequestBody TranslationRequest request,
34+
BindingResult bindingResult) {
35+
return ResponseEntity.ok(translationMapper.createTranslation(request, bindingResult));
36+
}
37+
38+
@PutMapping(PathConstants.TRANSLATION + PathConstants.TRANSLATION_KEY)
39+
public ResponseEntity<TranslationResponse> updateTranslation(@PathVariable("translationKey") String translationKey,
40+
@Valid @RequestBody TranslationRequest request,
41+
BindingResult bindingResult) {
42+
return ResponseEntity.ok(translationMapper.updateTranslation(translationKey, request, bindingResult));
43+
}
44+
45+
@DeleteMapping(PathConstants.TRANSLATION + PathConstants.TRANSLATION_KEY)
46+
public ResponseEntity<String> deleteTranslation(@PathVariable("translationKey") String translationKey) {
47+
return ResponseEntity.ok(translationMapper.deleteTranslation(translationKey));
48+
}
2849
}

localization-service/src/main/java/com/gmail/merikbest2015/mapper/TranslationMapper.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package com.gmail.merikbest2015.mapper;
22

33
import com.gmail.merikbest2015.commons.mapper.BasicMapper;
4+
import com.gmail.merikbest2015.dto.request.TranslationRequest;
45
import com.gmail.merikbest2015.dto.response.TranslationResponse;
6+
import com.gmail.merikbest2015.model.Translation;
57
import com.gmail.merikbest2015.service.TranslationService;
68
import lombok.RequiredArgsConstructor;
79
import org.springframework.stereotype.Component;
10+
import org.springframework.validation.BindingResult;
811

912
import java.util.List;
1013

@@ -22,4 +25,17 @@ public List<TranslationResponse> getTranslations() {
2225
public TranslationResponse getTranslation(String translationKey) {
2326
return basicMapper.convertToResponse(translationService.getTranslation(translationKey), TranslationResponse.class);
2427
}
28+
29+
public TranslationResponse createTranslation(TranslationRequest request, BindingResult bindingResult) {
30+
return basicMapper.convertToResponse(translationService.createTranslation(request, bindingResult), TranslationResponse.class);
31+
}
32+
33+
public TranslationResponse updateTranslation(String translationKey, TranslationRequest request, BindingResult bindingResult) {
34+
Translation translation = translationService.updateTranslation(translationKey, request, bindingResult);
35+
return basicMapper.convertToResponse(translation, TranslationResponse.class);
36+
}
37+
38+
public String deleteTranslation(String translationKey) {
39+
return translationService.deleteTranslation(translationKey);
40+
}
2541
}

localization-service/src/main/java/com/gmail/merikbest2015/service/TranslationService.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.gmail.merikbest2015.service;
22

3+
import com.gmail.merikbest2015.dto.request.TranslationRequest;
34
import com.gmail.merikbest2015.model.Translation;
5+
import org.springframework.validation.BindingResult;
46

57
import java.util.List;
68

@@ -9,4 +11,10 @@ public interface TranslationService {
911
List<Translation> getTranslations();
1012

1113
Translation getTranslation(String translationKey);
14+
15+
Translation createTranslation(TranslationRequest request, BindingResult bindingResult);
16+
17+
Translation updateTranslation(String translationKey, TranslationRequest request, BindingResult bindingResult);
18+
19+
String deleteTranslation(String translationKey);
1220
}

localization-service/src/main/java/com/gmail/merikbest2015/service/impl/TranslationServiceImpl.java

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,23 @@
11
package com.gmail.merikbest2015.service.impl;
22

33
import com.gmail.merikbest2015.commons.exception.ApiRequestException;
4+
import com.gmail.merikbest2015.commons.exception.InputFieldException;
45
import com.gmail.merikbest2015.constants.LocalizationErrorMessage;
6+
import com.gmail.merikbest2015.constants.LocalizationSuccessMessage;
7+
import com.gmail.merikbest2015.dto.request.TranslationRequest;
8+
import com.gmail.merikbest2015.dto.request.TranslationValueRequest;
9+
import com.gmail.merikbest2015.model.LanguageCode;
510
import com.gmail.merikbest2015.model.Translation;
11+
import com.gmail.merikbest2015.model.TranslationValue;
612
import com.gmail.merikbest2015.repository.TranslationRepository;
713
import com.gmail.merikbest2015.service.TranslationService;
814
import lombok.RequiredArgsConstructor;
915
import org.springframework.http.HttpStatus;
1016
import org.springframework.stereotype.Service;
17+
import org.springframework.transaction.annotation.Transactional;
18+
import org.springframework.validation.BindingResult;
1119

20+
import java.util.Arrays;
1221
import java.util.List;
1322

1423
@Service
@@ -27,4 +36,66 @@ public Translation getTranslation(String translationKey) {
2736
return translationRepository.findByTranslationKey(translationKey)
2837
.orElseThrow(() -> new ApiRequestException(LocalizationErrorMessage.TRANSLATION_KEY_NOT_FOUND, HttpStatus.NOT_FOUND));
2938
}
39+
40+
@Override
41+
@Transactional
42+
public Translation createTranslation(TranslationRequest request, BindingResult bindingResult) {
43+
processInputErrors(bindingResult);
44+
if (translationRepository.isTranslationKeyExists(request.getTranslationKey())) {
45+
throw new ApiRequestException(LocalizationErrorMessage.TRANSLATION_KEY_EXISTS, HttpStatus.NOT_FOUND);
46+
}
47+
Translation translation = new Translation();
48+
translation.setTranslationKey(request.getTranslationKey());
49+
List<TranslationValue> translationValues = Arrays.stream(LanguageCode.values())
50+
.map(languageCode -> {
51+
TranslationValue translationValue = new TranslationValue();
52+
translationValue.setTranslation(translation);
53+
translationValue.setLanguageCode(languageCode);
54+
String value = request.getTranslationValues().stream()
55+
.filter(valueRequest -> languageCode.name().equals(valueRequest.getLanguageCode()))
56+
.map(TranslationValueRequest::getValue)
57+
.findFirst()
58+
.orElse(null);
59+
translationValue.setValue(value);
60+
return translationValue;
61+
})
62+
.toList();
63+
translation.setTranslationValues(translationValues);
64+
return translationRepository.save(translation);
65+
}
66+
67+
@Override
68+
@Transactional
69+
public Translation updateTranslation(String translationKey, TranslationRequest request, BindingResult bindingResult) {
70+
processInputErrors(bindingResult);
71+
Translation translation = getTranslation(translationKey);
72+
List<TranslationValue> translationValues = translation.getTranslationValues();
73+
List<TranslationValue> newTranslationValues = translationValues.stream()
74+
.peek(translationValue -> {
75+
String value = request.getTranslationValues().stream()
76+
.filter(valueRequest -> translationValue.getLanguageCode().name().equals(valueRequest.getLanguageCode()))
77+
.map(TranslationValueRequest::getValue)
78+
.findFirst()
79+
.orElse(null);
80+
translationValue.setValue(value);
81+
})
82+
.toList();
83+
translationValues.clear();
84+
translationValues.addAll(newTranslationValues);
85+
return translation;
86+
}
87+
88+
@Override
89+
@Transactional
90+
public String deleteTranslation(String translationKey) {
91+
Translation translation = getTranslation(translationKey);
92+
translationRepository.delete(translation);
93+
return LocalizationSuccessMessage.TRANSLATION_KEY_DELETED;
94+
}
95+
96+
private void processInputErrors(BindingResult bindingResult) {
97+
if (bindingResult.hasErrors()) {
98+
throw new InputFieldException(bindingResult);
99+
}
100+
}
30101
}

user-service/src/main/java/com/gmail/merikbest2015/service/impl/AuthenticationServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package com.gmail.merikbest2015.service.impl;
22

33
import com.gmail.merikbest2015.commons.constants.HeaderConstants;
4+
import com.gmail.merikbest2015.commons.exception.InputFieldException;
45
import com.gmail.merikbest2015.constants.UserErrorMessage;
56
import com.gmail.merikbest2015.constants.UserSuccessMessage;
67
import com.gmail.merikbest2015.dto.request.AuthenticationRequest;
78
import com.gmail.merikbest2015.commons.event.SendEmailEvent;
89
import com.gmail.merikbest2015.commons.exception.ApiRequestException;
9-
import com.gmail.merikbest2015.exception.InputFieldException;
1010
import com.gmail.merikbest2015.broker.producer.SendEmailProducer;
1111
import com.gmail.merikbest2015.model.User;
1212
import com.gmail.merikbest2015.model.UserRole;

user-service/src/main/java/com/gmail/merikbest2015/service/util/UserServiceHelper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.gmail.merikbest2015.service.util;
22

33
import com.gmail.merikbest2015.commons.exception.ApiRequestException;
4+
import com.gmail.merikbest2015.commons.exception.InputFieldException;
45
import com.gmail.merikbest2015.constants.UserErrorMessage;
5-
import com.gmail.merikbest2015.exception.InputFieldException;
66
import com.gmail.merikbest2015.model.User;
77
import com.gmail.merikbest2015.repository.BlockUserRepository;
88
import com.gmail.merikbest2015.repository.FollowerUserRepository;

user-service/src/test/java/com/gmail/merikbest2015/service/AuthenticationServiceImplTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package com.gmail.merikbest2015.service;
22

33
import com.gmail.merikbest2015.UserServiceTestHelper;
4+
import com.gmail.merikbest2015.commons.exception.InputFieldException;
45
import com.gmail.merikbest2015.constants.UserErrorMessage;
56
import com.gmail.merikbest2015.constants.UserSuccessMessage;
67
import com.gmail.merikbest2015.dto.request.AuthenticationRequest;
78
import com.gmail.merikbest2015.commons.event.SendEmailEvent;
89
import com.gmail.merikbest2015.commons.exception.ApiRequestException;
9-
import com.gmail.merikbest2015.exception.InputFieldException;
1010
import com.gmail.merikbest2015.model.User;
1111
import com.gmail.merikbest2015.model.UserRole;
1212
import com.gmail.merikbest2015.repository.projection.AuthUserProjection;

0 commit comments

Comments
 (0)