SUPPORT-8696: Fix

This commit is contained in:
Eduard Tihomirov 2025-03-28 13:09:54 +03:00
parent a837fcaf83
commit 6c90f9c4a3
3 changed files with 113 additions and 55 deletions

View file

@ -0,0 +1,64 @@
package ru.micord.ervu.account_applications.dao;
import java.util.List;
import java.util.UUID;
import org.jooq.DSLContext;
import org.jooq.Record2;
import org.jooq.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Repository;
import ru.micord.ervu.account_applications.db_beans.public_.tables.records.RecruitmentRecord;
import ru.micord.ervu.account_applications.db_beans.public_.tables.records.UserApplicationRoleRecord;
import static ru.micord.ervu.account_applications.db_beans.public_.tables.Recruitment.RECRUITMENT;
import static ru.micord.ervu.account_applications.db_beans.public_.tables.UserApplicationRole.USER_APPLICATION_ROLE;
/**
* @author Eduard Tihomirov
*/
@Repository
public class ErvuDirectoriesDao {
@Autowired
private DSLContext dsl;
@Cacheable(value = "role-ids", unless = "#result == null")
public List<String> getRoleIds() {
return dsl.select(USER_APPLICATION_ROLE.USER_ROLE_ID)
.from(USER_APPLICATION_ROLE)
.fetch(USER_APPLICATION_ROLE.USER_ROLE_ID);
}
@Cacheable(value = "domain-ids", unless = "#result == null")
public Result<Record2<UUID, String>> getDomainIds() {
return dsl.select(RECRUITMENT.ID, RECRUITMENT.IDM_ID)
.from(RECRUITMENT)
.fetch();
}
public UserApplicationRoleRecord getRoleRecord() {
return dsl.newRecord(USER_APPLICATION_ROLE);
}
public RecruitmentRecord getRecruitmentRecord() {
return dsl.newRecord(RECRUITMENT);
}
public void insertRecruitmentRecords(List<RecruitmentRecord> newRecruitmentRecords) {
dsl.batchInsert(newRecruitmentRecords).execute();
}
public void updateRecruitmentRecords(List<RecruitmentRecord> recruitmentRecords) {
dsl.batchUpdate(recruitmentRecords).execute();
}
public void insertRoleRecords(List<UserApplicationRoleRecord> newRoleRecords) {
dsl.batchInsert(newRoleRecords).execute();
}
public void updateRoleRecords(List<UserApplicationRoleRecord> roleRecords ) {
dsl.batchUpdate(roleRecords).execute();
}
}

View file

@ -0,0 +1,26 @@
package ru.micord.ervu.account_applications.kafka;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
import ru.micord.ervu.account_applications.service.ErvuDirectoriesService;
/**
* @author Eduard Tihomirov
*/
@Component
public class ErvuDirectoriesListner {
@Autowired
private ErvuDirectoriesService ervuDirectoriesService;
@KafkaListener(id = "${kafka.domain.group.id}", topics = "${kafka.domain.reconciliation}")
public void listenKafkaDomain(String kafkaMessage) {
ervuDirectoriesService.upsertKafkaDomainMessage(kafkaMessage);
}
@KafkaListener(id = "${kafka.role.group.id}", topics = "${kafka.role.reconciliation}")
public void listenKafkaRole(String kafkaMessage) {
ervuDirectoriesService.upsertKafkaRoleMessage(kafkaMessage);
}
}

View file

