From 97df82833ee4875cd48fc9133bf236b0c4d95f53 Mon Sep 17 00:00:00 2001 From: Mike Friesen - FormKiQ Date: Thu, 5 Jan 2023 22:05:26 -0700 Subject: [PATCH] #100 - Add DELETE /documents/{documentId}/versions/{versionKey} --- .../api/AbstractCoreRequestHandler.java | 2 + .../DocumentVersionsKeyRequestHandler.java | 34 +++++++++++++ .../resources/cloudformation/api-iam.yaml | 23 +++++++++ .../main/resources/cloudformation/api.yaml | 23 +++++++++ .../api/ApiDocumentsVersionsRequestTest.java | 48 +++++++++++++++++++ 5 files changed, 130 insertions(+) create mode 100644 lambda-api/src/main/java/com/formkiq/stacks/api/handler/DocumentVersionsKeyRequestHandler.java diff --git a/lambda-api/src/main/java/com/formkiq/stacks/api/AbstractCoreRequestHandler.java b/lambda-api/src/main/java/com/formkiq/stacks/api/AbstractCoreRequestHandler.java index 2e044bba4..b9a58ecf1 100644 --- a/lambda-api/src/main/java/com/formkiq/stacks/api/AbstractCoreRequestHandler.java +++ b/lambda-api/src/main/java/com/formkiq/stacks/api/AbstractCoreRequestHandler.java @@ -58,6 +58,7 @@ import com.formkiq.stacks.api.handler.DocumentTagRequestHandler; import com.formkiq.stacks.api.handler.DocumentTagValueRequestHandler; import com.formkiq.stacks.api.handler.DocumentTagsRequestHandler; +import com.formkiq.stacks.api.handler.DocumentVersionsKeyRequestHandler; import com.formkiq.stacks.api.handler.DocumentVersionsRequestHandler; import com.formkiq.stacks.api.handler.DocumentsActionsRequestHandler; import com.formkiq.stacks.api.handler.DocumentsFulltextRequestHandler; @@ -135,6 +136,7 @@ public static void buildUrlMap() { addRequestHandler(new VersionRequestHandler()); addRequestHandler(new SitesRequestHandler()); addRequestHandler(new DocumentVersionsRequestHandler()); + addRequestHandler(new DocumentVersionsKeyRequestHandler()); addRequestHandler(new DocumentTagsRequestHandler()); addRequestHandler(new DocumentsActionsRequestHandler()); addRequestHandler(new DocumentTagValueRequestHandler()); diff --git a/lambda-api/src/main/java/com/formkiq/stacks/api/handler/DocumentVersionsKeyRequestHandler.java b/lambda-api/src/main/java/com/formkiq/stacks/api/handler/DocumentVersionsKeyRequestHandler.java new file mode 100644 index 000000000..5e26cf6b5 --- /dev/null +++ b/lambda-api/src/main/java/com/formkiq/stacks/api/handler/DocumentVersionsKeyRequestHandler.java @@ -0,0 +1,34 @@ +/** + * MIT License + * + * Copyright (c) 2018 - 2020 FormKiQ + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package com.formkiq.stacks.api.handler; + +import com.formkiq.aws.services.lambda.ApiGatewayRequestHandler; + +/** {@link ApiGatewayRequestHandler} for "/documents/{documentId}/versions/{versionKey}". */ +public class DocumentVersionsKeyRequestHandler extends AbstractPaymentRequiredRequestHandler { + @Override + public String getRequestUrl() { + return "/documents/{documentId}/versions/{versionKey}"; + } +} diff --git a/lambda-api/src/main/resources/cloudformation/api-iam.yaml b/lambda-api/src/main/resources/cloudformation/api-iam.yaml index aaaebc373..8f65148b1 100644 --- a/lambda-api/src/main/resources/cloudformation/api-iam.yaml +++ b/lambda-api/src/main/resources/cloudformation/api-iam.yaml @@ -476,6 +476,22 @@ Resources: - sigv4: [] x-amazon-apigateway-integration: $ref: "#/components/x-amazon-apigateway-integrations/lambdaApi200" + /documents/{documentId}/versions/{versionKey}: + delete: + operationId: DeleteDocumentVersion + description: Delete a specific previous document version; ONLY available with FormKiQ Pro and Enterprise + tags: + - Document Versions + parameters: + - $ref: '#/components/parameters/documentIdParam' + - $ref: '#/components/parameters/versionKeyPath' + responses: + '200': + $ref: '#/components/responses/200Cors' + security: + - sigv4: [] + x-amazon-apigateway-integration: + $ref: "#/components/x-amazon-apigateway-integrations/lambdaApi200" /documents/{documentId}/content: get: operationId: GetDocumentContent @@ -1989,6 +2005,13 @@ Resources: type: string content: {} parameters: + versionKeyPath: + name: versionKey + in: path + description: Version Key + required: true + schema: + type: string versionKeyParam: name: versionKey in: query diff --git a/lambda-api/src/main/resources/cloudformation/api.yaml b/lambda-api/src/main/resources/cloudformation/api.yaml index 46f852ff6..23cf658c7 100644 --- a/lambda-api/src/main/resources/cloudformation/api.yaml +++ b/lambda-api/src/main/resources/cloudformation/api.yaml @@ -476,6 +476,22 @@ Resources: - AuthorizationCognito: [] x-amazon-apigateway-integration: $ref: "#/components/x-amazon-apigateway-integrations/lambdaApi200" + /documents/{documentId}/versions/{versionKey}: + delete: + operationId: DeleteDocumentVersion + description: Delete a specific previous document version; ONLY available with FormKiQ Pro and Enterprise + tags: + - Document Versions + parameters: + - $ref: '#/components/parameters/documentIdParam' + - $ref: '#/components/parameters/versionKeyPath' + responses: + '200': + $ref: '#/components/responses/200Cors' + security: + - AuthorizationCognito: [] + x-amazon-apigateway-integration: + $ref: "#/components/x-amazon-apigateway-integrations/lambdaApi200" /documents/{documentId}/content: get: operationId: GetDocumentContent @@ -1989,6 +2005,13 @@ Resources: type: string content: {} parameters: + versionKeyPath: + name: versionKey + in: path + description: Version Key + required: true + schema: + type: string versionKeyParam: name: versionKey in: query diff --git a/lambda-api/src/test/java/com/formkiq/stacks/api/ApiDocumentsVersionsRequestTest.java b/lambda-api/src/test/java/com/formkiq/stacks/api/ApiDocumentsVersionsRequestTest.java index f96f8c3ab..6d62eafae 100644 --- a/lambda-api/src/test/java/com/formkiq/stacks/api/ApiDocumentsVersionsRequestTest.java +++ b/lambda-api/src/test/java/com/formkiq/stacks/api/ApiDocumentsVersionsRequestTest.java @@ -33,6 +33,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import com.formkiq.aws.services.lambda.ApiGatewayRequestEvent; +import com.formkiq.aws.services.lambda.ApiGatewayRequestEventBuilder; import com.formkiq.lambda.apigateway.util.GsonUtil; import com.formkiq.testutils.aws.DynamoDbExtension; import com.formkiq.testutils.aws.LocalStackExtension; @@ -79,4 +80,51 @@ public void testHandleGetDocumentVersions01() throws Exception { assertEquals(getHeaders(), "\"headers\":" + GsonUtil.getInstance().toJson(m.get("headers"))); } } + + /** + * Delete /documents/{documentId}/versions/{versionKey} request. + * + * @param siteId {@link String} + * @param documentId {@link String} + * @param versionKey {@link String} + * @return {@link ApiGatewayRequestEvent} + */ + private ApiGatewayRequestEvent deleteVersionsRequest(final String siteId, final String documentId, + final String versionKey) { + ApiGatewayRequestEvent event = new ApiGatewayRequestEventBuilder().method("delete") + .resource("/documents/{documentId}/versions/{versionKey}") + .path("/documents/" + documentId + "/versions/" + versionKey).user("joesmith") + .group(siteId != null ? siteId : "default") + .pathParameters(Map.of("documentId", documentId, "versionKey", versionKey)) + .queryParameters(siteId != null ? Map.of("siteId", siteId) : null).build(); + return event; + } + + /** + * Delete /documents/{documentId}/versions/{versionKey} request. + * + * @throws Exception an error has occurred + */ + @SuppressWarnings("unchecked") + @Test + public void testHandleDeleteDocumentVersions01() throws Exception { + for (String siteId : Arrays.asList(null, UUID.randomUUID().toString())) { + // given + String documentId = UUID.randomUUID().toString(); + + ApiGatewayRequestEvent event = + deleteVersionsRequest(siteId, documentId, UUID.randomUUID().toString()); + + // when + String response = handleRequest(event); + + // then + Map m = GsonUtil.getInstance().fromJson(response, Map.class); + + final int mapsize = 3; + assertEquals(mapsize, m.size()); + assertEquals("402.0", String.valueOf(m.get("statusCode"))); + assertEquals(getHeaders(), "\"headers\":" + GsonUtil.getInstance().toJson(m.get("headers"))); + } + } }