Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Sandbox mdms action roles #572

Open
wants to merge 14 commits into
base: sandbox-default-data-handler
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

@Component
@Data
Expand All @@ -21,22 +22,40 @@ public class ServiceConfiguration {
@Value("${egov.mdms.host}${egov.mdms.default.data.create.endpoint}")
private String mdmsDefaultDataCreateURI;

@Value("${egov.mdms.host}${egov.mdms.schema.create.endpoint}")
private String mdmsSchemaCreateURI;

@Value("${egov.mdms.host}${egov.mdms.schema.search.endpoint}")
private String mdmsSchemaSearchURI;

@Value("${egov.mdms.host}${egov.mdms.data.create.endpoint}")
private String mdmsDataCreateURI;

@Value("${egov.mdms.host}${egov.mdms.data.search.endpoint}")
private String mdmsDataSearchURI;

@Value("#{'${default.mdms.schema.create.list}'.split(',')}")
private List<String> defaultMdmsSchemaList;

@Value("#{${mdms.schemacode.map}}")
private Map<String, List<String>> mdmsSchemacodeMap;

//Localization Configs
@Value("${egov.localization.host}${egov.localization.default.data.create.endpoint}")
private String localizationDefaultDataCreateURI;

@Value("${egov.localization.host}${egov.localization.upsert.path}")
private String upsertLocalizationURI;

@Value("${default.localization.locale}")
private String defaultLocalizationLocale;

@Value("#{'${default.localization.module.create.list}'.split(',')}")
private List<String> defaultLocalizationModuleList;

@Value("${tenant.localization.module}")
private String tenantLocalizationModule;

// User Config
@Value("${egov.user.host}")
private String userHost;
Expand Down Expand Up @@ -71,10 +90,6 @@ public class ServiceConfiguration {
@Value("${default.tenant.id}")
private String defaultTenantId;

// Module Master Configuration
@Value("${sandbox-ui.module.master.config}")
private String moduleMasterConfig;

// Workflow Configuration
@Value("${egov.workflow.host}${egov.workflow.businessservice.create.path}")
private String wfBusinessServiceCreateURI;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
@Component
public class ServiceConstants {

public static final String TENANT_BOUNDARY_SCHEMA = "egov-location.TenantBoundary";

public static final String EXTERNAL_SERVICE_EXCEPTION = "External Service threw an Exception: ";
public static final String SEARCHER_SERVICE_EXCEPTION = "Exception while fetching from searcher: ";

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@

import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.egov.common.contract.request.User;
import org.egov.handler.config.ServiceConfiguration;
import org.egov.handler.service.DataHandlerService;
import org.egov.handler.util.LocalizationUtil;
import org.egov.handler.util.OtpUtil;
import org.egov.handler.util.UserUtil;
import org.egov.handler.web.models.DefaultDataRequest;
Expand Down Expand Up @@ -32,19 +34,30 @@ public class TenantConsumer {

private final ServiceConfiguration serviceConfig;

private final LocalizationUtil localizationUtil;

@Autowired
public TenantConsumer(ObjectMapper mapper, DataHandlerService dataHandlerService, UserUtil userUtil, OtpUtil otpUtil, ServiceConfiguration serviceConfig) {
public TenantConsumer(ObjectMapper mapper, DataHandlerService dataHandlerService, UserUtil userUtil, OtpUtil otpUtil, ServiceConfiguration serviceConfig, LocalizationUtil localizationUtil) {
this.mapper = mapper;
this.dataHandlerService = dataHandlerService;
this.userUtil = userUtil;
this.otpUtil = otpUtil;
this.serviceConfig = serviceConfig;
this.localizationUtil = localizationUtil;
}

@KafkaListener(topics = {"${kafka.topics.create.tenant}"})
public void listen(final HashMap<String, Object> record, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic) {
TenantRequest tenantRequest = mapper.convertValue(record, TenantRequest.class);

// Setting userInfo with UUID
User userInfo = User.builder()
.uuid("40dceade-992d-4a8f-8243-19dda76a4171")
.build();
tenantRequest.getRequestInfo().setUserInfo(userInfo);

localizationUtil.upsertLocalization(tenantRequest);

// create user only for root tenant
if (Objects.isNull(tenantRequest.getTenant().getParentId())) {
log.info("Configuring Tenant: {}", tenantRequest.getTenant().getCode());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package org.egov.handler.service;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import lombok.extern.slf4j.Slf4j;
import org.egov.common.contract.request.RequestInfo;
import org.egov.handler.config.ServiceConfiguration;
import org.egov.handler.util.LocalizationUtil;
import org.egov.handler.util.MdmsV2Util;
Expand All @@ -18,6 +21,8 @@
import java.io.InputStream;
import java.util.*;

import static org.egov.handler.config.ServiceConstants.TENANT_BOUNDARY_SCHEMA;

@Slf4j
@Service
public class DataHandlerService {
Expand Down Expand Up @@ -55,13 +60,19 @@ public DataHandlerService(MdmsV2Util mdmsV2Util,

public void createDefaultData(DefaultDataRequest defaultDataRequest) {
if (defaultDataRequest.getSchemaCodes() != null) {
List<String> schemaCodes = new ArrayList<>(defaultDataRequest.getSchemaCodes());
if (schemaCodes.contains(TENANT_BOUNDARY_SCHEMA)) {
createTenantBoundarydata(defaultDataRequest.getRequestInfo(), defaultDataRequest.getTargetTenantId());
schemaCodes.remove(TENANT_BOUNDARY_SCHEMA);
}
DefaultMdmsDataRequest defaultMdmsDataRequest = DefaultMdmsDataRequest.builder()
.requestInfo(defaultDataRequest.getRequestInfo())
.targetTenantId(defaultDataRequest.getTargetTenantId())
.schemaCodes(defaultDataRequest.getSchemaCodes())
.schemaCodes(schemaCodes)
.onlySchemas(defaultDataRequest.getOnlySchemas())
.defaultTenantId(serviceConfig.getDefaultTenantId())
.build();
mdmsV2Util.createMdmsData(defaultMdmsDataRequest);
mdmsV2Util.createDefaultMdmsData(defaultMdmsDataRequest);
}

if (defaultDataRequest.getLocale() != null && defaultDataRequest.getModules() != null) {
Expand All @@ -70,13 +81,91 @@ public void createDefaultData(DefaultDataRequest defaultDataRequest) {
.targetTenantId(defaultDataRequest.getTargetTenantId())
.locale(defaultDataRequest.getLocale())
.modules(defaultDataRequest.getModules())
.defaultTenantId(serviceConfig.getDefaultTenantId())
.build();
localizationUtil.createLocalizationData(defaultLocalizationDataRequest);
}
}

private void createTenantBoundarydata(RequestInfo requestInfo, String targetTenantId) {
List<String> schemaCodes = new ArrayList<>(Collections.singletonList(TENANT_BOUNDARY_SCHEMA));

DefaultMdmsDataRequest defaultMdmsDataRequest = DefaultMdmsDataRequest.builder()
.requestInfo(requestInfo)
.targetTenantId(targetTenantId)
.schemaCodes(schemaCodes)
.onlySchemas(Boolean.TRUE)
.defaultTenantId(serviceConfig.getDefaultTenantId())
.build();
mdmsV2Util.createDefaultMdmsData(defaultMdmsDataRequest);

// Search data for the schema code in default tenetId
List<Mdms> mdmsList = getAllMdmsResults(serviceConfig.getDefaultTenantId(), TENANT_BOUNDARY_SCHEMA, requestInfo);
// Create schema data in the given tenantId
for (Mdms mdms : mdmsList) {
mdms.setTenantId(targetTenantId);

JsonNode dataNode = mdms.getData();
if (dataNode.has("boundary")) {
// Cast the 'boundary' node to ObjectNode so that we can modify it
ObjectNode boundaryNode = (ObjectNode) dataNode.get("boundary");

// Modify the 'code' field within the 'boundary' node
boundaryNode.put("code", targetTenantId);

// Set the modified 'data' back to the Mdms object (optional, since it's mutable)
((ObjectNode) dataNode).set("boundary", boundaryNode);
mdms.setData(dataNode);
} else {
log.info("Boundary node does not exist in the data.");
}
MdmsRequest mdmsRequest = MdmsRequest.builder().requestInfo(requestInfo).mdms(mdms).build();
log.info("{} : {}", mdms.getSchemaCode(), mdms.getUniqueIdentifier());
mdmsV2Util.createMdmsData(mdmsRequest);
}
}

// Method to get all search results with pagination
public List<Mdms> getAllMdmsResults(String tenantId, String schemaCode, RequestInfo requestInfo) {
List<Mdms> allMdmsResults = new ArrayList<>();
int limit = 100; // Default limit
int offset = 0; // Default offset

while (true) {
// Create MdmsCriteriaV2 with current offset and limit
MdmsCriteriaV2 mdmsCriteria = MdmsCriteriaV2.builder()
.tenantId(tenantId)
.schemaCode(schemaCode)
.offset(offset)
.limit(limit)
.build();

MdmsCriteriaReqV2 mdmsCriteriaReq = MdmsCriteriaReqV2.builder()
.requestInfo(requestInfo)
.mdmsCriteria(mdmsCriteria)
.build();

// Fetch results from the repository
MdmsResponseV2 dataSearchResponse = mdmsV2Util.searchMdmsData(mdmsCriteriaReq);
List<Mdms> mdmsList = dataSearchResponse.getMdms();

// Add the current batch of results to the list
allMdmsResults.addAll(mdmsList);

// Check if there are fewer results than the limit; if so, this is the last page
if (mdmsList.size() < limit) {
break;
}

// Update offset for the next batch
offset += limit;
}
return allMdmsResults;
}

public void createTenantConfig(TenantRequest tenantRequest) {
TenantConfigResponse tenantConfigSearchResponse = tenantManagementUtil.searchTenantConfig(serviceConfig.getDefaultTenantId(), tenantRequest.getRequestInfo());
TenantConfigResponse tenantConfigSearchResponse = tenantManagementUtil
.searchTenantConfig(serviceConfig.getDefaultTenantId(), tenantRequest.getRequestInfo());
List<TenantConfig> tenantConfigList = tenantConfigSearchResponse.getTenantConfigs();

for (TenantConfig tenantConfig : tenantConfigList) {
Expand All @@ -94,36 +183,27 @@ public void createTenantConfig(TenantRequest tenantRequest) {
}

public DefaultDataRequest setupDefaultData(DataSetupRequest dataSetupRequest) {
DefaultDataRequest defaultDataRequest = DefaultDataRequest.builder()
.requestInfo(dataSetupRequest.getRequestInfo())
.targetTenantId(dataSetupRequest.getTargetTenantId())
.onlySchemas(dataSetupRequest.getOnlySchemas())
.build();

if (Objects.equals(dataSetupRequest.getModule(), "PGR")) {
createPgrWorkflowConfig(dataSetupRequest.getTargetTenantId());
}

Set<String> uniqueIdentifiers = new HashSet<>();
uniqueIdentifiers.add(dataSetupRequest.getModule());

MdmsResponseV2 mdmsResponseV2 = mdmsV2Util.searchMdmsData(dataSetupRequest.getRequestInfo(), serviceConfig.getDefaultTenantId(), serviceConfig.getModuleMasterConfig(), uniqueIdentifiers);
List<Mdms> mdmsList = mdmsResponseV2.getMdms();

List<String> schemaCodes = new ArrayList<>();
List<String> modules = new ArrayList<>();

for (Mdms mdms : mdmsList) {
try {
MdmsData mdmsData = objectMapper.treeToValue(mdms.getData(), MdmsData.class);
processMasterList(mdmsData.getMasterList(), schemaCodes, modules);
} catch (IOException e) {
log.error("Failed to parse MDMS data :{}", mdms.getData(), e);
throw new CustomException("MDMS_DATA_PARSE_FAILED", "Failed to parse mdms data ");
if (dataSetupRequest.getSchemaCodes() == null) {
if (Objects.equals(dataSetupRequest.getModule(), "PGR")) {
defaultDataRequest.setSchemaCodes(serviceConfig.getMdmsSchemacodeMap().get("PGR"));
}
if (Objects.equals(dataSetupRequest.getModule(), "HRMS")) {
defaultDataRequest.setSchemaCodes(serviceConfig.getMdmsSchemacodeMap().get("HRMS"));
}
} else {
defaultDataRequest.setSchemaCodes(dataSetupRequest.getSchemaCodes());
}

DefaultDataRequest defaultDataRequest = DefaultDataRequest.builder()
.requestInfo(dataSetupRequest.getRequestInfo())
.targetTenantId(dataSetupRequest.getTargetTenantId())
.schemaCodes(schemaCodes)
.onlySchemas(dataSetupRequest.getOnlySchemas())
.build();

try {
createDefaultData(defaultDataRequest);
} catch (Exception e) {
Expand All @@ -137,23 +217,64 @@ private void createPgrWorkflowConfig(String targetTenantId) {
// Load the JSON file
Resource resource = resourceLoader.getResource("classpath:PgrWorkflowConfig.json");
try (InputStream inputStream = resource.getInputStream()) {
BusinessServiceRequest businessServiceRequest = objectMapper.readValue(inputStream, BusinessServiceRequest.class);
BusinessServiceRequest businessServiceRequest = objectMapper.readValue(inputStream,
BusinessServiceRequest.class);
businessServiceRequest.getBusinessServices().forEach(service -> service.setTenantId(targetTenantId));
workflowUtil.createWfConfig(businessServiceRequest);
} catch (IOException e) {
throw new CustomException("IO_EXCEPTION", "Error reading or mapping JSON file: " + e.getMessage());
}
}

private void processMasterList(List<Master> masterList, List<String> schemaCodes, List<String> modules) {
for (Master master : masterList) {
if ("module".equals(master.getType()) ||
"common".equals(master.getType()) ||
"config".equals(master.getType())) {
schemaCodes.add(master.getCode());
} else if ("localisation".equals(master.getType())) {
modules.add(master.getCode());
public void addMdmsData(DataSetupRequest dataSetupRequest) {

List<Mdms> filteredMdmsData = new ArrayList<>();

Resource resource = resourceLoader.getResource("classpath:MDMS.json");

try (InputStream inputStream = resource.getInputStream()) {

JsonNode rootNode = objectMapper.readTree(inputStream);
Map<String, List<Mdms>> mdmsMap = new HashMap<>();

// Iterate over each module (PGR, HRMS, etc.)
Iterator<Map.Entry<String, JsonNode>> fields = rootNode.fields();
while (fields.hasNext()) {
Map.Entry<String, JsonNode> field = fields.next();
String module = field.getKey();
JsonNode moduleNode = field.getValue();

// Convert the module node to List<Mdms>
List<Mdms> mdmsList = new ArrayList<>();
if (moduleNode.isArray()) {
for (JsonNode itemNode : moduleNode) {
Mdms mdms = objectMapper.treeToValue(itemNode, Mdms.class);
mdms.setData(itemNode);
mdmsList.add(mdms);
}
}

mdmsMap.put(module, mdmsList);
}
filteredMdmsData = mdmsMap.get(dataSetupRequest.getModule());
} catch (IOException e) {
throw new CustomException("IO_EXCEPTION", "Error reading or mapping JSON file: " + e.getMessage());
}
// Iterate over each filtered Mdms entry and create an MDMS entry
for (Mdms mdms : filteredMdmsData) {
mdms.setTenantId(dataSetupRequest.getTargetTenantId());
mdms.setSchemaCode("ACCESSCONTROL-ROLEACTIONS.roleactions");
String uniqueId = mdms.getData().get("actionid").asText() + "." + mdms.getData().get("rolecode").asText();
mdms.setUniqueIdentifier(uniqueId);
// Build an MdmsRequest for each entry
MdmsRequest mdmsRequest = MdmsRequest.builder()
.requestInfo(dataSetupRequest.getRequestInfo())
.mdms(mdms) // Assuming MdmsRequest has a field to set Mdms data
.build();

// Call createMdmsData for each mdmsRequest
mdmsV2Util.createMdmsData(mdmsRequest);
}
}

}
Loading