From 53c005051e70e2b806bd4f2a998057fbe89e6c15 Mon Sep 17 00:00:00 2001 From: t-samples Date: Thu, 3 Aug 2023 11:16:24 -0500 Subject: [PATCH] CE-537 - Updating to support API Delete --- .../backend/module/api/APIBackendModule.java | 3 +- .../module/api/actions/APIDeleteAction.java | 59 +++++++++++++++++++ .../module/api/actions/BaseAPIActionUtil.java | 49 +++++++++++++++ .../module/api/actions/QHttpResponse.java | 5 +- 4 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/APIDeleteAction.java diff --git a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/APIBackendModule.java b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/APIBackendModule.java index 4a79a30d..486d2db6 100644 --- a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/APIBackendModule.java +++ b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/APIBackendModule.java @@ -32,6 +32,7 @@ import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableBackendDetails; import com.kingsrook.qqq.backend.core.modules.backend.QBackendModuleInterface; import com.kingsrook.qqq.backend.module.api.actions.APICountAction; +import com.kingsrook.qqq.backend.module.api.actions.APIDeleteAction; import com.kingsrook.qqq.backend.module.api.actions.APIGetAction; import com.kingsrook.qqq.backend.module.api.actions.APIInsertAction; import com.kingsrook.qqq.backend.module.api.actions.APIQueryAction; @@ -136,7 +137,7 @@ public class APIBackendModule implements QBackendModuleInterface @Override public DeleteInterface getDeleteInterface() { - return (null); //return (new RDBMSDeleteAction()); + return (new APIDeleteAction()); } } diff --git a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/APIDeleteAction.java b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/APIDeleteAction.java new file mode 100644 index 00000000..f7aa0e96 --- /dev/null +++ b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/APIDeleteAction.java @@ -0,0 +1,59 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2022. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.kingsrook.qqq.backend.module.api.actions; + + +import com.kingsrook.qqq.backend.core.actions.interfaces.DeleteInterface; +import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.actions.tables.delete.DeleteInput; +import com.kingsrook.qqq.backend.core.model.actions.tables.delete.DeleteOutput; +import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; + + +/******************************************************************************* + ** + *******************************************************************************/ +public class APIDeleteAction extends AbstractAPIAction implements DeleteInterface +{ + /******************************************************************************* + ** + *******************************************************************************/ + public DeleteOutput execute(DeleteInput deleteInput) throws QException + { + QTableMetaData table = deleteInput.getTable(); + preAction(deleteInput); + return (apiActionUtil.doDelete(table, deleteInput)); + } + + + + /******************************************************************************* + ** Specify whether this particular module's update action can & should fetch + ** records before updating them, e.g., for audits or "not-found-checks" + *******************************************************************************/ + @Override + public boolean supportsPreFetchQuery() + { + return (false); + } + +} diff --git a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java index 68396436..cc5d35fb 100644 --- a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java +++ b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java @@ -43,6 +43,8 @@ import com.kingsrook.qqq.backend.core.logging.QLogger; import com.kingsrook.qqq.backend.core.model.actions.AbstractTableActionInput; import com.kingsrook.qqq.backend.core.model.actions.tables.count.CountInput; import com.kingsrook.qqq.backend.core.model.actions.tables.count.CountOutput; +import com.kingsrook.qqq.backend.core.model.actions.tables.delete.DeleteInput; +import com.kingsrook.qqq.backend.core.model.actions.tables.delete.DeleteOutput; import com.kingsrook.qqq.backend.core.model.actions.tables.get.GetInput; import com.kingsrook.qqq.backend.core.model.actions.tables.get.GetOutput; import com.kingsrook.qqq.backend.core.model.actions.tables.insert.InsertInput; @@ -79,6 +81,7 @@ import org.apache.http.HttpEntityEnclosingRequest; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; @@ -384,6 +387,41 @@ public class BaseAPIActionUtil + /******************************************************************************* + ** + * + *******************************************************************************/ + public DeleteOutput doDelete(QTableMetaData table, DeleteInput deleteInput) throws QException + { + try + { + DeleteOutput deleteOutput = new DeleteOutput(); + + String urlSuffix = buildQueryStringForDelete(deleteInput.getQueryFilter(), deleteInput.getPrimaryKeys()); + String url = buildTableUrl(table); + HttpDelete request = new HttpDelete(url + urlSuffix); + + QHttpResponse response = makeRequest(table, request); + if(response.getStatusCode() == 204) + { + deleteOutput.setDeletedRecordCount(1); + } + else + { + deleteOutput.setDeletedRecordCount(0); + } + + return (deleteOutput); + } + catch(Exception e) + { + LOG.error("Error in API Delete", e); + throw new QException("Error executing Delete: " + e.getMessage(), e); + } + } + + + /******************************************************************************* ** *******************************************************************************/ @@ -601,6 +639,17 @@ public class BaseAPIActionUtil + /******************************************************************************* + ** method to build up delete string based on a given QFilter object + ** + *******************************************************************************/ + protected String buildQueryStringForDelete(QQueryFilter filter, List primaryKeys) throws QException + { + return (""); + } + + + /******************************************************************************* ** Do a default query string for a single-record GET - e.g., a query for just 1 record. *******************************************************************************/ diff --git a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/QHttpResponse.java b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/QHttpResponse.java index eacbba0a..1f77a230 100644 --- a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/QHttpResponse.java +++ b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/QHttpResponse.java @@ -69,7 +69,10 @@ public class QHttpResponse this.statusProtocolVersion = httpResponse.getStatusLine().getProtocolVersion().toString(); } } - this.content = EntityUtils.toString(httpResponse.getEntity()); + if(httpResponse.getEntity() != null) + { + this.content = EntityUtils.toString(httpResponse.getEntity()); + } }