diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/impl/OperatorImpl.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/impl/OperatorImpl.java index 1f21495fd..c3dbe2c7d 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/impl/OperatorImpl.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/impl/OperatorImpl.java @@ -1,14 +1,21 @@ package ru.spcex.clearing.backendapi.service.impl; +import org.apache.commons.lang3.StringUtils; import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.clients.producer.RecordMetadata; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.user.User; import ru.spcex.clearing.backendapi.controller.response.cud.QueueSuccessResponse; import ru.spcex.clearing.backendapi.domain.actions.IAction; import ru.spcex.clearing.backendapi.errors.ActionValidationException; import ru.spcex.clearing.backendapi.errors.BackEndError; import ru.spcex.clearing.backendapi.errors.NotFound404Exception; +import ru.spcex.clearing.backendapi.security.KeycloakUtils; import ru.spcex.clearing.backendapi.service.IOperator; import ru.spcex.clearing.backendapi.service.validation.ActionValidationProvider; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -21,21 +28,39 @@ import ru.spcex.platform.utils.enumeration.EnumMessage; import ru.spcex.platform.utils.validation.IValidator; import java.util.Collection; +import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @Service public class OperatorImpl implements IOperator { + protected final Logger log = LoggerFactory.getLogger(getClass()); private final Producer kafka; private final ImdgId idGenerator; private final ImdgProvider imdgProvider; private final ActionValidationProvider validation; + private final Imdg userImdg; public OperatorImpl(Producer kafka, ImdgProvider imdgProvider, ActionValidationProvider validation) { this.kafka = kafka; this.idGenerator = imdgProvider.getImdgIdGenerator(); this.imdgProvider = imdgProvider; this.validation = validation; + this.userImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_User, User.class); + } + + + protected Long currentUserId() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String username = KeycloakUtils.getUserNameFromAuthentication(authentication); + User user = StringUtils.isEmpty(username) ? null : userImdg.getSingleObjectByFieldValues(Map.of("identifier", username)); + if (user == null) { + log.warn("UserID not found by login \"{}\"", username); + return null; + //throw new IllegalStateException("cannot obtain userId from logged in user " + username); + } + return user.getId(); + // todo добавить кэш, с очисткой по времени } @Override @@ -45,6 +70,7 @@ public class OperatorImpl implements IOperator { request.setId(idGenerator.nextId()); request.setActionType(iAction.getActionType()); request.setRequestPayload(iAction.toRequest()); + request.setUserId(currentUserId()); //сохраняет данные о запросе в хранилище saveRequestToStorage(destination, request); Future send = kafka.send(new ProducerRecord<>(destination, request)); diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/UserMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/UserMapStore.java index c63197d6f..e2cc7ba57 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/UserMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessobject/UserMapStore.java @@ -30,10 +30,14 @@ public class UserMapStore extends TemplateMapStore { @Override public String[] getFields() { return new String[]{ - "ID", "CREATED_AT", "UPDATED_AT", "IDENTIFIER", "NAME", "FIRST_NAME", "LAST_NAME", "MIDDLE_NAME", "EMAIL", + "ID", "CREATED_AT", "UPDATED_AT", "IDENTIFIER", "NAME", "FIRST_NAME", "LAST_NAME", "MIDDLE_NAME", "EMAIL", }; } + public String[] getIndexingField() { + return new String[]{"identifier"}; + } + @Override public User objectReader(ResultSet resultSet) throws SQLException { User object = new User();