Merge branch 'feature/SUPPORT-9422_fixes' into develop

This commit is contained in:
adel.ka 2025-09-23 09:40:35 +03:00
commit b705734b7c
22 changed files with 125 additions and 44 deletions

View file

@ -3,6 +3,7 @@ import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.time.Duration;
import java.util.Map;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
@ -11,6 +12,7 @@ import javax.sql.DataSource;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.StreamReadConstraints;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
@ -40,7 +42,9 @@ import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import ru.micord.ervu.account_applications.deserializer.DataWrapperDeserializer;
import ru.micord.ervu.account_applications.deserializer.ReferenceEntityDeserializer;
import ru.micord.ervu.account_applications.model.DataWrapper;
import ru.micord.ervu.account_applications.model.ReferenceEntity;
/**
@ -162,7 +166,7 @@ public class AppConfig {
.build();
SimpleModule module = new SimpleModule();
module.addDeserializer(ReferenceEntity.class, new ReferenceEntityDeserializer());
customDeserializers().forEach(module::addDeserializer);
return new ObjectMapper(factory)
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
@ -171,4 +175,11 @@ public class AppConfig {
.configure(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE, true)
.registerModules(new JavaTimeModule(), module);
}
private Map<Class, JsonDeserializer> customDeserializers() {
return Map.of(
ReferenceEntity.class, new ReferenceEntityDeserializer(),
DataWrapper.class, new DataWrapperDeserializer()
);
}
}

View file

@ -1,5 +1,6 @@
package ru.micord.ervu.account_applications.dao;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@ -83,11 +84,11 @@ public abstract class AbstractDataDao<T extends UpdatableRecord<T>> {
.fetch(selectField);
}
protected <V, F> void setFieldByField(Field<V> targetField, V value, Field<F> whereField,
F whereValue) {
protected <V, F> void setFieldWhereIn(Field<V> targetField, V value, Field<F> whereField,
Collection<F> whereValues) {
dsl.update(getTable())
.set(targetField, value)
.where(whereField.eq(whereValue))
.where(whereField.in(whereValues))
.execute();
}

View file

@ -78,8 +78,11 @@ public class RecruitmentDao extends AbstractDataDao<RecruitmentRecord> {
return getValueByField(Recruitment.RECRUITMENT.ID, Recruitment.RECRUITMENT.IDM_ID, idmId);
}
public void setActiveStatus(String id, boolean active) {
setFieldByField(Recruitment.RECRUITMENT.ACTIVE, active, Recruitment.RECRUITMENT.IDM_ID, id);
public void setActiveStatus(List<String> ids, boolean active) {
setFieldWhereIn(
Recruitment.RECRUITMENT.ACTIVE, active,
Recruitment.RECRUITMENT.IDM_ID, ids
);
}
public boolean exists(Long appNumber, String domainId, boolean checkParents) {

View file

@ -1,5 +1,7 @@
package ru.micord.ervu.account_applications.dao;
import java.util.List;
import org.jooq.DSLContext;
import org.jooq.Table;
import org.springframework.stereotype.Repository;
@ -21,10 +23,10 @@ public class RoleDao extends AbstractDataDao<UserApplicationRoleRecord> {
return Tables.USER_APPLICATION_ROLE;
}
public void setActiveStatus(String id, boolean active) {
setFieldByField(
public void setActiveStatus(List<String> ids, boolean active) {
setFieldWhereIn(
Tables.USER_APPLICATION_ROLE.ACTIVE, active,
Tables.USER_APPLICATION_ROLE.USER_ROLE_ID, id
Tables.USER_APPLICATION_ROLE.USER_ROLE_ID, ids
);
}
}

View file

@ -1,6 +1,8 @@
package ru.micord.ervu.account_applications.dao;
import java.util.List;
import org.jooq.DSLContext;
import org.jooq.Table;
import org.springframework.stereotype.Repository;
@ -16,8 +18,11 @@ public class SolutionDao extends AbstractDataDao<SolutionRecord> {
super(dsl);
}
public void setActiveStatus(String id, boolean active) {
setFieldByField(Tables.SOLUTION.ACTIVE, active, Tables.SOLUTION.ID, id);
public void setActiveStatus(List<String> ids, boolean active) {
setFieldWhereIn(
Tables.SOLUTION.ACTIVE, active,
Tables.SOLUTION.ID, ids
);
}
@Override

View file

@ -0,0 +1,39 @@
package ru.micord.ervu.account_applications.deserializer;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import com.fasterxml.jackson.core.JacksonException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
import ru.micord.ervu.account_applications.model.DataWrapper;
/**
* @author Adel Kalimullin
*/
public class DataWrapperDeserializer extends JsonDeserializer<DataWrapper> {
@Override
public DataWrapper deserialize(JsonParser jsonParser,
DeserializationContext deserializationContext) throws IOException, JacksonException {
JsonNode node = jsonParser.readValueAsTree();
if (node.isTextual()){
return new DataWrapper(List.of(node.asText()));
}
else if (node.isArray()){
List<String> values = new ArrayList<>();
for (JsonNode element : node) {
if (element.isTextual()) {
values.add(element.asText());
}
}
return new DataWrapper(values);
}
return new DataWrapper(Collections.emptyList());
}
}

