From d3ba645464e728a5c5b37fdeea045a370250e61f Mon Sep 17 00:00:00 2001 From: AqeelMuhammad Date: Wed, 5 Feb 2025 17:13:25 +0530 Subject: [PATCH 1/7] Fix: 3526 - Add _overview doc validation and markdownContentId parameter --- .../wso2/carbon/apimgt/api/APIProvider.java | 12 ++++++++++ .../org/wso2/carbon/apimgt/api/model/API.java | 10 ++++++++ .../carbon/apimgt/api/model/APIProduct.java | 9 ++++++++ .../carbon/apimgt/impl/APIConsumerImpl.java | 7 ++++++ .../carbon/apimgt/impl/APIProviderImpl.java | 21 +++++++++++++++++ .../persistence/RegistryPersistenceImpl.java | 7 ++++++ .../apimgt/persistence/dto/DevPortalAPI.java | 10 +++++++- .../src/main/resources/devportal-api.yaml | 4 ++++ .../common/mappings/PublisherCommonUtils.java | 5 ++++ .../v1/impl/ApiProductsApiServiceImpl.java | 11 +++++++++ .../publisher/v1/impl/ApisApiServiceImpl.java | 6 +++++ .../apimgt/rest/api/store/v1/dto/APIDTO.java | 23 ++++++++++++++++++- .../api/store/v1/mappings/APIMappingUtil.java | 2 ++ .../src/main/resources/devportal-api.yaml | 4 ++++ 14 files changed, 129 insertions(+), 2 deletions(-) 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 69157976272c..3735be61ed30 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 @@ -1224,6 +1224,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.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java index a7d852eff7e1..1000d6afc456 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java +++ b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java @@ -143,6 +143,8 @@ public class API implements Serializable { private String implementation = "ENDPOINT"; private String monetizationCategory; + + private String markdownContentId; private List soapToRestSequences; @@ -1380,6 +1382,14 @@ public void setTestKey(String testKey) { this.testKey = testKey; } + public String getMarkdownContentId() { + return markdownContentId; + } + + public void setMarkdownContentId(String markdownContentId) { + this.markdownContentId = markdownContentId; + } + /** * This method returns endpoints according to the given endpoint config * diff --git a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/APIProduct.java b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/APIProduct.java index 13b9cdcff804..dd0b8d272422 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/APIProduct.java +++ b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/APIProduct.java @@ -65,6 +65,7 @@ public class APIProduct implements Serializable { private JSONObject monetizationProperties = new JSONObject(); private boolean isMonetizationEnabled = false; private String versionTimestamp; + private String markdownContentId; /** * API security at the gateway level. @@ -716,4 +717,12 @@ public int isEgress() { public void setEgress(int egress) { isEgress = egress; } + + public String getMarkdownContentId() { + return markdownContentId; + } + + public void setMarkdownContentId(String markdownContentId) { + this.markdownContentId = markdownContentId; + } } diff --git a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java index 6a062b1648fb..8f385d607de6 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java +++ b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java @@ -3907,6 +3907,13 @@ public ApiTypeWrapper getAPIorAPIProductByUUID(String uuid, String organization) checkVisibilityPermission(userNameWithoutChange, devPortalApi.getVisibility(), devPortalApi.getVisibleRoles(), devPortalApi.getPublisherAccessControl(), devPortalApi.getPublisherAccessControlRoles()); + List existingDocs = getAllDocumentation(uuid, organization); + for (Documentation doc : existingDocs) { + if (doc.getOtherTypeName() != null && doc.getOtherTypeName().equals("_overview")) { + devPortalApi.setMarkdownContentId(doc.getId()); + break; + } + } if (APIConstants.API_PRODUCT.equalsIgnoreCase(devPortalApi.getType())) { APIProduct apiProduct = APIMapper.INSTANCE.toApiProduct(devPortalApi); apiProduct.setID(new APIProductIdentifier(devPortalApi.getProviderName(), 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 23f810d0faac..96ddb4a87fe9 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 @@ -2418,6 +2418,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 74e8663a433d..6d85c7592533 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 @@ -2676,6 +2676,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.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/DevPortalAPI.java b/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/DevPortalAPI.java index 9db22f4078e0..b8a3469c2096 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/DevPortalAPI.java +++ b/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/DevPortalAPI.java @@ -67,6 +67,7 @@ public class DevPortalAPI extends DevPortalAPIInfo { private String asyncTransportProtocols; private String publisherAccessControl; private String publisherAccessControlRoles; + private String markdownContentId; public String getContextTemplate() { return contextTemplate; @@ -348,6 +349,13 @@ public void setAsyncTransportProtocols(String asyncTransportProtocols) { this.asyncTransportProtocols = asyncTransportProtocols; } + public String getMarkdownContentId() { + return markdownContentId; + } + + public void setMarkdownContentId(String markdownContentId) { + this.markdownContentId = markdownContentId; + } @Override public String toString() { @@ -366,7 +374,7 @@ public String toString() { + additionalProperties + ", endpointConfig=" + endpointConfig + ", type=" + type + ", advertisedOnly=" + advertisedOnly + ", swaggerDefinition=" + swaggerDefinition + ", contextTemplate=" + contextTemplate + ", apiSecurity=" + apiSecurity + ", visibility=" + visibility + ", visibleRoles=" + visibleRoles - + "]"; + + ", markdownContentId=" + markdownContentId + "]"; } public String getApiSecurity() { diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/devportal-api.yaml b/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/devportal-api.yaml index c6deac472695..7b91c285871b 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/devportal-api.yaml +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/devportal-api.yaml @@ -4053,6 +4053,10 @@ components: description: | If the provider value is not given user invoking the api will be used as the provider. example: admin + markdownContentId: + type: string + description: UUID of the overview markdown document + example: 01234567-0123-0123-0123-012345678901 apiDefinition: type: string description: | 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 d5904027c930..163de643e1a6 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 @@ -2242,6 +2242,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 edd6de768fcf..a83bb76594b9 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 @@ -1640,6 +1640,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()); diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/dto/APIDTO.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/dto/APIDTO.java index c5556b76967d..425bafa5a2a5 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/dto/APIDTO.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/dto/APIDTO.java @@ -36,6 +36,7 @@ public class APIDTO { private String context = null; private String version = null; private String provider = null; + private String markdownContentId = null; private String apiDefinition = null; private String wsdlUri = null; private String lifeCycleStatus = null; @@ -180,6 +181,24 @@ public void setProvider(String provider) { this.provider = provider; } + /** + * UUID of the overview markdown document + **/ + public APIDTO markdownContentId(String markdownContentId) { + this.markdownContentId = markdownContentId; + return this; + } + + + @ApiModelProperty(example = "01234567-0123-0123-0123-012345678901", value = "UUID of the overview markdown document") + @JsonProperty("markdownContentId") + public String getMarkdownContentId() { + return markdownContentId; + } + public void setMarkdownContentId(String markdownContentId) { + this.markdownContentId = markdownContentId; + } + /** * Swagger definition of the API which contains details about URI templates and scopes **/ @@ -751,6 +770,7 @@ public boolean equals(java.lang.Object o) { Objects.equals(context, API.context) && Objects.equals(version, API.version) && Objects.equals(provider, API.provider) && + Objects.equals(markdownContentId, API.markdownContentId) && Objects.equals(apiDefinition, API.apiDefinition) && Objects.equals(wsdlUri, API.wsdlUri) && Objects.equals(lifeCycleStatus, API.lifeCycleStatus) && @@ -786,7 +806,7 @@ public boolean equals(java.lang.Object o) { @Override public int hashCode() { - return Objects.hash(id, name, description, context, version, provider, apiDefinition, wsdlUri, lifeCycleStatus, isDefaultVersion, type, transport, operations, authorizationHeader, apiKeyHeader, securityScheme, tags, tiers, hasThumbnail, additionalProperties, monetization, endpointURLs, businessInformation, environmentList, scopes, avgRating, subscriptions, advertiseInfo, isSubscriptionAvailable, categories, keyManagers, createdTime, lastUpdatedTime, gatewayVendor, asyncTransportProtocols, egress, subtype); + return Objects.hash(id, name, description, context, version, provider, markdownContentId, apiDefinition, wsdlUri, lifeCycleStatus, isDefaultVersion, type, transport, operations, authorizationHeader, apiKeyHeader, securityScheme, tags, tiers, hasThumbnail, additionalProperties, monetization, endpointURLs, businessInformation, environmentList, scopes, avgRating, subscriptions, advertiseInfo, isSubscriptionAvailable, categories, keyManagers, createdTime, lastUpdatedTime, gatewayVendor, asyncTransportProtocols, egress, subtype); } @Override @@ -800,6 +820,7 @@ public String toString() { sb.append(" context: ").append(toIndentedString(context)).append("\n"); sb.append(" version: ").append(toIndentedString(version)).append("\n"); sb.append(" provider: ").append(toIndentedString(provider)).append("\n"); + sb.append(" markdownContentId: ").append(toIndentedString(markdownContentId)).append("\n"); sb.append(" apiDefinition: ").append(toIndentedString(apiDefinition)).append("\n"); sb.append(" wsdlUri: ").append(toIndentedString(wsdlUri)).append("\n"); sb.append(" lifeCycleStatus: ").append(toIndentedString(lifeCycleStatus)).append("\n"); diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/mappings/APIMappingUtil.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/mappings/APIMappingUtil.java index 6a89b988bf8e..87681d77e795 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/mappings/APIMappingUtil.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/mappings/APIMappingUtil.java @@ -98,6 +98,7 @@ public static APIDTO fromAPItoDTO(API model, String organization) throws APIMana dto.setSubtype(model.getSubtype()); dto.setAvgRating(String.valueOf(model.getRating())); dto.setEgress(model.isEgress() == 1); + dto.setMarkdownContentId(model.getMarkdownContentId()); Set scopes = model.getScopes(); Map uniqueScope = new HashMap<>(); @@ -302,6 +303,7 @@ public static APIDTO fromAPItoDTO(APIProduct model, String organization) throws dto.setType(model.getType()); dto.setAvgRating(String.valueOf(model.getRating())); dto.setEgress(model.isEgress() == 1); + dto.setMarkdownContentId(model.getMarkdownContentId()); /* todo: created and last updated times if (null != model.getLastUpdated()) { diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/resources/devportal-api.yaml b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/resources/devportal-api.yaml index c6deac472695..7b91c285871b 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/resources/devportal-api.yaml +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/resources/devportal-api.yaml @@ -4053,6 +4053,10 @@ components: description: | If the provider value is not given user invoking the api will be used as the provider. example: admin + markdownContentId: + type: string + description: UUID of the overview markdown document + example: 01234567-0123-0123-0123-012345678901 apiDefinition: type: string description: | From a23c28b177a6ad481f6cb3b1bb402f70c0fdf92d Mon Sep 17 00:00:00 2001 From: AqeelMuhammad Date: Sat, 8 Feb 2025 08:27:55 +0530 Subject: [PATCH 2/7] Fix: 3526 - Add a new resource to get the overview markdown content --- .../wso2/carbon/apimgt/api/APIManager.java | 11 ++++ .../org/wso2/carbon/apimgt/api/model/API.java | 12 ++-- .../carbon/apimgt/api/model/APIProduct.java | 10 +-- .../carbon/apimgt/impl/APIConsumerImpl.java | 11 +++- .../apimgt/impl/AbstractAPIManager.java | 17 ++++++ .../apimgt/impl/APIConsumerImplTest.java | 36 +++++------ .../impl/AbstractAPIManagerTestCase.java | 30 +++++++++ .../apimgt/persistence/dto/DevPortalAPI.java | 12 ++-- .../src/main/resources/devportal-api.yaml | 61 +++++++++++++++++-- .../apimgt/rest/api/store/v1/ApisApi.java | 18 ++++++ .../rest/api/store/v1/ApisApiService.java | 1 + .../apimgt/rest/api/store/v1/dto/APIDTO.java | 25 ++++---- .../api/store/v1/impl/ApisApiServiceImpl.java | 27 ++++++++ .../api/store/v1/mappings/APIMappingUtil.java | 4 +- .../src/main/resources/devportal-api.yaml | 61 +++++++++++++++++-- 15 files changed, 277 insertions(+), 59 deletions(-) diff --git a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/APIManager.java b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/APIManager.java index 05544baf910c..80397ee800f1 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/APIManager.java +++ b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/APIManager.java @@ -230,6 +230,17 @@ Documentation getDocumentation(String apiId, String docId, String organization) DocumentationContent getDocumentationContent(String apiId, String docId, String organization) throws APIManagementException; + /** + * Get the markdown overview documentation Content by api id + * + * @param apiId ID of the API + * @param organization Identifier of an organization + * @return DocumentationContent + * @throws APIManagementException if failed to get Documentation + */ + DocumentationContent getMarkdownOverviewContent(String apiId, String organization) + throws APIManagementException; + /** * Returns the GraphqlComplexityInfo object for a given API ID * diff --git a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java index 1000d6afc456..e43fdbfbaad8 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java +++ b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java @@ -144,8 +144,8 @@ public class API implements Serializable { private String monetizationCategory; - private String markdownContentId; - + private Boolean isMarkdownOverview; + private List soapToRestSequences; public List getSoapToRestSequences() { @@ -1382,12 +1382,12 @@ public void setTestKey(String testKey) { this.testKey = testKey; } - public String getMarkdownContentId() { - return markdownContentId; + public Boolean isIsMarkdownOverview() { + return isMarkdownOverview; } - public void setMarkdownContentId(String markdownContentId) { - this.markdownContentId = markdownContentId; + public void setIsMarkdownOverview(Boolean isMarkdownOverview) { + this.isMarkdownOverview = isMarkdownOverview; } /** diff --git a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/APIProduct.java b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/APIProduct.java index dd0b8d272422..7175c06b1f94 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/APIProduct.java +++ b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/APIProduct.java @@ -65,7 +65,7 @@ public class APIProduct implements Serializable { private JSONObject monetizationProperties = new JSONObject(); private boolean isMonetizationEnabled = false; private String versionTimestamp; - private String markdownContentId; + private Boolean isMarkdownOverview; /** * API security at the gateway level. @@ -718,11 +718,11 @@ public void setEgress(int egress) { isEgress = egress; } - public String getMarkdownContentId() { - return markdownContentId; + public Boolean isIsMarkdownOverview() { + return isMarkdownOverview; } - public void setMarkdownContentId(String markdownContentId) { - this.markdownContentId = markdownContentId; + public void setIsMarkdownOverview(Boolean isMarkdownOverview) { + this.isMarkdownOverview = isMarkdownOverview; } } diff --git a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java index 8f385d607de6..b2dc27ec778a 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java +++ b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java @@ -3908,9 +3908,10 @@ public ApiTypeWrapper getAPIorAPIProductByUUID(String uuid, String organization) devPortalApi.getVisibleRoles(), devPortalApi.getPublisherAccessControl(), devPortalApi.getPublisherAccessControlRoles()); List existingDocs = getAllDocumentation(uuid, organization); + devPortalApi.setIsMarkdownOverview(false); for (Documentation doc : existingDocs) { if (doc.getOtherTypeName() != null && doc.getOtherTypeName().equals("_overview")) { - devPortalApi.setMarkdownContentId(doc.getId()); + devPortalApi.setIsMarkdownOverview(true); break; } } @@ -4336,6 +4337,14 @@ public DocumentationContent getDocumentationContent(String apiId, String docId, return super.getDocumentationContent(apiId, docId, organization); } + @Override + public DocumentationContent getMarkdownOverviewContent(String apiId, String organization) + throws APIManagementException { + + checkAPIVisibilityRestriction(apiId, organization); + return super.getMarkdownOverviewContent(apiId, organization); + } + @Override public String getAsyncAPIDefinitionForLabel(Identifier apiId, String labelName) throws APIManagementException { diff --git a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/AbstractAPIManager.java b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/AbstractAPIManager.java index 37ed81e2b3c0..4eaf480edfde 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/AbstractAPIManager.java +++ b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/AbstractAPIManager.java @@ -495,6 +495,23 @@ public DocumentationContent getDocumentationContent(String apiId, String docId, } } + @Override + public DocumentationContent getMarkdownOverviewContent(String apiId, String organization) + throws APIManagementException { + + try { + DocumentSearchResult result = apiPersistenceInstance + .searchDocumentation(new Organization(organization), apiId, 0, 0, + "other:_overview", null); + if (result == null || result.getDocumentationList() == null || result.getDocumentationList().isEmpty()) { + return null; + } + return getDocumentationContent(apiId, result.getDocumentationList().get(0).getId(), organization); + } catch (DocumentationPersistenceException e) { + throw new APIManagementException("Error while retrieving document content ", e); + } + } + public GraphqlComplexityInfo getComplexityDetails(String uuid) throws APIManagementException { return apiMgtDAO.getComplexityDetails(uuid); diff --git a/components/apimgt/org.wso2.carbon.apimgt.impl/src/test/java/org/wso2/carbon/apimgt/impl/APIConsumerImplTest.java b/components/apimgt/org.wso2.carbon.apimgt.impl/src/test/java/org/wso2/carbon/apimgt/impl/APIConsumerImplTest.java index 79123abe8256..1ffe0e316d8b 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.impl/src/test/java/org/wso2/carbon/apimgt/impl/APIConsumerImplTest.java +++ b/components/apimgt/org.wso2.carbon.apimgt.impl/src/test/java/org/wso2/carbon/apimgt/impl/APIConsumerImplTest.java @@ -37,24 +37,7 @@ import org.wso2.carbon.apimgt.api.ExceptionCodes; import org.wso2.carbon.apimgt.api.WorkflowStatus; import org.wso2.carbon.apimgt.api.dto.KeyManagerConfigurationDTO; -import org.wso2.carbon.apimgt.api.model.API; -import org.wso2.carbon.apimgt.api.model.APIIdentifier; -import org.wso2.carbon.apimgt.api.model.APIKey; -import org.wso2.carbon.apimgt.api.model.APIRating; -import org.wso2.carbon.apimgt.api.model.AccessTokenInfo; -import org.wso2.carbon.apimgt.api.model.AccessTokenRequest; -import org.wso2.carbon.apimgt.api.model.ApiTypeWrapper; -import org.wso2.carbon.apimgt.api.model.Application; -import org.wso2.carbon.apimgt.api.model.Comment; -import org.wso2.carbon.apimgt.api.model.KeyManager; -import org.wso2.carbon.apimgt.api.model.KeyManagerConfiguration; -import org.wso2.carbon.apimgt.api.model.OAuthAppRequest; -import org.wso2.carbon.apimgt.api.model.OAuthApplicationInfo; -import org.wso2.carbon.apimgt.api.model.Scope; -import org.wso2.carbon.apimgt.api.model.SubscribedAPI; -import org.wso2.carbon.apimgt.api.model.Subscriber; -import org.wso2.carbon.apimgt.api.model.SubscriptionResponse; -import org.wso2.carbon.apimgt.api.model.Tier; +import org.wso2.carbon.apimgt.api.model.*; import org.wso2.carbon.apimgt.impl.dao.ApiMgtDAO; import org.wso2.carbon.apimgt.impl.dto.SubscriptionWorkflowDTO; import org.wso2.carbon.apimgt.impl.dto.WorkflowDTO; @@ -1008,4 +991,21 @@ public void testGetApplicationKeys() throws APIManagementException { assertEquals(apiKeySet.size(), 2); assertNotNull(apiKeySet.iterator().next().getAccessToken()); } + + @Test + public void testGetMarkdownOverviewContent() throws Exception { + String apiId = "api123"; + String organization = "wso2"; + DocumentationContent mockContent = new DocumentationContent(); + + APIConsumerImpl apiConsumer = PowerMockito.spy(new APIConsumerImplWrapper()); + + PowerMockito.doNothing().when(apiConsumer).checkAPIVisibilityRestriction(apiId, organization); + PowerMockito.doReturn(mockContent).when(apiConsumer, "getMarkdownOverviewContent", apiId, organization); + + DocumentationContent result = apiConsumer.getMarkdownOverviewContent(apiId, organization); + + Assert.assertNotNull(result); + Assert.assertEquals(mockContent, result); + } } diff --git a/components/apimgt/org.wso2.carbon.apimgt.impl/src/test/java/org/wso2/carbon/apimgt/impl/AbstractAPIManagerTestCase.java b/components/apimgt/org.wso2.carbon.apimgt.impl/src/test/java/org/wso2/carbon/apimgt/impl/AbstractAPIManagerTestCase.java index 0a130d890348..be61fd3be551 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.impl/src/test/java/org/wso2/carbon/apimgt/impl/AbstractAPIManagerTestCase.java +++ b/components/apimgt/org.wso2.carbon.apimgt.impl/src/test/java/org/wso2/carbon/apimgt/impl/AbstractAPIManagerTestCase.java @@ -257,6 +257,36 @@ public void testGetDocumentationFromId() throws Exception { } + @Test + public void testGetMarkdownOverviewContent() throws Exception { + String apiId = "sample-api-id"; + String organization = "sample-org"; + + AbstractAPIManager abstractAPIManager = new AbstractAPIManagerWrapper(apiPersistenceInstance); + + PowerMockito.mockStatic(ServiceReferenceHolder.class); + ServiceReferenceHolder sh = Mockito.mock(ServiceReferenceHolder.class); + APIManagerConfigurationService amConfigService = Mockito.mock(APIManagerConfigurationService.class); + APIManagerConfiguration amConfig = Mockito.mock(APIManagerConfiguration.class); + + PowerMockito.when(ServiceReferenceHolder.getInstance()).thenReturn(sh); + PowerMockito.when(sh.getAPIManagerConfigurationService()).thenReturn(amConfigService); + PowerMockito.when(amConfigService.getAPIManagerConfiguration()).thenReturn(amConfig); + + DocumentSearchResult searchResult = Mockito.mock(DocumentSearchResult.class); + Mockito.when(searchResult.getDocumentationList()).thenReturn(Collections.emptyList()); + Mockito.when(apiPersistenceInstance.searchDocumentation( + Mockito.any(Organization.class), + Mockito.eq(apiId), + Mockito.eq(0), + Mockito.eq(0), + Mockito.eq("other:_overview"), + Mockito.isNull() + )).thenReturn(searchResult); + + DocumentationContent result = abstractAPIManager.getMarkdownOverviewContent(apiId, organization); + Assert.assertNull(result); + } @Test public void testIsContextExist() throws APIManagementException { diff --git a/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/DevPortalAPI.java b/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/DevPortalAPI.java index b8a3469c2096..b2333b553e6c 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/DevPortalAPI.java +++ b/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/DevPortalAPI.java @@ -67,7 +67,7 @@ public class DevPortalAPI extends DevPortalAPIInfo { private String asyncTransportProtocols; private String publisherAccessControl; private String publisherAccessControlRoles; - private String markdownContentId; + private Boolean isMarkdownOverview; public String getContextTemplate() { return contextTemplate; @@ -349,12 +349,12 @@ public void setAsyncTransportProtocols(String asyncTransportProtocols) { this.asyncTransportProtocols = asyncTransportProtocols; } - public String getMarkdownContentId() { - return markdownContentId; + public Boolean isIsMarkdownOverview() { + return isMarkdownOverview; } - public void setMarkdownContentId(String markdownContentId) { - this.markdownContentId = markdownContentId; + public void setIsMarkdownOverview(Boolean isMarkdownOverview) { + this.isMarkdownOverview = isMarkdownOverview; } @Override @@ -374,7 +374,7 @@ public String toString() { + additionalProperties + ", endpointConfig=" + endpointConfig + ", type=" + type + ", advertisedOnly=" + advertisedOnly + ", swaggerDefinition=" + swaggerDefinition + ", contextTemplate=" + contextTemplate + ", apiSecurity=" + apiSecurity + ", visibility=" + visibility + ", visibleRoles=" + visibleRoles - + ", markdownContentId=" + markdownContentId + "]"; + + ", isMarkdownOverview=" + isMarkdownOverview + "]"; } public String getApiSecurity() { diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/devportal-api.yaml b/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/devportal-api.yaml index 7b91c285871b..3f2acb943104 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/devportal-api.yaml +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/devportal-api.yaml @@ -836,6 +836,60 @@ paths: - lang: Curl source: curl -k "https://localhost:9443/api/am/devportal/v3/apis/890a4f4d-09eb-4877-a323-57f6ce2ed79b/documents/0bcb7f05-599d-4e1a-adce-5cb89bfe58d5/content" + /apis/{apiId}/markdown-content: + get: + tags: + - APIs + summary: | + Get the Content of the API Overview Markdown Document + description: | + This operation can be used to retrieve the overview markdown document content of an API. You need to provide the Id of the API to retrieve it. + + The content of the document will be retrieved in `text/plain` content type + + `X-WSO2-Tenant` header can be used to retrieve the content of the overview markdown document of an API that belongs to a different tenant domain. If not specified super tenant will be used. If Authorization header is present in the request, the user's tenant associated with the access token will be used. + + **NOTE:** + * This operation does not require an Authorization header by default. But in order to see a restricted API's overview markdown document content, you need to provide Authorization header. + operationId: getMarkdownContentOfAPI + parameters: + - $ref: '#/components/parameters/apiId' + - $ref: '#/components/parameters/requestedTenant' + - $ref: '#/components/parameters/If-None-Match' + responses: + 200: + description: | + OK. + Inline content returned. + headers: + ETag: + description: | + Entity Tag of the response resource. + Used by caches, or in conditional requests. + schema: + type: string + Last-Modified: + description: | + Date and time the resource has been modified the last time. + Used by caches, or in conditional requests. + schema: + type: string + content: { } + 304: + description: | + Not Modified. + Empty body because the client has already the latest version of the requested resource. + content: { } + 404: + $ref: '#/components/responses/NotFound' + 406: + $ref: '#/components/responses/NotAcceptable' + security: + - OAuth2Security: [ ] + x-code-samples: + - lang: Curl + source: curl -k "https://localhost:9443/api/am/devportal/v3/apis/890a4f4d-09eb-4877-a323-57f6ce2ed79b/markdown-content" + /apis/{apiId}/thumbnail: get: tags: @@ -4053,10 +4107,9 @@ components: description: | If the provider value is not given user invoking the api will be used as the provider. example: admin - markdownContentId: - type: string - description: UUID of the overview markdown document - example: 01234567-0123-0123-0123-012345678901 + isMarkdownOverview: + type: boolean + example: true apiDefinition: type: string description: | diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/ApisApi.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/ApisApi.java index d71f44464f46..9d642433b568 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/ApisApi.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/ApisApi.java @@ -479,6 +479,24 @@ public Response getAllCommentsOfAPI(@ApiParam(value = "**API ID** consisting of return delegate.getCommentOfAPI(commentId, apiId, xWSO2Tenant, ifNoneMatch, includeCommenterInfo, replyLimit, replyOffset, securityContext); } + @GET + @Path("/{apiId}/markdown-content") + + @Produces({ "application/json" }) + @ApiOperation(value = "Get the Content of the API Overview Markdown Document ", notes = "This operation can be used to retrieve the overview markdown document content of an API. You need to provide the Id of the API to retrieve it. The content of the document will be retrieved in `text/plain` content type `X-WSO2-Tenant` header can be used to retrieve the content of the overview markdown document of an API that belongs to a different tenant domain. If not specified super tenant will be used. If Authorization header is present in the request, the user's tenant associated with the access token will be used. **NOTE:** * This operation does not require an Authorization header by default. But in order to see a restricted API's overview markdown document content, you need to provide Authorization header. ", response = Void.class, authorizations = { + @Authorization(value = "OAuth2Security", scopes = { + + }) + }, tags={ "APIs", }) + @ApiResponses(value = { + @ApiResponse(code = 200, message = "OK. Inline content returned. ", response = Void.class), + @ApiResponse(code = 304, message = "Not Modified. Empty body because the client has already the latest version of the requested resource. ", response = Void.class), + @ApiResponse(code = 404, message = "Not Found. The specified resource does not exist.", response = ErrorDTO.class), + @ApiResponse(code = 406, message = "Not Acceptable. The requested media type is not supported.", response = ErrorDTO.class) }) + public Response getMarkdownContentOfAPI(@ApiParam(value = "**API ID** consisting of the **UUID** of the API. ",required=true) @PathParam("apiId") String apiId, @ApiParam(value = "For cross-tenant invocations, this is used to specify the tenant domain, where the resource need to be retrieved from. " )@HeaderParam("X-WSO2-Tenant") String xWSO2Tenant, @ApiParam(value = "Validator for conditional requests; based on the ETag of the formerly retrieved variant of the resourec. " )@HeaderParam("If-None-Match") String ifNoneMatch) throws APIManagementException{ + return delegate.getMarkdownContentOfAPI(apiId, xWSO2Tenant, ifNoneMatch, securityContext); + } + @GET @Path("/{apiId}/comments/{commentId}/replies") diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/ApisApiService.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/ApisApiService.java index b554d2636f8a..1f3772c5cb09 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/ApisApiService.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/ApisApiService.java @@ -60,6 +60,7 @@ public interface ApisApiService { public Response editCommentOfAPI(String commentId, String apiId, PatchRequestBodyDTO patchRequestBodyDTO, MessageContext messageContext) throws APIManagementException; public Response getAllCommentsOfAPI(String apiId, String xWSO2Tenant, Integer limit, Integer offset, Boolean includeCommenterInfo, MessageContext messageContext) throws APIManagementException; public Response getCommentOfAPI(String commentId, String apiId, String xWSO2Tenant, String ifNoneMatch, Boolean includeCommenterInfo, Integer replyLimit, Integer replyOffset, MessageContext messageContext) throws APIManagementException; + public Response getMarkdownContentOfAPI(String apiId, String xWSO2Tenant, String ifNoneMatch, MessageContext messageContext) throws APIManagementException; public Response getRepliesOfComment(String commentId, String apiId, String xWSO2Tenant, Integer limit, Integer offset, String ifNoneMatch, Boolean includeCommenterInfo, MessageContext messageContext) throws APIManagementException; public Response getWSDLOfAPI(String apiId, String environmentName, String ifNoneMatch, String xWSO2Tenant, MessageContext messageContext) throws APIManagementException; } diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/dto/APIDTO.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/dto/APIDTO.java index 425bafa5a2a5..e7092c80ef61 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/dto/APIDTO.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/dto/APIDTO.java @@ -36,7 +36,7 @@ public class APIDTO { private String context = null; private String version = null; private String provider = null; - private String markdownContentId = null; + private Boolean isMarkdownOverview = null; private String apiDefinition = null; private String wsdlUri = null; private String lifeCycleStatus = null; @@ -182,21 +182,20 @@ public void setProvider(String provider) { } /** - * UUID of the overview markdown document **/ - public APIDTO markdownContentId(String markdownContentId) { - this.markdownContentId = markdownContentId; + public APIDTO isMarkdownOverview(Boolean isMarkdownOverview) { + this.isMarkdownOverview = isMarkdownOverview; return this; } - @ApiModelProperty(example = "01234567-0123-0123-0123-012345678901", value = "UUID of the overview markdown document") - @JsonProperty("markdownContentId") - public String getMarkdownContentId() { - return markdownContentId; + @ApiModelProperty(example = "true", value = "") + @JsonProperty("isMarkdownOverview") + public Boolean isIsMarkdownOverview() { + return isMarkdownOverview; } - public void setMarkdownContentId(String markdownContentId) { - this.markdownContentId = markdownContentId; + public void setIsMarkdownOverview(Boolean isMarkdownOverview) { + this.isMarkdownOverview = isMarkdownOverview; } /** @@ -770,7 +769,7 @@ public boolean equals(java.lang.Object o) { Objects.equals(context, API.context) && Objects.equals(version, API.version) && Objects.equals(provider, API.provider) && - Objects.equals(markdownContentId, API.markdownContentId) && + Objects.equals(isMarkdownOverview, API.isMarkdownOverview) && Objects.equals(apiDefinition, API.apiDefinition) && Objects.equals(wsdlUri, API.wsdlUri) && Objects.equals(lifeCycleStatus, API.lifeCycleStatus) && @@ -806,7 +805,7 @@ public boolean equals(java.lang.Object o) { @Override public int hashCode() { - return Objects.hash(id, name, description, context, version, provider, markdownContentId, apiDefinition, wsdlUri, lifeCycleStatus, isDefaultVersion, type, transport, operations, authorizationHeader, apiKeyHeader, securityScheme, tags, tiers, hasThumbnail, additionalProperties, monetization, endpointURLs, businessInformation, environmentList, scopes, avgRating, subscriptions, advertiseInfo, isSubscriptionAvailable, categories, keyManagers, createdTime, lastUpdatedTime, gatewayVendor, asyncTransportProtocols, egress, subtype); + return Objects.hash(id, name, description, context, version, provider, isMarkdownOverview, apiDefinition, wsdlUri, lifeCycleStatus, isDefaultVersion, type, transport, operations, authorizationHeader, apiKeyHeader, securityScheme, tags, tiers, hasThumbnail, additionalProperties, monetization, endpointURLs, businessInformation, environmentList, scopes, avgRating, subscriptions, advertiseInfo, isSubscriptionAvailable, categories, keyManagers, createdTime, lastUpdatedTime, gatewayVendor, asyncTransportProtocols, egress, subtype); } @Override @@ -820,7 +819,7 @@ public String toString() { sb.append(" context: ").append(toIndentedString(context)).append("\n"); sb.append(" version: ").append(toIndentedString(version)).append("\n"); sb.append(" provider: ").append(toIndentedString(provider)).append("\n"); - sb.append(" markdownContentId: ").append(toIndentedString(markdownContentId)).append("\n"); + sb.append(" isMarkdownOverview: ").append(toIndentedString(isMarkdownOverview)).append("\n"); sb.append(" apiDefinition: ").append(toIndentedString(apiDefinition)).append("\n"); sb.append(" wsdlUri: ").append(toIndentedString(wsdlUri)).append("\n"); sb.append(" lifeCycleStatus: ").append(toIndentedString(lifeCycleStatus)).append("\n"); diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/impl/ApisApiServiceImpl.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/impl/ApisApiServiceImpl.java index 70f30e8e0bb8..420ff8dbbe18 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/impl/ApisApiServiceImpl.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/impl/ApisApiServiceImpl.java @@ -1189,6 +1189,33 @@ private APIDTO getAPIByAPIId(String apiId, String organization) { return null; } + @Override + public Response getMarkdownContentOfAPI(String apiId, String xWSO2Tenant, String ifNoneMatch, + MessageContext messageContext) throws APIManagementException { + try { + String organization = RestApiUtil.getValidatedOrganization(messageContext); + APIConsumer apiConsumer = RestApiCommonUtil.getLoggedInUserConsumer(); + + DocumentationContent docContent = apiConsumer.getMarkdownOverviewContent(apiId, organization); + if (docContent == null) { + RestApiUtil.handleResourceNotFoundError(RestApiConstants.RESOURCE_DOCUMENTATION, ""); + return null; + } + String content = docContent.getTextContent(); + return Response.ok(content) + .header(RestApiConstants.HEADER_CONTENT_TYPE, APIConstants.DOCUMENTATION_INLINE_CONTENT_TYPE) + .build(); + } catch (APIManagementException e) { + if (RestApiUtil.isDueToResourceNotFound(e)) { + RestApiUtil.handleResourceNotFoundError(RestApiConstants.RESOURCE_API, apiId, e, log); + } else { + String errorMessage = "Error while retrieving overview markdown document of the API " + apiId; + RestApiUtil.handleInternalServerError(errorMessage, e, log); + } + } + return null; + } + /** * To check whether a particular exception is due to access control restriction. * diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/mappings/APIMappingUtil.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/mappings/APIMappingUtil.java index 87681d77e795..012a195d1239 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/mappings/APIMappingUtil.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/mappings/APIMappingUtil.java @@ -98,7 +98,7 @@ public static APIDTO fromAPItoDTO(API model, String organization) throws APIMana dto.setSubtype(model.getSubtype()); dto.setAvgRating(String.valueOf(model.getRating())); dto.setEgress(model.isEgress() == 1); - dto.setMarkdownContentId(model.getMarkdownContentId()); + dto.setIsMarkdownOverview(model.isIsMarkdownOverview()); Set scopes = model.getScopes(); Map uniqueScope = new HashMap<>(); @@ -303,7 +303,7 @@ public static APIDTO fromAPItoDTO(APIProduct model, String organization) throws dto.setType(model.getType()); dto.setAvgRating(String.valueOf(model.getRating())); dto.setEgress(model.isEgress() == 1); - dto.setMarkdownContentId(model.getMarkdownContentId()); + dto.setIsMarkdownOverview(model.isIsMarkdownOverview()); /* todo: created and last updated times if (null != model.getLastUpdated()) { diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/resources/devportal-api.yaml b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/resources/devportal-api.yaml index 7b91c285871b..3f2acb943104 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/resources/devportal-api.yaml +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/resources/devportal-api.yaml @@ -836,6 +836,60 @@ paths: - lang: Curl source: curl -k "https://localhost:9443/api/am/devportal/v3/apis/890a4f4d-09eb-4877-a323-57f6ce2ed79b/documents/0bcb7f05-599d-4e1a-adce-5cb89bfe58d5/content" + /apis/{apiId}/markdown-content: + get: + tags: + - APIs + summary: | + Get the Content of the API Overview Markdown Document + description: | + This operation can be used to retrieve the overview markdown document content of an API. You need to provide the Id of the API to retrieve it. + + The content of the document will be retrieved in `text/plain` content type + + `X-WSO2-Tenant` header can be used to retrieve the content of the overview markdown document of an API that belongs to a different tenant domain. If not specified super tenant will be used. If Authorization header is present in the request, the user's tenant associated with the access token will be used. + + **NOTE:** + * This operation does not require an Authorization header by default. But in order to see a restricted API's overview markdown document content, you need to provide Authorization header. + operationId: getMarkdownContentOfAPI + parameters: + - $ref: '#/components/parameters/apiId' + - $ref: '#/components/parameters/requestedTenant' + - $ref: '#/components/parameters/If-None-Match' + responses: + 200: + description: | + OK. + Inline content returned. + headers: + ETag: + description: | + Entity Tag of the response resource. + Used by caches, or in conditional requests. + schema: + type: string + Last-Modified: + description: | + Date and time the resource has been modified the last time. + Used by caches, or in conditional requests. + schema: + type: string + content: { } + 304: + description: | + Not Modified. + Empty body because the client has already the latest version of the requested resource. + content: { } + 404: + $ref: '#/components/responses/NotFound' + 406: + $ref: '#/components/responses/NotAcceptable' + security: + - OAuth2Security: [ ] + x-code-samples: + - lang: Curl + source: curl -k "https://localhost:9443/api/am/devportal/v3/apis/890a4f4d-09eb-4877-a323-57f6ce2ed79b/markdown-content" + /apis/{apiId}/thumbnail: get: tags: @@ -4053,10 +4107,9 @@ components: description: | If the provider value is not given user invoking the api will be used as the provider. example: admin - markdownContentId: - type: string - description: UUID of the overview markdown document - example: 01234567-0123-0123-0123-012345678901 + isMarkdownOverview: + type: boolean + example: true apiDefinition: type: string description: | From 1b57b70088558be419441f83fc0f686412f435ed Mon Sep 17 00:00:00 2001 From: AqeelMuhammad Date: Sat, 8 Feb 2025 09:58:18 +0530 Subject: [PATCH 3/7] Fix: 3526 - Fix isMarkdownOverview getter setter --- .../src/main/java/org/wso2/carbon/apimgt/api/model/API.java | 4 ++-- .../java/org/wso2/carbon/apimgt/api/model/APIProduct.java | 4 ++-- .../java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java | 4 ++-- .../org/wso2/carbon/apimgt/persistence/dto/DevPortalAPI.java | 4 ++-- .../apimgt/rest/api/store/v1/mappings/APIMappingUtil.java | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java index e43fdbfbaad8..d93698126d42 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java +++ b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java @@ -1382,11 +1382,11 @@ public void setTestKey(String testKey) { this.testKey = testKey; } - public Boolean isIsMarkdownOverview() { + public Boolean isMarkdownOverview() { return isMarkdownOverview; } - public void setIsMarkdownOverview(Boolean isMarkdownOverview) { + public void setMarkdownOverview(Boolean isMarkdownOverview) { this.isMarkdownOverview = isMarkdownOverview; } diff --git a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/APIProduct.java b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/APIProduct.java index 7175c06b1f94..95a5d3622e4c 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/APIProduct.java +++ b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/APIProduct.java @@ -718,11 +718,11 @@ public void setEgress(int egress) { isEgress = egress; } - public Boolean isIsMarkdownOverview() { + public Boolean isMarkdownOverview() { return isMarkdownOverview; } - public void setIsMarkdownOverview(Boolean isMarkdownOverview) { + public void setMarkdownOverview(Boolean isMarkdownOverview) { this.isMarkdownOverview = isMarkdownOverview; } } diff --git a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java index b2dc27ec778a..f74343e99abf 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java +++ b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java @@ -3908,10 +3908,10 @@ public ApiTypeWrapper getAPIorAPIProductByUUID(String uuid, String organization) devPortalApi.getVisibleRoles(), devPortalApi.getPublisherAccessControl(), devPortalApi.getPublisherAccessControlRoles()); List existingDocs = getAllDocumentation(uuid, organization); - devPortalApi.setIsMarkdownOverview(false); + devPortalApi.setMarkdownOverview(false); for (Documentation doc : existingDocs) { if (doc.getOtherTypeName() != null && doc.getOtherTypeName().equals("_overview")) { - devPortalApi.setIsMarkdownOverview(true); + devPortalApi.setMarkdownOverview(true); break; } } diff --git a/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/DevPortalAPI.java b/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/DevPortalAPI.java index b2333b553e6c..c742a8cfcd4b 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/DevPortalAPI.java +++ b/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/DevPortalAPI.java @@ -349,11 +349,11 @@ public void setAsyncTransportProtocols(String asyncTransportProtocols) { this.asyncTransportProtocols = asyncTransportProtocols; } - public Boolean isIsMarkdownOverview() { + public Boolean isMarkdownOverview() { return isMarkdownOverview; } - public void setIsMarkdownOverview(Boolean isMarkdownOverview) { + public void setMarkdownOverview(Boolean isMarkdownOverview) { this.isMarkdownOverview = isMarkdownOverview; } diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/mappings/APIMappingUtil.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/mappings/APIMappingUtil.java index 012a195d1239..bc850bd031f2 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/mappings/APIMappingUtil.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/mappings/APIMappingUtil.java @@ -98,7 +98,7 @@ public static APIDTO fromAPItoDTO(API model, String organization) throws APIMana dto.setSubtype(model.getSubtype()); dto.setAvgRating(String.valueOf(model.getRating())); dto.setEgress(model.isEgress() == 1); - dto.setIsMarkdownOverview(model.isIsMarkdownOverview()); + dto.setIsMarkdownOverview(model.isMarkdownOverview()); Set scopes = model.getScopes(); Map uniqueScope = new HashMap<>(); @@ -303,7 +303,7 @@ public static APIDTO fromAPItoDTO(APIProduct model, String organization) throws dto.setType(model.getType()); dto.setAvgRating(String.valueOf(model.getRating())); dto.setEgress(model.isEgress() == 1); - dto.setIsMarkdownOverview(model.isIsMarkdownOverview()); + dto.setIsMarkdownOverview(model.isMarkdownOverview()); /* todo: created and last updated times if (null != model.getLastUpdated()) { From efe5fb84da4d91e84c89e893938188c30eccd70d Mon Sep 17 00:00:00 2001 From: AqeelMuhammad Date: Mon, 10 Feb 2025 09:37:58 +0530 Subject: [PATCH 4/7] Fix: 3526 - Allow URI in api-manager.xml and api-manager.xml.j2 --- .../templates/repository/conf/api-manager.xml.j2 | 8 ++++++++ .../src/main/resources/config/api-manager.xml | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/conf_templates/templates/repository/conf/api-manager.xml.j2 b/features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/conf_templates/templates/repository/conf/api-manager.xml.j2 index fbb086ea50c3..0703019a9c66 100644 --- a/features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/conf_templates/templates/repository/conf/api-manager.xml.j2 +++ b/features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/conf_templates/templates/repository/conf/api-manager.xml.j2 @@ -738,6 +738,10 @@ /api/am/devportal/{version}/apis/{apiId} GET,HEAD + + /api/am/devportal/{version}/apis/{apiId}/markdown-content + GET,HEAD + /api/am/devportal/{version}/apis/{apiId}/swagger GET,HEAD @@ -802,6 +806,10 @@ /api/am/devportal/{version}/api-products/{apiId} GET,HEAD + + /api/am/devportal/{version}/api-products/{apiId}/markdown-content + GET,HEAD + /api/am/devportal/{version}/api-products/{apiId}/swagger GET,HEAD diff --git a/features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/config/api-manager.xml b/features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/config/api-manager.xml index 7d17bbe93ee7..13d8a297180c 100644 --- a/features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/config/api-manager.xml +++ b/features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/config/api-manager.xml @@ -454,6 +454,10 @@ /api/am/store/{version}/apis/{apiId} GET,HEAD + + /api/am/store/{version}/apis/{apiId}/markdown-content + GET,HEAD + /api/am/store/{version}/apis/{apiId}/swagger GET,HEAD @@ -514,6 +518,10 @@ /api/am/store/{version}/api-products/{apiProductId} GET,HEAD + + /api/am/store/{version}/api-products/{apiProductId}/markdown-content + GET,HEAD + /api/am/store/{version}/api-products/{apiProductId}/swagger GET,HEAD From e496a327afc6ecffcea302490abaaaee1f94a55c Mon Sep 17 00:00:00 2001 From: AqeelMuhammad Date: Sat, 15 Feb 2025 14:49:14 +0530 Subject: [PATCH 5/7] remove the resource `/apis/{apiId}/markdown-content` and related implementation --- .../wso2/carbon/apimgt/api/APIManager.java | 11 ---- .../carbon/apimgt/impl/APIConsumerImpl.java | 8 --- .../apimgt/impl/AbstractAPIManager.java | 17 ------ .../apimgt/impl/APIConsumerImplTest.java | 36 ++++++------- .../impl/AbstractAPIManagerTestCase.java | 30 ----------- .../src/main/resources/devportal-api.yaml | 54 ------------------- .../apimgt/rest/api/store/v1/ApisApi.java | 18 ------- .../rest/api/store/v1/ApisApiService.java | 1 - .../api/store/v1/impl/ApisApiServiceImpl.java | 27 ---------- .../src/main/resources/devportal-api.yaml | 54 ------------------- .../repository/conf/api-manager.xml.j2 | 8 --- .../src/main/resources/config/api-manager.xml | 8 --- 12 files changed, 18 insertions(+), 254 deletions(-) diff --git a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/APIManager.java b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/APIManager.java index 80397ee800f1..05544baf910c 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/APIManager.java +++ b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/APIManager.java @@ -230,17 +230,6 @@ Documentation getDocumentation(String apiId, String docId, String organization) DocumentationContent getDocumentationContent(String apiId, String docId, String organization) throws APIManagementException; - /** - * Get the markdown overview documentation Content by api id - * - * @param apiId ID of the API - * @param organization Identifier of an organization - * @return DocumentationContent - * @throws APIManagementException if failed to get Documentation - */ - DocumentationContent getMarkdownOverviewContent(String apiId, String organization) - throws APIManagementException; - /** * Returns the GraphqlComplexityInfo object for a given API ID * diff --git a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java index 38b45ffbc62d..62443152cac3 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java +++ b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java @@ -4397,14 +4397,6 @@ public DocumentationContent getDocumentationContent(String apiId, String docId, return super.getDocumentationContent(apiId, docId, organization); } - @Override - public DocumentationContent getMarkdownOverviewContent(String apiId, String organization) - throws APIManagementException { - - checkAPIVisibilityRestriction(apiId, organization); - return super.getMarkdownOverviewContent(apiId, organization); - } - @Override public String getAsyncAPIDefinitionForLabel(Identifier apiId, String labelName) throws APIManagementException { String updatedDefinition = null; diff --git a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/AbstractAPIManager.java b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/AbstractAPIManager.java index 1424fcda8bcf..ba229c79a643 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/AbstractAPIManager.java +++ b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/AbstractAPIManager.java @@ -498,23 +498,6 @@ public DocumentationContent getDocumentationContent(String apiId, String docId, } } - @Override - public DocumentationContent getMarkdownOverviewContent(String apiId, String organization) - throws APIManagementException { - - try { - DocumentSearchResult result = apiPersistenceInstance - .searchDocumentation(new Organization(organization), apiId, 0, 0, - "other:_overview", null); - if (result == null || result.getDocumentationList() == null || result.getDocumentationList().isEmpty()) { - return null; - } - return getDocumentationContent(apiId, result.getDocumentationList().get(0).getId(), organization); - } catch (DocumentationPersistenceException e) { - throw new APIManagementException("Error while retrieving document content ", e); - } - } - public GraphqlComplexityInfo getComplexityDetails(String uuid) throws APIManagementException { return apiMgtDAO.getComplexityDetails(uuid); diff --git a/components/apimgt/org.wso2.carbon.apimgt.impl/src/test/java/org/wso2/carbon/apimgt/impl/APIConsumerImplTest.java b/components/apimgt/org.wso2.carbon.apimgt.impl/src/test/java/org/wso2/carbon/apimgt/impl/APIConsumerImplTest.java index d1aba063b1c8..17180850614c 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.impl/src/test/java/org/wso2/carbon/apimgt/impl/APIConsumerImplTest.java +++ b/components/apimgt/org.wso2.carbon.apimgt.impl/src/test/java/org/wso2/carbon/apimgt/impl/APIConsumerImplTest.java @@ -37,7 +37,24 @@ import org.wso2.carbon.apimgt.api.ExceptionCodes; import org.wso2.carbon.apimgt.api.WorkflowStatus; import org.wso2.carbon.apimgt.api.dto.KeyManagerConfigurationDTO; -import org.wso2.carbon.apimgt.api.model.*; +import org.wso2.carbon.apimgt.api.model.API; +import org.wso2.carbon.apimgt.api.model.APIIdentifier; +import org.wso2.carbon.apimgt.api.model.APIKey; +import org.wso2.carbon.apimgt.api.model.APIRating; +import org.wso2.carbon.apimgt.api.model.AccessTokenInfo; +import org.wso2.carbon.apimgt.api.model.AccessTokenRequest; +import org.wso2.carbon.apimgt.api.model.ApiTypeWrapper; +import org.wso2.carbon.apimgt.api.model.Application; +import org.wso2.carbon.apimgt.api.model.Comment; +import org.wso2.carbon.apimgt.api.model.KeyManager; +import org.wso2.carbon.apimgt.api.model.KeyManagerConfiguration; +import org.wso2.carbon.apimgt.api.model.OAuthAppRequest; +import org.wso2.carbon.apimgt.api.model.OAuthApplicationInfo; +import org.wso2.carbon.apimgt.api.model.Scope; +import org.wso2.carbon.apimgt.api.model.SubscribedAPI; +import org.wso2.carbon.apimgt.api.model.Subscriber; +import org.wso2.carbon.apimgt.api.model.SubscriptionResponse; +import org.wso2.carbon.apimgt.api.model.Tier; import org.wso2.carbon.apimgt.impl.dao.ApiMgtDAO; import org.wso2.carbon.apimgt.impl.dto.SubscriptionWorkflowDTO; import org.wso2.carbon.apimgt.impl.dto.WorkflowDTO; @@ -992,21 +1009,4 @@ public void testGetApplicationKeys() throws APIManagementException { assertEquals(apiKeySet.size(), 2); assertNotNull(apiKeySet.iterator().next().getAccessToken()); } - - @Test - public void testGetMarkdownOverviewContent() throws Exception { - String apiId = "api123"; - String organization = "wso2"; - DocumentationContent mockContent = new DocumentationContent(); - - APIConsumerImpl apiConsumer = PowerMockito.spy(new APIConsumerImplWrapper()); - - PowerMockito.doNothing().when(apiConsumer).checkAPIVisibilityRestriction(apiId, organization); - PowerMockito.doReturn(mockContent).when(apiConsumer, "getMarkdownOverviewContent", apiId, organization); - - DocumentationContent result = apiConsumer.getMarkdownOverviewContent(apiId, organization); - - Assert.assertNotNull(result); - Assert.assertEquals(mockContent, result); - } } diff --git a/components/apimgt/org.wso2.carbon.apimgt.impl/src/test/java/org/wso2/carbon/apimgt/impl/AbstractAPIManagerTestCase.java b/components/apimgt/org.wso2.carbon.apimgt.impl/src/test/java/org/wso2/carbon/apimgt/impl/AbstractAPIManagerTestCase.java index be61fd3be551..0a130d890348 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.impl/src/test/java/org/wso2/carbon/apimgt/impl/AbstractAPIManagerTestCase.java +++ b/components/apimgt/org.wso2.carbon.apimgt.impl/src/test/java/org/wso2/carbon/apimgt/impl/AbstractAPIManagerTestCase.java @@ -257,36 +257,6 @@ public void testGetDocumentationFromId() throws Exception { } - @Test - public void testGetMarkdownOverviewContent() throws Exception { - String apiId = "sample-api-id"; - String organization = "sample-org"; - - AbstractAPIManager abstractAPIManager = new AbstractAPIManagerWrapper(apiPersistenceInstance); - - PowerMockito.mockStatic(ServiceReferenceHolder.class); - ServiceReferenceHolder sh = Mockito.mock(ServiceReferenceHolder.class); - APIManagerConfigurationService amConfigService = Mockito.mock(APIManagerConfigurationService.class); - APIManagerConfiguration amConfig = Mockito.mock(APIManagerConfiguration.class); - - PowerMockito.when(ServiceReferenceHolder.getInstance()).thenReturn(sh); - PowerMockito.when(sh.getAPIManagerConfigurationService()).thenReturn(amConfigService); - PowerMockito.when(amConfigService.getAPIManagerConfiguration()).thenReturn(amConfig); - - DocumentSearchResult searchResult = Mockito.mock(DocumentSearchResult.class); - Mockito.when(searchResult.getDocumentationList()).thenReturn(Collections.emptyList()); - Mockito.when(apiPersistenceInstance.searchDocumentation( - Mockito.any(Organization.class), - Mockito.eq(apiId), - Mockito.eq(0), - Mockito.eq(0), - Mockito.eq("other:_overview"), - Mockito.isNull() - )).thenReturn(searchResult); - - DocumentationContent result = abstractAPIManager.getMarkdownOverviewContent(apiId, organization); - Assert.assertNull(result); - } @Test public void testIsContextExist() throws APIManagementException { diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/devportal-api.yaml b/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/devportal-api.yaml index ef72e53b0d65..9d492fc43b0a 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/devportal-api.yaml +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/devportal-api.yaml @@ -836,60 +836,6 @@ paths: - lang: Curl source: curl -k "https://localhost:9443/api/am/devportal/v3/apis/890a4f4d-09eb-4877-a323-57f6ce2ed79b/documents/0bcb7f05-599d-4e1a-adce-5cb89bfe58d5/content" - /apis/{apiId}/markdown-content: - get: - tags: - - APIs - summary: | - Get the Content of the API Overview Markdown Document - description: | - This operation can be used to retrieve the overview markdown document content of an API. You need to provide the Id of the API to retrieve it. - - The content of the document will be retrieved in `text/plain` content type - - `X-WSO2-Tenant` header can be used to retrieve the content of the overview markdown document of an API that belongs to a different tenant domain. If not specified super tenant will be used. If Authorization header is present in the request, the user's tenant associated with the access token will be used. - - **NOTE:** - * This operation does not require an Authorization header by default. But in order to see a restricted API's overview markdown document content, you need to provide Authorization header. - operationId: getMarkdownContentOfAPI - parameters: - - $ref: '#/components/parameters/apiId' - - $ref: '#/components/parameters/requestedTenant' - - $ref: '#/components/parameters/If-None-Match' - responses: - 200: - description: | - OK. - Inline content returned. - headers: - ETag: - description: | - Entity Tag of the response resource. - Used by caches, or in conditional requests. - schema: - type: string - Last-Modified: - description: | - Date and time the resource has been modified the last time. - Used by caches, or in conditional requests. - schema: - type: string - content: { } - 304: - description: | - Not Modified. - Empty body because the client has already the latest version of the requested resource. - content: { } - 404: - $ref: '#/components/responses/NotFound' - 406: - $ref: '#/components/responses/NotAcceptable' - security: - - OAuth2Security: [ ] - x-code-samples: - - lang: Curl - source: curl -k "https://localhost:9443/api/am/devportal/v3/apis/890a4f4d-09eb-4877-a323-57f6ce2ed79b/markdown-content" - /apis/{apiId}/thumbnail: get: tags: diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/ApisApi.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/ApisApi.java index 9d642433b568..d71f44464f46 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/ApisApi.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/ApisApi.java @@ -479,24 +479,6 @@ public Response getAllCommentsOfAPI(@ApiParam(value = "**API ID** consisting of return delegate.getCommentOfAPI(commentId, apiId, xWSO2Tenant, ifNoneMatch, includeCommenterInfo, replyLimit, replyOffset, securityContext); } - @GET - @Path("/{apiId}/markdown-content") - - @Produces({ "application/json" }) - @ApiOperation(value = "Get the Content of the API Overview Markdown Document ", notes = "This operation can be used to retrieve the overview markdown document content of an API. You need to provide the Id of the API to retrieve it. The content of the document will be retrieved in `text/plain` content type `X-WSO2-Tenant` header can be used to retrieve the content of the overview markdown document of an API that belongs to a different tenant domain. If not specified super tenant will be used. If Authorization header is present in the request, the user's tenant associated with the access token will be used. **NOTE:** * This operation does not require an Authorization header by default. But in order to see a restricted API's overview markdown document content, you need to provide Authorization header. ", response = Void.class, authorizations = { - @Authorization(value = "OAuth2Security", scopes = { - - }) - }, tags={ "APIs", }) - @ApiResponses(value = { - @ApiResponse(code = 200, message = "OK. Inline content returned. ", response = Void.class), - @ApiResponse(code = 304, message = "Not Modified. Empty body because the client has already the latest version of the requested resource. ", response = Void.class), - @ApiResponse(code = 404, message = "Not Found. The specified resource does not exist.", response = ErrorDTO.class), - @ApiResponse(code = 406, message = "Not Acceptable. The requested media type is not supported.", response = ErrorDTO.class) }) - public Response getMarkdownContentOfAPI(@ApiParam(value = "**API ID** consisting of the **UUID** of the API. ",required=true) @PathParam("apiId") String apiId, @ApiParam(value = "For cross-tenant invocations, this is used to specify the tenant domain, where the resource need to be retrieved from. " )@HeaderParam("X-WSO2-Tenant") String xWSO2Tenant, @ApiParam(value = "Validator for conditional requests; based on the ETag of the formerly retrieved variant of the resourec. " )@HeaderParam("If-None-Match") String ifNoneMatch) throws APIManagementException{ - return delegate.getMarkdownContentOfAPI(apiId, xWSO2Tenant, ifNoneMatch, securityContext); - } - @GET @Path("/{apiId}/comments/{commentId}/replies") diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/ApisApiService.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/ApisApiService.java index 1f3772c5cb09..b554d2636f8a 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/ApisApiService.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/ApisApiService.java @@ -60,7 +60,6 @@ public interface ApisApiService { public Response editCommentOfAPI(String commentId, String apiId, PatchRequestBodyDTO patchRequestBodyDTO, MessageContext messageContext) throws APIManagementException; public Response getAllCommentsOfAPI(String apiId, String xWSO2Tenant, Integer limit, Integer offset, Boolean includeCommenterInfo, MessageContext messageContext) throws APIManagementException; public Response getCommentOfAPI(String commentId, String apiId, String xWSO2Tenant, String ifNoneMatch, Boolean includeCommenterInfo, Integer replyLimit, Integer replyOffset, MessageContext messageContext) throws APIManagementException; - public Response getMarkdownContentOfAPI(String apiId, String xWSO2Tenant, String ifNoneMatch, MessageContext messageContext) throws APIManagementException; public Response getRepliesOfComment(String commentId, String apiId, String xWSO2Tenant, Integer limit, Integer offset, String ifNoneMatch, Boolean includeCommenterInfo, MessageContext messageContext) throws APIManagementException; public Response getWSDLOfAPI(String apiId, String environmentName, String ifNoneMatch, String xWSO2Tenant, MessageContext messageContext) throws APIManagementException; } diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/impl/ApisApiServiceImpl.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/impl/ApisApiServiceImpl.java index 2ca1a8b51193..b0429332cf09 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/impl/ApisApiServiceImpl.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/impl/ApisApiServiceImpl.java @@ -1218,33 +1218,6 @@ private APIDTO getAPIByAPIId(String apiId, String organization, OrganizationInfo return null; } - @Override - public Response getMarkdownContentOfAPI(String apiId, String xWSO2Tenant, String ifNoneMatch, - MessageContext messageContext) throws APIManagementException { - try { - String organization = RestApiUtil.getValidatedOrganization(messageContext); - APIConsumer apiConsumer = RestApiCommonUtil.getLoggedInUserConsumer(); - - DocumentationContent docContent = apiConsumer.getMarkdownOverviewContent(apiId, organization); - if (docContent == null) { - RestApiUtil.handleResourceNotFoundError(RestApiConstants.RESOURCE_DOCUMENTATION, ""); - return null; - } - String content = docContent.getTextContent(); - return Response.ok(content) - .header(RestApiConstants.HEADER_CONTENT_TYPE, APIConstants.DOCUMENTATION_INLINE_CONTENT_TYPE) - .build(); - } catch (APIManagementException e) { - if (RestApiUtil.isDueToResourceNotFound(e)) { - RestApiUtil.handleResourceNotFoundError(RestApiConstants.RESOURCE_API, apiId, e, log); - } else { - String errorMessage = "Error while retrieving overview markdown document of the API " + apiId; - RestApiUtil.handleInternalServerError(errorMessage, e, log); - } - } - return null; - } - /** * To check whether a particular exception is due to access control restriction. * diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/resources/devportal-api.yaml b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/resources/devportal-api.yaml index ef72e53b0d65..9d492fc43b0a 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/resources/devportal-api.yaml +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/resources/devportal-api.yaml @@ -836,60 +836,6 @@ paths: - lang: Curl source: curl -k "https://localhost:9443/api/am/devportal/v3/apis/890a4f4d-09eb-4877-a323-57f6ce2ed79b/documents/0bcb7f05-599d-4e1a-adce-5cb89bfe58d5/content" - /apis/{apiId}/markdown-content: - get: - tags: - - APIs - summary: | - Get the Content of the API Overview Markdown Document - description: | - This operation can be used to retrieve the overview markdown document content of an API. You need to provide the Id of the API to retrieve it. - - The content of the document will be retrieved in `text/plain` content type - - `X-WSO2-Tenant` header can be used to retrieve the content of the overview markdown document of an API that belongs to a different tenant domain. If not specified super tenant will be used. If Authorization header is present in the request, the user's tenant associated with the access token will be used. - - **NOTE:** - * This operation does not require an Authorization header by default. But in order to see a restricted API's overview markdown document content, you need to provide Authorization header. - operationId: getMarkdownContentOfAPI - parameters: - - $ref: '#/components/parameters/apiId' - - $ref: '#/components/parameters/requestedTenant' - - $ref: '#/components/parameters/If-None-Match' - responses: - 200: - description: | - OK. - Inline content returned. - headers: - ETag: - description: | - Entity Tag of the response resource. - Used by caches, or in conditional requests. - schema: - type: string - Last-Modified: - description: | - Date and time the resource has been modified the last time. - Used by caches, or in conditional requests. - schema: - type: string - content: { } - 304: - description: | - Not Modified. - Empty body because the client has already the latest version of the requested resource. - content: { } - 404: - $ref: '#/components/responses/NotFound' - 406: - $ref: '#/components/responses/NotAcceptable' - security: - - OAuth2Security: [ ] - x-code-samples: - - lang: Curl - source: curl -k "https://localhost:9443/api/am/devportal/v3/apis/890a4f4d-09eb-4877-a323-57f6ce2ed79b/markdown-content" - /apis/{apiId}/thumbnail: get: tags: diff --git a/features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/conf_templates/templates/repository/conf/api-manager.xml.j2 b/features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/conf_templates/templates/repository/conf/api-manager.xml.j2 index 0703019a9c66..fbb086ea50c3 100644 --- a/features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/conf_templates/templates/repository/conf/api-manager.xml.j2 +++ b/features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/conf_templates/templates/repository/conf/api-manager.xml.j2 @@ -738,10 +738,6 @@ /api/am/devportal/{version}/apis/{apiId} GET,HEAD - - /api/am/devportal/{version}/apis/{apiId}/markdown-content - GET,HEAD - /api/am/devportal/{version}/apis/{apiId}/swagger GET,HEAD @@ -806,10 +802,6 @@ /api/am/devportal/{version}/api-products/{apiId} GET,HEAD - - /api/am/devportal/{version}/api-products/{apiId}/markdown-content - GET,HEAD - /api/am/devportal/{version}/api-products/{apiId}/swagger GET,HEAD diff --git a/features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/config/api-manager.xml b/features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/config/api-manager.xml index 13d8a297180c..7d17bbe93ee7 100644 --- a/features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/config/api-manager.xml +++ b/features/apimgt/org.wso2.carbon.apimgt.core.feature/src/main/resources/config/api-manager.xml @@ -454,10 +454,6 @@ /api/am/store/{version}/apis/{apiId} GET,HEAD - - /api/am/store/{version}/apis/{apiId}/markdown-content - GET,HEAD - /api/am/store/{version}/apis/{apiId}/swagger GET,HEAD @@ -518,10 +514,6 @@ /api/am/store/{version}/api-products/{apiProductId} GET,HEAD - - /api/am/store/{version}/api-products/{apiProductId}/markdown-content - GET,HEAD - /api/am/store/{version}/api-products/{apiProductId}/swagger GET,HEAD From 4c052c2b455cc280ca729bea603aea730c2c87ba Mon Sep 17 00:00:00 2001 From: AqeelMuhammad Date: Tue, 18 Feb 2025 20:50:05 +0530 Subject: [PATCH 6/7] Remove isMarkdownOverview parameter from dev portal get API details API --- .../org/wso2/carbon/apimgt/api/model/API.java | 10 --------- .../carbon/apimgt/api/model/APIProduct.java | 9 -------- .../carbon/apimgt/impl/APIConsumerImpl.java | 8 ------- .../apimgt/persistence/dto/DevPortalAPI.java | 11 +--------- .../src/main/resources/devportal-api.yaml | 3 --- .../apimgt/rest/api/store/v1/dto/APIDTO.java | 22 +------------------ .../api/store/v1/mappings/APIMappingUtil.java | 2 -- .../src/main/resources/devportal-api.yaml | 3 --- 8 files changed, 2 insertions(+), 66 deletions(-) diff --git a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java index ec81c316c8c4..f78fbd65bc3e 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java +++ b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java @@ -146,8 +146,6 @@ public class API implements Serializable { private String monetizationCategory; - private Boolean isMarkdownOverview; - private List soapToRestSequences; public List getSoapToRestSequences() { @@ -1392,14 +1390,6 @@ public void setTestKey(String testKey) { this.testKey = testKey; } - public Boolean isMarkdownOverview() { - return isMarkdownOverview; - } - - public void setMarkdownOverview(Boolean isMarkdownOverview) { - this.isMarkdownOverview = isMarkdownOverview; - } - /** * This method returns endpoints according to the given endpoint config * diff --git a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/APIProduct.java b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/APIProduct.java index 95a5d3622e4c..13b9cdcff804 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/APIProduct.java +++ b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/APIProduct.java @@ -65,7 +65,6 @@ public class APIProduct implements Serializable { private JSONObject monetizationProperties = new JSONObject(); private boolean isMonetizationEnabled = false; private String versionTimestamp; - private Boolean isMarkdownOverview; /** * API security at the gateway level. @@ -717,12 +716,4 @@ public int isEgress() { public void setEgress(int egress) { isEgress = egress; } - - public Boolean isMarkdownOverview() { - return isMarkdownOverview; - } - - public void setMarkdownOverview(Boolean isMarkdownOverview) { - this.isMarkdownOverview = isMarkdownOverview; - } } diff --git a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java index 62443152cac3..504c778d2b36 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java +++ b/components/apimgt/org.wso2.carbon.apimgt.impl/src/main/java/org/wso2/carbon/apimgt/impl/APIConsumerImpl.java @@ -3935,14 +3935,6 @@ public ApiTypeWrapper getAPIorAPIProductByUUID(String uuid, String organization) checkVisibilityPermission(userNameWithoutChange, devPortalApi.getVisibility(), devPortalApi.getVisibleRoles(), devPortalApi.getPublisherAccessControl(), devPortalApi.getPublisherAccessControlRoles()); - List existingDocs = getAllDocumentation(uuid, organization); - devPortalApi.setMarkdownOverview(false); - for (Documentation doc : existingDocs) { - if (doc.getOtherTypeName() != null && doc.getOtherTypeName().equals("_overview")) { - devPortalApi.setMarkdownOverview(true); - break; - } - } if (APIConstants.API_PRODUCT.equalsIgnoreCase(devPortalApi.getType())) { APIProduct apiProduct = APIMapper.INSTANCE.toApiProduct(devPortalApi); apiProduct.setID(new APIProductIdentifier(devPortalApi.getProviderName(), diff --git a/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/DevPortalAPI.java b/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/DevPortalAPI.java index 9a48c769cd93..a38331074dc5 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/DevPortalAPI.java +++ b/components/apimgt/org.wso2.carbon.apimgt.persistence/src/main/java/org/wso2/carbon/apimgt/persistence/dto/DevPortalAPI.java @@ -68,7 +68,6 @@ public class DevPortalAPI extends DevPortalAPIInfo { private String asyncTransportProtocols; private String publisherAccessControl; private String publisherAccessControlRoles; - private Boolean isMarkdownOverview; public String getContextTemplate() { return contextTemplate; @@ -358,14 +357,6 @@ public void setAsyncTransportProtocols(String asyncTransportProtocols) { this.asyncTransportProtocols = asyncTransportProtocols; } - public Boolean isMarkdownOverview() { - return isMarkdownOverview; - } - - public void setMarkdownOverview(Boolean isMarkdownOverview) { - this.isMarkdownOverview = isMarkdownOverview; - } - @Override public String toString() { return "DevPortalAPI [status=" + status + ", isDefaultVersion=" + isDefaultVersion + ", description=" @@ -384,7 +375,7 @@ public String toString() { + ", type=" + type + ", advertisedOnly=" + advertisedOnly + ", swaggerDefinition=" + swaggerDefinition + ", contextTemplate=" + contextTemplate + ", apiSecurity=" + apiSecurity + ", visibility=" + visibility + ", visibleRoles=" + visibleRoles + ", gatewayVendor=" + gatewayVendor + ", asyncTransportProtocols=" - + asyncTransportProtocols + ", isMarkdownOverview=" + isMarkdownOverview + "]"; + + asyncTransportProtocols + "]"; } public String getApiSecurity() { diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/devportal-api.yaml b/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/devportal-api.yaml index 9d492fc43b0a..ba5d308246cf 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/devportal-api.yaml +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.common/src/main/resources/devportal-api.yaml @@ -4053,9 +4053,6 @@ components: description: | If the provider value is not given user invoking the api will be used as the provider. example: admin - isMarkdownOverview: - type: boolean - example: true apiDefinition: type: string description: | diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/dto/APIDTO.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/dto/APIDTO.java index e7092c80ef61..c5556b76967d 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/dto/APIDTO.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/gen/java/org/wso2/carbon/apimgt/rest/api/store/v1/dto/APIDTO.java @@ -36,7 +36,6 @@ public class APIDTO { private String context = null; private String version = null; private String provider = null; - private Boolean isMarkdownOverview = null; private String apiDefinition = null; private String wsdlUri = null; private String lifeCycleStatus = null; @@ -181,23 +180,6 @@ public void setProvider(String provider) { this.provider = provider; } - /** - **/ - public APIDTO isMarkdownOverview(Boolean isMarkdownOverview) { - this.isMarkdownOverview = isMarkdownOverview; - return this; - } - - - @ApiModelProperty(example = "true", value = "") - @JsonProperty("isMarkdownOverview") - public Boolean isIsMarkdownOverview() { - return isMarkdownOverview; - } - public void setIsMarkdownOverview(Boolean isMarkdownOverview) { - this.isMarkdownOverview = isMarkdownOverview; - } - /** * Swagger definition of the API which contains details about URI templates and scopes **/ @@ -769,7 +751,6 @@ public boolean equals(java.lang.Object o) { Objects.equals(context, API.context) && Objects.equals(version, API.version) && Objects.equals(provider, API.provider) && - Objects.equals(isMarkdownOverview, API.isMarkdownOverview) && Objects.equals(apiDefinition, API.apiDefinition) && Objects.equals(wsdlUri, API.wsdlUri) && Objects.equals(lifeCycleStatus, API.lifeCycleStatus) && @@ -805,7 +786,7 @@ public boolean equals(java.lang.Object o) { @Override public int hashCode() { - return Objects.hash(id, name, description, context, version, provider, isMarkdownOverview, apiDefinition, wsdlUri, lifeCycleStatus, isDefaultVersion, type, transport, operations, authorizationHeader, apiKeyHeader, securityScheme, tags, tiers, hasThumbnail, additionalProperties, monetization, endpointURLs, businessInformation, environmentList, scopes, avgRating, subscriptions, advertiseInfo, isSubscriptionAvailable, categories, keyManagers, createdTime, lastUpdatedTime, gatewayVendor, asyncTransportProtocols, egress, subtype); + return Objects.hash(id, name, description, context, version, provider, apiDefinition, wsdlUri, lifeCycleStatus, isDefaultVersion, type, transport, operations, authorizationHeader, apiKeyHeader, securityScheme, tags, tiers, hasThumbnail, additionalProperties, monetization, endpointURLs, businessInformation, environmentList, scopes, avgRating, subscriptions, advertiseInfo, isSubscriptionAvailable, categories, keyManagers, createdTime, lastUpdatedTime, gatewayVendor, asyncTransportProtocols, egress, subtype); } @Override @@ -819,7 +800,6 @@ public String toString() { sb.append(" context: ").append(toIndentedString(context)).append("\n"); sb.append(" version: ").append(toIndentedString(version)).append("\n"); sb.append(" provider: ").append(toIndentedString(provider)).append("\n"); - sb.append(" isMarkdownOverview: ").append(toIndentedString(isMarkdownOverview)).append("\n"); sb.append(" apiDefinition: ").append(toIndentedString(apiDefinition)).append("\n"); sb.append(" wsdlUri: ").append(toIndentedString(wsdlUri)).append("\n"); sb.append(" lifeCycleStatus: ").append(toIndentedString(lifeCycleStatus)).append("\n"); diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/mappings/APIMappingUtil.java b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/mappings/APIMappingUtil.java index bc850bd031f2..6a89b988bf8e 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/mappings/APIMappingUtil.java +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/java/org/wso2/carbon/apimgt/rest/api/store/v1/mappings/APIMappingUtil.java @@ -98,7 +98,6 @@ public static APIDTO fromAPItoDTO(API model, String organization) throws APIMana dto.setSubtype(model.getSubtype()); dto.setAvgRating(String.valueOf(model.getRating())); dto.setEgress(model.isEgress() == 1); - dto.setIsMarkdownOverview(model.isMarkdownOverview()); Set scopes = model.getScopes(); Map uniqueScope = new HashMap<>(); @@ -303,7 +302,6 @@ public static APIDTO fromAPItoDTO(APIProduct model, String organization) throws dto.setType(model.getType()); dto.setAvgRating(String.valueOf(model.getRating())); dto.setEgress(model.isEgress() == 1); - dto.setIsMarkdownOverview(model.isMarkdownOverview()); /* todo: created and last updated times if (null != model.getLastUpdated()) { diff --git a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/resources/devportal-api.yaml b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/resources/devportal-api.yaml index 9d492fc43b0a..ba5d308246cf 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/resources/devportal-api.yaml +++ b/components/apimgt/org.wso2.carbon.apimgt.rest.api.store.v1/src/main/resources/devportal-api.yaml @@ -4053,9 +4053,6 @@ components: description: | If the provider value is not given user invoking the api will be used as the provider. example: admin - isMarkdownOverview: - type: boolean - example: true apiDefinition: type: string description: | From 72be80c7d163ca157f149c321d32e5e1f14d4234 Mon Sep 17 00:00:00 2001 From: Muhammad Aqeel Date: Tue, 18 Feb 2025 20:56:12 +0530 Subject: [PATCH 7/7] Update API.java Revert white space change --- .../src/main/java/org/wso2/carbon/apimgt/api/model/API.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java index f78fbd65bc3e..bd96b8829408 100644 --- a/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java +++ b/components/apimgt/org.wso2.carbon.apimgt.api/src/main/java/org/wso2/carbon/apimgt/api/model/API.java @@ -145,7 +145,7 @@ public class API implements Serializable { private String implementation = "ENDPOINT"; private String monetizationCategory; - + private List soapToRestSequences; public List getSoapToRestSequences() {