@ -10,28 +10,28 @@ import java.util.UUID;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.jooq.DSLContext;
import org.jooq.Record2;
import org.jooq.Result;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Caching;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import ru.micord.ervu.account_applications.dao.ErvuDirectoriesDao;
import ru.micord.ervu.account_applications.db_beans.public_.tables.records.RecruitmentRecord;
import ru.micord.ervu.account_applications.db_beans.public_.tables.records.UserApplicationRoleRecord;
import ru.micord.ervu.account_applications.model.RecruitmentResponse;
import ru.micord.ervu.account_applications.model.RoleResponse;
import static ru.micord.ervu.account_applications.db_beans.public_.tables.Recruitment.RECRUITMENT;
import static ru.micord.ervu.account_applications.db_beans.public_.tables.UserApplicationRole.USER_APPLICATION_ROLE;
/**
* @author Eduard Tihomirov
@ -45,18 +45,19 @@ public class ErvuDirectoriesService {
@Value("${ervu.collection:domain, role}")
private String ervuCollection;
@Autowired
private DSLContext dsl;
@Autowired
private RestTemplate restTemplate;
@Autowired
private ObjectMapper objectMapper;
Result<Record2<UUID, String>> domainIds = null;
List<String> roleIds = null;
@Autowired
private ErvuDirectoriesDao ervuDirectoriesDao;
@Caching(evict = {
@CacheEvict(value = "domain-ids", allEntries = true),
@CacheEvict(value = "role-ids", allEntries = true)
})
public void updateDirectories() {
try {
initIds();
String[] ervuCollectionArray = ervuCollection.split(",");
Arrays.stream(ervuCollectionArray).forEach(ervuCollection -> {
String targetUrl = ervuUrl + "/service/idm/reconcile/"+ ervuCollection + "/to/kafka/v1";
@ -78,9 +79,8 @@ public class ErvuDirectoriesService {
}
@KafkaListener(id = "${kafka.domain.group.id}", topics = "${kafka.domain.reconciliation}")
@Transactional
public void listenKafkaDomain(String kafkaMessage) {
public void upsertKafkaDomainMessage(String kafkaMessage) {
RecruitmentResponse[] response = null;
try {
response = objectMapper.readValue(kafkaMessage, RecruitmentResponse[].class);
@ -89,16 +89,12 @@ public class ErvuDirectoriesService {
throw new RuntimeException("Error with parsing domain kafka message", e);
}
if (response.length > 0 && response[0].getData() != null && !response[0].getData().isEmpty()) {
if (domainIds == null) {
initIds();
}
upsertRecruitmentData(response[0].getData(), getDomainIds());
upsertRecruitmentData(response[0].getData());
}
}
@KafkaListener(id = "${kafka.role.group.id}", topics = "${kafka.role.reconciliation}")
@Transactional
public void listenKafkaRole(String kafkaMessage) {
public void upsertKafkaRoleMessage(String kafkaMessage) {
RoleResponse[] response = null;
try {
response = objectMapper.readValue(kafkaMessage, RoleResponse[].class);
@ -107,21 +103,18 @@ public class ErvuDirectoriesService {
throw new RuntimeException("Error with parsing role kafka message", e);
}
if (response.length > 0 && response[0].getData() != null && !response[0].getData().isEmpty()) {
if (roleIds == null) {
initIds();
}
upsertRoleData(response[0].getData(), getRoleIds());
upsertRoleData(response[0].getData());
}
}
private void upsertRecruitmentData(List<RecruitmentResponse.Data> dataList,
Result<Record2<UUID, String>> ids) {
private void upsertRecruitmentData(List<RecruitmentResponse.Data> dataList) {
List<RecruitmentRecord> newRecruitmentRecords = new ArrayList<>();
List<RecruitmentRecord> recruitmentRecords = new ArrayList<>();
Result<Record2<UUID, String>> ids = ervuDirectoriesDao.getDomainIds();
dataList.forEach(data -> {
Timestamp updatedAt = Timestamp.from(Instant.ofEpochSecond(data.getModified()));
Timestamp createdAt = Timestamp.from(Instant.ofEpochSecond(data.getCreateDate()));
RecruitmentRecord recruitmentRecord = dsl.newRecord(RECRUITMENT);
RecruitmentRecord recruitmentRecord = ervuDirectoriesDao.getRecruitmentRecord();
recruitmentRecord.setIdmId(data.getId());
recruitmentRecord.setVersion(data.getVersion());
recruitmentRecord.setSchema(data.getSchema());
@ -169,13 +162,14 @@ public class ErvuDirectoriesService {
newRecruitmentRecords.add(recruitmentRecord);
}
});
dsl.batchInsert(newRecruitmentRecords).execute();
dsl.batchUpdate(recruitmentRecords).execute();
ervuDirectoriesDao.insertRecruitmentRecords(newRecruitmentRecords);
ervuDirectoriesDao.updateRecruitmentRecords(recruitmentRecords);
}
private void upsertRoleData(List<RoleResponse.Data> dataList, List<String> ids) {
private void upsertRoleData(List<RoleResponse.Data> dataList) {
List<UserApplicationRoleRecord> newRoleRecords = new ArrayList<>();
List<UserApplicationRoleRecord> roleRecords = new ArrayList<>();
List<String> ids = ervuDirectoriesDao.getRoleIds();
dataList.forEach(data -> {
Timestamp updatedAt = Timestamp.from(Instant.ofEpochSecond(data.getModified()));
Timestamp createdAt = Timestamp.from(Instant.ofEpochSecond(data.getCreateDate()));
@ -183,7 +177,7 @@ public class ErvuDirectoriesService {
if (data.getFinish() != null) {
finishAt = Timestamp.from(Instant.ofEpochSecond(data.getFinish()));
}
UserApplicationRoleRecord roleRecord = dsl.newRecord(USER_APPLICATION_ROLE);
UserApplicationRoleRecord roleRecord = ervuDirectoriesDao.getRoleRecord();
roleRecord.setUserRoleId(data.getId());
roleRecord.setRoleName(data.getDisplayName());
roleRecord.setCreated(createdAt);
@ -196,33 +190,7 @@ public class ErvuDirectoriesService {
newRoleRecords.add(roleRecord);
}
});
dsl.batchInsert(newRoleRecords).execute();
dsl.batchUpdate(roleRecords).execute();
ervuDirectoriesDao.insertRoleRecords(newRoleRecords);
ervuDirectoriesDao.updateRoleRecords(roleRecords);
}
private void initIds() {
setDomainIds(dsl.select(RECRUITMENT.ID, RECRUITMENT.IDM_ID)
.from(RECRUITMENT)
.fetch());
setRoleIds(dsl.select(USER_APPLICATION_ROLE.USER_ROLE_ID)
.from(USER_APPLICATION_ROLE)
.fetch(USER_APPLICATION_ROLE.USER_ROLE_ID));
}
public synchronized Result<Record2<UUID, String>> getDomainIds() {
return domainIds;
}
public synchronized void setDomainIds(Result<Record2<UUID, String>> domainIds) {
this.domainIds = domainIds;
}
public synchronized List<String> getRoleIds() {
return roleIds;
}
public synchronized void setRoleIds(List<String> roleIds) {
this.roleIds = roleIds;
}
}