SUPPORT-8696: Fix
This commit is contained in:
parent
a837fcaf83
commit
6c90f9c4a3
3 changed files with 113 additions and 55 deletions
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue