From 21657b918cf3f20b620cb24129ea61c8ca04d69d Mon Sep 17 00:00:00 2001 From: Darin Kelkhoff Date: Thu, 25 Apr 2024 12:08:02 -0500 Subject: [PATCH] CE-882 Updated test - passes real-world scenarios we need for story --- .../sharing/SharingMetaDataProvider.java | 78 ++++-- .../module/rdbms/sharing/SharingTest.java | 196 +++++++++++---- .../rdbms/sharing/model/AssetAudienceInt.java | 226 ------------------ .../model/{Audience.java => SharedAsset.java} | 128 +++++----- .../prime-test-database-sharing-test.sql | 63 ++--- 5 files changed, 306 insertions(+), 385 deletions(-) delete mode 100644 qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/model/AssetAudienceInt.java rename qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/model/{Audience.java => SharedAsset.java} (80%) diff --git a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/SharingMetaDataProvider.java b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/SharingMetaDataProvider.java index a961fc58..51b1890c 100644 --- a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/SharingMetaDataProvider.java +++ b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/SharingMetaDataProvider.java @@ -22,20 +22,24 @@ package com.kingsrook.qqq.backend.module.rdbms.sharing; +import java.util.List; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.instances.QInstanceEnricher; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.backend.core.model.metadata.joins.JoinOn; +import com.kingsrook.qqq.backend.core.model.metadata.joins.JoinType; +import com.kingsrook.qqq.backend.core.model.metadata.joins.QJoinMetaData; import com.kingsrook.qqq.backend.core.model.metadata.possiblevalues.QPossibleValueSource; +import com.kingsrook.qqq.backend.core.model.metadata.security.MultiRecordSecurityLock; import com.kingsrook.qqq.backend.core.model.metadata.security.QSecurityKeyType; import com.kingsrook.qqq.backend.core.model.metadata.security.RecordSecurityLock; import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; import com.kingsrook.qqq.backend.module.rdbms.TestUtils; import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSTableBackendDetails; import com.kingsrook.qqq.backend.module.rdbms.sharing.model.Asset; -import com.kingsrook.qqq.backend.module.rdbms.sharing.model.AssetAudienceInt; -import com.kingsrook.qqq.backend.module.rdbms.sharing.model.Audience; import com.kingsrook.qqq.backend.module.rdbms.sharing.model.Client; import com.kingsrook.qqq.backend.module.rdbms.sharing.model.Group; +import com.kingsrook.qqq.backend.module.rdbms.sharing.model.SharedAsset; import com.kingsrook.qqq.backend.module.rdbms.sharing.model.User; @@ -47,6 +51,11 @@ public class SharingMetaDataProvider public static final String USER_ID_KEY_TYPE = "userIdKey"; public static final String USER_ID_ALL_ACCESS_KEY_TYPE = "userIdAllAccessKey"; + public static final String GROUP_ID_KEY_TYPE = "groupIdKey"; + public static final String GROUP_ID_ALL_ACCESS_KEY_TYPE = "groupIdAllAccessKey"; + + private static final String ASSET_JOIN_SHARED_ASSET = "assetJoinSharedAsset"; + /******************************************************************************* @@ -58,30 +67,58 @@ public class SharingMetaDataProvider .withName(USER_ID_KEY_TYPE) .withAllAccessKeyName(USER_ID_ALL_ACCESS_KEY_TYPE)); + qInstance.addSecurityKeyType(new QSecurityKeyType() + .withName(GROUP_ID_KEY_TYPE) + .withAllAccessKeyName(GROUP_ID_ALL_ACCESS_KEY_TYPE)); + qInstance.addTable(new QTableMetaData() .withName(Asset.TABLE_NAME) .withPrimaryKeyField("id") .withBackendName(TestUtils.DEFAULT_BACKEND_NAME) + .withBackendDetails(new RDBMSTableBackendDetails().withTableName("asset")) .withFieldsFromEntity(Asset.class) - .withRecordSecurityLock(new RecordSecurityLock() - .withSecurityKeyType(USER_ID_KEY_TYPE) - .withFieldName("userId"))); + + //////////////////////////////////////// + // This is original - just owner/user // + //////////////////////////////////////// + // .withRecordSecurityLock(new RecordSecurityLock() + // .withSecurityKeyType(USER_ID_KEY_TYPE) + // .withFieldName("userId"))); + + .withRecordSecurityLock(new MultiRecordSecurityLock() + .withOperator(MultiRecordSecurityLock.BooleanOperator.OR) + .withLock(new RecordSecurityLock() + .withSecurityKeyType(USER_ID_KEY_TYPE) + .withFieldName("userId")) + .withLock(new RecordSecurityLock() + .withSecurityKeyType(USER_ID_KEY_TYPE) + .withFieldName("sharedAsset.userId") + .withJoinNameChain(List.of(ASSET_JOIN_SHARED_ASSET))) + .withLock(new RecordSecurityLock() + .withSecurityKeyType(GROUP_ID_KEY_TYPE) + .withFieldName("sharedAsset.groupId") + .withJoinNameChain(List.of(ASSET_JOIN_SHARED_ASSET))) + )); QInstanceEnricher.setInferredFieldBackendNames(qInstance.getTable(Asset.TABLE_NAME)); qInstance.addTable(new QTableMetaData() - .withName(Audience.TABLE_NAME) + .withName(SharedAsset.TABLE_NAME) + .withBackendDetails(new RDBMSTableBackendDetails().withTableName("shared_asset")) .withPrimaryKeyField("id") .withBackendName(TestUtils.DEFAULT_BACKEND_NAME) - .withFieldsFromEntity(Audience.class)); - QInstanceEnricher.setInferredFieldBackendNames(qInstance.getTable(Audience.TABLE_NAME)); - - qInstance.addTable(new QTableMetaData() - .withName(AssetAudienceInt.TABLE_NAME) - .withBackendDetails(new RDBMSTableBackendDetails().withTableName("asset_audience_int")) - .withPrimaryKeyField("id") - .withBackendName(TestUtils.DEFAULT_BACKEND_NAME) - .withFieldsFromEntity(AssetAudienceInt.class)); - QInstanceEnricher.setInferredFieldBackendNames(qInstance.getTable(AssetAudienceInt.TABLE_NAME)); + .withFieldsFromEntity(SharedAsset.class) + .withRecordSecurityLock(new MultiRecordSecurityLock() + .withOperator(MultiRecordSecurityLock.BooleanOperator.OR) + .withLock(new RecordSecurityLock() + .withSecurityKeyType(USER_ID_KEY_TYPE) + .withHint(RecordSecurityLock.QueryHint.DO_NOT_PUT_CRITERIA_IN_JOIN_ON) + .withFieldName("userId")) + .withLock(new RecordSecurityLock() + .withSecurityKeyType(GROUP_ID_KEY_TYPE) + .withHint(RecordSecurityLock.QueryHint.DO_NOT_PUT_CRITERIA_IN_JOIN_ON) + .withFieldName("groupId")) + )); + QInstanceEnricher.setInferredFieldBackendNames(qInstance.getTable(SharedAsset.TABLE_NAME)); qInstance.addTable(new QTableMetaData() .withName(User.TABLE_NAME) @@ -111,7 +148,14 @@ public class SharingMetaDataProvider qInstance.addPossibleValueSource(QPossibleValueSource.newForTable(Group.TABLE_NAME)); qInstance.addPossibleValueSource(QPossibleValueSource.newForTable(Client.TABLE_NAME)); qInstance.addPossibleValueSource(QPossibleValueSource.newForTable(Asset.TABLE_NAME)); - qInstance.addPossibleValueSource(QPossibleValueSource.newForTable(Audience.TABLE_NAME)); + + qInstance.addJoin(new QJoinMetaData() + .withName(ASSET_JOIN_SHARED_ASSET) + .withLeftTable(Asset.TABLE_NAME) + .withRightTable(SharedAsset.TABLE_NAME) + .withType(JoinType.ONE_TO_MANY) + .withJoinOn(new JoinOn("id", "assetId")) + ); } } diff --git a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/SharingTest.java b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/SharingTest.java index 38154d51..3a27f1b3 100644 --- a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/SharingTest.java +++ b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/SharingTest.java @@ -22,7 +22,7 @@ package com.kingsrook.qqq.backend.module.rdbms.sharing; -import java.util.ArrayList; +import java.sql.SQLException; import java.util.HashMap; import java.util.List; import com.kingsrook.qqq.backend.core.actions.tables.InsertAction; @@ -31,17 +31,21 @@ import com.kingsrook.qqq.backend.core.context.QContext; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.actions.tables.insert.InsertInput; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryInput; +import com.kingsrook.qqq.backend.core.model.data.QRecord; import com.kingsrook.qqq.backend.core.model.data.QRecordEntity; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.backend.core.model.metadata.security.RecordSecurityLock; import com.kingsrook.qqq.backend.core.model.session.QSession; import com.kingsrook.qqq.backend.module.rdbms.TestUtils; import com.kingsrook.qqq.backend.module.rdbms.sharing.model.Asset; -import com.kingsrook.qqq.backend.module.rdbms.sharing.model.AssetAudienceInt; -import com.kingsrook.qqq.backend.module.rdbms.sharing.model.Audience; import com.kingsrook.qqq.backend.module.rdbms.sharing.model.Group; +import com.kingsrook.qqq.backend.module.rdbms.sharing.model.SharedAsset; import com.kingsrook.qqq.backend.module.rdbms.sharing.model.User; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import static com.kingsrook.qqq.backend.module.rdbms.sharing.SharingMetaDataProvider.GROUP_ID_KEY_TYPE; +import static com.kingsrook.qqq.backend.module.rdbms.sharing.SharingMetaDataProvider.USER_ID_ALL_ACCESS_KEY_TYPE; +import static com.kingsrook.qqq.backend.module.rdbms.sharing.SharingMetaDataProvider.USER_ID_KEY_TYPE; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -50,6 +54,24 @@ import static org.junit.jupiter.api.Assertions.assertEquals; *******************************************************************************/ public class SharingTest { + ////////////// + // user ids // + ////////////// + public static final int HOMER_ID = 1; + public static final int MARGE_ID = 2; + public static final int BART_ID = 3; + public static final int LISA_ID = 4; + public static final int BURNS_ID = 5; + + /////////////// + // group ids // + /////////////// + public static final int SIMPSONS_ID = 1; + public static final int POWER_PLANT_ID = 2; + public static final int BOGUS_GROUP_ID = Integer.MAX_VALUE; + + + /******************************************************************************* ** *******************************************************************************/ @@ -76,48 +98,35 @@ public class SharingTest QContext.getQSession().withSecurityKeyValue(SharingMetaDataProvider.USER_ID_ALL_ACCESS_KEY_TYPE, true); List userList = List.of( - new User().withId(100).withUsername("homer"), - new User().withId(101).withUsername("marge"), - new User().withId(102).withUsername("bart"), - new User().withId(103).withUsername("lisa"), - new User().withId(110).withUsername("burns")); + new User().withId(HOMER_ID).withUsername("homer"), + new User().withId(MARGE_ID).withUsername("marge"), + new User().withId(BART_ID).withUsername("bart"), + new User().withId(LISA_ID).withUsername("lisa"), + new User().withId(BURNS_ID).withUsername("burns")); new InsertAction().execute(new InsertInput(User.TABLE_NAME).withRecordEntities(userList)); List groupList = List.of( - new Group().withId(200).withName("simpsons"), - new Group().withId(201).withName("powerplant")); + new Group().withId(SIMPSONS_ID).withName("simpsons"), + new Group().withId(POWER_PLANT_ID).withName("powerplant")); new InsertAction().execute(new InsertInput(Group.TABLE_NAME).withRecordEntities(groupList)); List assetList = List.of( - new Asset().withId(3000).withName("742evergreen").withUserId(100), - new Asset().withId(3001).withName("beer").withUserId(100), - new Asset().withId(3010).withName("bed").withUserId(101), - new Asset().withId(3020).withName("skateboard").withUserId(102), - new Asset().withId(3030).withName("saxamaphone").withUserId(103)); + new Asset().withId(1).withName("742evergreen").withUserId(HOMER_ID), + new Asset().withId(2).withName("beer").withUserId(HOMER_ID), + new Asset().withId(3).withName("car").withUserId(MARGE_ID), + new Asset().withId(4).withName("skateboard").withUserId(BART_ID), + new Asset().withId(5).withName("santaslittlehelper").withUserId(BART_ID), + new Asset().withId(6).withName("saxamaphone").withUserId(LISA_ID), + new Asset().withId(7).withName("radiation").withUserId(BURNS_ID)); new InsertAction().execute(new InsertInput(Asset.TABLE_NAME).withRecordEntities(assetList)); - List assetAudienceIntList = List.of( - // homer shares his house with the simpson family (group) - new AssetAudienceInt().withAssetId(3000).withAudienceId(200), - - // marge shares a bed with homer - new AssetAudienceInt().withAssetId(3010).withAudienceId(100) - + List sharedAssetList = List.of( + new SharedAsset().withAssetId(1).withGroupId(SIMPSONS_ID), // homer shares his house with the simpson family (group) + new SharedAsset().withAssetId(3).withUserId(HOMER_ID), // marge shares a car with homer + new SharedAsset().withAssetId(5).withGroupId(SIMPSONS_ID), // bart shares santa's little helper with the whole family + new SharedAsset().withAssetId(7).withGroupId(POWER_PLANT_ID) // burns shares radiation with the power plant ); - new InsertAction().execute(new InsertInput(AssetAudienceInt.TABLE_NAME).withRecordEntities(assetAudienceIntList)); - - List audienceList = new ArrayList<>(); - for(QRecordEntity entity : userList) - { - User user = (User) entity; - audienceList.add(new Audience().withId(user.getId()).withName(user.getUsername()).withType("user")); - } - for(QRecordEntity entity : groupList) - { - Group group = (Group) entity; - audienceList.add(new Audience().withId(group.getId()).withName(group.getName()).withType("group")); - } - new InsertAction().execute(new InsertInput(Audience.TABLE_NAME).withRecordEntities(audienceList)); + new InsertAction().execute(new InsertInput(SharedAsset.TABLE_NAME).withRecordEntities(sharedAssetList)); QContext.getQSession().withSecurityKeyValues(new HashMap<>()); } @@ -128,22 +137,127 @@ public class SharingTest ** *******************************************************************************/ @Test - void test() throws QException + void testAssetWithUserIdOnlySecurityKey() throws QException { + //////////////////////////////////////////////////////////////////// + // update the asset table to change its lock to only be on userId // + //////////////////////////////////////////////////////////////////// + QContext.getQInstance().getTable(Asset.TABLE_NAME) + .withRecordSecurityLocks(List.of(new RecordSecurityLock() + .withSecurityKeyType(USER_ID_KEY_TYPE) + .withFieldName("userId"))); + + //////////////////////////////////////////////////////// + // with nothing in session, make sure we find nothing // + //////////////////////////////////////////////////////// assertEquals(0, new QueryAction().execute(new QueryInput(Asset.TABLE_NAME)).getRecords().size()); + //////////////////////////////////// + // marge direct owner only of car // + //////////////////////////////////// QContext.getQSession().withSecurityKeyValues(new HashMap<>()); - QContext.getQSession().withSecurityKeyValue(SharingMetaDataProvider.USER_ID_KEY_TYPE, 101); + QContext.getQSession().withSecurityKeyValue(USER_ID_KEY_TYPE, MARGE_ID); assertEquals(1, new QueryAction().execute(new QueryInput(Asset.TABLE_NAME)).getRecords().size()); + ///////////////////////////////////////////////// + // homer direct owner of 742evergreen and beer // + ///////////////////////////////////////////////// QContext.getQSession().withSecurityKeyValues(new HashMap<>()); - QContext.getQSession().withSecurityKeyValue(SharingMetaDataProvider.USER_ID_KEY_TYPE, 100); + QContext.getQSession().withSecurityKeyValue(USER_ID_KEY_TYPE, HOMER_ID); assertEquals(2, new QueryAction().execute(new QueryInput(Asset.TABLE_NAME)).getRecords().size()); + ///////////////////////////////////////////////////// + // marge & homer - own car, 742evergreen, and beer // + ///////////////////////////////////////////////////// QContext.getQSession().withSecurityKeyValues(new HashMap<>()); - QContext.getQSession().withSecurityKeyValue(SharingMetaDataProvider.USER_ID_KEY_TYPE, 100); - QContext.getQSession().withSecurityKeyValue(SharingMetaDataProvider.USER_ID_KEY_TYPE, 101); + QContext.getQSession().withSecurityKeyValue(USER_ID_KEY_TYPE, HOMER_ID); + QContext.getQSession().withSecurityKeyValue(USER_ID_KEY_TYPE, MARGE_ID); assertEquals(3, new QueryAction().execute(new QueryInput(Asset.TABLE_NAME)).getRecords().size()); } + + + /******************************************************************************* + ** normally (?) maybe we wouldn't query sharedAsset directly (we'd instead query + ** for asset, and understand that there's a security lock coming from sharedAsset), + ** but this test is here as we build up making a more complex lock like that. + *******************************************************************************/ + @Test + void testSharedAssetDirectly() throws QException + { + //////////////////////////////////////////////////////// + // with nothing in session, make sure we find nothing // + //////////////////////////////////////////////////////// + assertEquals(0, new QueryAction().execute(new QueryInput(SharedAsset.TABLE_NAME)).getRecords().size()); + + ///////////////////////////////////// + // homer has a car shared with him // + ///////////////////////////////////// + QContext.getQSession().withSecurityKeyValues(new HashMap<>()); + QContext.getQSession().withSecurityKeyValue(USER_ID_KEY_TYPE, HOMER_ID); + assertEquals(1, new QueryAction().execute(new QueryInput(SharedAsset.TABLE_NAME)).getRecords().size()); + + ///////////////////////////////////////////////////////////////////////////////////////// + // now put homer's groups in the session as well - and we should find 742evergreen too // + ///////////////////////////////////////////////////////////////////////////////////////// + QContext.getQSession().withSecurityKeyValues(new HashMap<>()); + QContext.getQSession().withSecurityKeyValue(USER_ID_KEY_TYPE, HOMER_ID); + QContext.getQSession().withSecurityKeyValue(GROUP_ID_KEY_TYPE, SIMPSONS_ID); + QContext.getQSession().withSecurityKeyValue(GROUP_ID_KEY_TYPE, POWER_PLANT_ID); + List records = new QueryAction().execute(new QueryInput(SharedAsset.TABLE_NAME)).getRecords(); + assertEquals(4, records.size()); + } + + + /******************************************************************************* + ** real-world use-case (e.g., why sharing concept exists) - query the asset table + ** + *******************************************************************************/ + @Test + void testAssetsWithLockThroughSharing() throws QException, SQLException + { + //////////////////////////////////////////////////////// + // with nothing in session, make sure we find nothing // + //////////////////////////////////////////////////////// + assertEquals(0, new QueryAction().execute(new QueryInput(Asset.TABLE_NAME)).getRecords().size()); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // homer has a car shared with him and 2 things he owns himself - so w/ only his userId in session (and no groups), should find those 3 // + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + QContext.getQSession().withSecurityKeyValues(new HashMap<>()); + QContext.getQSession().withSecurityKeyValue(USER_ID_KEY_TYPE, HOMER_ID); + assertEquals(3, new QueryAction().execute(new QueryInput(Asset.TABLE_NAME)).getRecords().size()); + + ////////////////////////////////////////////////////////////////////// + // add a group that matches nothing now, just to ensure same result // + ////////////////////////////////////////////////////////////////////// + QContext.getQSession().withSecurityKeyValue(GROUP_ID_KEY_TYPE, BOGUS_GROUP_ID); + assertEquals(3, new QueryAction().execute(new QueryInput(Asset.TABLE_NAME)).getRecords().size()); + + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // now put homer's groups in the session as well - and we should find the 3 from above, plus a shared family asset and shared power-plant asset // + ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + QContext.getQSession().withSecurityKeyValues(new HashMap<>()); + QContext.getQSession().withSecurityKeyValue(USER_ID_KEY_TYPE, HOMER_ID); + QContext.getQSession().withSecurityKeyValue(GROUP_ID_KEY_TYPE, SIMPSONS_ID); + QContext.getQSession().withSecurityKeyValue(GROUP_ID_KEY_TYPE, POWER_PLANT_ID); + assertEquals(5, new QueryAction().execute(new QueryInput(Asset.TABLE_NAME)).getRecords().size()); + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + @Test + void testAllAccessKeys() throws QException + { + /////////////////////////////////////////////////////////////// + // with user-id all access key, should get all asset records // + /////////////////////////////////////////////////////////////// + QContext.getQSession().withSecurityKeyValues(new HashMap<>()); + QContext.getQSession().withSecurityKeyValue(USER_ID_ALL_ACCESS_KEY_TYPE, true); + assertEquals(7, new QueryAction().execute(new QueryInput(Asset.TABLE_NAME)).getRecords().size()); + } + } diff --git a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/model/AssetAudienceInt.java b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/model/AssetAudienceInt.java deleted file mode 100644 index 212ca1a5..00000000 --- a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/model/AssetAudienceInt.java +++ /dev/null @@ -1,226 +0,0 @@ -/* - * QQQ - Low-code Application Framework for Engineers. - * Copyright (C) 2021-2024. 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.rdbms.sharing.model; - - -import java.time.Instant; -import com.kingsrook.qqq.backend.core.model.data.QField; -import com.kingsrook.qqq.backend.core.model.data.QRecord; -import com.kingsrook.qqq.backend.core.model.data.QRecordEntity; - - -/******************************************************************************* - ** QRecord Entity for AssetAudienceInt table - *******************************************************************************/ -public class AssetAudienceInt extends QRecordEntity -{ - public static final String TABLE_NAME = "AssetAudienceInt"; - - @QField(isEditable = false) - private Integer id; - - @QField(isEditable = false) - private Instant createDate; - - @QField(isEditable = false) - private Instant modifyDate; - - @QField(possibleValueSourceName = Asset.TABLE_NAME) - private Integer assetId; - - @QField(possibleValueSourceName = Audience.TABLE_NAME) - private Integer audienceId; - - - /******************************************************************************* - ** Default constructor - *******************************************************************************/ - public AssetAudienceInt() - { - } - - - - /******************************************************************************* - ** Constructor that takes a QRecord - *******************************************************************************/ - public AssetAudienceInt(QRecord record) - { - populateFromQRecord(record); - } - - - /******************************************************************************* - ** Getter for id - *******************************************************************************/ - public Integer getId() - { - return (this.id); - } - - - - /******************************************************************************* - ** Setter for id - *******************************************************************************/ - public void setId(Integer id) - { - this.id = id; - } - - - - /******************************************************************************* - ** Fluent setter for id - *******************************************************************************/ - public AssetAudienceInt withId(Integer id) - { - this.id = id; - return (this); - } - - - - /******************************************************************************* - ** Getter for createDate - *******************************************************************************/ - public Instant getCreateDate() - { - return (this.createDate); - } - - - - /******************************************************************************* - ** Setter for createDate - *******************************************************************************/ - public void setCreateDate(Instant createDate) - { - this.createDate = createDate; - } - - - - /******************************************************************************* - ** Fluent setter for createDate - *******************************************************************************/ - public AssetAudienceInt withCreateDate(Instant createDate) - { - this.createDate = createDate; - return (this); - } - - - - /******************************************************************************* - ** Getter for modifyDate - *******************************************************************************/ - public Instant getModifyDate() - { - return (this.modifyDate); - } - - - - /******************************************************************************* - ** Setter for modifyDate - *******************************************************************************/ - public void setModifyDate(Instant modifyDate) - { - this.modifyDate = modifyDate; - } - - - - /******************************************************************************* - ** Fluent setter for modifyDate - *******************************************************************************/ - public AssetAudienceInt withModifyDate(Instant modifyDate) - { - this.modifyDate = modifyDate; - return (this); - } - - - - /******************************************************************************* - ** Getter for assetId - *******************************************************************************/ - public Integer getAssetId() - { - return (this.assetId); - } - - - - /******************************************************************************* - ** Setter for assetId - *******************************************************************************/ - public void setAssetId(Integer assetId) - { - this.assetId = assetId; - } - - - - /******************************************************************************* - ** Fluent setter for assetId - *******************************************************************************/ - public AssetAudienceInt withAssetId(Integer assetId) - { - this.assetId = assetId; - return (this); - } - - - - /******************************************************************************* - ** Getter for audienceId - *******************************************************************************/ - public Integer getAudienceId() - { - return (this.audienceId); - } - - - - /******************************************************************************* - ** Setter for audienceId - *******************************************************************************/ - public void setAudienceId(Integer audienceId) - { - this.audienceId = audienceId; - } - - - - /******************************************************************************* - ** Fluent setter for audienceId - *******************************************************************************/ - public AssetAudienceInt withAudienceId(Integer audienceId) - { - this.audienceId = audienceId; - return (this); - } - - -} diff --git a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/model/Audience.java b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/model/SharedAsset.java similarity index 80% rename from qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/model/Audience.java rename to qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/model/SharedAsset.java index 88216a46..f0636525 100644 --- a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/model/Audience.java +++ b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/sharing/model/SharedAsset.java @@ -29,11 +29,11 @@ import com.kingsrook.qqq.backend.core.model.data.QRecordEntity; /******************************************************************************* - ** QRecord Entity for Audience table + ** QRecord Entity for SharedAsset table *******************************************************************************/ -public class Audience extends QRecordEntity +public class SharedAsset extends QRecordEntity { - public static final String TABLE_NAME = "Audience"; + public static final String TABLE_NAME = "SharedAsset"; @QField(isEditable = false) private Integer id; @@ -44,21 +44,20 @@ public class Audience extends QRecordEntity @QField(isEditable = false) private Instant modifyDate; - @QField() - private String type; + @QField(possibleValueSourceName = Asset.TABLE_NAME) + private Integer assetId; - @QField() - private String name; - - @QField() - private String securityKey; + @QField(possibleValueSourceName = User.TABLE_NAME) + private Integer userId; + @QField(possibleValueSourceName = Group.TABLE_NAME) + private Integer groupId; /******************************************************************************* ** Default constructor *******************************************************************************/ - public Audience() + public SharedAsset() { } @@ -67,7 +66,7 @@ public class Audience extends QRecordEntity /******************************************************************************* ** Constructor that takes a QRecord *******************************************************************************/ - public Audience(QRecord record) + public SharedAsset(QRecord record) { populateFromQRecord(record); } @@ -96,7 +95,7 @@ public class Audience extends QRecordEntity /******************************************************************************* ** Fluent setter for id *******************************************************************************/ - public Audience withId(Integer id) + public SharedAsset withId(Integer id) { this.id = id; return (this); @@ -127,7 +126,7 @@ public class Audience extends QRecordEntity /******************************************************************************* ** Fluent setter for createDate *******************************************************************************/ - public Audience withCreateDate(Instant createDate) + public SharedAsset withCreateDate(Instant createDate) { this.createDate = createDate; return (this); @@ -158,7 +157,7 @@ public class Audience extends QRecordEntity /******************************************************************************* ** Fluent setter for modifyDate *******************************************************************************/ - public Audience withModifyDate(Instant modifyDate) + public SharedAsset withModifyDate(Instant modifyDate) { this.modifyDate = modifyDate; return (this); @@ -167,93 +166,94 @@ public class Audience extends QRecordEntity /******************************************************************************* - ** Getter for type + ** Getter for assetId *******************************************************************************/ - public String getType() + public Integer getAssetId() { - return (this.type); + return (this.assetId); } /******************************************************************************* - ** Setter for type + ** Setter for assetId *******************************************************************************/ - public void setType(String type) + public void setAssetId(Integer assetId) { - this.type = type; + this.assetId = assetId; } /******************************************************************************* - ** Fluent setter for type + ** Fluent setter for assetId *******************************************************************************/ - public Audience withType(String type) + public SharedAsset withAssetId(Integer assetId) { - this.type = type; + this.assetId = assetId; + return (this); + } + + + + + /******************************************************************************* + ** Getter for userId + *******************************************************************************/ + public Integer getUserId() + { + return (this.userId); + } + + + + /******************************************************************************* + ** Setter for userId + *******************************************************************************/ + public void setUserId(Integer userId) + { + this.userId = userId; + } + + + + /******************************************************************************* + ** Fluent setter for userId + *******************************************************************************/ + public SharedAsset withUserId(Integer userId) + { + this.userId = userId; return (this); } /******************************************************************************* - ** Getter for name + ** Getter for groupId *******************************************************************************/ - public String getName() + public Integer getGroupId() { - return (this.name); + return (this.groupId); } /******************************************************************************* - ** Setter for name + ** Setter for groupId *******************************************************************************/ - public void setName(String name) + public void setGroupId(Integer groupId) { - this.name = name; + this.groupId = groupId; } /******************************************************************************* - ** Fluent setter for name + ** Fluent setter for groupId *******************************************************************************/ - public Audience withName(String name) + public SharedAsset withGroupId(Integer groupId) { - this.name = name; - return (this); - } - - - - /******************************************************************************* - ** Getter for securityKey - *******************************************************************************/ - public String getSecurityKey() - { - return (this.securityKey); - } - - - - /******************************************************************************* - ** Setter for securityKey - *******************************************************************************/ - public void setSecurityKey(String securityKey) - { - this.securityKey = securityKey; - } - - - - /******************************************************************************* - ** Fluent setter for securityKey - *******************************************************************************/ - public Audience withSecurityKey(String securityKey) - { - this.securityKey = securityKey; + this.groupId = groupId; return (this); } diff --git a/qqq-backend-module-rdbms/src/test/resources/prime-test-database-sharing-test.sql b/qqq-backend-module-rdbms/src/test/resources/prime-test-database-sharing-test.sql index 3c3e47d0..70a00914 100644 --- a/qqq-backend-module-rdbms/src/test/resources/prime-test-database-sharing-test.sql +++ b/qqq-backend-module-rdbms/src/test/resources/prime-test-database-sharing-test.sql @@ -22,64 +22,53 @@ DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( - id INTEGER AUTO_INCREMENT PRIMARY KEY, - create_date TIMESTAMP DEFAULT now(), - modify_date TIMESTAMP DEFAULT now(), - username VARCHAR(100) + id INTEGER AUTO_INCREMENT PRIMARY KEY, + create_date TIMESTAMP DEFAULT NOW(), + modify_date TIMESTAMP DEFAULT NOW(), + username VARCHAR(100) ); DROP TABLE IF EXISTS `group`; CREATE TABLE `group` ( - id INTEGER AUTO_INCREMENT PRIMARY KEY, - create_date TIMESTAMP DEFAULT now(), - modify_date TIMESTAMP DEFAULT now(), - name VARCHAR(100), - client_id INTEGER + id INTEGER AUTO_INCREMENT PRIMARY KEY, + create_date TIMESTAMP DEFAULT NOW(), + modify_date TIMESTAMP DEFAULT NOW(), + name VARCHAR(100), + client_id INTEGER ); DROP TABLE IF EXISTS `client`; CREATE TABLE `client` ( - id INTEGER AUTO_INCREMENT PRIMARY KEY, - create_date TIMESTAMP DEFAULT now(), - modify_date TIMESTAMP DEFAULT now(), - name VARCHAR(100) -); - - -DROP TABLE IF EXISTS audience; -CREATE TABLE audience -( - id INT AUTO_INCREMENT primary key , - create_date TIMESTAMP DEFAULT now(), - modify_date TIMESTAMP DEFAULT now(), - type VARCHAR(50), - name VARCHAR(100), - security_key VARCHAR(100) + id INTEGER AUTO_INCREMENT PRIMARY KEY, + create_date TIMESTAMP DEFAULT NOW(), + modify_date TIMESTAMP DEFAULT NOW(), + name VARCHAR(100) ); DROP TABLE IF EXISTS asset; CREATE TABLE asset ( - id INT AUTO_INCREMENT primary key , - create_date TIMESTAMP DEFAULT now(), - modify_date TIMESTAMP DEFAULT now(), - name VARCHAR(100), - user_id INTEGER + id INT AUTO_INCREMENT PRIMARY KEY, + create_date TIMESTAMP DEFAULT NOW(), + modify_date TIMESTAMP DEFAULT NOW(), + name VARCHAR(100), + user_id INTEGER ); -DROP TABLE IF EXISTS asset_audience_int; -CREATE TABLE asset_audience_int +DROP TABLE IF EXISTS shared_asset; +CREATE TABLE shared_asset ( - id INT AUTO_INCREMENT primary key , - create_date TIMESTAMP DEFAULT now(), - modify_date TIMESTAMP DEFAULT now(), - asset_id INTEGER, - audience_id INTEGER + id INT AUTO_INCREMENT PRIMARY KEY, + create_date TIMESTAMP DEFAULT NOW(), + modify_date TIMESTAMP DEFAULT NOW(), + asset_id INTEGER, + user_id INTEGER, + group_id INTEGER );