From 7788fd6175023b0bab235b50cd9adbd668b9f47b Mon Sep 17 00:00:00 2001 From: ialbert Date: Mon, 3 Oct 2022 15:31:16 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-64 --- .../queue/QueueExceptionHandler.java | 2 +- .../user/UserSettingsSessionController.java | 38 --------- .../utilities/UserSettingsController.java | 77 +++++++++++++++++++ .../utilities/UserSettingsUpdateAction.java | 54 +++++++++++++ .../backendapi/security/KeycloakUtils.java | 20 +++++ .../utilities/UserSettingsUpdateRequest.java | 3 +- 6 files changed, 154 insertions(+), 40 deletions(-) delete mode 100644 clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/user/UserSettingsSessionController.java create mode 100644 clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/utilities/UserSettingsController.java create mode 100644 clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/utilities/UserSettingsUpdateAction.java create mode 100644 clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/KeycloakUtils.java diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/QueueExceptionHandler.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/QueueExceptionHandler.java index f2c2036a9..5b6503559 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/QueueExceptionHandler.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/QueueExceptionHandler.java @@ -55,7 +55,7 @@ public class QueueExceptionHandler extends ResponseEntityExceptionHandler { UnrecognizedPropertyException jacksonException = (UnrecognizedPropertyException) ex.getCause(); message = new EnumMessage(BackEndError.UnknownJsonProperty, jacksonException.getPropertyName()); } catch (ClassCastException e) { - log.error(ExceptionUtils.getStackTrace(e)); + log.error(ExceptionUtils.getStackTrace(ex)); message = new EnumMessage(BackEndError.FailedToReadHttpMessage); } errorResponse.setCode(message.getSubject().getId()); diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/user/UserSettingsSessionController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/user/UserSettingsSessionController.java deleted file mode 100644 index 549d04aee..000000000 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/user/UserSettingsSessionController.java +++ /dev/null @@ -1,38 +0,0 @@ -package ru.spcex.clearing.backendapi.controller.queue.user; - -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; -import ru.clearing.classes.statics.data.user.UserSettings; -import ru.spcex.clearing.backendapi.controller.response.entity.user.UserSettingsBackendGetAll; -import ru.spcex.clearing.backendapi.service.IStateLoader; -import ru.spcex.clearing.imdg.IMDGDistributedNames; - -import java.util.Collection; - -@Controller -@RequestMapping("/user-settings") -public class UserSettingsSessionController { - private final IStateLoader stateLoader; - - @Autowired - public UserSettingsSessionController(IStateLoader stateLoader) { - this.stateLoader = stateLoader; - } - - @ApiOperation(value = "get all user settings.") - @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = UserSettingsBackendGetAll.class)}) - @RequestMapping(method = RequestMethod.GET) - @ResponseBody - public UserSettingsBackendGetAll getAll() { - Collection all = stateLoader.getAll(IMDGDistributedNames.Map_UserSettings, UserSettings.class); - var response = new UserSettingsBackendGetAll(); - response.fromEntity(all); - return response; - } -} diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/utilities/UserSettingsController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/utilities/UserSettingsController.java new file mode 100644 index 000000000..1fa83bc05 --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/utilities/UserSettingsController.java @@ -0,0 +1,77 @@ +package ru.spcex.clearing.backendapi.controller.queue.utilities; + +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import ru.clearing.classes.statics.data.user.User; +import ru.clearing.classes.statics.data.user.UserSettings; +import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController; +import ru.spcex.clearing.backendapi.controller.request.cud.utilities.UserSettingsUpdateAction; +import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse; +import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse; +import ru.spcex.clearing.backendapi.controller.response.entity.user.UserSettingsBackendGetAll; +import ru.spcex.clearing.backendapi.security.KeycloakUtils; +import ru.spcex.clearing.backendapi.service.IOperator; +import ru.spcex.clearing.backendapi.service.IStateLoader; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; + +import java.util.Collection; +import java.util.Map; +import java.util.concurrent.ExecutionException; + +@Controller +//todo ask Lesha Ushenin +@RequestMapping("/utilities/user-settings") +public class UserSettingsController extends AbstractQueueController { + private final IStateLoader stateLoader; + private final Imdg userImdg; + + @Autowired + public UserSettingsController(IOperator operator, IStateLoader stateLoader, ImdgProvider imdgProvider) { + super(operator); + this.stateLoader = stateLoader; + this.userImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_User, User.class); + } + + @ApiOperation(value = "get all user settings.") + @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = UserSettingsBackendGetAll.class)}) + @RequestMapping(method = RequestMethod.GET) + @ResponseBody + public UserSettingsBackendGetAll getAll() { + Collection all = stateLoader.getAll(IMDGDistributedNames.Map_UserSettings, UserSettings.class); + var response = new UserSettingsBackendGetAll(); + response.fromEntity(all); + return response; + } + + @ApiOperation(value = "update user settings.") + @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)}) + @RequestMapping(method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE) + @ResponseBody + public CudResponse update( + @ApiParam(value = "Новые значения полей объекта.", required = true) + @RequestBody UserSettingsUpdateAction userSettingsUpdateAction) throws ExecutionException, InterruptedException { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String username = KeycloakUtils.getUserNameFromAuthentication(authentication); + User user = userImdg.getSingleObjectByFieldValues(Map.of("identifier", username)); + if (user == null) { + throw new IllegalStateException("cannot obtain userId from logged in user " + username); + } + userSettingsUpdateAction.setUserId(user.getId()); + return processRequest(Consts.USER_SETTINGS_UPDATE, userSettingsUpdateAction); + } + +} diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/utilities/UserSettingsUpdateAction.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/utilities/UserSettingsUpdateAction.java new file mode 100644 index 000000000..cc4bbf384 --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/utilities/UserSettingsUpdateAction.java @@ -0,0 +1,54 @@ +package ru.spcex.clearing.backendapi.controller.request.cud.utilities; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.JsonNode; +import io.swagger.annotations.ApiModelProperty; +import ru.spcex.clearing.backendapi.domain.actions.IAction; +import ru.spcex.clearing.platform.messaging.domain.ActionType; +import ru.spcex.clearing.platform.messaging.domain.cud.utilities.UserSettingsUpdateRequest; + +public class UserSettingsUpdateAction implements IAction { + @ApiModelProperty(hidden = true) + @JsonProperty + public Long userId; + + @JsonProperty + public String version; + public String json; + + @JsonProperty("json") + public void unpackRawJson(JsonNode json) { + this.json = json.toString(); + } + + @ApiModelProperty(hidden = true) + @Override + public ActionType getActionType() { + return ActionType.UPDATE; + } + + @Override + public UserSettingsUpdateRequest toRequest() { + var req = new UserSettingsUpdateRequest(); + req.setVersion(version); + req.setJson(json); + req.setUserId(userId); + return req; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } +} diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/KeycloakUtils.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/KeycloakUtils.java new file mode 100644 index 000000000..52bc02e40 --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/KeycloakUtils.java @@ -0,0 +1,20 @@ +package ru.spcex.clearing.backendapi.security; + +import org.keycloak.KeycloakPrincipal; +import org.keycloak.adapters.spi.KeycloakAccount; +import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; +import org.springframework.security.core.Authentication; + +public class KeycloakUtils { + /** + * Достать username из Keycloak имплементации Authentication + */ + public static String getUserNameFromAuthentication(Authentication authentication) { + KeycloakAuthenticationToken auth = (KeycloakAuthenticationToken) authentication; + KeycloakAccount details = (KeycloakAccount) auth.getDetails(); + return ((KeycloakPrincipal) details.getPrincipal()) + .getKeycloakSecurityContext() + .getToken() + .getPreferredUsername(); + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/UserSettingsUpdateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/UserSettingsUpdateRequest.java index cc22c7766..8eb9093fe 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/UserSettingsUpdateRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/UserSettingsUpdateRequest.java @@ -1,13 +1,14 @@ package ru.spcex.clearing.platform.messaging.domain.cud.utilities; import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonRawValue; public class UserSettingsUpdateRequest { @JsonProperty public Long userId; @JsonProperty public String version; - @JsonProperty + @JsonRawValue public String json; public Long getUserId() {