From 8b5438e340d8e04bd855e6bc5c213f41e48232d3 Mon Sep 17 00:00:00 2001 From: Tejaswini Date: Tue, 20 Jun 2023 12:15:37 +0530 Subject: [PATCH 1/8] unique index created1 --- .../registry/controller/RegistryEntityController.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/java/registry/src/main/java/dev/sunbirdrc/registry/controller/RegistryEntityController.java b/java/registry/src/main/java/dev/sunbirdrc/registry/controller/RegistryEntityController.java index 28bdfa75b..5bf29cdfe 100644 --- a/java/registry/src/main/java/dev/sunbirdrc/registry/controller/RegistryEntityController.java +++ b/java/registry/src/main/java/dev/sunbirdrc/registry/controller/RegistryEntityController.java @@ -24,6 +24,7 @@ import dev.sunbirdrc.registry.transform.Configuration; import dev.sunbirdrc.registry.transform.Data; import dev.sunbirdrc.registry.transform.ITransformer; +import dev.sunbirdrc.registry.util.EntityParenter; import dev.sunbirdrc.validators.ValidationException; import org.apache.commons.lang3.StringUtils; import org.apache.tinkerpop.gremlin.structure.Vertex; @@ -63,6 +64,8 @@ public class RegistryEntityController extends AbstractController { private AsyncRequest asyncRequest; + @Autowired + EntityParenter entityParenter; @Value("${authentication.enabled:true}") boolean securityEnabled; @Value("${certificate.enableExternalTemplates:false}") boolean externalTemplatesEnabled; @@ -245,6 +248,11 @@ public ResponseEntity postEntity( newRootNode.set(entityName, rootNode); try { + if(!entityName.equals("Schema")) { + entityParenter.ensureKnownParenters(); + entityParenter.loadDefinitionIndex(); + entityParenter.ensureIndexExists(); + } String userId = registryHelper.authorizeManageEntity(request, entityName); String label = registryHelper.addEntity(newRootNode, userId); String emailId = registryHelper.fetchEmailIdFromToken(request, entityName); From cef34d4d33ff14563e9da392645daae04b8b6402 Mon Sep 17 00:00:00 2001 From: Tejaswini Date: Wed, 21 Jun 2023 11:22:33 +0530 Subject: [PATCH 2/8] updated unique index created1 --- .../registry/controller/RegistryEntityControllerTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/java/registry/src/test/java/dev/sunbirdrc/registry/controller/RegistryEntityControllerTest.java b/java/registry/src/test/java/dev/sunbirdrc/registry/controller/RegistryEntityControllerTest.java index 08bceb0ba..dfb7c0748 100644 --- a/java/registry/src/test/java/dev/sunbirdrc/registry/controller/RegistryEntityControllerTest.java +++ b/java/registry/src/test/java/dev/sunbirdrc/registry/controller/RegistryEntityControllerTest.java @@ -14,6 +14,7 @@ import dev.sunbirdrc.registry.transform.ConfigurationHelper; import dev.sunbirdrc.registry.transform.Transformer; import dev.sunbirdrc.registry.util.DefinitionsManager; +import dev.sunbirdrc.registry.util.EntityParenter; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -59,6 +60,9 @@ public class RegistryEntityControllerTest { private MockMvc mockMvc; private AbstractController abstractController; + @MockBean + private EntityParenter entityParenter; + @Before public void setUp() { abstractController = new RegistryEntityController(); From 90e4547d12007eef4a66d35a432c985090622b68 Mon Sep 17 00:00:00 2001 From: Tejaswini Date: Wed, 28 Jun 2023 13:00:35 +0530 Subject: [PATCH 3/8] make changed according to comment --- .../service/impl/RegistryServiceImpl.java | 3 + .../registry/util/EntityParenter.java | 56 +++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/java/registry/src/main/java/dev/sunbirdrc/registry/service/impl/RegistryServiceImpl.java b/java/registry/src/main/java/dev/sunbirdrc/registry/service/impl/RegistryServiceImpl.java index 160cea10c..0c22b2668 100755 --- a/java/registry/src/main/java/dev/sunbirdrc/registry/service/impl/RegistryServiceImpl.java +++ b/java/registry/src/main/java/dev/sunbirdrc/registry/service/impl/RegistryServiceImpl.java @@ -206,6 +206,9 @@ public String addEntity(Shard shard, String userId, JsonNode rootNode, boolean s entityId = registryDao.addEntity(graph, rootNode); if (commitEnabled) { dbProvider.commitTransaction(graph, tx); + entityParenter.ensureKnownParentersNew(rootNode); + entityParenter.loadDefinitionIndex(); + entityParenter.ensureIndexExists(); } } finally { if (tx != null) { diff --git a/java/registry/src/main/java/dev/sunbirdrc/registry/util/EntityParenter.java b/java/registry/src/main/java/dev/sunbirdrc/registry/util/EntityParenter.java index 72e7269db..33c751478 100644 --- a/java/registry/src/main/java/dev/sunbirdrc/registry/util/EntityParenter.java +++ b/java/registry/src/main/java/dev/sunbirdrc/registry/util/EntityParenter.java @@ -1,5 +1,6 @@ package dev.sunbirdrc.registry.util; +import com.fasterxml.jackson.databind.JsonNode; import dev.sunbirdrc.registry.dao.VertexWriter; import dev.sunbirdrc.registry.middleware.util.Constants; import dev.sunbirdrc.registry.model.DBConnectionInfo; @@ -26,6 +27,8 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import static dev.sunbirdrc.registry.Constants.Schema; + @Component("entityParenter") public class EntityParenter { private static Logger logger = LoggerFactory.getLogger(EntityParenter.class); @@ -163,6 +166,59 @@ public Optional ensureKnownParenters() { return result; } + public Optional ensureKnownParentersNew(JsonNode schemaNode) { + logger.info("Start - ensure parent node for defined schema"); + Optional result; + + dbConnectionInfoList.forEach(dbConnectionInfo -> { + logger.info("Starting to parents for {} definitions in shard {}", defintionNames.size(), + dbConnectionInfo.getShardId()); + DatabaseProvider dbProvider = dbProviderFactory.getInstance(dbConnectionInfo); + try { + try (OSGraph osGraph = dbProvider.getOSGraph()) { + Graph graph = osGraph.getGraphStore(); + List shardParentInfoList = new ArrayList<>(); + try (Transaction tx = dbProvider.startTransaction(graph)) { + + List parentLabels = new ArrayList<>(); + if(schemaNode.get(Schema)==null && schemaNode.fieldNames().next()!=null) { + String name = schemaNode.fieldNames().next(); + defintionNames.forEach(defintionName -> { + if (defintionName.contains(name)) { + String parentLabel = ParentLabelGenerator.getLabel(defintionName); + parentLabels.add(parentLabel); + + VertexWriter vertexWriter = new VertexWriter(graph, dbProvider, uuidPropertyName); + Vertex v = vertexWriter.ensureParentVertex(parentLabel); + + ShardParentInfo shardParentInfo = new ShardParentInfo(defintionName, v); + shardParentInfo.setUuid(dbProvider.getId(v)); + shardParentInfoList.add(shardParentInfo); + } + }); + + + ShardParentInfoList valList = new ShardParentInfoList(); + valList.setParentInfos(shardParentInfoList); + + shardParentMap.put(dbConnectionInfo.getShardId(), valList); + + dbProvider.commitTransaction(graph, tx); + } + } + logger.info("Ensured parents for {} definitions in shard {}", defintionNames.size(), + dbConnectionInfo.getShardId()); + } + } catch (Exception e) { + logger.error("Can't ensure parents for definitions " + e); + } + }); + + logger.info("End - ensure parent node for defined schema"); + result = Optional.empty(); + return result; + } + /** * Gets a known parent id * From 2188278ba198f8563ef88e8aa55a0b2b02a0e965 Mon Sep 17 00:00:00 2001 From: Tejaswini Date: Wed, 5 Jul 2023 15:24:16 +0530 Subject: [PATCH 4/8] conflicts resolved for Unique Index --- .../java/dev/sunbirdrc/pojos/Response.java | 8 + .../controller/RegistryEntityController.java | 166 ++++++++++++++---- .../service/impl/RegistryServiceImpl.java | 4 +- .../registry/util/EntityParenter.java | 47 ++++- 4 files changed, 187 insertions(+), 38 deletions(-) diff --git a/java/pojos/src/main/java/dev/sunbirdrc/pojos/Response.java b/java/pojos/src/main/java/dev/sunbirdrc/pojos/Response.java index 6fad2d3f0..c7d972485 100644 --- a/java/pojos/src/main/java/dev/sunbirdrc/pojos/Response.java +++ b/java/pojos/src/main/java/dev/sunbirdrc/pojos/Response.java @@ -85,6 +85,14 @@ public enum API_ID { AUDIT(getApiPrefix() + ".audit"), HEALTH(getApiPrefix() + ".health"), DELETE(getApiPrefix() + ".delete"), + + PUT(getApiPrefix() + ".put"), + + POST(getApiPrefix() + ".post"), + + GET(getApiPrefix() + ".get"), + + PATCH(getApiPrefix() + ".patch"), SEARCH(getApiPrefix() + ".search"), SIGN(getApiName() + ".utils.sign"), VERIFY(getApiName() + ".utils.verify"), diff --git a/java/registry/src/main/java/dev/sunbirdrc/registry/controller/RegistryEntityController.java b/java/registry/src/main/java/dev/sunbirdrc/registry/controller/RegistryEntityController.java index 5bf29cdfe..24e2d1c76 100644 --- a/java/registry/src/main/java/dev/sunbirdrc/registry/controller/RegistryEntityController.java +++ b/java/registry/src/main/java/dev/sunbirdrc/registry/controller/RegistryEntityController.java @@ -10,9 +10,9 @@ import dev.sunbirdrc.pojos.PluginResponseMessage; import dev.sunbirdrc.pojos.Response; import dev.sunbirdrc.pojos.ResponseParams; -import dev.sunbirdrc.registry.dao.NotFoundException; import dev.sunbirdrc.registry.entities.AttestationPolicy; import dev.sunbirdrc.registry.exception.AttestationNotFoundException; +import dev.sunbirdrc.registry.exception.ErrorMessages; import dev.sunbirdrc.registry.exception.RecordNotFoundException; import dev.sunbirdrc.registry.exception.UnAuthorizedException; import dev.sunbirdrc.registry.middleware.MiddlewareHaltException; @@ -25,9 +25,11 @@ import dev.sunbirdrc.registry.transform.Data; import dev.sunbirdrc.registry.transform.ITransformer; import dev.sunbirdrc.registry.util.EntityParenter; +import dev.sunbirdrc.registry.util.ViewTemplateManager; import dev.sunbirdrc.validators.ValidationException; import org.apache.commons.lang3.StringUtils; import org.apache.tinkerpop.gremlin.structure.Vertex; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.keycloak.KeycloakPrincipal; import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; @@ -63,12 +65,18 @@ public class RegistryEntityController extends AbstractController { @Autowired private AsyncRequest asyncRequest; + @Autowired + private ViewTemplateManager viewTemplateManager; + + @Autowired EntityParenter entityParenter; - @Value("${authentication.enabled:true}") boolean securityEnabled; - @Value("${certificate.enableExternalTemplates:false}") boolean externalTemplatesEnabled; + @Value("${authentication.enabled:true}") + boolean securityEnabled; + @Value("${certificate.enableExternalTemplates:false}") + boolean externalTemplatesEnabled; @RequestMapping(value = "/api/v1/{entityName}/invite", method = RequestMethod.POST) public ResponseEntity invite( @@ -85,6 +93,7 @@ public ResponseEntity invite( ObjectNode newRootNode = objectMapper.createObjectNode(); newRootNode.set(entityName, rootNode); try { + checkEntityNameInDefinitionManager(entityName); registryHelper.authorizeInviteEntity(request, entityName); watch.start(TAG); String entityId = registryHelper.inviteEntity(newRootNode, ""); @@ -96,7 +105,12 @@ public ResponseEntity invite( responseParams.setStatus(Response.Status.SUCCESSFUL); watch.start(TAG); return new ResponseEntity<>(response, HttpStatus.OK); - }catch (MiddlewareHaltException | ValidationException | OwnerCreationException e) { + }catch (RecordNotFoundException e) { + createSchemaNotFoundResponse(e.getMessage(), responseParams); + response = new Response(Response.API_ID.INVITE, "ERROR", responseParams); + return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + } + catch (MiddlewareHaltException | ValidationException | OwnerCreationException e) { return badRequestException(responseParams, response, e.getMessage()); }catch (UnAuthorizedException unAuthorizedException){ return createUnauthorizedExceptionResponse(unAuthorizedException); @@ -111,7 +125,18 @@ public ResponseEntity invite( return internalErrorResponse(responseParams, response, e); } } + @NotNull + private void createSchemaNotFoundResponse(String errorMessage, ResponseParams responseParams) { + responseParams.setStatus(Response.Status.UNSUCCESSFUL); + responseParams.setErrmsg(errorMessage); + } + private void checkEntityNameInDefinitionManager(String entityName) throws RecordNotFoundException { + if (definitionsManager.getDefinition(entityName) == null) { + String errorMessage = String.format(ErrorMessages.NOT_PART_OF_THE_SYSTEM_EXCEPTION, entityName); + throw new RecordNotFoundException(errorMessage); + } + } @RequestMapping(value = "/api/v1/{entityName}/{entityId}", method = RequestMethod.DELETE) public ResponseEntity deleteEntity( @PathVariable String entityName, @@ -131,6 +156,7 @@ public ResponseEntity deleteEntity( ResponseParams responseParams = new ResponseParams(); Response response = new Response(Response.API_ID.DELETE, "OK", responseParams); try { + checkEntityNameInDefinitionManager(entityName); String tag = "RegistryController.delete " + entityName; watch.start(tag); Vertex deletedEntity = registryHelper.deleteEntity(entityId, userId); @@ -141,7 +167,12 @@ public ResponseEntity deleteEntity( responseParams.setStatus(Response.Status.SUCCESSFUL); watch.stop(tag); return new ResponseEntity<>(response, HttpStatus.OK); - } catch (Exception e) { + } catch (RecordNotFoundException e) { + createSchemaNotFoundResponse(e.getMessage(), responseParams); + response = new Response(Response.API_ID.DELETE, "ERROR", responseParams); + return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + } + catch (Exception e) { logger.error("RegistryController: Exception while Deleting entity", e); responseParams.setStatus(Response.Status.UNSUCCESSFUL); responseParams.setErrmsg(e.getMessage()); @@ -160,6 +191,7 @@ public ResponseEntity searchEntity(@PathVariable String entityName, @Req ArrayNode entity = JsonNodeFactory.instance.arrayNode(); entity.add(entityName); searchNode.set(ENTITY_TYPE, entity); + checkEntityNameInDefinitionManager(entityName); if (definitionsManager.getDefinition(entityName).getOsSchemaConfiguration().getEnableSearch()) { JsonNode result = registryHelper.searchEntity(searchNode); watch.stop("RegistryController.searchEntity"); @@ -171,7 +203,12 @@ public ResponseEntity searchEntity(@PathVariable String entityName, @Req responseParams.setStatus(Response.Status.UNSUCCESSFUL); responseParams.setErrmsg(String.format("Searching on entity %s not allowed", entityName)); } - } catch (Exception e) { + } catch (RecordNotFoundException e) { + createSchemaNotFoundResponse(e.getMessage(), responseParams); + response = new Response(Response.API_ID.SEARCH, "ERROR", responseParams); + return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + } + catch (Exception e) { logger.error("Exception in controller while searching entities !", e); response.setResult(""); responseParams.setStatus(Response.Status.UNSUCCESSFUL); @@ -203,6 +240,7 @@ public ResponseEntity putEntity( newRootNode.set(entityName, rootNode); try { + checkEntityNameInDefinitionManager(entityName); String tag = "RegistryController.update " + entityName; watch.start(tag); // TODO: get userID from auth header @@ -220,7 +258,12 @@ public ResponseEntity putEntity( watch.stop(tag); return new ResponseEntity<>(response, HttpStatus.OK); - } catch (Exception e) { + } catch (RecordNotFoundException e) { + createSchemaNotFoundResponse(e.getMessage(), responseParams); + response = new Response(Response.API_ID.PUT, "ERROR", responseParams); + return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + } + catch (Exception e) { logger.error("RegistryController: Exception while updating entity (without id)!", e); responseParams.setStatus(Response.Status.UNSUCCESSFUL); responseParams.setErrmsg(e.getMessage()); @@ -248,11 +291,7 @@ public ResponseEntity postEntity( newRootNode.set(entityName, rootNode); try { - if(!entityName.equals("Schema")) { - entityParenter.ensureKnownParenters(); - entityParenter.loadDefinitionIndex(); - entityParenter.ensureIndexExists(); - } + checkEntityNameInDefinitionManager(entityName); String userId = registryHelper.authorizeManageEntity(request, entityName); String label = registryHelper.addEntity(newRootNode, userId); String emailId = registryHelper.fetchEmailIdFromToken(request, entityName); @@ -269,7 +308,12 @@ public ResponseEntity postEntity( watch.stop("RegistryController.addToExistingEntity"); return new ResponseEntity<>(response, HttpStatus.OK); - } catch (MiddlewareHaltException e) { + }catch (RecordNotFoundException e) { + createSchemaNotFoundResponse(e.getMessage(), responseParams); + response = new Response(Response.API_ID.POST, "ERROR", responseParams); + return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + } + catch (MiddlewareHaltException e) { logger.info("Error in validating the request"); return badRequestException(responseParams, response, e.getMessage()); } catch (Exception e) { @@ -303,6 +347,7 @@ public ResponseEntity updatePropertyOfTheEntity( Response response = new Response(Response.API_ID.UPDATE, "OK", responseParams); try { + checkEntityNameInDefinitionManager(entityName); String tag = "RegistryController.update " + entityName; watch.start(tag); requestBody = registryHelper.removeFormatAttr(requestBody); @@ -317,7 +362,12 @@ public ResponseEntity updatePropertyOfTheEntity( registryHelper.invalidateAttestation(entityName, entityId, userId,registryHelper.getPropertyToUpdate(request,entityId)); watch.stop(tag); return new ResponseEntity<>(response, HttpStatus.OK); - } catch (Exception e) { + } catch (RecordNotFoundException e) { + createSchemaNotFoundResponse(e.getMessage(), responseParams); + response = new Response(Response.API_ID.PUT, "ERROR", responseParams); + return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + } + catch (Exception e) { responseParams.setErrmsg(e.getMessage()); responseParams.setStatus(Response.Status.UNSUCCESSFUL); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); @@ -332,13 +382,19 @@ public ResponseEntity addNewPropertyToTheEntity( @RequestHeader HttpHeaders header, @RequestBody JsonNode requestBody ) { + ResponseParams responseParams = new ResponseParams(); + Response response = new Response(Response.API_ID.UPDATE, "OK", responseParams); try { + checkEntityNameInDefinitionManager(entityName); registryHelper.authorize(entityName, entityId, request); - } catch (Exception e) { + } catch (RecordNotFoundException e) { + createSchemaNotFoundResponse(e.getMessage(), responseParams); + response = new Response(Response.API_ID.POST, "ERROR", responseParams); + return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + } + catch (Exception e) { return createUnauthorizedExceptionResponse(e); } - ResponseParams responseParams = new ResponseParams(); - Response response = new Response(Response.API_ID.UPDATE, "OK", responseParams); try { String tag = "RegistryController.addNewPropertyToTheEntity " + entityName; watch.start(tag); @@ -389,7 +445,9 @@ private JsonNode getAttestationNode(String attestationId, JsonNode node) { public ResponseEntity getEntityWithConsent( @PathVariable String entityName, HttpServletRequest request) { + ResponseParams responseParams=new ResponseParams(); try { + checkEntityNameInDefinitionManager(entityName); ArrayList fields = getConsentFields(request); JsonNode userInfoFromRegistry = registryHelper.getRequestedUserDetails(request, entityName); JsonNode jsonNode = userInfoFromRegistry.get(entityName); @@ -404,9 +462,10 @@ public ResponseEntity getEntityWithConsent( } } return new ResponseEntity<>(HttpStatus.NOT_FOUND); - } catch (RecordNotFoundException ex) { - logger.error("Error in finding the entity", ex); - return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } catch (RecordNotFoundException e) { + createSchemaNotFoundResponse(e.getMessage(), responseParams); + Response response = new Response(Response.API_ID.GET, "ERROR", responseParams); + return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); } catch (Exception e) { logger.error("Error in partner api access", e); return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); @@ -443,13 +502,20 @@ private ArrayList getConsentFields(HttpServletRequest request) { public ResponseEntity getEntityType(@PathVariable String entityName, @PathVariable String entityId, HttpServletRequest request) { + ResponseParams responseParams = new ResponseParams(); if (registryHelper.doesEntityOperationRequireAuthorization(entityName) && securityEnabled) { try { registryHelper.authorize(entityName, entityId, request); } catch (Exception e) { try { + checkEntityNameInDefinitionManager(entityName); registryHelper.authorizeAttestor(entityName, request); - } catch (Exception exceptionFromAuthorizeAttestor) { + } catch (RecordNotFoundException re) { + createSchemaNotFoundResponse(re.getMessage(), responseParams); + Response response = new Response(Response.API_ID.GET, "ERROR", responseParams); + return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + } + catch (Exception exceptionFromAuthorizeAttestor) { return new ResponseEntity<>(HttpStatus.FORBIDDEN); } } @@ -524,6 +590,7 @@ public ResponseEntity getEntity( ResponseParams responseParams = new ResponseParams(); Response response = new Response(Response.API_ID.READ, "OK", responseParams); try { + checkEntityNameInDefinitionManager(entityName); String readerUserId = getUserId(entityName, request); JsonNode node = getEntityJsonNode(entityName, entityId, requireLDResponse, readerUserId); if(requireLDResponse) { @@ -534,9 +601,9 @@ public ResponseEntity getEntity( } return new ResponseEntity<>(node, HttpStatus.OK); - } catch (NotFoundException | RecordNotFoundException e) { - responseParams.setErrmsg(e.getMessage()); - responseParams.setStatus(Response.Status.UNSUCCESSFUL); + } catch (RecordNotFoundException re) { + createSchemaNotFoundResponse(re.getMessage(), responseParams); + response = new Response(Response.API_ID.GET, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); } catch (Exception e) { logger.error("Read Api Exception occurred ", e); @@ -576,6 +643,7 @@ public ResponseEntity getEntityByToken(@PathVariable String entityName, ResponseParams responseParams = new ResponseParams(); Response response = new Response(Response.API_ID.SEARCH, "OK", responseParams); try { + checkEntityNameInDefinitionManager(entityName); JsonNode result = registryHelper.getRequestedUserDetails(request, entityName); if (result.get(entityName).size() > 0) { ArrayNode responseFromDb = registryHelper.fetchFromDBUsingEsResponse(entityName, (ArrayNode) result.get(entityName)); @@ -586,12 +654,11 @@ public ResponseEntity getEntityByToken(@PathVariable String entityName, return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); } } catch (RecordNotFoundException e) { - logger.error("Exception in controller while searching entities !", e); - response.setResult(""); - responseParams.setStatus(Response.Status.UNSUCCESSFUL); - responseParams.setErrmsg(e.getMessage()); + createSchemaNotFoundResponse(e.getMessage(),responseParams); + response = new Response(Response.API_ID.GET, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); - } catch (Exception e) { + } + catch (Exception e) { logger.error("Exception in controller while searching entities !", e); response.setResult(""); responseParams.setStatus(Response.Status.UNSUCCESSFUL); @@ -605,17 +672,23 @@ public ResponseEntity getEntityByToken(@PathVariable String entityName, public ResponseEntity getEntityForAttestation( @PathVariable String entity, @PathVariable String entityId - ) { + ) { ResponseParams responseParams= new ResponseParams(); try { JsonNode resultNode = registryHelper.readEntity("", entity, entityId, false, null, false); ObjectNode objectNode = objectMapper.createObjectNode(); objectNode.set("entity", resultNode.get(entity)); + checkEntityNameInDefinitionManager(entity); List attestationPolicies = definitionsManager.getDefinition(entity) .getOsSchemaConfiguration() .getAttestationPolicies(); objectNode.set("attestationPolicies", objectMapper.convertValue(attestationPolicies, JsonNode.class)); return new ResponseEntity<>(objectNode, HttpStatus.OK); - } catch (Exception e) { + } catch (RecordNotFoundException re) { + createSchemaNotFoundResponse(re.getMessage(), responseParams); + Response response = new Response(Response.API_ID.GET, "ERROR", responseParams); + return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + } + catch (Exception e) { e.printStackTrace(); return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } @@ -629,7 +702,15 @@ public ResponseEntity attestEntity( @RequestHeader HttpHeaders header, @RequestBody JsonNode rootNode ) throws Exception { - logger.info("Attestation request for {}", rootNode.get("fieldPaths")); + ResponseParams responseParams=new ResponseParams(); + try { + checkEntityNameInDefinitionManager(entityName); + } catch (RecordNotFoundException re) { + createSchemaNotFoundResponse(re.getMessage(),responseParams); + Response response = new Response(Response.API_ID.PATCH, "ERROR", responseParams); + return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + } + logger.info("Attestation request for {}", rootNode.get("fieldPaths")); JsonNode nodePath = rootNode.get("jsonPaths"); if (nodePath instanceof ArrayNode) { Iterator elements = ((ArrayNode) nodePath).elements(); @@ -704,6 +785,7 @@ public ResponseEntity getSignedEntityByToken(@PathVariable String entity ResponseParams responseParams = new ResponseParams(); Response response = new Response(Response.API_ID.SEARCH, "OK", responseParams); try { + checkEntityNameInDefinitionManager(entityName); JsonNode result = registryHelper.getRequestedUserDetails(request, entityName); if (result.get(entityName).size() > 0) { Object credentialTemplate = definitionsManager.getCredentialTemplate(entityName); @@ -714,7 +796,12 @@ public ResponseEntity getSignedEntityByToken(@PathVariable String entity responseParams.setStatus(Response.Status.UNSUCCESSFUL); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); } - } catch (Exception e) { + } catch (RecordNotFoundException re) { + createSchemaNotFoundResponse(re.getMessage(), responseParams); + response = new Response(Response.API_ID.GET, "ERROR", responseParams); + return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + } + catch (Exception e) { logger.error("Exception in controller while searching entities !", e); response.setResult(""); responseParams.setStatus(Response.Status.UNSUCCESSFUL); @@ -727,7 +814,9 @@ public ResponseEntity getSignedEntityByToken(@PathVariable String entity produces = {MediaType.APPLICATION_PDF_VALUE, MediaType.TEXT_HTML_VALUE, Constants.SVG_MEDIA_TYPE}) public ResponseEntity getAttestationCertificate(HttpServletRequest request, @PathVariable String entityName, @PathVariable String entityId, @PathVariable String attestationName, @PathVariable String attestationId) { + ResponseParams responseParams = new ResponseParams(); try { + checkEntityNameInDefinitionManager(entityName); String readerUserId = getUserId(entityName, request); JsonNode node = registryHelper.readEntity(readerUserId, entityName, entityId, false, null, false) .get(entityName).get(attestationName); @@ -739,7 +828,16 @@ public ResponseEntity getAttestationCertificate(HttpServletRequest reque getTemplateUrlFromRequest(request, entityName), getAttestationNode(attestationId, node) ), HttpStatus.OK); - } catch (AttestationNotFoundException e) { + }catch (RecordNotFoundException re) { + createSchemaNotFoundResponse(re.getMessage(), responseParams); + Response response = new Response(Response.API_ID.GET, "ERROR", responseParams); + try { + return new ResponseEntity<>(objectMapper.writeValueAsString(response), HttpStatus.NOT_FOUND); + } catch (JsonProcessingException e) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + } + catch (AttestationNotFoundException e) { logger.error(e.getMessage()); return new ResponseEntity<>(HttpStatus.NOT_FOUND); } catch (Exception e) { diff --git a/java/registry/src/main/java/dev/sunbirdrc/registry/service/impl/RegistryServiceImpl.java b/java/registry/src/main/java/dev/sunbirdrc/registry/service/impl/RegistryServiceImpl.java index 0c22b2668..7c69c29e7 100755 --- a/java/registry/src/main/java/dev/sunbirdrc/registry/service/impl/RegistryServiceImpl.java +++ b/java/registry/src/main/java/dev/sunbirdrc/registry/service/impl/RegistryServiceImpl.java @@ -206,8 +206,8 @@ public String addEntity(Shard shard, String userId, JsonNode rootNode, boolean s entityId = registryDao.addEntity(graph, rootNode); if (commitEnabled) { dbProvider.commitTransaction(graph, tx); - entityParenter.ensureKnownParentersNew(rootNode); - entityParenter.loadDefinitionIndex(); + entityParenter.ensureKnownParentNodesForSchema(rootNode); + entityParenter.loadDefinitionIndexForSchema(rootNode); entityParenter.ensureIndexExists(); } } finally { diff --git a/java/registry/src/main/java/dev/sunbirdrc/registry/util/EntityParenter.java b/java/registry/src/main/java/dev/sunbirdrc/registry/util/EntityParenter.java index 33c751478..6400239cf 100644 --- a/java/registry/src/main/java/dev/sunbirdrc/registry/util/EntityParenter.java +++ b/java/registry/src/main/java/dev/sunbirdrc/registry/util/EntityParenter.java @@ -88,7 +88,6 @@ public void loadDefinitionIndex() { List indexUniqueFields = definition.getOsSchemaConfiguration().getUniqueIndexFields(); List compositeIndexFields = IndexHelper.getCompositeIndexFields(indexFields); List singleIndexFields = IndexHelper.getSingleIndexFields(indexFields); - IndexFields indicesByDefinition = new IndexFields(); indicesByDefinition.setDefinitionName(definition.getTitle()); indicesByDefinition.setIndexFields(indexFields); @@ -113,7 +112,51 @@ public void loadDefinitionIndex() { } indexHelper.setDefinitionIndexMap(indexMap); } + public void loadDefinitionIndexForSchema(JsonNode schemaNode) { + Map indexMap = new ConcurrentHashMap(); + String schemaName = schemaNode.fieldNames().next(); + + for (Map.Entry entry : shardParentMap.entrySet()) { + String shardId = entry.getKey(); + ShardParentInfoList shardParentInfoList = entry.getValue(); + shardParentInfoList.getParentInfos().forEach(shardParentInfo -> { + Definition definition = definitionsManager.getDefinition(shardParentInfo.getName()); + // Process only for the specific schema added through API + if (definition.getTitle().equals(schemaName)) { + Vertex parentVertex = shardParentInfo.getVertex(); + List indexFields = definition.getOsSchemaConfiguration().getIndexFields(); + if (!indexFields.contains(uuidPropertyName)) { + indexFields.add(uuidPropertyName); // adds default field + } + List indexUniqueFields = definition.getOsSchemaConfiguration().getUniqueIndexFields(); + List compositeIndexFields = IndexHelper.getCompositeIndexFields(indexFields); + List singleIndexFields = IndexHelper.getSingleIndexFields(indexFields); + + IndexFields indicesByDefinition = new IndexFields(); + indicesByDefinition.setDefinitionName(definition.getTitle()); + indicesByDefinition.setIndexFields(indexFields); + indicesByDefinition.setUniqueIndexFields(indexUniqueFields); + indicesByDefinition.setNewSingleIndexFields(indexHelper.getNewFields(parentVertex, singleIndexFields, false)); + indicesByDefinition.setNewCompositeIndexFields(indexHelper.getNewFields(parentVertex, compositeIndexFields, false)); + indicesByDefinition.setNewUniqueIndexFields(indexHelper.getNewFields(parentVertex, indexUniqueFields, true)); + + int nNewIndices = indicesByDefinition.getNewSingleIndexFields().size(); + int nNewUniqIndices = indicesByDefinition.getNewUniqueIndexFields().size(); + int nNewCompIndices = indicesByDefinition.getNewCompositeIndexFields().size(); + + boolean indexingComplete = (nNewIndices == 0 && nNewUniqIndices == 0 && nNewCompIndices == 0); + indexHelper.updateDefinitionIndex(shardId, definition.getTitle(), indexingComplete); + logger.info("On loadDefinitionIndex for Shard:" + shardId + " definition: {} updated index to {} ", + definition.getTitle(), indexingComplete); + + definitionIndexFields.put(indicesByDefinition.getDefinitionName(), indicesByDefinition); + } + }); + } + + indexHelper.setDefinitionIndexMap(indexMap); + } /** * Creates the parent vertex in all the shards for all default definitions * @@ -166,7 +209,7 @@ public Optional ensureKnownParenters() { return result; } - public Optional ensureKnownParentersNew(JsonNode schemaNode) { + public Optional ensureKnownParentNodesForSchema(JsonNode schemaNode) { logger.info("Start - ensure parent node for defined schema"); Optional result; From 047e4389852d438c1a8530354772d9d44f9ad3ee Mon Sep 17 00:00:00 2001 From: Tejaswini Date: Wed, 5 Jul 2023 17:16:09 +0530 Subject: [PATCH 5/8] formating done --- .../controller/RegistryEntityController.java | 83 ++++++++----------- 1 file changed, 34 insertions(+), 49 deletions(-) diff --git a/java/registry/src/main/java/dev/sunbirdrc/registry/controller/RegistryEntityController.java b/java/registry/src/main/java/dev/sunbirdrc/registry/controller/RegistryEntityController.java index 833cad649..17f5f313a 100644 --- a/java/registry/src/main/java/dev/sunbirdrc/registry/controller/RegistryEntityController.java +++ b/java/registry/src/main/java/dev/sunbirdrc/registry/controller/RegistryEntityController.java @@ -24,7 +24,6 @@ import dev.sunbirdrc.registry.transform.Configuration; import dev.sunbirdrc.registry.transform.Data; import dev.sunbirdrc.registry.transform.ITransformer; -import dev.sunbirdrc.registry.util.ViewTemplateManager; import dev.sunbirdrc.registry.util.EntityParenter; import dev.sunbirdrc.registry.util.ViewTemplateManager; import dev.sunbirdrc.validators.ValidationException; @@ -78,10 +77,6 @@ public class RegistryEntityController extends AbstractController { @Autowired EntityParenter entityParenter; - @Value("${authentication.enabled:true}") - boolean securityEnabled; - @Value("${certificate.enableExternalTemplates:false}") - boolean externalTemplatesEnabled; @RequestMapping(value = "/api/v1/{entityName}/invite", method = RequestMethod.POST) public ResponseEntity invite( @@ -129,6 +124,7 @@ public ResponseEntity invite( return internalErrorResponse(responseParams, response, e); } } + @NotNull private void createSchemaNotFoundResponse(String errorMessage, ResponseParams responseParams) { responseParams.setStatus(Response.Status.UNSUCCESSFUL); @@ -174,12 +170,11 @@ public ResponseEntity deleteEntity( responseParams.setStatus(Response.Status.SUCCESSFUL); watch.stop(tag); return new ResponseEntity<>(response, HttpStatus.OK); - } catch (RecordNotFoundException e) { + } catch (RecordNotFoundException e) { createSchemaNotFoundResponse(e.getMessage(), responseParams); response = new Response(Response.API_ID.DELETE, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); - } - catch (Exception e) { + } catch (Exception e) { logger.error("RegistryController: Exception while Deleting entity", e); responseParams.setStatus(Response.Status.UNSUCCESSFUL); responseParams.setErrmsg(e.getMessage()); @@ -211,12 +206,11 @@ public ResponseEntity searchEntity(@PathVariable String entityName, @Req responseParams.setStatus(Response.Status.UNSUCCESSFUL); responseParams.setErrmsg(String.format("Searching on entity %s not allowed", entityName)); } - } catch (RecordNotFoundException e) { + } catch (RecordNotFoundException e) { createSchemaNotFoundResponse(e.getMessage(), responseParams); response = new Response(Response.API_ID.SEARCH, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); - } - catch (Exception e) { + } catch (Exception e) { logger.error("Exception in controller while searching entities !", e); response.setResult(""); responseParams.setStatus(Response.Status.UNSUCCESSFUL); @@ -270,8 +264,7 @@ public ResponseEntity putEntity( createSchemaNotFoundResponse(e.getMessage(), responseParams); response = new Response(Response.API_ID.PUT, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); - } - catch (Exception e) { + } catch (Exception e) { logger.error("RegistryController: Exception while updating entity (without id)!", e); responseParams.setStatus(Response.Status.UNSUCCESSFUL); responseParams.setErrmsg(e.getMessage()); @@ -317,12 +310,11 @@ public ResponseEntity postEntity( watch.stop("RegistryController.addToExistingEntity"); return new ResponseEntity<>(response, HttpStatus.OK); - }catch (RecordNotFoundException e) { + } catch (RecordNotFoundException e) { createSchemaNotFoundResponse(e.getMessage(), responseParams); response = new Response(Response.API_ID.POST, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); - } - catch (MiddlewareHaltException e) { + } catch (MiddlewareHaltException e) { logger.info("Error in validating the request"); return badRequestException(responseParams, response, e.getMessage()); } catch (Exception e) { @@ -370,12 +362,11 @@ public ResponseEntity updatePropertyOfTheEntity( registryHelper.invalidateAttestation(entityName, entityId, userId, registryHelper.getPropertyToUpdate(request, entityId)); watch.stop(tag); return new ResponseEntity<>(response, HttpStatus.OK); - } catch (RecordNotFoundException e) { + } catch (RecordNotFoundException e) { createSchemaNotFoundResponse(e.getMessage(), responseParams); response = new Response(Response.API_ID.PUT, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); - } - catch (Exception e) { + } catch (Exception e) { responseParams.setErrmsg(e.getMessage()); responseParams.setStatus(Response.Status.UNSUCCESSFUL); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); @@ -399,13 +390,10 @@ public ResponseEntity addNewPropertyToTheEntity( createSchemaNotFoundResponse(e.getMessage(), responseParams); response = new Response(Response.API_ID.POST, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); - } - catch (Exception e) { + } catch (Exception e) { return createUnauthorizedExceptionResponse(e); } - try { - String tag = "RegistryController.addNewPropertyToTheEntity " + entityName; watch.start(tag); String notes = getNotes(requestBody); @@ -512,7 +500,7 @@ private ArrayList getConsentFields(HttpServletRequest request) { {MediaType.APPLICATION_PDF_VALUE, MediaType.TEXT_HTML_VALUE, Constants.SVG_MEDIA_TYPE}) public ResponseEntity getEntityType(@PathVariable String entityName, @PathVariable String entityId, - HttpServletRequest request) { + HttpServletRequest request, @RequestHeader(required = false) String viewTemplateId) { ResponseParams responseParams = new ResponseParams(); if (registryHelper.doesEntityOperationRequireAuthorization(entityName) && securityEnabled) { try { @@ -522,12 +510,11 @@ public ResponseEntity getEntityType(@PathVariable String entityName, try { checkEntityNameInDefinitionManager(entityName); registryHelper.authorizeAttestor(entityName, request); - } catch (RecordNotFoundException re) { + } catch (RecordNotFoundException re) { createSchemaNotFoundResponse(re.getMessage(), responseParams); Response response = new Response(Response.API_ID.GET, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); - } - catch (Exception exceptionFromAuthorizeAttestor) { + } catch (Exception exceptionFromAuthorizeAttestor) { return new ResponseEntity<>(HttpStatus.FORBIDDEN); } } @@ -607,8 +594,8 @@ public ResponseEntity getEntity( try { checkEntityNameInDefinitionManager(entityName); String readerUserId = getUserId(entityName, request); - JsonNode node = getEntityJsonNode(entityName, entityId, requireLDResponse, readerUserId); - if(requireLDResponse) { + JsonNode node = getEntityJsonNode(entityName, entityId, requireLDResponse, readerUserId, viewTemplateId); + if (requireLDResponse) { addJsonLDSpec(node); } else if (requireVCResponse) { String vcString = node.get(OSSystemFields._osSignedData.name()).textValue(); @@ -677,11 +664,10 @@ public ResponseEntity getEntityByToken(@PathVariable String entityName, return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); } } catch (RecordNotFoundException e) { - createSchemaNotFoundResponse(e.getMessage(),responseParams); + createSchemaNotFoundResponse(e.getMessage(), responseParams); response = new Response(Response.API_ID.GET, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); - } - catch (Exception e) { + } catch (Exception e) { logger.error("Exception in controller while searching entities !", e); response.setResult(""); responseParams.setStatus(Response.Status.UNSUCCESSFUL); @@ -695,7 +681,8 @@ public ResponseEntity getEntityByToken(@PathVariable String entityName, public ResponseEntity getEntityForAttestation( @PathVariable String entity, @PathVariable String entityId - ) { ResponseParams responseParams= new ResponseParams(); + ) { + ResponseParams responseParams = new ResponseParams(); try { JsonNode resultNode = registryHelper.readEntity("", entity, entityId, false, null, false); ObjectNode objectNode = objectMapper.createObjectNode(); @@ -710,8 +697,7 @@ public ResponseEntity getEntityForAttestation( createSchemaNotFoundResponse(re.getMessage(), responseParams); Response response = new Response(Response.API_ID.GET, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); - } - catch (Exception e) { + } catch (Exception e) { e.printStackTrace(); return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } @@ -726,15 +712,15 @@ public ResponseEntity attestEntity( @RequestHeader HttpHeaders header, @RequestBody JsonNode rootNode ) throws Exception { - ResponseParams responseParams=new ResponseParams(); + ResponseParams responseParams = new ResponseParams(); try { checkEntityNameInDefinitionManager(entityName); } catch (RecordNotFoundException re) { - createSchemaNotFoundResponse(re.getMessage(),responseParams); + createSchemaNotFoundResponse(re.getMessage(), responseParams); Response response = new Response(Response.API_ID.PATCH, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); } - logger.info("Attestation request for {}", rootNode.get("fieldPaths")); + logger.info("Attestation request for {}", rootNode.get("fieldPaths")); JsonNode nodePath = rootNode.get("jsonPaths"); if (nodePath instanceof ArrayNode) { Iterator elements = ((ArrayNode) nodePath).elements(); @@ -824,8 +810,7 @@ public ResponseEntity getSignedEntityByToken(@PathVariable String entity createSchemaNotFoundResponse(re.getMessage(), responseParams); response = new Response(Response.API_ID.GET, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); - } - catch (Exception e) { + } catch (Exception e) { logger.error("Exception in controller while searching entities !", e); response.setResult(""); responseParams.setStatus(Response.Status.UNSUCCESSFUL); @@ -852,7 +837,7 @@ public ResponseEntity getAttestationCertificate(HttpServletRequest reque getTemplateUrlFromRequest(request, entityName), getAttestationNode(attestationId, node) ), HttpStatus.OK); - }catch (RecordNotFoundException re) { + } catch (RecordNotFoundException re) { createSchemaNotFoundResponse(re.getMessage(), responseParams); Response response = new Response(Response.API_ID.GET, "ERROR", responseParams); try { @@ -860,8 +845,7 @@ public ResponseEntity getAttestationCertificate(HttpServletRequest reque } catch (JsonProcessingException e) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } - } - catch (AttestationNotFoundException e) { + } catch (AttestationNotFoundException e) { logger.error(e.getMessage()); return new ResponseEntity<>(HttpStatus.NOT_FOUND); } catch (Exception e) { @@ -869,15 +853,16 @@ public ResponseEntity getAttestationCertificate(HttpServletRequest reque return new ResponseEntity<>(HttpStatus.BAD_REQUEST); } } + @RequestMapping(value = "/api/v1/{entityName}/{entityId}/revoke", method = RequestMethod.POST) - public ResponseEntity revokeACredential ( + public ResponseEntity revokeACredential( HttpServletRequest request, @PathVariable String entityName, @PathVariable String entityId, @RequestHeader HttpHeaders headers - ){ + ) { String userId = USER_ANONYMOUS; - logger.info("Revoking the entityType {} with {} Id",entityName, entityId); + logger.info("Revoking the entityType {} with {} Id", entityName, entityId); // Check fot Authorisation if (registryHelper.doesEntityOperationRequireAuthorization(entityName)) { try { @@ -891,12 +876,12 @@ public ResponseEntity revokeACredential ( try { String tag = "RegistryController.revokeAnExistingCredential " + entityName; watch.start(tag); - JsonNode existingEntityNode = getEntityJsonNode(entityName, entityId,false, userId, null); + JsonNode existingEntityNode = getEntityJsonNode(entityName, entityId, false, userId, null); String signedData = existingEntityNode.get(OSSystemFields._osSignedData.name()).asText(); if (signedData.equals(new String()) || signedData.equals(null)) { throw new RecordNotFoundException("Credential is already revoked"); } - JsonNode revokedEntity = registryHelper.revokeAnEntity( entityName ,entityId, userId, existingEntityNode); + JsonNode revokedEntity = registryHelper.revokeAnEntity(entityName, entityId, userId, existingEntityNode); if (revokedEntity != null) { registryHelper.revokeExistingCredentials(entityName, entityId, userId, signedData); } @@ -908,7 +893,7 @@ public ResponseEntity revokeACredential ( logger.error("Registry Controller: Exception while revoking an entity:", e); responseParams.setStatus(Response.Status.UNSUCCESSFUL); responseParams.setErrmsg(e.getMessage()); - return new ResponseEntity<>(response,HttpStatus.INTERNAL_SERVER_ERROR); + return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR); } } } From b4a68614d4967b08030dffc19a815b08291b272d Mon Sep 17 00:00:00 2001 From: Tejaswini Date: Tue, 10 Oct 2023 16:52:54 +0530 Subject: [PATCH 6/8] resolve formating issue --- .../java/dev/sunbirdrc/pojos/Response.java | 7 +- .../controller/RegistryEntityController.java | 64 ++++++++++--------- .../RegistryEntityControllerTest.java | 14 ++-- 3 files changed, 40 insertions(+), 45 deletions(-) diff --git a/java/pojos/src/main/java/dev/sunbirdrc/pojos/Response.java b/java/pojos/src/main/java/dev/sunbirdrc/pojos/Response.java index 285c10ba9..4e47bfbde 100644 --- a/java/pojos/src/main/java/dev/sunbirdrc/pojos/Response.java +++ b/java/pojos/src/main/java/dev/sunbirdrc/pojos/Response.java @@ -86,15 +86,12 @@ public enum API_ID { HEALTH(getApiPrefix() + ".health"), DELETE(getApiPrefix() + ".delete"), - PUT(getApiPrefix() + ".put"), - - POST(getApiPrefix() + ".post"), - GET(getApiPrefix() + ".get"), - PATCH(getApiPrefix() + ".patch"), + PUT(getApiPrefix() + ".put"), SEARCH(getApiPrefix() + ".search"), + POST(getApiPrefix() + ".post"), SIGN(getApiName() + ".utils.sign"), VERIFY(getApiName() + ".utils.verify"), KEYS(getApiName() + ".utils.keys"), diff --git a/java/registry/src/main/java/dev/sunbirdrc/registry/controller/RegistryEntityController.java b/java/registry/src/main/java/dev/sunbirdrc/registry/controller/RegistryEntityController.java index 17f5f313a..5b29c2af9 100644 --- a/java/registry/src/main/java/dev/sunbirdrc/registry/controller/RegistryEntityController.java +++ b/java/registry/src/main/java/dev/sunbirdrc/registry/controller/RegistryEntityController.java @@ -24,7 +24,6 @@ import dev.sunbirdrc.registry.transform.Configuration; import dev.sunbirdrc.registry.transform.Data; import dev.sunbirdrc.registry.transform.ITransformer; -import dev.sunbirdrc.registry.util.EntityParenter; import dev.sunbirdrc.registry.util.ViewTemplateManager; import dev.sunbirdrc.validators.ValidationException; import org.agrona.Strings; @@ -74,10 +73,6 @@ public class RegistryEntityController extends AbstractController { @Value("${certificate.enableExternalTemplates:false}") boolean externalTemplatesEnabled; - @Autowired - EntityParenter entityParenter; - - @RequestMapping(value = "/api/v1/{entityName}/invite", method = RequestMethod.POST) public ResponseEntity invite( @PathVariable String entityName, @@ -170,6 +165,7 @@ public ResponseEntity deleteEntity( responseParams.setStatus(Response.Status.SUCCESSFUL); watch.stop(tag); return new ResponseEntity<>(response, HttpStatus.OK); + } catch (RecordNotFoundException e) { createSchemaNotFoundResponse(e.getMessage(), responseParams); response = new Response(Response.API_ID.DELETE, "ERROR", responseParams); @@ -260,8 +256,9 @@ public ResponseEntity putEntity( watch.stop(tag); return new ResponseEntity<>(response, HttpStatus.OK); + } catch (RecordNotFoundException e) { - createSchemaNotFoundResponse(e.getMessage(), responseParams); + createSchemaNotFoundResponse(e.getMessage(), responseParams); response = new Response(Response.API_ID.PUT, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); } catch (Exception e) { @@ -311,7 +308,7 @@ public ResponseEntity postEntity( return new ResponseEntity<>(response, HttpStatus.OK); } catch (RecordNotFoundException e) { - createSchemaNotFoundResponse(e.getMessage(), responseParams); + createSchemaNotFoundResponse(e.getMessage(), responseParams); response = new Response(Response.API_ID.POST, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); } catch (MiddlewareHaltException e) { @@ -363,7 +360,7 @@ public ResponseEntity updatePropertyOfTheEntity( watch.stop(tag); return new ResponseEntity<>(response, HttpStatus.OK); } catch (RecordNotFoundException e) { - createSchemaNotFoundResponse(e.getMessage(), responseParams); + createSchemaNotFoundResponse(e.getMessage(), responseParams); response = new Response(Response.API_ID.PUT, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); } catch (Exception e) { @@ -387,13 +384,15 @@ public ResponseEntity addNewPropertyToTheEntity( checkEntityNameInDefinitionManager(entityName); registryHelper.authorize(entityName, entityId, request); } catch (RecordNotFoundException e) { - createSchemaNotFoundResponse(e.getMessage(), responseParams); - response = new Response(Response.API_ID.POST, "ERROR", responseParams); + createSchemaNotFoundResponse(e.getMessage(), responseParams); + response = new Response(Response.API_ID.POST, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); } catch (Exception e) { return createUnauthorizedExceptionResponse(e); } + try { + String tag = "RegistryController.addNewPropertyToTheEntity " + entityName; watch.start(tag); String notes = getNotes(requestBody); @@ -462,8 +461,8 @@ public ResponseEntity getEntityWithConsent( } return new ResponseEntity<>(HttpStatus.NOT_FOUND); } catch (RecordNotFoundException e) { - createSchemaNotFoundResponse(e.getMessage(), responseParams); - Response response = new Response(Response.API_ID.GET, "ERROR", responseParams); + createSchemaNotFoundResponse(e.getMessage(), responseParams); + Response response = new Response(Response.API_ID.GET, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); } catch (Exception e) { logger.error("Error in partner api access", e); @@ -500,8 +499,10 @@ private ArrayList getConsentFields(HttpServletRequest request) { {MediaType.APPLICATION_PDF_VALUE, MediaType.TEXT_HTML_VALUE, Constants.SVG_MEDIA_TYPE}) public ResponseEntity getEntityType(@PathVariable String entityName, @PathVariable String entityId, - HttpServletRequest request, @RequestHeader(required = false) String viewTemplateId) { + HttpServletRequest request, + @RequestHeader(required = false) String viewTemplateId) { ResponseParams responseParams = new ResponseParams(); + Response response ; if (registryHelper.doesEntityOperationRequireAuthorization(entityName) && securityEnabled) { try { @@ -511,9 +512,9 @@ public ResponseEntity getEntityType(@PathVariable String entityName, checkEntityNameInDefinitionManager(entityName); registryHelper.authorizeAttestor(entityName, request); } catch (RecordNotFoundException re) { - createSchemaNotFoundResponse(re.getMessage(), responseParams); - Response response = new Response(Response.API_ID.GET, "ERROR", responseParams); - return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + createSchemaNotFoundResponse(re.getMessage(), responseParams); + response = new Response(Response.API_ID.GET, "ERROR", responseParams); + return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); } catch (Exception exceptionFromAuthorizeAttestor) { return new ResponseEntity<>(HttpStatus.FORBIDDEN); } @@ -604,7 +605,7 @@ public ResponseEntity getEntity( return new ResponseEntity<>(node, HttpStatus.OK); } catch (RecordNotFoundException re) { - createSchemaNotFoundResponse(re.getMessage(), responseParams); + createSchemaNotFoundResponse(re.getMessage(), responseParams); response = new Response(Response.API_ID.GET, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); } catch (Exception e) { @@ -664,7 +665,7 @@ public ResponseEntity getEntityByToken(@PathVariable String entityName, return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); } } catch (RecordNotFoundException e) { - createSchemaNotFoundResponse(e.getMessage(), responseParams); + createSchemaNotFoundResponse(e.getMessage(),responseParams); response = new Response(Response.API_ID.GET, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); } catch (Exception e) { @@ -682,7 +683,7 @@ public ResponseEntity getEntityForAttestation( @PathVariable String entity, @PathVariable String entityId ) { - ResponseParams responseParams = new ResponseParams(); + ResponseParams responseParams = new ResponseParams(); try { JsonNode resultNode = registryHelper.readEntity("", entity, entityId, false, null, false); ObjectNode objectNode = objectMapper.createObjectNode(); @@ -693,11 +694,13 @@ public ResponseEntity getEntityForAttestation( .getAttestationPolicies(); objectNode.set("attestationPolicies", objectMapper.convertValue(attestationPolicies, JsonNode.class)); return new ResponseEntity<>(objectNode, HttpStatus.OK); + } catch (RecordNotFoundException re) { - createSchemaNotFoundResponse(re.getMessage(), responseParams); + createSchemaNotFoundResponse(re.getMessage(), responseParams); Response response = new Response(Response.API_ID.GET, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); - } catch (Exception e) { + } + catch (Exception e) { e.printStackTrace(); return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR); } @@ -716,10 +719,11 @@ public ResponseEntity attestEntity( try { checkEntityNameInDefinitionManager(entityName); } catch (RecordNotFoundException re) { - createSchemaNotFoundResponse(re.getMessage(), responseParams); + createSchemaNotFoundResponse(re.getMessage(),responseParams); Response response = new Response(Response.API_ID.PATCH, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); } + logger.info("Attestation request for {}", rootNode.get("fieldPaths")); JsonNode nodePath = rootNode.get("jsonPaths"); if (nodePath instanceof ArrayNode) { @@ -807,7 +811,7 @@ public ResponseEntity getSignedEntityByToken(@PathVariable String entity return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); } } catch (RecordNotFoundException re) { - createSchemaNotFoundResponse(re.getMessage(), responseParams); + createSchemaNotFoundResponse(re.getMessage(), responseParams); response = new Response(Response.API_ID.GET, "ERROR", responseParams); return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); } catch (Exception e) { @@ -837,6 +841,7 @@ public ResponseEntity getAttestationCertificate(HttpServletRequest reque getTemplateUrlFromRequest(request, entityName), getAttestationNode(attestationId, node) ), HttpStatus.OK); + } catch (RecordNotFoundException re) { createSchemaNotFoundResponse(re.getMessage(), responseParams); Response response = new Response(Response.API_ID.GET, "ERROR", responseParams); @@ -853,16 +858,15 @@ public ResponseEntity getAttestationCertificate(HttpServletRequest reque return new ResponseEntity<>(HttpStatus.BAD_REQUEST); } } - @RequestMapping(value = "/api/v1/{entityName}/{entityId}/revoke", method = RequestMethod.POST) - public ResponseEntity revokeACredential( + public ResponseEntity revokeACredential ( HttpServletRequest request, @PathVariable String entityName, @PathVariable String entityId, @RequestHeader HttpHeaders headers - ) { + ){ String userId = USER_ANONYMOUS; - logger.info("Revoking the entityType {} with {} Id", entityName, entityId); + logger.info("Revoking the entityType {} with {} Id",entityName, entityId); // Check fot Authorisation if (registryHelper.doesEntityOperationRequireAuthorization(entityName)) { try { @@ -876,12 +880,12 @@ public ResponseEntity revokeACredential( try { String tag = "RegistryController.revokeAnExistingCredential " + entityName; watch.start(tag); - JsonNode existingEntityNode = getEntityJsonNode(entityName, entityId, false, userId, null); + JsonNode existingEntityNode = getEntityJsonNode(entityName, entityId,false, userId, null); String signedData = existingEntityNode.get(OSSystemFields._osSignedData.name()).asText(); if (signedData.equals(new String()) || signedData.equals(null)) { throw new RecordNotFoundException("Credential is already revoked"); } - JsonNode revokedEntity = registryHelper.revokeAnEntity(entityName, entityId, userId, existingEntityNode); + JsonNode revokedEntity = registryHelper.revokeAnEntity( entityName ,entityId, userId, existingEntityNode); if (revokedEntity != null) { registryHelper.revokeExistingCredentials(entityName, entityId, userId, signedData); } @@ -893,7 +897,7 @@ public ResponseEntity revokeACredential( logger.error("Registry Controller: Exception while revoking an entity:", e); responseParams.setStatus(Response.Status.UNSUCCESSFUL); responseParams.setErrmsg(e.getMessage()); - return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR); + return new ResponseEntity<>(response,HttpStatus.INTERNAL_SERVER_ERROR); } } } diff --git a/java/registry/src/test/java/dev/sunbirdrc/registry/controller/RegistryEntityControllerTest.java b/java/registry/src/test/java/dev/sunbirdrc/registry/controller/RegistryEntityControllerTest.java index 1991c12ec..677a58da0 100644 --- a/java/registry/src/test/java/dev/sunbirdrc/registry/controller/RegistryEntityControllerTest.java +++ b/java/registry/src/test/java/dev/sunbirdrc/registry/controller/RegistryEntityControllerTest.java @@ -6,7 +6,6 @@ import com.fasterxml.jackson.databind.node.JsonNodeFactory; import dev.sunbirdrc.pojos.AsyncRequest; import dev.sunbirdrc.pojos.SunbirdRCInstrumentation; -import org.mockito.ArgumentMatchers; import dev.sunbirdrc.registry.exception.RecordNotFoundException; import dev.sunbirdrc.registry.helper.RegistryHelper; import dev.sunbirdrc.registry.model.DBConnectionInfoMgr; @@ -14,12 +13,11 @@ import dev.sunbirdrc.registry.service.ICertificateService; import dev.sunbirdrc.registry.transform.*; import dev.sunbirdrc.registry.util.DefinitionsManager; -import org.apache.tinkerpop.gremlin.structure.Vertex; import dev.sunbirdrc.registry.util.ViewTemplateManager; -import dev.sunbirdrc.registry.util.EntityParenter; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentMatchers; import org.mockito.InjectMocks; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; @@ -27,6 +25,7 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.ContextConfiguration; @@ -34,13 +33,11 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.http.HttpHeaders; import javax.servlet.http.HttpServletRequest; + import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.*; - -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @RunWith(SpringRunner.class) @WebMvcTest({RegistryEntityController.class}) @@ -77,9 +74,6 @@ public class RegistryEntityControllerTest { @MockBean private ViewTemplateManager viewTemplateManager; - @MockBean - private EntityParenter entityParenter; - @Before public void setUp() { abstractController = new RegistryEntityController(); From afbd3939b90f65a2b15474febdd3f9a02977e149 Mon Sep 17 00:00:00 2001 From: Tejaswini Date: Wed, 25 Oct 2023 14:36:06 +0530 Subject: [PATCH 7/8] Changes in RegistryEntityControllrTest --- .../registry/controller/RegistryEntityControllerTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java/registry/src/test/java/dev/sunbirdrc/registry/controller/RegistryEntityControllerTest.java b/java/registry/src/test/java/dev/sunbirdrc/registry/controller/RegistryEntityControllerTest.java index 677a58da0..3f2aaa95d 100644 --- a/java/registry/src/test/java/dev/sunbirdrc/registry/controller/RegistryEntityControllerTest.java +++ b/java/registry/src/test/java/dev/sunbirdrc/registry/controller/RegistryEntityControllerTest.java @@ -38,7 +38,6 @@ import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - @RunWith(SpringRunner.class) @WebMvcTest({RegistryEntityController.class}) @ContextConfiguration(classes = {RegistryEntityController.class}) From 64058edd2c53aadf302c0fccad3dbad4560825d1 Mon Sep 17 00:00:00 2001 From: Tejaswini Date: Wed, 25 Oct 2023 16:57:05 +0530 Subject: [PATCH 8/8] reverted file RegistryEntityControllrTest --- .../controller/RegistryEntityControllerTest.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/java/registry/src/test/java/dev/sunbirdrc/registry/controller/RegistryEntityControllerTest.java b/java/registry/src/test/java/dev/sunbirdrc/registry/controller/RegistryEntityControllerTest.java index 3f2aaa95d..200043d46 100644 --- a/java/registry/src/test/java/dev/sunbirdrc/registry/controller/RegistryEntityControllerTest.java +++ b/java/registry/src/test/java/dev/sunbirdrc/registry/controller/RegistryEntityControllerTest.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.node.JsonNodeFactory; import dev.sunbirdrc.pojos.AsyncRequest; import dev.sunbirdrc.pojos.SunbirdRCInstrumentation; +import org.mockito.ArgumentMatchers; import dev.sunbirdrc.registry.exception.RecordNotFoundException; import dev.sunbirdrc.registry.helper.RegistryHelper; import dev.sunbirdrc.registry.model.DBConnectionInfoMgr; @@ -13,11 +14,11 @@ import dev.sunbirdrc.registry.service.ICertificateService; import dev.sunbirdrc.registry.transform.*; import dev.sunbirdrc.registry.util.DefinitionsManager; +import org.apache.tinkerpop.gremlin.structure.Vertex; import dev.sunbirdrc.registry.util.ViewTemplateManager; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.ArgumentMatchers; import org.mockito.InjectMocks; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; @@ -25,7 +26,6 @@ import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.ContextConfiguration; @@ -33,11 +33,14 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.http.HttpHeaders; import javax.servlet.http.HttpServletRequest; - import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; + @RunWith(SpringRunner.class) @WebMvcTest({RegistryEntityController.class}) @ContextConfiguration(classes = {RegistryEntityController.class})