diff --git a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/APIProvider.java b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/APIProvider.java index d745f5900cf0..26c2c78afbd7 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/APIProvider.java +++ b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/APIProvider.java @@ -1225,6 +1225,18 @@ void deleteAPIProduct(APIProductIdentifier identifier, String apiProductUUID, St */ boolean isDocumentationExist(String uuid, String docName, String organization) throws APIManagementException; + /** + * Checks whether the given document already exists for the given api/product + * + * @param uuid API/Product id + * @param documentId updating document id + * @param docOtherTypeName Name of the other document type + * @param organization Identifier of the organization + * @return true if document already exists for the given api/product + * @throws APIManagementException if failed to check existence of the documentation + */ + boolean isAnotherOverviewDocumentationExist(String uuid, String documentId, String docOtherTypeName, String organization) throws APIManagementException; + /** * Add WSDL to the api. wsdl can be provided either as a url or a resource file * @param apiId ID of the API diff --git a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIProviderImpl.java b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIProviderImpl.java index ea2dceb81065..e976d6b95c87 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIProviderImpl.java +++ b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIProviderImpl.java @@ -2518,6 +2518,27 @@ public boolean isDocumentationExist(String uuid, String docName, String organiza return exist; } + @Override + public boolean isAnotherOverviewDocumentationExist(String uuid, String documentId, String docOtherTypeName, String organization) throws APIManagementException { + boolean exist = false; + UserContext ctx = null; + try { + DocumentSearchResult result = apiPersistenceInstance.searchDocumentation(new Organization(organization), uuid, 0, 0, + "other:_overview", ctx); + if (result != null && result.getDocumentationList() != null && !result.getDocumentationList().isEmpty()) { + String returnDocOtherTypeName = result.getDocumentationList().get(0).getOtherTypeName(); + String returnDocId = result.getDocumentationList().get(0).getId(); + if ((documentId == null || !documentId.equals(returnDocId)) + && returnDocOtherTypeName != null && returnDocOtherTypeName.equals(docOtherTypeName)) { + exist = true; + } + } + } catch (DocumentationPersistenceException e) { + handleException("Failed to search documentation for other type name " + docOtherTypeName, e); + } + return exist; + } + /** * Returns the details of all the life-cycle changes done per API or API Product * diff --git a/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/RegistryPersistenceImpl.java b/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/RegistryPersistenceImpl.java index 45f28d39027e..475f48e87a75 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/RegistryPersistenceImpl.java +++ b/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/RegistryPersistenceImpl.java @@ -2817,6 +2817,13 @@ public DocumentSearchResult searchDocumentation(Organization org, String apiId, if (doc.getName().equalsIgnoreCase(requestedDocName)) { documentationList.add(doc); } + } + else if (searchQuery.toLowerCase().startsWith("other:")) { + String requestedDocOtherTypeName = searchQuery.split(":")[1]; + if (doc.getOtherTypeName() != null + && doc.getOtherTypeName().equalsIgnoreCase(requestedDocOtherTypeName)) { + documentationList.add(doc); + } } else { log.warn("Document search not implemented for the query " + searchQuery); } diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/common/mappings/PublisherCommonUtils.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/common/mappings/PublisherCommonUtils.java index fe02de190190..4ae693cf30a8 100755 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/common/mappings/PublisherCommonUtils.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1.common/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/common/mappings/PublisherCommonUtils.java @@ -2613,6 +2613,11 @@ public static Documentation addDocumentationToAPI(DocumentDTO documentDto, Strin throw new APIManagementException("Requested document '" + documentName + "' already exists", ExceptionCodes.DOCUMENT_ALREADY_EXISTS); } + if (documentDto.getType() == DocumentDTO.TypeEnum.OTHER && documentDto.getOtherTypeName() != null && apiProvider + .isAnotherOverviewDocumentationExist(apiId, null, documentDto.getOtherTypeName(), organization)) { + throw new APIManagementException("Requested other document type _overview already exists", + ExceptionCodes.DOCUMENT_ALREADY_EXISTS); + } documentation = apiProvider.addDocumentation(apiId, documentation, organization); return documentation; diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/impl/ApiProductsApiServiceImpl.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/impl/ApiProductsApiServiceImpl.java index 62677dfa8259..65ebf56de574 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/impl/ApiProductsApiServiceImpl.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/impl/ApiProductsApiServiceImpl.java @@ -355,6 +355,12 @@ public Response updateAPIProductDocument(String apiProductId, String documentId, RestApiUtil.handleBadRequest("Invalid document sourceUrl Format", log); return null; } + if (body.getType() == DocumentDTO.TypeEnum.OTHER + && body.getOtherTypeName() != null + && apiProvider.isAnotherOverviewDocumentationExist(apiProductId, documentId, body.getOtherTypeName(), organization)) { + RestApiUtil.handleBadRequest("Requested other document type _overview already exists", log); + return null; + } //overriding some properties body.setName(oldDocument.getName()); @@ -449,6 +455,11 @@ public Response addAPIProductDocument(String apiProductId, DocumentDTO body, String errorMessage = "Requested document '" + documentName + "' already exists"; RestApiUtil.handleResourceAlreadyExistsError(errorMessage, log); } + if (body.getType() == DocumentDTO.TypeEnum.OTHER + && body.getOtherTypeName() != null + && apiProvider.isAnotherOverviewDocumentationExist(apiProductId, null, body.getOtherTypeName(), organization)) { + RestApiUtil.handleBadRequest("Requested other document type _overview already exists", log); + } documentation = apiProvider.addDocumentation(apiProductId, documentation, organization); DocumentDTO newDocumentDTO = DocumentationMappingUtil.fromDocumentationToDTO(documentation); diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/impl/ApisApiServiceImpl.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/impl/ApisApiServiceImpl.java index 531a924f868d..85fea97d05a5 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/impl/ApisApiServiceImpl.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.publisher.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/publisher/v1/impl/ApisApiServiceImpl.java @@ -1918,6 +1918,12 @@ public Response updateAPIDocument(String apiId, String documentId, DocumentDTO b RestApiUtil.handleBadRequest("Invalid document sourceUrl Format", log); return null; } + if (body.getType() == DocumentDTO.TypeEnum.OTHER + && body.getOtherTypeName() != null + && apiProvider.isAnotherOverviewDocumentationExist(apiId, documentId, body.getOtherTypeName(), organization)) { + RestApiUtil.handleBadRequest("Requested other document type _overview already exists", log); + return null; + } //overriding some properties body.setName(oldDocument.getName());