View file

@ -1,7 +1,7 @@
package ru.micord.ervu.account_applications.kafka.model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import ru.micord.ervu.account_applications.model.ReferenceEntity;
import ru.micord.ervu.account_applications.model.DataWrapper;
/**
* @author Adel Kalimullin
@ -9,13 +9,13 @@ import ru.micord.ervu.account_applications.model.ReferenceEntity;
@JsonIgnoreProperties(ignoreUnknown = true)
public class ChangeActiveMessage {
private boolean success;
private ReferenceEntity data;
private DataWrapper data;
public ReferenceEntity getData() {
public DataWrapper getData() {
return data;
}
public void setData(ReferenceEntity data) {
public void setData(DataWrapper data) {
this.data = data;
}

View file

@ -0,0 +1,18 @@
package ru.micord.ervu.account_applications.model;
import java.util.List;
/**
* @author Adel Kalimullin
*/
public class DataWrapper {
private final List<String> ids;
public DataWrapper(List<String> values) {
this.ids = values;
}
public List<String> getIds() {
return ids;
}
}

View file

@ -15,6 +15,7 @@ import org.springframework.context.annotation.DependsOn;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import ru.micord.ervu.account_applications.exception.IdmDirectoriesException;
@ -98,13 +99,15 @@ public class ErvuDirectoriesService {
ChangeActiveMessage.class
);
if (changeActiveMessage.isSuccess() && changeActiveMessage.getData() != null) {
if (changeActiveMessage.isSuccess() &&
changeActiveMessage.getData() != null &&
!CollectionUtils.isEmpty(changeActiveMessage.getData().getIds())) {
DataProcessor<T, ?> processor = (DataProcessor<T, ?>) dataProcessors.get(entityClass);
if (processor == null) {
throw new IllegalStateException("No processor found for " + entityClass.getSimpleName());
}
processor.changeActiveStatus(changeActiveMessage.getData().getId(), active);
processor.changeActiveStatus(changeActiveMessage.getData().getIds(), active);
}
}
catch (Exception e) {

View file

@ -1,12 +1,14 @@
package ru.micord.ervu.account_applications.service.processor;
import java.util.List;
/**
* @author Adel Kalimullin
*/
public interface DataProcessor<T, R> {
void upsertData(T data);
void changeActiveStatus(String id, boolean active);
void changeActiveStatus(List<String> ids, boolean active);
Class<T> getType();

View file

@ -54,7 +54,7 @@ public class RecruitmentIpProcessor
}
@Override
public void changeActiveStatus(String id, boolean active) {
public void changeActiveStatus(List<String> ids, boolean active) {
throw new UnsupportedOperationException("Not supported yet.");
}

View file

@ -2,6 +2,7 @@ package ru.micord.ervu.account_applications.service.processor.impl;
import java.sql.Timestamp;
import java.time.Instant;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
@ -56,8 +57,8 @@ public class RecruitmentProcessor implements DataProcessor<RecruitmentData, Recr
}
@Override
public void changeActiveStatus(String id, boolean active) {
dao.setActiveStatus(id, active);
public void changeActiveStatus(List<String> ids, boolean active) {
dao.setActiveStatus(ids, active);
}
@Override

View file

@ -57,7 +57,7 @@ public class RecruitmentSolutionProcessor
}
@Override
public void changeActiveStatus(String id, boolean active) {
public void changeActiveStatus(List<String> ids, boolean active) {
throw new UnsupportedOperationException("Not supported yet.");
}

View file

@ -4,6 +4,7 @@ package ru.micord.ervu.account_applications.service.processor.impl;
import java.sql.Timestamp;
import java.time.Instant;
import java.util.Arrays;
import java.util.List;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
@ -41,8 +42,8 @@ public class RoleProcessor implements DataProcessor<RoleData, UserApplicationRol
}
@Override
public void changeActiveStatus(String id, boolean active) {
dao.setActiveStatus(id, active);
public void changeActiveStatus(List<String> ids, boolean active) {
dao.setActiveStatus(ids, active);
}
@Override

View file

@ -2,6 +2,7 @@ package ru.micord.ervu.account_applications.service.processor.impl;
import java.sql.Timestamp;
import java.time.Instant;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@ -40,8 +41,8 @@ public class SolutionProcessor implements DataProcessor<SolutionData, SolutionRe
}
@Override
public void changeActiveStatus(String id, boolean active) {
dao.setActiveStatus(id, active);
public void changeActiveStatus(List<String> ids, boolean active) {
dao.setActiveStatus(ids, active);
}
@Override

View file

@ -57,7 +57,7 @@ public class SolutionRoleProcessor
}
@Override
public void changeActiveStatus(String id, boolean active) {
public void changeActiveStatus(List<String> ids, boolean active) {
throw new UnsupportedOperationException("Not supported yet.");
}