From dadb7b6c374f3788989adfcfb63cc67630c94dca Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Tue, 30 Nov 2021 18:08:03 -0600 Subject: [PATCH] Implemented Delete --- .../backend/core/actions/DeleteAction.java | 32 +++++++++ .../core/model/actions/DeleteRequest.java | 68 +++++++++++++++++++ .../core/model/actions/DeleteResult.java | 35 ++++++++++ .../modules/interfaces/DeleteInterface.java | 18 +++++ .../modules/interfaces/QModuleInterface.java | 32 +++++++-- .../core/modules/mock/MockDeleteAction.java | 41 +++++++++++ .../core/actions/DeleteActionTest.java | 36 ++++++++++ 7 files changed, 257 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/kingsrook/qqq/backend/core/actions/DeleteAction.java create mode 100644 src/main/java/com/kingsrook/qqq/backend/core/model/actions/DeleteRequest.java create mode 100644 src/main/java/com/kingsrook/qqq/backend/core/model/actions/DeleteResult.java create mode 100644 src/main/java/com/kingsrook/qqq/backend/core/modules/interfaces/DeleteInterface.java create mode 100644 src/main/java/com/kingsrook/qqq/backend/core/modules/mock/MockDeleteAction.java create mode 100644 src/test/java/com/kingsrook/qqq/backend/core/actions/DeleteActionTest.java diff --git a/src/main/java/com/kingsrook/qqq/backend/core/actions/DeleteAction.java b/src/main/java/com/kingsrook/qqq/backend/core/actions/DeleteAction.java new file mode 100644 index 00000000..ccf10cd4 --- /dev/null +++ b/src/main/java/com/kingsrook/qqq/backend/core/actions/DeleteAction.java @@ -0,0 +1,32 @@ +package com.kingsrook.qqq.backend.core.actions; + + +import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.actions.DeleteRequest; +import com.kingsrook.qqq.backend.core.model.actions.DeleteResult; +import com.kingsrook.qqq.backend.core.model.metadata.QBackendMetaData; +import com.kingsrook.qqq.backend.core.modules.QModuleDispatcher; +import com.kingsrook.qqq.backend.core.modules.interfaces.QModuleInterface; + + +/******************************************************************************* + ** + *******************************************************************************/ +public class DeleteAction +{ + /******************************************************************************* + ** + *******************************************************************************/ + public DeleteResult execute(DeleteRequest deleteRequest) throws QException + { + QModuleDispatcher qModuleDispatcher = new QModuleDispatcher(); + + QBackendMetaData backend = deleteRequest.getBackend(); + + QModuleInterface qModule = qModuleDispatcher.getQModule(backend); + // todo pre-customization - just get to modify the request? + DeleteResult deleteResult = qModule.getDeleteInterface().execute(deleteRequest); + // todo post-customization - can do whatever w/ the result if you want + return deleteResult; + } +} diff --git a/src/main/java/com/kingsrook/qqq/backend/core/model/actions/DeleteRequest.java b/src/main/java/com/kingsrook/qqq/backend/core/model/actions/DeleteRequest.java new file mode 100644 index 00000000..4b11ae0b --- /dev/null +++ b/src/main/java/com/kingsrook/qqq/backend/core/model/actions/DeleteRequest.java @@ -0,0 +1,68 @@ +package com.kingsrook.qqq.backend.core.model.actions; + + +import java.io.Serializable; +import java.util.List; +import com.kingsrook.qqq.backend.core.model.metadata.QInstance; + + +/******************************************************************************* + ** + *******************************************************************************/ +public class DeleteRequest extends AbstractQTableRequest +{ + private List primaryKeys; + + + + /******************************************************************************* + ** + *******************************************************************************/ + public DeleteRequest() + { + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public DeleteRequest(QInstance instance) + { + super(instance); + } + + + + /******************************************************************************* + ** Getter for ids + ** + *******************************************************************************/ + public List getPrimaryKeys() + { + return primaryKeys; + } + + + + /******************************************************************************* + ** Setter for ids + ** + *******************************************************************************/ + public void setPrimaryKeys(List primaryKeys) + { + this.primaryKeys = primaryKeys; + } + + + + /******************************************************************************* + ** Setter for ids + ** + *******************************************************************************/ + public DeleteRequest withPrimaryKeys(List primaryKeys) + { + this.primaryKeys = primaryKeys; + return (this); + } +} diff --git a/src/main/java/com/kingsrook/qqq/backend/core/model/actions/DeleteResult.java b/src/main/java/com/kingsrook/qqq/backend/core/model/actions/DeleteResult.java new file mode 100644 index 00000000..56fe1e55 --- /dev/null +++ b/src/main/java/com/kingsrook/qqq/backend/core/model/actions/DeleteResult.java @@ -0,0 +1,35 @@ +package com.kingsrook.qqq.backend.core.model.actions; + + +import java.util.List; +import com.kingsrook.qqq.backend.core.model.data.QRecordWithStatus; + + +/******************************************************************************* + * Result for a delete action + * + *******************************************************************************/ +public class DeleteResult extends AbstractQResult +{ + List records; + + + + /******************************************************************************* + ** + *******************************************************************************/ + public List getRecords() + { + return records; + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public void setRecords(List records) + { + this.records = records; + } +} diff --git a/src/main/java/com/kingsrook/qqq/backend/core/modules/interfaces/DeleteInterface.java b/src/main/java/com/kingsrook/qqq/backend/core/modules/interfaces/DeleteInterface.java new file mode 100644 index 00000000..942eee0a --- /dev/null +++ b/src/main/java/com/kingsrook/qqq/backend/core/modules/interfaces/DeleteInterface.java @@ -0,0 +1,18 @@ +package com.kingsrook.qqq.backend.core.modules.interfaces; + + +import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.actions.DeleteRequest; +import com.kingsrook.qqq.backend.core.model.actions.DeleteResult; + + +/******************************************************************************* + ** + *******************************************************************************/ +public interface DeleteInterface +{ + /******************************************************************************* + ** + *******************************************************************************/ + DeleteResult execute(DeleteRequest deleteRequest) throws QException; +} diff --git a/src/main/java/com/kingsrook/qqq/backend/core/modules/interfaces/QModuleInterface.java b/src/main/java/com/kingsrook/qqq/backend/core/modules/interfaces/QModuleInterface.java index b1429d9e..46820b1a 100644 --- a/src/main/java/com/kingsrook/qqq/backend/core/modules/interfaces/QModuleInterface.java +++ b/src/main/java/com/kingsrook/qqq/backend/core/modules/interfaces/QModuleInterface.java @@ -1,9 +1,6 @@ package com.kingsrook.qqq.backend.core.modules.interfaces; -import com.kingsrook.qqq.backend.core.actions.InsertAction; - - /******************************************************************************* ** *******************************************************************************/ @@ -12,10 +9,35 @@ public interface QModuleInterface /******************************************************************************* ** *******************************************************************************/ - QueryInterface getQueryInterface(); + default QueryInterface getQueryInterface() + { + throwNotImplemented("Query"); + return null; + } /******************************************************************************* ** *******************************************************************************/ - InsertInterface getInsertInterface(); + default InsertInterface getInsertInterface() + { + throwNotImplemented("Insert"); + return null; + } + + /******************************************************************************* + ** + *******************************************************************************/ + default DeleteInterface getDeleteInterface() + { + throwNotImplemented("Delete"); + return null; + } + + /******************************************************************************* + ** + *******************************************************************************/ + private void throwNotImplemented(String actionName) + { + throw new IllegalStateException(actionName + " is not implemented in this module: " + this.getClass().getSimpleName()); + } } diff --git a/src/main/java/com/kingsrook/qqq/backend/core/modules/mock/MockDeleteAction.java b/src/main/java/com/kingsrook/qqq/backend/core/modules/mock/MockDeleteAction.java new file mode 100644 index 00000000..9248fca3 --- /dev/null +++ b/src/main/java/com/kingsrook/qqq/backend/core/modules/mock/MockDeleteAction.java @@ -0,0 +1,41 @@ +package com.kingsrook.qqq.backend.core.modules.mock; + + +import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.actions.DeleteRequest; +import com.kingsrook.qqq.backend.core.model.actions.DeleteResult; +import com.kingsrook.qqq.backend.core.model.data.QRecord; +import com.kingsrook.qqq.backend.core.model.data.QRecordWithStatus; +import com.kingsrook.qqq.backend.core.modules.interfaces.DeleteInterface; + + +/******************************************************************************* + ** + *******************************************************************************/ +public class MockDeleteAction implements DeleteInterface +{ + + /******************************************************************************* + ** + *******************************************************************************/ + public DeleteResult execute(DeleteRequest deleteRequest) throws QException + { + try + { + DeleteResult rs = new DeleteResult(); + + rs.setRecords(deleteRequest.getPrimaryKeys().stream().map(primaryKey -> + { + QRecord qRecord = new QRecord().withTableName(deleteRequest.getTableName()).withPrimaryKey(primaryKey); + return new QRecordWithStatus(qRecord); + }).toList()); + + return rs; + } + catch(Exception e) + { + throw new QException("Error executing delete: " + e.getMessage(), e); + } + } + +} diff --git a/src/test/java/com/kingsrook/qqq/backend/core/actions/DeleteActionTest.java b/src/test/java/com/kingsrook/qqq/backend/core/actions/DeleteActionTest.java new file mode 100644 index 00000000..4b6e06ec --- /dev/null +++ b/src/test/java/com/kingsrook/qqq/backend/core/actions/DeleteActionTest.java @@ -0,0 +1,36 @@ +package com.kingsrook.qqq.backend.core.actions; + + +import java.util.List; +import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.actions.DeleteRequest; +import com.kingsrook.qqq.backend.core.model.actions.DeleteResult; +import com.kingsrook.qqq.backend.core.utils.TestUtils; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + + +/******************************************************************************* + ** + *******************************************************************************/ +class DeleteActionTest +{ + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + public void test() throws QException + { + DeleteRequest request = new DeleteRequest(TestUtils.defineInstance()); + request.setTableName("person"); + request.setPrimaryKeys(List.of(1, 2)); + DeleteResult result = new DeleteAction().execute(request); + assertNotNull(result); + assertEquals(2, result.getRecords().size()); + assertTrue(result.getRecords().stream().allMatch(r -> r.getErrors() == null)); + } + +} \ No newline at end of file