diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPostDeleteCustomizer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPostDeleteCustomizer.java new file mode 100644 index 00000000..2ce2a177 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPostDeleteCustomizer.java @@ -0,0 +1,65 @@ +/* + * 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.core.actions.customizers; + + +import java.util.List; +import com.kingsrook.qqq.backend.core.model.actions.tables.delete.DeleteInput; +import com.kingsrook.qqq.backend.core.model.data.QRecord; + + +/******************************************************************************* + ** + *******************************************************************************/ +public abstract class AbstractPostDeleteCustomizer +{ + protected DeleteInput deleteInput; + + + + /******************************************************************************* + ** + *******************************************************************************/ + public abstract List apply(List records); + + + + /******************************************************************************* + ** Getter for deleteInput + ** + *******************************************************************************/ + public DeleteInput getDeleteInput() + { + return deleteInput; + } + + + + /******************************************************************************* + ** Setter for deleteInput + ** + *******************************************************************************/ + public void setDeleteInput(DeleteInput deleteInput) + { + this.deleteInput = deleteInput; + } +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPostUpdateCustomizer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPostUpdateCustomizer.java new file mode 100644 index 00000000..e3658ec0 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPostUpdateCustomizer.java @@ -0,0 +1,111 @@ +/* + * 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.core.actions.customizers; + + +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import com.kingsrook.qqq.backend.core.model.actions.tables.update.UpdateInput; +import com.kingsrook.qqq.backend.core.model.data.QRecord; + + +/******************************************************************************* + ** + *******************************************************************************/ +public abstract class AbstractPostUpdateCustomizer +{ + protected UpdateInput updateInput; + protected List oldRecordList; + + private Map oldRecordMap = null; + + + + /******************************************************************************* + ** + *******************************************************************************/ + public abstract List apply(List records); + + + + /******************************************************************************* + ** Getter for updateInput + ** + *******************************************************************************/ + public UpdateInput getUpdateInput() + { + return updateInput; + } + + + + /******************************************************************************* + ** Setter for updateInput + ** + *******************************************************************************/ + public void setUpdateInput(UpdateInput updateInput) + { + this.updateInput = updateInput; + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public void setOldRecordList(List oldRecordList) + { + this.oldRecordList = oldRecordList; + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + public List getOldRecordList() + { + return oldRecordList; + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + protected Map getOldRecordMap() + { + if(oldRecordMap == null) + { + oldRecordMap = new HashMap<>(); + for(QRecord qRecord : oldRecordList) + { + oldRecordMap.put(qRecord.getValue(updateInput.getTable().getPrimaryKeyField()), qRecord); + } + } + + return (oldRecordMap); + } + +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPreDeleteCustomizer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPreDeleteCustomizer.java new file mode 100644 index 00000000..7fa93003 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPreDeleteCustomizer.java @@ -0,0 +1,65 @@ +/* + * 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.core.actions.customizers; + + +import java.util.List; +import com.kingsrook.qqq.backend.core.model.actions.tables.delete.DeleteInput; +import com.kingsrook.qqq.backend.core.model.data.QRecord; + + +/******************************************************************************* + ** + *******************************************************************************/ +public abstract class AbstractPreDeleteCustomizer +{ + protected DeleteInput deleteInput; + + + + /******************************************************************************* + ** + *******************************************************************************/ + public abstract List apply(List records); + + + + /******************************************************************************* + ** Getter for deleteInput + ** + *******************************************************************************/ + public DeleteInput getDeleteInput() + { + return deleteInput; + } + + + + /******************************************************************************* + ** Setter for deleteInput + ** + *******************************************************************************/ + public void setDeleteInput(DeleteInput deleteInput) + { + this.deleteInput = deleteInput; + } +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/TableCustomizer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPreUpdateCustomizer.java similarity index 59% rename from qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/TableCustomizer.java rename to qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPreUpdateCustomizer.java index 4e8e22b1..ca464f08 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/TableCustomizer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPreUpdateCustomizer.java @@ -22,29 +22,51 @@ package com.kingsrook.qqq.backend.core.actions.customizers; -import java.util.function.Consumer; +import java.io.Serializable; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import com.kingsrook.qqq.backend.core.model.actions.tables.update.UpdateInput; +import com.kingsrook.qqq.backend.core.model.data.QRecord; /******************************************************************************* - ** Object used by TableCustomizers enum (and similar enums in backend modules) - ** to assist with definition and validation of Customizers applied to tables. + ** *******************************************************************************/ -public class TableCustomizer +public abstract class AbstractPreUpdateCustomizer { - private final String role; - private final Class expectedType; - private final Consumer validationFunction; + protected UpdateInput updateInput; + protected List oldRecordList; + + private Map oldRecordMap = null; /******************************************************************************* ** *******************************************************************************/ - public TableCustomizer(String role, Class expectedType, Consumer validationFunction) + public abstract List apply(List records); + + + + /******************************************************************************* + ** Getter for updateInput + ** + *******************************************************************************/ + public UpdateInput getUpdateInput() { - this.role = role; - this.expectedType = expectedType; - this.validationFunction = validationFunction; + return updateInput; + } + + + + /******************************************************************************* + ** Setter for updateInput + ** + *******************************************************************************/ + public void setUpdateInput(UpdateInput updateInput) + { + this.updateInput = updateInput; } @@ -52,43 +74,38 @@ public class TableCustomizer /******************************************************************************* ** *******************************************************************************/ - public TableCustomizer(String role, Class expectedType) + public void setOldRecordList(List oldRecordList) { - this.role = role; - this.expectedType = expectedType; - this.validationFunction = null; + this.oldRecordList = oldRecordList; } /******************************************************************************* - ** Getter for role ** *******************************************************************************/ - public String getRole() + public List getOldRecordList() { - return role; + return oldRecordList; } /******************************************************************************* - ** Getter for expectedType ** *******************************************************************************/ - public Class getExpectedType() + protected Map getOldRecordMap() { - return expectedType; + if(oldRecordMap == null) + { + oldRecordMap = new HashMap<>(); + for(QRecord qRecord : oldRecordList) + { + oldRecordMap.put(qRecord.getValue(updateInput.getTable().getPrimaryKeyField()), qRecord); + } + } + + return (oldRecordMap); } - - - /******************************************************************************* - ** Getter for validationFunction - ** - *******************************************************************************/ - public Consumer getValidationFunction() - { - return validationFunction; - } } diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPreUpdateCustomizerTest.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPreUpdateCustomizerTest.java new file mode 100644 index 00000000..7a91d76a --- /dev/null +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/customizers/AbstractPreUpdateCustomizerTest.java @@ -0,0 +1,68 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2023. 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.core.actions.customizers; + + +import java.util.List; +import com.kingsrook.qqq.backend.core.BaseTest; +import com.kingsrook.qqq.backend.core.context.QContext; +import com.kingsrook.qqq.backend.core.model.data.QRecord; +import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; +import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; +import com.kingsrook.qqq.backend.core.utils.TestUtils; +import org.junit.jupiter.api.Test; + + +/******************************************************************************* + ** Unit test for AbstractPreUpdateCustomizer + *******************************************************************************/ +class AbstractPreUpdateCustomizerTest extends BaseTest +{ + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void test() + { + QTableMetaData table = QContext.getQInstance().getTable(TestUtils.TABLE_NAME_PERSON_MEMORY); + table.withCustomizer(TableCustomizers.PRE_UPDATE_RECORD.getRole(), new QCodeReference(PreUpdate.class)); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + private static class PreUpdate extends AbstractPreUpdateCustomizer + { + /******************************************************************************* + ** + *******************************************************************************/ + @Override + public List apply(List records) + { + return null; + } + } + +} \ No newline at end of file diff --git a/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/base/actions/AbstractPostReadFileCustomizer.java b/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/base/actions/AbstractPostReadFileCustomizer.java new file mode 100644 index 00000000..e969e852 --- /dev/null +++ b/qqq-backend-module-filesystem/src/main/java/com/kingsrook/qqq/backend/module/filesystem/base/actions/AbstractPostReadFileCustomizer.java @@ -0,0 +1,37 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2023. 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.filesystem.base.actions; + + +/******************************************************************************* + ** after a file is read, "customize" its contents - e.g., do regex, or append + ** contents, or do whatever we like to it. + *******************************************************************************/ +public abstract class AbstractPostReadFileCustomizer +{ + + /******************************************************************************* + ** + *******************************************************************************/ + public abstract String customizeFileContents(String s); + +}