From b21283f295d7cdef1f6e2efa8ea245e4c3927469 Mon Sep 17 00:00:00 2001
From: "albino.servin" <121980479+Decano989@users.noreply.github.com>
Date: Mon, 6 Oct 2025 22:51:14 -0300
Subject: [PATCH] test adapter
---
.gitignore | 36 ++
README.md | 2 +
nbactions.xml | 55 +++
pom.xml | 161 ++++++++
.../java/io/kumare/iqr/IqrApplication.java | 32 ++
src/main/java/io/kumare/iqr/app/App.java | 48 +++
.../java/io/kumare/iqr/app/AppConstants.java | 21 +
.../java/io/kumare/iqr/app/AppContext.java | 77 ++++
.../java/io/kumare/iqr/app/AppEngine.java | 64 +++
.../java/io/kumare/iqr/app/AppErrors.java | 69 ++++
.../java/io/kumare/iqr/app/AppException.java | 132 +++++++
.../io/kumare/iqr/app/action/AppAction.java | 36 ++
.../iqr/app/action/AppActionArgument.java | 40 ++
.../kumare/iqr/app/action/AppActionError.java | 12 +
.../iqr/app/action/AppActionManager.java | 15 +
.../iqr/app/action/AppActionResult.java | 15 +
.../app/action/AppEntityActionArgument.java | 46 +++
.../iqr/app/action/AppEntityActionResult.java | 30 ++
.../iqr/app/action/AppListActionArgument.java | 85 ++++
.../kumare/iqr/app/adapter/AppAdapters.java | 27 ++
.../iqr/app/endpoint/AppTransports.java | 14 +
.../app/endpoint/rest/AppEndpointRest.java | 28 ++
.../rest/AppOpenAPIConfiguration.java | 31 ++
.../app/endpoint/rest/WebSecurityConfig.java | 122 ++++++
.../iqr/app/module/AppModuleController.java | 16 +
.../io/kumare/iqr/app/module/AppModules.java | 67 ++++
.../app/security/AppPermissionManager.java | 16 +
.../iqr/app/security/AppSecurityContext.java | 23 ++
.../iqr/app/security/AppSecurityScopes.java | 57 +++
.../io/kumare/iqr/app/store/AppEntity.java | 29 ++
.../iqr/app/store/AppEntityRepository.java | 21 +
.../kumare/iqr/app/store/AppEntityStore.java | 29 ++
.../iqr/app/store/AppExtendedEntity.java | 30 ++
.../iqr/app/store/AppExtendedEntityData.java | 15 +
.../app/store/AppJacksonConfiguration.java | 26 ++
.../iqr/app/store/AppKeyEntityRepository.java | 21 +
.../iqr/app/store/AppKeyEntityStore.java | 29 ++
.../java/io/kumare/iqr/app/util/AppUtil.java | 18 +
.../AuthenticationConstants.java | 20 +
.../AuthenticationController.java | 57 +++
.../authentication/AuthenticationErrors.java | 94 +++++
.../authentication/AuthenticationModule.java | 37 ++
.../AuthenticationPermissions.java | 84 ++++
.../authuser/AuthUserActionArgument.java | 29 ++
.../action/authuser/AuthUserAddAction.java | 169 ++++++++
.../action/authuser/AuthUserAddArgument.java | 52 +++
.../action/authuser/AuthUserDeleteAction.java | 59 +++
.../action/authuser/AuthUserEditAction.java | 109 ++++++
.../action/authuser/AuthUserEditArgument.java | 32 ++
.../action/authuser/AuthUserEnableAction.java | 60 +++
.../action/authuser/AuthUserFindAction.java | 64 +++
.../action/authuser/AuthUserListAction.java | 148 +++++++
.../action/authuser/AuthUserListArgument.java | 33 ++
.../authuser/AuthUserPreloadAction.java | 101 +++++
.../authuser/AuthUserPreloadArgument.java | 26 ++
.../AuthUserRelationActionArgument.java | 29 ++
.../AuthUserRelationAddAction.java | 123 ++++++
.../AuthUserRelationAddArgument.java | 34 ++
.../AuthUserRelationDeleteAction.java | 59 +++
.../AuthUserRelationEditAction.java | 103 +++++
.../AuthUserRelationEditArgument.java | 32 ++
.../AuthUserRelationEnableAction.java | 60 +++
.../AuthUserRelationFindAction.java | 64 +++
.../AuthUserRelationListAction.java | 148 +++++++
.../AuthUserRelationListArgument.java | 33 ++
.../AuthUserRelationPreloadAction.java | 105 +++++
.../AuthUserRelationPreloadArgument.java | 26 ++
.../rest/AbstractAuthUserRelationRest.java | 214 ++++++++++
.../endpoint/rest/AbstractAuthUserRest.java | 214 ++++++++++
.../endpoint/rest/AuthUserRelationRest.java | 24 ++
.../endpoint/rest/AuthUserRest.java | 24 ++
.../store/AuthenticationEntities.java | 102 +++++
.../store/authuser/AuthUserData.java | 25 ++
.../store/authuser/AuthUserEntity.java | 179 +++++++++
.../store/authuser/AuthUserFields.java | 163 ++++++++
.../store/authuser/AuthUserMapBuilder.java | 93 +++++
.../store/authuser/AuthUserRepository.java | 18 +
.../store/authuser/AuthUserStore.java | 35 ++
.../AuthUserRelationData.java | 25 ++
.../AuthUserRelationEntity.java | 153 ++++++++
.../AuthUserRelationFields.java | 155 ++++++++
.../AuthUserRelationMapBuilder.java | 139 +++++++
.../AuthUserRelationRepository.java | 18 +
.../AuthUserRelationStore.java | 35 ++
.../io/kumare/iqr/mod/biz/BizConstants.java | 20 +
.../io/kumare/iqr/mod/biz/BizController.java | 87 +++++
.../java/io/kumare/iqr/mod/biz/BizErrors.java | 165 ++++++++
.../java/io/kumare/iqr/mod/biz/BizModule.java | 37 ++
.../io/kumare/iqr/mod/biz/BizPermissions.java | 198 ++++++++++
.../business/BusinessActionArgument.java | 29 ++
.../action/business/BusinessAddAction.java | 161 ++++++++
.../action/business/BusinessAddArgument.java | 49 +++
.../action/business/BusinessDeleteAction.java | 59 +++
.../action/business/BusinessEditAction.java | 110 ++++++
.../action/business/BusinessEditArgument.java | 39 ++
.../action/business/BusinessEnableAction.java | 60 +++
.../action/business/BusinessFindAction.java | 70 ++++
.../action/business/BusinessListAction.java | 148 +++++++
.../action/business/BusinessListArgument.java | 33 ++
.../business/BusinessPreloadAction.java | 97 +++++
.../business/BusinessPreloadArgument.java | 26 ++
.../BusinessImageActionArgument.java | 29 ++
.../businessimage/BusinessImageAddAction.java | 121 ++++++
.../BusinessImageAddArgument.java | 34 ++
.../BusinessImageDeleteAction.java | 59 +++
.../BusinessImageEditAction.java | 95 +++++
.../BusinessImageEditArgument.java | 32 ++
.../BusinessImageEnableAction.java | 60 +++
.../BusinessImageFindAction.java | 64 +++
.../BusinessImageListAction.java | 149 +++++++
.../BusinessImageListArgument.java | 33 ++
.../BusinessImagePreloadAction.java | 114 ++++++
.../BusinessImagePreloadArgument.java | 26 ++
.../BusinessProfileActionArgument.java | 29 ++
.../BusinessProfileAddAction.java | 133 +++++++
.../BusinessProfileAddArgument.java | 34 ++
.../BusinessProfileDeleteAction.java | 59 +++
.../BusinessProfileEditAction.java | 107 +++++
.../BusinessProfileEditArgument.java | 32 ++
.../BusinessProfileEnableAction.java | 60 +++
.../BusinessProfileFindAction.java | 64 +++
.../BusinessProfileListAction.java | 149 +++++++
.../BusinessProfileListArgument.java | 33 ++
.../BusinessProfilePreloadAction.java | 114 ++++++
.../BusinessProfilePreloadArgument.java | 26 ++
.../BusinessPromoActionArgument.java | 29 ++
.../businesspromo/BusinessPromoAddAction.java | 149 +++++++
.../BusinessPromoAddArgument.java | 41 ++
.../BusinessPromoDeleteAction.java | 59 +++
.../BusinessPromoEditAction.java | 107 +++++
.../BusinessPromoEditArgument.java | 32 ++
.../BusinessPromoEnableAction.java | 60 +++
.../BusinessPromoFindAction.java | 64 +++
.../BusinessPromoListAction.java | 150 +++++++
.../BusinessPromoListArgument.java | 33 ++
.../BusinessPromoPreloadAction.java | 123 ++++++
.../BusinessPromoPreloadArgument.java | 26 ++
.../BusinessPromoItemActionArgument.java | 29 ++
.../BusinessPromoItemAddAction.java | 129 ++++++
.../BusinessPromoItemAddArgument.java | 34 ++
.../BusinessPromoItemDeleteAction.java | 59 +++
.../BusinessPromoItemEditAction.java | 99 +++++
.../BusinessPromoItemEditArgument.java | 32 ++
.../BusinessPromoItemEnableAction.java | 60 +++
.../BusinessPromoItemFindAction.java | 64 +++
.../BusinessPromoItemListAction.java | 150 +++++++
.../BusinessPromoItemListArgument.java | 33 ++
.../BusinessPromoItemPreloadAction.java | 123 ++++++
.../BusinessPromoItemPreloadArgument.java | 26 ++
.../BusinessSettingActionArgument.java | 29 ++
.../BusinessSettingAddAction.java | 117 ++++++
.../BusinessSettingAddArgument.java | 34 ++
.../BusinessSettingDeleteAction.java | 59 +++
.../BusinessSettingEditAction.java | 97 +++++
.../BusinessSettingEditArgument.java | 32 ++
.../BusinessSettingEnableAction.java | 60 +++
.../BusinessSettingFindAction.java | 64 +++
.../BusinessSettingListAction.java | 148 +++++++
.../BusinessSettingListArgument.java | 33 ++
.../BusinessSettingPreloadAction.java | 105 +++++
.../BusinessSettingPreloadArgument.java | 26 ++
.../BusinessTagActionArgument.java | 29 ++
.../businesstag/BusinessTagAddAction.java | 114 ++++++
.../businesstag/BusinessTagAddArgument.java | 34 ++
.../businesstag/BusinessTagDeleteAction.java | 59 +++
.../businesstag/BusinessTagEditAction.java | 95 +++++
.../businesstag/BusinessTagEditArgument.java | 32 ++
.../businesstag/BusinessTagEnableAction.java | 60 +++
.../businesstag/BusinessTagFindAction.java | 64 +++
.../businesstag/BusinessTagListAction.java | 148 +++++++
.../businesstag/BusinessTagListArgument.java | 33 ++
.../businesstag/BusinessTagPreloadAction.java | 101 +++++
.../BusinessTagPreloadArgument.java | 26 ++
.../BusinessWorkerActionArgument.java | 29 ++
.../BusinessWorkerAddAction.java | 146 +++++++
.../BusinessWorkerAddArgument.java | 39 ++
.../BusinessWorkerDeleteAction.java | 59 +++
.../BusinessWorkerEditAction.java | 105 +++++
.../BusinessWorkerEditArgument.java | 32 ++
.../BusinessWorkerEnableAction.java | 60 +++
.../BusinessWorkerFindAction.java | 64 +++
.../BusinessWorkerListAction.java | 150 +++++++
.../BusinessWorkerListArgument.java | 33 ++
.../BusinessWorkerPreloadAction.java | 118 ++++++
.../BusinessWorkerPreloadArgument.java | 26 ++
.../rest/AbstractBusinessImageRest.java | 214 ++++++++++
.../rest/AbstractBusinessProfileRest.java | 215 ++++++++++
.../rest/AbstractBusinessPromoItemRest.java | 214 ++++++++++
.../rest/AbstractBusinessPromoRest.java | 214 ++++++++++
.../endpoint/rest/AbstractBusinessRest.java | 215 ++++++++++
.../rest/AbstractBusinessSettingRest.java | 214 ++++++++++
.../rest/AbstractBusinessTagRest.java | 214 ++++++++++
.../rest/AbstractBusinessWorkerRest.java | 214 ++++++++++
.../biz/endpoint/rest/BizTaxonomyRest.java | 25 ++
.../biz/endpoint/rest/BusinessImageRest.java | 24 ++
.../endpoint/rest/BusinessProfileRest.java | 24 ++
.../endpoint/rest/BusinessPromoItemRest.java | 24 ++
.../biz/endpoint/rest/BusinessPromoRest.java | 24 ++
.../mod/biz/endpoint/rest/BusinessRest.java | 24 ++
.../endpoint/rest/BusinessSettingRest.java | 24 ++
.../biz/endpoint/rest/BusinessTagRest.java | 24 ++
.../biz/endpoint/rest/BusinessWorkerRest.java | 24 ++
.../kumare/iqr/mod/biz/store/BizEntities.java | 120 ++++++
.../iqr/mod/biz/store/BizTaxonomies.java | 120 ++++++
.../iqr/mod/biz/store/BizWorkerRoles.java | 29 ++
.../mod/biz/store/business/BusinessData.java | 25 ++
.../biz/store/business/BusinessEntity.java | 137 +++++++
.../biz/store/business/BusinessFields.java | 151 +++++++
.../store/business/BusinessMapBuilder.java | 139 +++++++
.../store/business/BusinessRepository.java | 18 +
.../mod/biz/store/business/BusinessStore.java | 35 ++
.../businessimage/BusinessImageData.java | 25 ++
.../businessimage/BusinessImageEntity.java | 109 ++++++
.../businessimage/BusinessImageFields.java | 145 +++++++
.../BusinessImageMapBuilder.java | 185 +++++++++
.../BusinessImageRepository.java | 18 +
.../businessimage/BusinessImageStore.java | 35 ++
.../businessprofile/BusinessProfileData.java | 25 ++
.../BusinessProfileEntity.java | 200 ++++++++++
.../BusinessProfileFields.java | 171 ++++++++
.../BusinessProfileMapBuilder.java | 185 +++++++++
.../BusinessProfileRepository.java | 18 +
.../businessprofile/BusinessProfileStore.java | 35 ++
.../businesspromo/BusinessPromoData.java | 25 ++
.../businesspromo/BusinessPromoEntity.java | 215 ++++++++++
.../businesspromo/BusinessPromoFields.java | 175 +++++++++
.../BusinessPromoMapBuilder.java | 231 +++++++++++
.../BusinessPromoRepository.java | 18 +
.../businesspromo/BusinessPromoStore.java | 35 ++
.../BusinessPromoItemData.java | 25 ++
.../BusinessPromoItemEntity.java | 155 ++++++++
.../BusinessPromoItemFields.java | 159 ++++++++
.../BusinessPromoItemMapBuilder.java | 231 +++++++++++
.../BusinessPromoItemRepository.java | 18 +
.../BusinessPromoItemStore.java | 35 ++
.../businesssetting/BusinessSettingData.java | 25 ++
.../BusinessSettingEntity.java | 108 +++++
.../BusinessSettingFields.java | 143 +++++++
.../BusinessSettingMapBuilder.java | 139 +++++++
.../BusinessSettingRepository.java | 18 +
.../businesssetting/BusinessSettingStore.java | 35 ++
.../store/businesstag/BusinessTagData.java | 25 ++
.../store/businesstag/BusinessTagEntity.java | 83 ++++
.../store/businesstag/BusinessTagFields.java | 135 +++++++
.../businesstag/BusinessTagMapBuilder.java | 93 +++++
.../businesstag/BusinessTagRepository.java | 18 +
.../store/businesstag/BusinessTagStore.java | 35 ++
.../businessworker/BusinessWorkerData.java | 25 ++
.../businessworker/BusinessWorkerEntity.java | 201 ++++++++++
.../businessworker/BusinessWorkerFields.java | 169 ++++++++
.../BusinessWorkerMapBuilder.java | 230 +++++++++++
.../BusinessWorkerRepository.java | 18 +
.../businessworker/BusinessWorkerStore.java | 35 ++
.../iqr/mod/clientele/ClienteleConstants.java | 20 +
.../mod/clientele/ClienteleController.java | 57 +++
.../iqr/mod/clientele/ClienteleErrors.java | 95 +++++
.../iqr/mod/clientele/ClienteleModule.java | 37 ++
.../mod/clientele/ClientelePermissions.java | 84 ++++
.../action/client/ClientActionArgument.java | 29 ++
.../action/client/ClientAddAction.java | 136 +++++++
.../action/client/ClientAddArgument.java | 38 ++
.../action/client/ClientDeleteAction.java | 59 +++
.../action/client/ClientEditAction.java | 107 +++++
.../action/client/ClientEditArgument.java | 32 ++
.../action/client/ClientEnableAction.java | 60 +++
.../action/client/ClientFindAction.java | 64 +++
.../action/client/ClientListAction.java | 145 +++++++
.../action/client/ClientListArgument.java | 50 +++
.../action/client/ClientPreloadAction.java | 114 ++++++
.../action/client/ClientPreloadArgument.java | 26 ++
.../mod/clientele/action/client/GvTime.java | 35 ++
.../clientele/action/client/PunchType.java | 41 ++
.../action/client/VismaAddPunchAction.java | 56 +++
.../action/client/VismaAddPunchArgument.java | 49 +++
.../client/VismaAddPunchMultipleAction.java | 63 +++
.../client/VismaAddPunchMultipleArgument.java | 21 +
.../action/client/VismaDeletePunchAction.java | 55 +++
.../client/VismaDeletePunchArgument.java | 29 ++
.../client/VismaEmployeeListAction.java | 49 +++
.../action/client/VismaPunchListAction.java | 57 +++
.../action/client/VismaPunchListArgument.java | 52 +++
.../client/VismaPunchListPageAction.java | 59 +++
.../ClientRelationActionArgument.java | 29 ++
.../ClientRelationAddAction.java | 124 ++++++
.../ClientRelationAddArgument.java | 34 ++
.../ClientRelationDeleteAction.java | 59 +++
.../ClientRelationEditAction.java | 101 +++++
.../ClientRelationEditArgument.java | 32 ++
.../ClientRelationEnableAction.java | 60 +++
.../ClientRelationFindAction.java | 64 +++
.../ClientRelationListAction.java | 149 +++++++
.../ClientRelationListArgument.java | 33 ++
.../ClientRelationPreloadAction.java | 107 +++++
.../ClientRelationPreloadArgument.java | 26 ++
.../rest/AbstractClientRelationRest.java | 214 ++++++++++
.../endpoint/rest/AbstractClientRest.java | 315 +++++++++++++++
.../endpoint/rest/ClientRelationRest.java | 24 ++
.../clientele/endpoint/rest/ClientRest.java | 24 ++
.../endpoint/rest/ClienteleTaxonomyRest.java | 25 ++
.../clientele/store/ClienteleEntities.java | 102 +++++
.../clientele/store/ClienteleTaxonomies.java | 116 ++++++
.../clientele/store/client/ClientData.java | 25 ++
.../clientele/store/client/ClientEntity.java | 199 ++++++++++
.../clientele/store/client/ClientFields.java | 169 ++++++++
.../store/client/ClientMapBuilder.java | 185 +++++++++
.../store/client/ClientRepository.java | 18 +
.../clientele/store/client/ClientStore.java | 35 ++
.../clientrelation/ClientRelationData.java | 25 ++
.../clientrelation/ClientRelationEntity.java | 152 ++++++++
.../clientrelation/ClientRelationFields.java | 157 ++++++++
.../ClientRelationMapBuilder.java | 184 +++++++++
.../ClientRelationRepository.java | 18 +
.../clientrelation/ClientRelationStore.java | 35 ++
.../iqr/mod/loyalty/LoyaltyConstants.java | 20 +
.../iqr/mod/loyalty/LoyaltyController.java | 62 +++
.../kumare/iqr/mod/loyalty/LoyaltyErrors.java | 102 +++++
.../kumare/iqr/mod/loyalty/LoyaltyModule.java | 37 ++
.../iqr/mod/loyalty/LoyaltyPermissions.java | 103 +++++
.../SubscriptionActionArgument.java | 29 ++
.../subscription/SubscriptionAddAction.java | 144 +++++++
.../subscription/SubscriptionAddArgument.java | 41 ++
.../SubscriptionDeleteAction.java | 59 +++
.../subscription/SubscriptionEditAction.java | 95 +++++
.../SubscriptionEditArgument.java | 32 ++
.../SubscriptionEnableAction.java | 60 +++
.../subscription/SubscriptionFindAction.java | 64 +++
.../subscription/SubscriptionListAction.java | 151 +++++++
.../SubscriptionListArgument.java | 33 ++
.../SubscriptionPreloadAction.java | 132 +++++++
.../SubscriptionPreloadArgument.java | 26 ++
.../SubscriptionTxActionArgument.java | 29 ++
.../SubscriptionTxAddAction.java | 154 ++++++++
.../SubscriptionTxAddArgument.java | 41 ++
.../SubscriptionTxDeleteAction.java | 59 +++
.../SubscriptionTxEditAction.java | 97 +++++
.../SubscriptionTxEditArgument.java | 32 ++
.../SubscriptionTxEnableAction.java | 60 +++
.../SubscriptionTxFindAction.java | 64 +++
.../SubscriptionTxListAction.java | 153 ++++++++
.../SubscriptionTxListArgument.java | 33 ++
.../SubscriptionTxPreloadAction.java | 143 +++++++
.../SubscriptionTxPreloadArgument.java | 26 ++
.../SubscriptionTxTagActionArgument.java | 29 ++
.../SubscriptionTxTagAddAction.java | 124 ++++++
.../SubscriptionTxTagAddArgument.java | 34 ++
.../SubscriptionTxTagDeleteAction.java | 59 +++
.../SubscriptionTxTagEditAction.java | 93 +++++
.../SubscriptionTxTagEditArgument.java | 32 ++
.../SubscriptionTxTagEnableAction.java | 60 +++
.../SubscriptionTxTagFindAction.java | 64 +++
.../SubscriptionTxTagListAction.java | 150 +++++++
.../SubscriptionTxTagListArgument.java | 33 ++
.../SubscriptionTxTagPreloadAction.java | 123 ++++++
.../SubscriptionTxTagPreloadArgument.java | 26 ++
.../rest/AbstractSubscriptionRest.java | 214 ++++++++++
.../rest/AbstractSubscriptionTxRest.java | 214 ++++++++++
.../rest/AbstractSubscriptionTxTagRest.java | 214 ++++++++++
.../endpoint/rest/LoyaltyTaxonomyRest.java | 25 ++
.../endpoint/rest/SubscriptionRest.java | 24 ++
.../endpoint/rest/SubscriptionTxRest.java | 24 ++
.../endpoint/rest/SubscriptionTxTagRest.java | 24 ++
.../mod/loyalty/store/LoyaltyEntities.java | 105 +++++
.../mod/loyalty/store/LoyaltyTaxonomies.java | 116 ++++++
.../store/subscription/SubscriptionData.java | 25 ++
.../subscription/SubscriptionEntity.java | 141 +++++++
.../subscription/SubscriptionFields.java | 157 ++++++++
.../subscription/SubscriptionMapBuilder.java | 277 +++++++++++++
.../subscription/SubscriptionRepository.java | 18 +
.../store/subscription/SubscriptionStore.java | 35 ++
.../subscriptiontx/SubscriptionTxData.java | 25 ++
.../subscriptiontx/SubscriptionTxEntity.java | 187 +++++++++
.../subscriptiontx/SubscriptionTxFields.java | 173 ++++++++
.../SubscriptionTxMapBuilder.java | 368 ++++++++++++++++++
.../SubscriptionTxRepository.java | 18 +
.../subscriptiontx/SubscriptionTxStore.java | 35 ++
.../SubscriptionTxTagData.java | 25 ++
.../SubscriptionTxTagEntity.java | 110 ++++++
.../SubscriptionTxTagFields.java | 147 +++++++
.../SubscriptionTxTagMapBuilder.java | 231 +++++++++++
.../SubscriptionTxTagRepository.java | 18 +
.../SubscriptionTxTagStore.java | 35 ++
.../iqr/mod/pocket/PocketConstants.java | 20 +
.../iqr/mod/pocket/PocketController.java | 62 +++
.../kumare/iqr/mod/pocket/PocketErrors.java | 99 +++++
.../kumare/iqr/mod/pocket/PocketModule.java | 37 ++
.../iqr/mod/pocket/PocketPermissions.java | 103 +++++
.../action/wallet/WalletActionArgument.java | 29 ++
.../pocket/action/wallet/WalletAddAction.java | 125 ++++++
.../action/wallet/WalletAddArgument.java | 41 ++
.../action/wallet/WalletDeleteAction.java | 59 +++
.../action/wallet/WalletEditAction.java | 95 +++++
.../action/wallet/WalletEditArgument.java | 32 ++
.../action/wallet/WalletEnableAction.java | 60 +++
.../action/wallet/WalletFindAction.java | 64 +++
.../action/wallet/WalletListAction.java | 148 +++++++
.../action/wallet/WalletListArgument.java | 33 ++
.../action/wallet/WalletPreloadAction.java | 101 +++++
.../action/wallet/WalletPreloadArgument.java | 26 ++
.../WalletMovementActionArgument.java | 29 ++
.../WalletMovementAddAction.java | 137 +++++++
.../WalletMovementAddArgument.java | 34 ++
.../WalletMovementDeleteAction.java | 59 +++
.../WalletMovementEditAction.java | 103 +++++
.../WalletMovementEditArgument.java | 32 ++
.../WalletMovementEnableAction.java | 60 +++
.../WalletMovementFindAction.java | 64 +++
.../WalletMovementListAction.java | 151 +++++++
.../WalletMovementListArgument.java | 33 ++
.../WalletMovementPreloadAction.java | 125 ++++++
.../WalletMovementPreloadArgument.java | 26 ++
.../walletslot/WalletSlotActionArgument.java | 29 ++
.../walletslot/WalletSlotAddAction.java | 117 ++++++
.../walletslot/WalletSlotAddArgument.java | 34 ++
.../walletslot/WalletSlotDeleteAction.java | 59 +++
.../walletslot/WalletSlotEditAction.java | 97 +++++
.../walletslot/WalletSlotEditArgument.java | 32 ++
.../walletslot/WalletSlotEnableAction.java | 60 +++
.../walletslot/WalletSlotFindAction.java | 64 +++
.../walletslot/WalletSlotListAction.java | 148 +++++++
.../walletslot/WalletSlotListArgument.java | 33 ++
.../walletslot/WalletSlotPreloadAction.java | 105 +++++
.../walletslot/WalletSlotPreloadArgument.java | 26 ++
.../rest/AbstractWalletMovementRest.java | 214 ++++++++++
.../endpoint/rest/AbstractWalletRest.java | 214 ++++++++++
.../endpoint/rest/AbstractWalletSlotRest.java | 214 ++++++++++
.../endpoint/rest/PocketTaxonomyRest.java | 25 ++
.../endpoint/rest/WalletMovementRest.java | 24 ++
.../mod/pocket/endpoint/rest/WalletRest.java | 24 ++
.../pocket/endpoint/rest/WalletSlotRest.java | 24 ++
.../iqr/mod/pocket/store/PocketEntities.java | 105 +++++
.../mod/pocket/store/PocketTaxonomies.java | 115 ++++++
.../mod/pocket/store/wallet/WalletData.java | 25 ++
.../mod/pocket/store/wallet/WalletEntity.java | 83 ++++
.../mod/pocket/store/wallet/WalletFields.java | 135 +++++++
.../pocket/store/wallet/WalletMapBuilder.java | 93 +++++
.../pocket/store/wallet/WalletRepository.java | 18 +
.../mod/pocket/store/wallet/WalletStore.java | 35 ++
.../walletmovement/WalletMovementData.java | 25 ++
.../walletmovement/WalletMovementEntity.java | 200 ++++++++++
.../walletmovement/WalletMovementFields.java | 173 ++++++++
.../WalletMovementMapBuilder.java | 276 +++++++++++++
.../WalletMovementRepository.java | 18 +
.../walletmovement/WalletMovementStore.java | 35 ++
.../store/walletslot/WalletSlotData.java | 25 ++
.../store/walletslot/WalletSlotEntity.java | 108 +++++
.../store/walletslot/WalletSlotFields.java | 143 +++++++
.../walletslot/WalletSlotMapBuilder.java | 139 +++++++
.../walletslot/WalletSlotRepository.java | 18 +
.../store/walletslot/WalletSlotStore.java | 35 ++
.../iqr/mod/taxonomy/TaxonomyConstants.java | 20 +
.../iqr/mod/taxonomy/TaxonomyController.java | 62 +++
.../iqr/mod/taxonomy/TaxonomyErrors.java | 118 ++++++
.../iqr/mod/taxonomy/TaxonomyModule.java | 37 ++
.../iqr/mod/taxonomy/TaxonomyPermissions.java | 103 +++++
.../action/taxa/TaxaActionArgument.java | 29 ++
.../taxonomy/action/taxa/TaxaAddAction.java | 128 ++++++
.../taxonomy/action/taxa/TaxaAddArgument.java | 48 +++
.../action/taxa/TaxaDeleteAction.java | 59 +++
.../taxonomy/action/taxa/TaxaEditAction.java | 111 ++++++
.../action/taxa/TaxaEditArgument.java | 32 ++
.../action/taxa/TaxaEnableAction.java | 60 +++
.../action/taxa/TaxaExportAction.java | 85 ++++
.../taxonomy/action/taxa/TaxaFindAction.java | 64 +++
.../action/taxa/TaxaImportAction.java | 100 +++++
.../action/taxa/TaxaImportArgument.java | 45 +++
.../taxonomy/action/taxa/TaxaListAction.java | 148 +++++++
.../action/taxa/TaxaListArgument.java | 33 ++
.../action/taxa/TaxaPreloadAction.java | 101 +++++
.../action/taxa/TaxaPreloadArgument.java | 26 ++
.../action/taxon/TaxonActionArgument.java | 29 ++
.../action/taxon/TaxonActionUtils.java | 65 ++++
.../taxonomy/action/taxon/TaxonAddAction.java | 204 ++++++++++
.../action/taxon/TaxonAddArgument.java | 53 +++
.../action/taxon/TaxonDeleteAction.java | 59 +++
.../action/taxon/TaxonEditAction.java | 133 +++++++
.../action/taxon/TaxonEditArgument.java | 32 ++
.../action/taxon/TaxonEnableAction.java | 60 +++
.../action/taxon/TaxonFindAction.java | 70 ++++
.../action/taxon/TaxonListAction.java | 157 ++++++++
.../action/taxon/TaxonListArgument.java | 40 ++
.../action/taxon/TaxonPreloadAction.java | 121 ++++++
.../action/taxon/TaxonPreloadArgument.java | 26 ++
.../TaxonRelationActionArgument.java | 29 ++
.../taxonrelation/TaxonRelationAddAction.java | 127 ++++++
.../TaxonRelationAddArgument.java | 34 ++
.../TaxonRelationDeleteAction.java | 59 +++
.../TaxonRelationEditAction.java | 101 +++++
.../TaxonRelationEditArgument.java | 32 ++
.../TaxonRelationEnableAction.java | 60 +++
.../TaxonRelationFindAction.java | 64 +++
.../TaxonRelationListAction.java | 150 +++++++
.../TaxonRelationListArgument.java | 33 ++
.../TaxonRelationPreloadAction.java | 109 ++++++
.../TaxonRelationPreloadArgument.java | 26 ++
.../endpoint/rest/AbstractTaxaRest.java | 262 +++++++++++++
.../rest/AbstractTaxonRelationRest.java | 214 ++++++++++
.../endpoint/rest/AbstractTaxonRest.java | 251 ++++++++++++
.../mod/taxonomy/endpoint/rest/TaxaRest.java | 24 ++
.../endpoint/rest/TaxonRelationRest.java | 24 ++
.../mod/taxonomy/endpoint/rest/TaxonRest.java | 24 ++
.../mod/taxonomy/store/TaxonomyEntities.java | 105 +++++
.../iqr/mod/taxonomy/store/taxa/TaxaData.java | 48 +++
.../mod/taxonomy/store/taxa/TaxaEntity.java | 158 ++++++++
.../mod/taxonomy/store/taxa/TaxaFields.java | 159 ++++++++
.../taxonomy/store/taxa/TaxaMapBuilder.java | 93 +++++
.../taxonomy/store/taxa/TaxaRepository.java | 18 +
.../mod/taxonomy/store/taxa/TaxaStore.java | 35 ++
.../mod/taxonomy/store/taxon/TaxonData.java | 34 ++
.../mod/taxonomy/store/taxon/TaxonEntity.java | 305 +++++++++++++++
.../store/taxon/TaxonFieldSchema.java | 18 +
.../mod/taxonomy/store/taxon/TaxonFields.java | 199 ++++++++++
.../taxonomy/store/taxon/TaxonMapBuilder.java | 230 +++++++++++
.../taxonomy/store/taxon/TaxonRepository.java | 54 +++
.../mod/taxonomy/store/taxon/TaxonStore.java | 133 +++++++
.../taxonrelation/TaxonRelationData.java | 48 +++
.../taxonrelation/TaxonRelationEntity.java | 138 +++++++
.../taxonrelation/TaxonRelationFields.java | 155 ++++++++
.../TaxonRelationMapBuilder.java | 229 +++++++++++
.../TaxonRelationRepository.java | 18 +
.../taxonrelation/TaxonRelationStore.java | 35 ++
src/main/resources/application.properties | 84 ++++
521 files changed, 41292 insertions(+)
create mode 100644 .gitignore
create mode 100644 README.md
create mode 100644 nbactions.xml
create mode 100644 pom.xml
create mode 100644 src/main/java/io/kumare/iqr/IqrApplication.java
create mode 100644 src/main/java/io/kumare/iqr/app/App.java
create mode 100644 src/main/java/io/kumare/iqr/app/AppConstants.java
create mode 100644 src/main/java/io/kumare/iqr/app/AppContext.java
create mode 100644 src/main/java/io/kumare/iqr/app/AppEngine.java
create mode 100644 src/main/java/io/kumare/iqr/app/AppErrors.java
create mode 100644 src/main/java/io/kumare/iqr/app/AppException.java
create mode 100644 src/main/java/io/kumare/iqr/app/action/AppAction.java
create mode 100644 src/main/java/io/kumare/iqr/app/action/AppActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/app/action/AppActionError.java
create mode 100644 src/main/java/io/kumare/iqr/app/action/AppActionManager.java
create mode 100644 src/main/java/io/kumare/iqr/app/action/AppActionResult.java
create mode 100644 src/main/java/io/kumare/iqr/app/action/AppEntityActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/app/action/AppEntityActionResult.java
create mode 100644 src/main/java/io/kumare/iqr/app/action/AppListActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/app/adapter/AppAdapters.java
create mode 100644 src/main/java/io/kumare/iqr/app/endpoint/AppTransports.java
create mode 100644 src/main/java/io/kumare/iqr/app/endpoint/rest/AppEndpointRest.java
create mode 100644 src/main/java/io/kumare/iqr/app/endpoint/rest/AppOpenAPIConfiguration.java
create mode 100644 src/main/java/io/kumare/iqr/app/endpoint/rest/WebSecurityConfig.java
create mode 100644 src/main/java/io/kumare/iqr/app/module/AppModuleController.java
create mode 100644 src/main/java/io/kumare/iqr/app/module/AppModules.java
create mode 100644 src/main/java/io/kumare/iqr/app/security/AppPermissionManager.java
create mode 100644 src/main/java/io/kumare/iqr/app/security/AppSecurityContext.java
create mode 100644 src/main/java/io/kumare/iqr/app/security/AppSecurityScopes.java
create mode 100644 src/main/java/io/kumare/iqr/app/store/AppEntity.java
create mode 100644 src/main/java/io/kumare/iqr/app/store/AppEntityRepository.java
create mode 100644 src/main/java/io/kumare/iqr/app/store/AppEntityStore.java
create mode 100644 src/main/java/io/kumare/iqr/app/store/AppExtendedEntity.java
create mode 100644 src/main/java/io/kumare/iqr/app/store/AppExtendedEntityData.java
create mode 100644 src/main/java/io/kumare/iqr/app/store/AppJacksonConfiguration.java
create mode 100644 src/main/java/io/kumare/iqr/app/store/AppKeyEntityRepository.java
create mode 100644 src/main/java/io/kumare/iqr/app/store/AppKeyEntityStore.java
create mode 100644 src/main/java/io/kumare/iqr/app/util/AppUtil.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/AuthenticationConstants.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/AuthenticationController.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/AuthenticationErrors.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/AuthenticationModule.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/AuthenticationPermissions.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/endpoint/rest/AbstractAuthUserRelationRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/endpoint/rest/AbstractAuthUserRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/endpoint/rest/AuthUserRelationRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/endpoint/rest/AuthUserRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/store/AuthenticationEntities.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/BizConstants.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/BizController.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/BizErrors.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/BizModule.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/BizPermissions.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImagePreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImagePreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfilePreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfilePreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessworker/BusinessWorkerActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessworker/BusinessWorkerAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessworker/BusinessWorkerAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessworker/BusinessWorkerDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessworker/BusinessWorkerEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessworker/BusinessWorkerEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessworker/BusinessWorkerEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessworker/BusinessWorkerFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessworker/BusinessWorkerListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessworker/BusinessWorkerListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessworker/BusinessWorkerPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/action/businessworker/BusinessWorkerPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/endpoint/rest/AbstractBusinessImageRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/endpoint/rest/AbstractBusinessProfileRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/endpoint/rest/AbstractBusinessPromoItemRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/endpoint/rest/AbstractBusinessPromoRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/endpoint/rest/AbstractBusinessRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/endpoint/rest/AbstractBusinessSettingRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/endpoint/rest/AbstractBusinessTagRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/endpoint/rest/AbstractBusinessWorkerRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/endpoint/rest/BizTaxonomyRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/endpoint/rest/BusinessImageRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/endpoint/rest/BusinessProfileRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/endpoint/rest/BusinessPromoItemRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/endpoint/rest/BusinessPromoRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/endpoint/rest/BusinessRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/endpoint/rest/BusinessSettingRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/endpoint/rest/BusinessTagRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/endpoint/rest/BusinessWorkerRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/BizEntities.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/BizTaxonomies.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/BizWorkerRoles.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/business/BusinessData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/business/BusinessEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/business/BusinessFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/business/BusinessMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/business/BusinessRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/business/BusinessStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businessimage/BusinessImageData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businessimage/BusinessImageEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businessimage/BusinessImageFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businessimage/BusinessImageMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businessimage/BusinessImageRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businessimage/BusinessImageStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businessprofile/BusinessProfileData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businessprofile/BusinessProfileEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businessprofile/BusinessProfileFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businessprofile/BusinessProfileMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businessprofile/BusinessProfileRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businessprofile/BusinessProfileStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesspromo/BusinessPromoData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesspromo/BusinessPromoEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesspromo/BusinessPromoFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesspromo/BusinessPromoMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesspromo/BusinessPromoRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesspromo/BusinessPromoStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesspromoitem/BusinessPromoItemData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesspromoitem/BusinessPromoItemEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesspromoitem/BusinessPromoItemFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesspromoitem/BusinessPromoItemMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesspromoitem/BusinessPromoItemRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesspromoitem/BusinessPromoItemStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesssetting/BusinessSettingData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesssetting/BusinessSettingEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesssetting/BusinessSettingFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesssetting/BusinessSettingMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesssetting/BusinessSettingRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesssetting/BusinessSettingStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesstag/BusinessTagData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesstag/BusinessTagEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesstag/BusinessTagFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesstag/BusinessTagMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesstag/BusinessTagRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businesstag/BusinessTagStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businessworker/BusinessWorkerData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businessworker/BusinessWorkerEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businessworker/BusinessWorkerFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businessworker/BusinessWorkerMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businessworker/BusinessWorkerRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/biz/store/businessworker/BusinessWorkerStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/ClienteleConstants.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/ClienteleController.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/ClienteleErrors.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/ClienteleModule.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/ClientelePermissions.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/ClientActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/ClientAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/ClientAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/ClientDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/ClientEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/ClientEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/ClientEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/ClientFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/ClientListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/ClientListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/ClientPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/ClientPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/GvTime.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/PunchType.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/VismaAddPunchAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/VismaAddPunchArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/VismaAddPunchMultipleAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/VismaAddPunchMultipleArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/VismaDeletePunchAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/VismaDeletePunchArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/VismaEmployeeListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/VismaPunchListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/VismaPunchListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/client/VismaPunchListPageAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/clientrelation/ClientRelationActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/clientrelation/ClientRelationAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/clientrelation/ClientRelationAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/clientrelation/ClientRelationDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/clientrelation/ClientRelationEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/clientrelation/ClientRelationEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/clientrelation/ClientRelationEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/clientrelation/ClientRelationFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/clientrelation/ClientRelationListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/clientrelation/ClientRelationListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/clientrelation/ClientRelationPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/action/clientrelation/ClientRelationPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/endpoint/rest/AbstractClientRelationRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/endpoint/rest/AbstractClientRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/endpoint/rest/ClientRelationRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/endpoint/rest/ClientRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/endpoint/rest/ClienteleTaxonomyRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/store/ClienteleEntities.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/store/ClienteleTaxonomies.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/store/client/ClientData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/store/client/ClientEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/store/client/ClientFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/store/client/ClientMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/store/client/ClientRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/store/client/ClientStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/store/clientrelation/ClientRelationData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/store/clientrelation/ClientRelationEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/store/clientrelation/ClientRelationFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/store/clientrelation/ClientRelationMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/store/clientrelation/ClientRelationRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/clientele/store/clientrelation/ClientRelationStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/LoyaltyConstants.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/LoyaltyController.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/LoyaltyErrors.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/LoyaltyModule.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/LoyaltyPermissions.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscription/SubscriptionActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscription/SubscriptionAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscription/SubscriptionAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscription/SubscriptionDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscription/SubscriptionEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscription/SubscriptionEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscription/SubscriptionEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscription/SubscriptionFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscription/SubscriptionListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscription/SubscriptionListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscription/SubscriptionPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscription/SubscriptionPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontx/SubscriptionTxActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontx/SubscriptionTxAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontx/SubscriptionTxAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontx/SubscriptionTxDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontx/SubscriptionTxEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontx/SubscriptionTxEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontx/SubscriptionTxEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontx/SubscriptionTxFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontx/SubscriptionTxListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontx/SubscriptionTxListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontx/SubscriptionTxPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontx/SubscriptionTxPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontxtag/SubscriptionTxTagActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontxtag/SubscriptionTxTagAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontxtag/SubscriptionTxTagAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontxtag/SubscriptionTxTagDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontxtag/SubscriptionTxTagEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontxtag/SubscriptionTxTagEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontxtag/SubscriptionTxTagEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontxtag/SubscriptionTxTagFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontxtag/SubscriptionTxTagListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontxtag/SubscriptionTxTagListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontxtag/SubscriptionTxTagPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/action/subscriptiontxtag/SubscriptionTxTagPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/endpoint/rest/AbstractSubscriptionRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/endpoint/rest/AbstractSubscriptionTxRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/endpoint/rest/AbstractSubscriptionTxTagRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/endpoint/rest/LoyaltyTaxonomyRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/endpoint/rest/SubscriptionRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/endpoint/rest/SubscriptionTxRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/endpoint/rest/SubscriptionTxTagRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/LoyaltyEntities.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/LoyaltyTaxonomies.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/subscription/SubscriptionData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/subscription/SubscriptionEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/subscription/SubscriptionFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/subscription/SubscriptionMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/subscription/SubscriptionRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/subscription/SubscriptionStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/subscriptiontx/SubscriptionTxData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/subscriptiontx/SubscriptionTxEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/subscriptiontx/SubscriptionTxFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/subscriptiontx/SubscriptionTxMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/subscriptiontx/SubscriptionTxRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/subscriptiontx/SubscriptionTxStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/subscriptiontxtag/SubscriptionTxTagData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/subscriptiontxtag/SubscriptionTxTagEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/subscriptiontxtag/SubscriptionTxTagFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/subscriptiontxtag/SubscriptionTxTagMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/subscriptiontxtag/SubscriptionTxTagRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/loyalty/store/subscriptiontxtag/SubscriptionTxTagStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/PocketConstants.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/PocketController.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/PocketErrors.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/PocketModule.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/PocketPermissions.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/wallet/WalletActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/wallet/WalletAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/wallet/WalletAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/wallet/WalletDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/wallet/WalletEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/wallet/WalletEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/wallet/WalletEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/wallet/WalletFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/wallet/WalletListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/wallet/WalletListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/wallet/WalletPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/wallet/WalletPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletmovement/WalletMovementActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletmovement/WalletMovementAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletmovement/WalletMovementAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletmovement/WalletMovementDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletmovement/WalletMovementEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletmovement/WalletMovementEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletmovement/WalletMovementEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletmovement/WalletMovementFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletmovement/WalletMovementListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletmovement/WalletMovementListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletmovement/WalletMovementPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletmovement/WalletMovementPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletslot/WalletSlotActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletslot/WalletSlotAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletslot/WalletSlotAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletslot/WalletSlotDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletslot/WalletSlotEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletslot/WalletSlotEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletslot/WalletSlotEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletslot/WalletSlotFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletslot/WalletSlotListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletslot/WalletSlotListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletslot/WalletSlotPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/action/walletslot/WalletSlotPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/endpoint/rest/AbstractWalletMovementRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/endpoint/rest/AbstractWalletRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/endpoint/rest/AbstractWalletSlotRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/endpoint/rest/PocketTaxonomyRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/endpoint/rest/WalletMovementRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/endpoint/rest/WalletRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/endpoint/rest/WalletSlotRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/PocketEntities.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/PocketTaxonomies.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/wallet/WalletData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/wallet/WalletEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/wallet/WalletFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/wallet/WalletMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/wallet/WalletRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/wallet/WalletStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/walletmovement/WalletMovementData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/walletmovement/WalletMovementEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/walletmovement/WalletMovementFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/walletmovement/WalletMovementMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/walletmovement/WalletMovementRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/walletmovement/WalletMovementStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/walletslot/WalletSlotData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/walletslot/WalletSlotEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/walletslot/WalletSlotFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/walletslot/WalletSlotMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/walletslot/WalletSlotRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/pocket/store/walletslot/WalletSlotStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/TaxonomyConstants.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/TaxonomyController.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/TaxonomyErrors.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/TaxonomyModule.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/TaxonomyPermissions.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxa/TaxaActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxa/TaxaAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxa/TaxaAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxa/TaxaDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxa/TaxaEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxa/TaxaEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxa/TaxaEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxa/TaxaExportAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxa/TaxaFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxa/TaxaImportAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxa/TaxaImportArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxa/TaxaListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxa/TaxaListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxa/TaxaPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxa/TaxaPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxon/TaxonActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxon/TaxonActionUtils.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxon/TaxonAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxon/TaxonAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxon/TaxonDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxon/TaxonEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxon/TaxonEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxon/TaxonEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxon/TaxonFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxon/TaxonListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxon/TaxonListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxon/TaxonPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxon/TaxonPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxonrelation/TaxonRelationActionArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxonrelation/TaxonRelationAddAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxonrelation/TaxonRelationAddArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxonrelation/TaxonRelationDeleteAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxonrelation/TaxonRelationEditAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxonrelation/TaxonRelationEditArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxonrelation/TaxonRelationEnableAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxonrelation/TaxonRelationFindAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxonrelation/TaxonRelationListAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxonrelation/TaxonRelationListArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxonrelation/TaxonRelationPreloadAction.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/action/taxonrelation/TaxonRelationPreloadArgument.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/endpoint/rest/AbstractTaxaRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/endpoint/rest/AbstractTaxonRelationRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/endpoint/rest/AbstractTaxonRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/endpoint/rest/TaxaRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/endpoint/rest/TaxonRelationRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/endpoint/rest/TaxonRest.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/TaxonomyEntities.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxa/TaxaData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxa/TaxaEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxa/TaxaFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxa/TaxaMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxa/TaxaRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxa/TaxaStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxon/TaxonData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxon/TaxonEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxon/TaxonFieldSchema.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxon/TaxonFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxon/TaxonMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxon/TaxonRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxon/TaxonStore.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxonrelation/TaxonRelationData.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxonrelation/TaxonRelationEntity.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxonrelation/TaxonRelationFields.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxonrelation/TaxonRelationMapBuilder.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxonrelation/TaxonRelationRepository.java
create mode 100644 src/main/java/io/kumare/iqr/mod/taxonomy/store/taxonrelation/TaxonRelationStore.java
create mode 100644 src/main/resources/application.properties
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ae21355
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,36 @@
+# ---> Maven
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+# https://github.com/takari/maven-wrapper#usage-without-binary-jar
+.mvn/wrapper/maven-wrapper.jar
+
+# Eclipse m2e generated files
+# Eclipse Core
+.project
+# JDT-specific (Eclipse Java Development Tools)
+.classpath
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+# ---> NetBeans
+**/nbproject/private/
+**/nbproject/Makefile-*.mk
+**/nbproject/Package-*.bash
+nb-configuration.xml
+
+build/
+nbbuild/
+dist/
+nbdist/
+.nb-gradle/
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..7e3163e
--- /dev/null
+++ b/README.md
@@ -0,0 +1,2 @@
+# iqr-server-gen
+
diff --git a/nbactions.xml b/nbactions.xml
new file mode 100644
index 0000000..9d6937c
--- /dev/null
+++ b/nbactions.xml
@@ -0,0 +1,55 @@
+
+
+
+ run
+
+ jar
+
+
+ process-classes
+ org.codehaus.mojo:exec-maven-plugin:3.1.0:exec
+
+
+
+ ${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs}
+
+ io.kumare.iqr.IqrApplication
+ java
+
+
+
+ debug
+
+ jar
+
+
+ process-classes
+ org.codehaus.mojo:exec-maven-plugin:3.1.0:exec
+
+
+ -agentlib:jdwp=transport=dt_socket,server=n,address=${jpda.address}
+ ${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs}
+
+ io.kumare.iqr.IqrApplication
+ java
+ true
+
+
+
+ profile
+
+ jar
+
+
+ process-classes
+ org.codehaus.mojo:exec-maven-plugin:3.1.0:exec
+
+
+
+ ${exec.vmArgs} -classpath %classpath ${exec.mainClass} ${exec.appArgs}
+ io.kumare.iqr.IqrApplication
+ java
+
+
+
+
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..2fe6ae4
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,161 @@
+
+
+ 4.0.0
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 3.5.0
+
+
+
+
+ io.kumare.time
+ time-server
+ 0.0.1-SNAPSHOT
+ Kumare Time Server
+ time
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 22
+
+
+
+
+
+
+ io.kumare
+ kumare-base-server-spring
+ 0.0.1-SNAPSHOT
+
+
+
+ io.kumare
+ kumare-adapter-spring-oauthlib
+ 0.0.1-SNAPSHOT
+
+
+
+ io.kumare
+ kumare-adapter-spring-visma-time
+ 0.0.1-SNAPSHOT
+
+
+
+ com.fasterxml.jackson.datatype
+ jackson-datatype-hibernate6
+
+
+
+
+ org.springframework.security
+ spring-security-core
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+
+
+ org.postgresql
+ postgresql
+ runtime
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-security
+
+
+
+ org.springframework.boot
+ spring-boot-starter-oauth2-client
+
+
+ org.springframework.boot
+ spring-boot-starter-oauth2-resource-server
+
+
+
+
+ com.google.code.gson
+ gson
+
+
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+ 2.8.13
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ runtime
+ true
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
+
+
diff --git a/src/main/java/io/kumare/iqr/IqrApplication.java b/src/main/java/io/kumare/iqr/IqrApplication.java
new file mode 100644
index 0000000..92b8e32
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/IqrApplication.java
@@ -0,0 +1,32 @@
+/*
+ *
+ */
+package io.kumare.iqr;
+
+// spring
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.data.web.config.EnableSpringDataWebSupport;
+// app
+import io.kumare.iqr.app.App;
+
+/**
+ *
+ * @author afatecha
+ */
+@SpringBootApplication(scanBasePackages = {"io.kumare"})
+@EnableSpringDataWebSupport(pageSerializationMode = EnableSpringDataWebSupport.PageSerializationMode.VIA_DTO)
+public class IqrApplication {
+
+ // ::: cons
+ //
+ public static void main(String[] args) {
+
+ var innerContext = SpringApplication.run(IqrApplication.class, args);
+
+ // app
+ App.getEngine().getBase().setInnerContext(innerContext);
+ App.init();
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/App.java b/src/main/java/io/kumare/iqr/app/App.java
new file mode 100644
index 0000000..da0e6fa
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/App.java
@@ -0,0 +1,48 @@
+/*
+ *
+ */
+package io.kumare.iqr.app;
+
+// base
+import io.kumare.lib.app.api.module.ServiceModuleController;
+// app
+import io.kumare.iqr.app.adapter.AppAdapters;
+import io.kumare.iqr.app.module.AppModules;
+
+/**
+ *
+ * @author afatecha
+ */
+public class App {
+
+ // ::: constants
+ //
+ private static final AppModules modules = new AppModules();
+ private static final AppAdapters adapters = new AppAdapters();
+ //
+ private static boolean initialized = false;
+
+ public static void init() {
+ if (!initialized) {
+ modules.init();
+ //adapters.init();
+ initialized = true;
+ }
+ }
+
+ public static AppEngine getEngine() {
+ return AppEngine.getEngine();
+ }
+
+ public static AppModules getModules() {
+ return modules;
+ }
+
+ public static AppAdapters getAdapters() {
+ return adapters;
+ }
+
+ public static ServiceModuleController getController(String name) {
+ return getModules().getController(name);
+ }
+}
diff --git a/src/main/java/io/kumare/iqr/app/AppConstants.java b/src/main/java/io/kumare/iqr/app/AppConstants.java
new file mode 100644
index 0000000..b20c284
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/AppConstants.java
@@ -0,0 +1,21 @@
+/*
+ *
+ */
+package io.kumare.iqr.app;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AppConstants {
+
+ // ::: modules
+ //
+ public static final int AUTHENTICATION_CODE = 1;
+ public static final int TAXONOMY_CODE = 2;
+ public static final int POCKET_CODE = 3;
+ public static final int BIZ_CODE = 4;
+ public static final int CLIENTELE_CODE = 5;
+ public static final int LOYALTY_CODE = 6;
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/AppContext.java b/src/main/java/io/kumare/iqr/app/AppContext.java
new file mode 100644
index 0000000..1326de5
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/AppContext.java
@@ -0,0 +1,77 @@
+/*
+ *
+ */
+package io.kumare.iqr.app;
+
+// base
+import io.kumare.lib.app.api.module.ServiceModuleController;
+import io.kumare.lib.app.api.security.PermissionReference;
+import io.kumare.lib.base.server.spring.BaseContext;
+// app
+import io.kumare.iqr.app.adapter.AppAdapters;
+import io.kumare.iqr.app.module.AppModules;
+import io.kumare.iqr.app.security.AppSecurityContext;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AppContext extends BaseContext {
+
+ // ::: cons
+ //
+ private final AppSecurityContext security = new AppSecurityContext(this);
+
+ // ::: vars
+ //
+
+ // ::: fields
+ //
+ @Override
+ public AppEngine getEngine() {
+ return AppEngine.getEngine();
+ }
+
+ // ::: adapters
+ //
+ @Override
+ public AppAdapters getAdapters() {
+ return App.getAdapters();
+ }
+
+ // ::: modules
+ //
+ @Override
+ public AppModules getModules() {
+ return App.getModules();
+ }
+
+ @Override
+ public ServiceModuleController getController(String name) {
+ return App.getController(name);
+ }
+
+ // ::: security
+ //
+ @Override
+ public AppSecurityContext getSecurity() {
+ return security;
+ }
+
+ @Override
+ public void ensureAuthorization(PermissionReference ref) {
+ /*
+ var attached = isAttached("authorized");
+ if(attached && (Boolean) get("authorized")) {
+ return;
+ }
+
+ var controller = AppModules.auth.getController();
+ var allowed = controller.isAllowed(this, ref);
+ V.ifFalse(allowed, ref.getError());
+ attach("authorized", true);*/
+ }
+
+}
+
+
diff --git a/src/main/java/io/kumare/iqr/app/AppEngine.java b/src/main/java/io/kumare/iqr/app/AppEngine.java
new file mode 100644
index 0000000..65d0f13
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/AppEngine.java
@@ -0,0 +1,64 @@
+/*
+ *
+ */
+package io.kumare.iqr.app;
+
+// base
+import io.kumare.lib.app.api.Engine;
+import io.kumare.lib.base.server.spring.BaseEngine;
+import org.springframework.context.ConfigurableApplicationContext;
+// app
+import io.kumare.iqr.app.action.AppActionManager;
+import io.kumare.iqr.app.security.AppPermissionManager;
+
+/**
+ * wrapper of BaseEngine
+ *
+ * @author afatecha
+ */
+public class AppEngine implements Engine {
+
+ // cons
+ //
+ private static final AppEngine engine = new AppEngine();
+
+ // ::: constructors
+ //
+ private AppEngine() {
+ }
+
+ // ::: api
+ //
+ public static AppEngine getEngine() {
+ return engine;
+ }
+
+ // ::: api
+ //
+ @Override
+ public BaseEngine getBase() {
+ return BaseEngine.getEngine();
+ }
+
+ @Override
+ public ConfigurableApplicationContext getInnerContext() {
+ return (ConfigurableApplicationContext) getBase().getInnerContext();
+ }
+
+ @Override
+ public AppContext newContext() {
+ return new AppContext();
+ }
+
+ @Override
+ public AppActionManager getActionManager() {
+ return new AppActionManager();
+ }
+
+ @Override
+ public AppPermissionManager getPermissionManager() {
+ return new AppPermissionManager();
+ }
+}
+
+
diff --git a/src/main/java/io/kumare/iqr/app/AppErrors.java b/src/main/java/io/kumare/iqr/app/AppErrors.java
new file mode 100644
index 0000000..af8a423
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/AppErrors.java
@@ -0,0 +1,69 @@
+/*
+ *
+ */
+package io.kumare.iqr.app;
+
+// java
+import java.util.Map;
+import java.util.HashMap;
+// lib
+import io.kumare.lib.transport.TransportCode;
+import static io.kumare.lib.transport.Transports.code;
+import io.kumare.lib.v.ExceptionPrototype;
+// app
+import io.kumare.iqr.app.endpoint.AppTransports;
+
+/**
+ *
+ * @author afatecha
+ */
+public enum AppErrors implements ExceptionPrototype {
+
+ action_arg_notfound(1, code(AppTransports.http, 500)),
+ action_unauthorized(2, code(AppTransports.http, 500));
+
+ // ::: vars
+ //
+ private final Map transportCodes = new HashMap();
+ private final int code;
+
+ // ::: constructors
+ //
+ AppErrors(int code, TransportCode... codes) {
+ this.code = code;
+ if (codes != null) {
+ for (var i : codes) {
+ if (i != null) {
+ transportCodes.put(i.getId(), i.getCode());
+ }
+ }
+ }
+ }
+
+ // ::: prototype api
+ //
+ @Override
+ public int getCode() {
+ return code;
+ }
+
+ @Override
+ public String getName() {
+ return name();
+ }
+
+ @Override
+ public Map getTransportCodes() {
+ return transportCodes;
+ }
+
+ @Override
+ public RuntimeException newInstance(String msg, Throwable cause, Map extra) {
+ var ex = new AppException(this, msg, cause);
+ ex.setExtra(extra);
+ return ex;
+ }
+
+}
+
+
diff --git a/src/main/java/io/kumare/iqr/app/AppException.java b/src/main/java/io/kumare/iqr/app/AppException.java
new file mode 100644
index 0000000..6d11aca
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/AppException.java
@@ -0,0 +1,132 @@
+/*
+ *
+ */
+package io.kumare.iqr.app;
+
+// java
+import java.util.HashMap;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.ExceptionInterface;
+import io.kumare.lib.v.ExceptionPrototype;
+// app
+import io.kumare.iqr.app.endpoint.AppTransports;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AppException extends RuntimeException implements ExceptionInterface {
+
+ // ::: vars
+ //
+ private int code = 1;
+ private String name = "unknown";
+ private final Map transportCodes = new HashMap<>();
+ private Map extra;
+
+ // ::: constructors
+ //
+ public AppException() {
+ }
+
+ public AppException(Throwable cause) {
+ this(null, null, cause);
+ }
+
+ public AppException(ExceptionPrototype proto, String msg) {
+ this(proto, msg, null);
+ }
+
+ public AppException(ExceptionPrototype proto, String msg, Throwable cause) {
+ super(msg);
+
+ if (proto != null) {
+ this.code = proto.getCode();
+ this.name = proto.getName();
+ this.addTransportCodes(proto.getTransportCodes());
+ }
+
+ if (cause != null) {
+ initCause(cause);
+ }
+ }
+
+ public AppException(int code, String name) {
+ this(code, name, null);
+ }
+
+ public AppException(int code, String name, String msg) {
+ this(code, name, msg, null);
+ }
+
+ public AppException(int code, String name, String msg, Throwable cause) {
+ super(msg);
+
+ if (code > 0) {
+ this.code = code;
+ }
+
+ if (name != null) {
+ this.name = name;
+ }
+
+ if (cause != null) {
+ initCause(cause);
+ }
+
+ }
+
+ // ::: fields
+ //
+ @Override
+ public int getCode() {
+ return code;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public Object getTransportCode(String transportName) {
+ return getTransportCode(AppTransports.valueOf(transportName));
+ }
+
+ @Override
+ public Object getTransportCode(Enum transportId) {
+ return getTransportCode(AppTransports.valueOf(transportId.name()));
+ }
+
+ public Object getTransportCode(AppTransports transportId) {
+ return transportCodes.get(transportId);
+ }
+
+ public void setTransportCode(AppTransports transportId, Object code) {
+ transportCodes.put(transportId, code);
+ }
+
+ @Override
+ public Map getTransportCodes() {
+ return transportCodes;
+ }
+
+ public final void addTransportCodes(Map map) {
+ if (map != null) {
+ this.transportCodes.putAll(map);
+ }
+ }
+
+ @Override
+ public Map getExtra() {
+ return extra;
+ }
+
+ public void setExtra(Map extra) {
+ this.extra = extra;
+ }
+
+}
+
+
diff --git a/src/main/java/io/kumare/iqr/app/action/AppAction.java b/src/main/java/io/kumare/iqr/app/action/AppAction.java
new file mode 100644
index 0000000..5fac80d
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/action/AppAction.java
@@ -0,0 +1,36 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.action;
+
+// base
+import io.kumare.lib.base.server.spring.action.BaseAction;
+// app
+import io.kumare.iqr.app.AppContext;
+
+/**
+ *
+ * @author afatecha
+ * @param
+ * @param
+ */
+public abstract class AppAction extends BaseAction {
+
+
+ // ::: cons
+ //
+
+ // ::: vars
+ //
+
+ // ::: fields
+ //
+
+
+
+ // ::: api
+ //
+
+ // ::: internals
+ //
+}
diff --git a/src/main/java/io/kumare/iqr/app/action/AppActionArgument.java b/src/main/java/io/kumare/iqr/app/action/AppActionArgument.java
new file mode 100644
index 0000000..b18fe01
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/action/AppActionArgument.java
@@ -0,0 +1,40 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.action;
+
+// java
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AppActionArgument implements Serializable {
+
+
+ // ::: vars
+ //
+ private Map context;
+ private Map params;
+
+ // ::: fields
+ //
+ public Map getContext() {
+ return context;
+ }
+
+ public void setContext(Map context) {
+ this.context = context;
+ }
+
+ public Map getParams() {
+ return params;
+ }
+
+ public void setParams(Map params) {
+ this.params = params;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/action/AppActionError.java b/src/main/java/io/kumare/iqr/app/action/AppActionError.java
new file mode 100644
index 0000000..d399caf
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/action/AppActionError.java
@@ -0,0 +1,12 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.action;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AppActionError {
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/action/AppActionManager.java b/src/main/java/io/kumare/iqr/app/action/AppActionManager.java
new file mode 100644
index 0000000..1dbc343
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/action/AppActionManager.java
@@ -0,0 +1,15 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.action;
+
+// base
+import io.kumare.lib.base.server.spring.action.BaseActionManager;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AppActionManager extends BaseActionManager {
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/action/AppActionResult.java b/src/main/java/io/kumare/iqr/app/action/AppActionResult.java
new file mode 100644
index 0000000..519f0f6
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/action/AppActionResult.java
@@ -0,0 +1,15 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.action;
+
+// java
+import java.io.Serializable;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AppActionResult implements Serializable {
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/action/AppEntityActionArgument.java b/src/main/java/io/kumare/iqr/app/action/AppEntityActionArgument.java
new file mode 100644
index 0000000..7f33940
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/action/AppEntityActionArgument.java
@@ -0,0 +1,46 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.action;
+
+// base
+import io.kumare.lib.app.api.store.Entity;
+
+/**
+ *
+ * @author afatecha
+ * @param
+ */
+public class AppEntityActionArgument extends AppActionArgument {
+
+ // ::: vars
+ //
+ private E entity;
+
+ // ::: constructors
+ //
+ public AppEntityActionArgument() {
+ }
+
+ public AppEntityActionArgument(E entity) {
+ this.entity = entity;
+ }
+
+ // ::: fields
+ //
+ public E getEntity() {
+ return entity;
+ }
+
+ public void setEntity(E entity) {
+ this.entity = entity;
+ }
+
+ // ::: fluents
+ //
+ public AppEntityActionArgument entity(E entity) {
+ setEntity(entity);
+ return this;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/action/AppEntityActionResult.java b/src/main/java/io/kumare/iqr/app/action/AppEntityActionResult.java
new file mode 100644
index 0000000..fc18a1a
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/action/AppEntityActionResult.java
@@ -0,0 +1,30 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.action;
+
+// base
+import io.kumare.lib.app.api.store.Entity;
+
+/**
+ *
+ * @author afatecha
+ * @param
+ */
+public class AppEntityActionResult extends AppActionResult {
+
+ // ::: vars
+ //
+ private E entity;
+
+ // ::: fields
+ //
+ public E getEntity() {
+ return entity;
+ }
+
+ public void setEntity(E entity) {
+ this.entity = entity;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/action/AppListActionArgument.java b/src/main/java/io/kumare/iqr/app/action/AppListActionArgument.java
new file mode 100644
index 0000000..4a47b74
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/action/AppListActionArgument.java
@@ -0,0 +1,85 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.action;
+
+// base
+import io.kumare.lib.app.api.store.Entity;
+
+/**
+ *
+ * @author afatecha
+ * @param
+ */
+public class AppListActionArgument extends AppEntityActionArgument {
+
+ // ::: vars
+ //
+ private boolean wrapped = false;
+ private boolean pageable = false;
+ private int pageNumber = 0;
+ private int pageSize = 0;
+ private String sort;
+ private String query;
+
+ // ::: constructor
+ //
+ public AppListActionArgument() {
+ }
+
+ public AppListActionArgument(E entity) {
+ super(entity);
+ }
+
+ // ::: fields
+ //
+ public boolean isWrapped() {
+ return wrapped;
+ }
+
+ public void setWrapped(boolean wrapped) {
+ this.wrapped = wrapped;
+ }
+
+ public boolean isPageable() {
+ return pageable;
+ }
+
+ public void setPageable(boolean pageable) {
+ this.pageable = pageable;
+ }
+
+ public int getPageNumber() {
+ return pageNumber;
+ }
+
+ public void setPageNumber(int pageNumber) {
+ this.pageNumber = pageNumber;
+ }
+
+ public int getPageSize() {
+ return pageSize;
+ }
+
+ public void setPageSize(int pageSize) {
+ this.pageSize = pageSize;
+ }
+
+ public String getSort() {
+ return sort;
+ }
+
+ public void setSort(String sort) {
+ this.sort = sort;
+ }
+
+ public String getQuery() {
+ return query;
+ }
+
+ public void setQuery(String query) {
+ this.query = query;
+ }
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/adapter/AppAdapters.java b/src/main/java/io/kumare/iqr/app/adapter/AppAdapters.java
new file mode 100644
index 0000000..5c5ed34
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/adapter/AppAdapters.java
@@ -0,0 +1,27 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.adapter;
+
+// base
+import io.kumare.adapter.spring.vismatime.VismaTimeAdapter;
+import io.kumare.lib.base.server.spring.adapter.BaseAdapters;
+import io.kumare.oauthlib.server.app.adapter.oauth.OauthAdapter;
+// app
+
+/**
+ *
+ * @author afatecha
+ */
+public class AppAdapters extends BaseAdapters {
+
+ // ::: adapters
+ //
+ public OauthAdapter getOauth() {
+ return getContext().getBean(OauthAdapter.class);
+ }
+
+ public VismaTimeAdapter getVisma() {
+ return getContext().getBean(VismaTimeAdapter.class);
+ }
+}
diff --git a/src/main/java/io/kumare/iqr/app/endpoint/AppTransports.java b/src/main/java/io/kumare/iqr/app/endpoint/AppTransports.java
new file mode 100644
index 0000000..37dfc00
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/endpoint/AppTransports.java
@@ -0,0 +1,14 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.endpoint;
+
+/**
+ *
+ * @author afatecha
+ */
+public enum AppTransports {
+
+ http
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/endpoint/rest/AppEndpointRest.java b/src/main/java/io/kumare/iqr/app/endpoint/rest/AppEndpointRest.java
new file mode 100644
index 0000000..afa2fc0
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/endpoint/rest/AppEndpointRest.java
@@ -0,0 +1,28 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.endpoint.rest;
+
+// base
+import io.kumare.lib.app.api.action.ActionManager;
+import io.kumare.lib.base.server.spring.endpoint.rest.BaseEndpointRest;
+// app
+import io.kumare.iqr.app.AppContext;
+import io.kumare.iqr.app.AppEngine;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AppEndpointRest extends BaseEndpointRest {
+
+ @Override
+ protected ActionManager getActionManager() {
+ return AppEngine.getEngine().getActionManager();
+ }
+
+ @Override
+ protected AppContext newContext() {
+ return AppEngine.getEngine().newContext();
+ }
+}
diff --git a/src/main/java/io/kumare/iqr/app/endpoint/rest/AppOpenAPIConfiguration.java b/src/main/java/io/kumare/iqr/app/endpoint/rest/AppOpenAPIConfiguration.java
new file mode 100644
index 0000000..99c69aa
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/endpoint/rest/AppOpenAPIConfiguration.java
@@ -0,0 +1,31 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.endpoint.rest;
+
+// openapi
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Contact;
+import io.swagger.v3.oas.models.info.Info;
+// spring
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ *
+ * @author afatecha
+ */
+@Configuration
+public class AppOpenAPIConfiguration {
+
+ @Bean
+ public OpenAPI customOpenAPI() {
+ return new OpenAPI().info(
+ new Info()
+ .title("iqr")
+ .version("1.0")
+ .description("iqr project")
+ .contact(new Contact().name("Catatrepa").email("soporte@catatrepa.com"))
+ );
+ }
+}
diff --git a/src/main/java/io/kumare/iqr/app/endpoint/rest/WebSecurityConfig.java b/src/main/java/io/kumare/iqr/app/endpoint/rest/WebSecurityConfig.java
new file mode 100644
index 0000000..920b131
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/endpoint/rest/WebSecurityConfig.java
@@ -0,0 +1,122 @@
+/*
+ */
+package io.kumare.iqr.app.endpoint.rest;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.config.http.SessionCreationPolicy;
+import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+
+import java.util.Arrays;
+
+/**
+ * @author aservin
+ */
+@Configuration
+@EnableWebSecurity
+public class WebSecurityConfig {
+
+ // ::: constants
+ //
+ //private final JwtAuthConverter jwtAuthConverter;
+
+ // ::: constructors
+ //
+ /*
+ public WebSecurityConfig(JwtAuthConverter jwtAuthConverter) {
+ this.jwtAuthConverter = jwtAuthConverter;
+ }*/
+
+ // ::: beans
+ //
+ @Bean
+ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+ // REQUESTS
+ /*http.authorizeHttpRequests(authorize -> authorize
+ // Permitir acceso al login
+ .requestMatchers(HttpMethod.POST, "/account/accounts/login/**").permitAll()
+ // Agrupar rutas con las mismas reglas de autorización
+ .requestMatchers(
+ "/account/**",
+ "/actor/**",
+ "/attachment/**",
+ "/bpmflow/**",
+ "/authority/**",
+ "/bpmwork/**",
+ "/currency/**",
+ "/instrument/**",
+ "/issue/**",
+ "/management/**",
+ "/sale/**",
+ "/title/**",
+ "/workcase/**",
+ "/workgroup/**",
+ "/workflow/**"
+ ).hasAnyRole("ADMIN", "MOD")
+ // Permitir todas las rutas bajo "/procesos/" para todos los métodos
+ .requestMatchers("/procesos/**",
+ "/location/**").permitAll()
+ // Permitir acceso a Swagger y documentación API
+ .requestMatchers(HttpMethod.GET,
+ "/swagger-workflow-server.html",
+ "/swagger-ui/**",
+ "/swagger-ui.html",
+ "/v3/api-docs/**").permitAll()
+ // Requiere autenticación para el resto de las rutas
+ .anyRequest().authenticated());*/
+
+ //http
+ // .authorizeHttpRequests(authorize -> authorize.anyRequest().permitAll());
+
+
+ /*
+ // OAUTH JWT CONFIGURATION
+ http.oauth2ResourceServer(oauth2ResourceServer
+ -> oauth2ResourceServer.jwt(jwt
+ -> jwt.jwtAuthenticationConverter(jwtAuthConverter)));*/
+
+ // CORS CONFIGURATION
+ var source = new UrlBasedCorsConfigurationSource();
+ var corsConfig = new CorsConfiguration();
+ corsConfig.setAllowCredentials(true);
+ corsConfig.addAllowedOriginPattern("*"); // Permitir cualquier origen
+ corsConfig.addAllowedHeader("*");
+ corsConfig.setAllowedMethods(Arrays.asList("OPTIONS", "HEAD", "GET", "PUT", "POST", "DELETE", "PATCH"));
+ source.registerCorsConfiguration("/**", corsConfig);
+
+ http.csrf(csrf -> csrf.disable()).cors(cors -> cors.configurationSource(source));
+
+ // SESSION MANAGEMENT
+ /*
+ http.sessionManagement(sessionManagement
+ -> sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS));*/
+
+ // FINAL CONFIGURATION
+ return http.getOrBuild();
+ }
+
+ /*
+ //para prueba
+ @Bean
+ public CorsFilter corsFilter() {
+ final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+ final CorsConfiguration config = new CorsConfiguration();
+ //config.setAllowCredentials(true);
+ config.setAllowCredentials(false);
+ config.addAllowedOrigin("*");
+ config.addAllowedHeader("*");
+ config.addAllowedMethod("OPTIONS");
+ config.addAllowedMethod("HEAD");
+ config.addAllowedMethod("GET");
+ config.addAllowedMethod("PUT");
+ config.addAllowedMethod("POST");
+ config.addAllowedMethod("DELETE");
+ config.addAllowedMethod("PATCH");
+ source.registerCorsConfiguration("/**", config);
+ return new CorsFilter(source);
+ }*/
+}
diff --git a/src/main/java/io/kumare/iqr/app/module/AppModuleController.java b/src/main/java/io/kumare/iqr/app/module/AppModuleController.java
new file mode 100644
index 0000000..ed067a5
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/module/AppModuleController.java
@@ -0,0 +1,16 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.module;
+
+// base
+import io.kumare.lib.base.server.spring.module.BaseModuleController;
+
+/**
+ *
+ * @author afatecha
+ */
+public abstract class AppModuleController extends BaseModuleController {
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/module/AppModules.java b/src/main/java/io/kumare/iqr/app/module/AppModules.java
new file mode 100644
index 0000000..441ae4a
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/module/AppModules.java
@@ -0,0 +1,67 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.module;
+
+// base
+import io.kumare.lib.base.server.spring.module.BaseModules;
+// app
+import io.kumare.iqr.mod.authentication.AuthenticationModule;
+import io.kumare.iqr.mod.taxonomy.TaxonomyModule;
+import io.kumare.iqr.mod.pocket.PocketModule;
+import io.kumare.iqr.mod.biz.BizModule;
+import io.kumare.iqr.mod.clientele.ClienteleModule;
+import io.kumare.iqr.mod.loyalty.LoyaltyModule;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AppModules extends BaseModules {
+
+ // ::: constants
+ //
+ public static final AuthenticationModule authentication = new AuthenticationModule();
+ public static final TaxonomyModule taxonomy = new TaxonomyModule();
+ public static final PocketModule pocket = new PocketModule();
+ public static final BizModule biz = new BizModule();
+ public static final ClienteleModule clientele = new ClienteleModule();
+ public static final LoyaltyModule loyalty = new LoyaltyModule();
+
+ // ::: modules
+ //
+ public AuthenticationModule getAuthentication() {
+ return authentication;
+ }
+
+ public TaxonomyModule getTaxonomy() {
+ return taxonomy;
+ }
+
+ public PocketModule getPocket() {
+ return pocket;
+ }
+
+ public BizModule getBiz() {
+ return biz;
+ }
+
+ public ClienteleModule getClientele() {
+ return clientele;
+ }
+
+ public LoyaltyModule getLoyalty() {
+ return loyalty;
+ }
+
+ // ::: init
+ //
+ public void init() {
+ add(authentication);
+ add(taxonomy);
+ add(pocket);
+ add(biz);
+ add(clientele);
+ add(loyalty);
+ }
+}
diff --git a/src/main/java/io/kumare/iqr/app/security/AppPermissionManager.java b/src/main/java/io/kumare/iqr/app/security/AppPermissionManager.java
new file mode 100644
index 0000000..d8a0057
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/security/AppPermissionManager.java
@@ -0,0 +1,16 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.security;
+
+// base
+import io.kumare.lib.base.server.spring.security.BasePermissionManager;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AppPermissionManager extends BasePermissionManager {
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/security/AppSecurityContext.java b/src/main/java/io/kumare/iqr/app/security/AppSecurityContext.java
new file mode 100644
index 0000000..ca0d83b
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/security/AppSecurityContext.java
@@ -0,0 +1,23 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.security;
+
+// base
+import io.kumare.lib.base.server.spring.security.BaseSecurityContext;
+// app
+import io.kumare.iqr.app.AppContext;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AppSecurityContext extends BaseSecurityContext {
+
+ // ::: constructor
+ //
+ public AppSecurityContext(AppContext context) {
+ super(context);
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/security/AppSecurityScopes.java b/src/main/java/io/kumare/iqr/app/security/AppSecurityScopes.java
new file mode 100644
index 0000000..cb47776
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/security/AppSecurityScopes.java
@@ -0,0 +1,57 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.security;
+
+// java
+import java.util.LinkedList;
+import java.util.List;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public enum AppSecurityScopes {
+
+ system(false),
+ service(false),
+ module(false),
+ reference(true),
+ component(true);
+
+ // ::: api
+ //
+ private final boolean idRequired;
+
+ AppSecurityScopes(boolean idRequired) {
+ this.idRequired = idRequired;
+ }
+
+ public boolean isIdRequired() {
+ return idRequired;
+ }
+
+ public int level() {
+ return ordinal() + 1;
+ }
+
+ // ::: static
+ //
+ public static List scopes(String referenceId, String componentId) {
+ var list = new LinkedList();
+
+ list.add(system.name());
+ list.add(service.name());
+ list.add(module.name());
+
+ if (referenceId != null) {
+ list.add(reference.name() + "-" + referenceId);
+ }
+ if (componentId != null) {
+ list.add(component.name() + "-" + componentId);
+ }
+
+ return list;
+ }
+}
diff --git a/src/main/java/io/kumare/iqr/app/store/AppEntity.java b/src/main/java/io/kumare/iqr/app/store/AppEntity.java
new file mode 100644
index 0000000..93f44cc
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/store/AppEntity.java
@@ -0,0 +1,29 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.store;
+
+// java
+import jakarta.persistence.MappedSuperclass;
+// base
+import io.kumare.lib.base.server.spring.store.jpa.DefaultJpaEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+@MappedSuperclass
+public class AppEntity extends DefaultJpaEntity {
+
+ // ::: constructors
+ //
+ public AppEntity() {
+ super();
+ }
+
+ public AppEntity(String id) {
+ super(id);
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/app/store/AppEntityRepository.java b/src/main/java/io/kumare/iqr/app/store/AppEntityRepository.java
new file mode 100644
index 0000000..b92b676
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/store/AppEntityRepository.java
@@ -0,0 +1,21 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.store;
+
+// spring
+import org.springframework.data.repository.NoRepositoryBean;
+// base
+import io.kumare.lib.app.api.store.Entity;
+import io.kumare.lib.base.server.spring.store.jpa.BaseJpaEntityRepository;
+
+/**
+ *
+ * @author afatecha
+ * @param
+ */
+@NoRepositoryBean
+public interface AppEntityRepository extends BaseJpaEntityRepository {
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/store/AppEntityStore.java b/src/main/java/io/kumare/iqr/app/store/AppEntityStore.java
new file mode 100644
index 0000000..f71aec6
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/store/AppEntityStore.java
@@ -0,0 +1,29 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.store;
+
+// base
+import io.kumare.lib.app.api.store.Entity;
+import io.kumare.lib.base.server.spring.BaseContext;
+import io.kumare.lib.base.server.spring.store.jpa.BaseJpaEntityStore;
+// app
+import io.kumare.iqr.app.util.AppUtil;
+
+/**
+ *
+ * @author afatecha
+ * @param
+ */
+public abstract class AppEntityStore extends BaseJpaEntityStore {
+
+ // ::: api
+ //
+ @Override
+ protected String makeEntityId(E model) {
+ return model.getId() == null ? AppUtil.randomId() : model.getId().toString();
+ }
+
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/store/AppExtendedEntity.java b/src/main/java/io/kumare/iqr/app/store/AppExtendedEntity.java
new file mode 100644
index 0000000..7372be9
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/store/AppExtendedEntity.java
@@ -0,0 +1,30 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.store;
+
+// java
+import java.io.Serializable;
+import jakarta.persistence.MappedSuperclass;
+// base
+import io.kumare.lib.base.server.spring.store.jpa.DefaultExtendedJpaEntity;
+
+/**
+ *
+ * @author afatecha
+ * @param
+ */
+@MappedSuperclass
+public class AppExtendedEntity extends DefaultExtendedJpaEntity {
+
+ // ::: constructors
+ //
+ public AppExtendedEntity() {
+ super();
+ }
+
+ public AppExtendedEntity(String id) {
+ super(id);
+ }
+}
+
diff --git a/src/main/java/io/kumare/iqr/app/store/AppExtendedEntityData.java b/src/main/java/io/kumare/iqr/app/store/AppExtendedEntityData.java
new file mode 100644
index 0000000..e104613
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/store/AppExtendedEntityData.java
@@ -0,0 +1,15 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.store;
+
+// java
+import java.io.Serializable;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AppExtendedEntityData implements Serializable {
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/store/AppJacksonConfiguration.java b/src/main/java/io/kumare/iqr/app/store/AppJacksonConfiguration.java
new file mode 100644
index 0000000..b72acce
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/store/AppJacksonConfiguration.java
@@ -0,0 +1,26 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.store;
+
+// jackson
+import com.fasterxml.jackson.datatype.hibernate6.Hibernate6Module;
+// spring
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ *
+ */
+@Configuration
+public class AppJacksonConfiguration {
+
+ @Bean
+ public Hibernate6Module hibernate6Module() {
+
+ Hibernate6Module module = new Hibernate6Module();
+ module.enable(Hibernate6Module.Feature.SERIALIZE_IDENTIFIER_FOR_LAZY_NOT_LOADED_OBJECTS);
+ return module;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/store/AppKeyEntityRepository.java b/src/main/java/io/kumare/iqr/app/store/AppKeyEntityRepository.java
new file mode 100644
index 0000000..7c5063c
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/store/AppKeyEntityRepository.java
@@ -0,0 +1,21 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.store;
+
+// spring
+import org.springframework.data.repository.NoRepositoryBean;
+// base
+import io.kumare.lib.app.api.store.Entity;
+import io.kumare.lib.base.server.spring.store.jpa.BaseJpaKeyEntityRepository;
+
+/**
+ *
+ * @author afatecha
+ * @param
+ */
+@NoRepositoryBean
+public interface AppKeyEntityRepository extends BaseJpaKeyEntityRepository{
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/store/AppKeyEntityStore.java b/src/main/java/io/kumare/iqr/app/store/AppKeyEntityStore.java
new file mode 100644
index 0000000..5152c5b
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/store/AppKeyEntityStore.java
@@ -0,0 +1,29 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.store;
+
+// base
+import io.kumare.lib.app.api.store.Entity;
+import io.kumare.lib.app.api.Context;
+import io.kumare.lib.base.server.spring.store.jpa.BaseJpaKeyEntityStore;
+// app
+import io.kumare.iqr.app.util.AppUtil;
+
+/**
+ *
+ * @author afatecha
+ * @param
+ */
+public abstract class AppKeyEntityStore extends BaseJpaKeyEntityStore {
+
+ // ::: api
+ //
+ @Override
+ protected String makeEntityId(E model) {
+ return model.getId() == null ? AppUtil.randomId() : model.getId().toString();
+ }
+
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/app/util/AppUtil.java b/src/main/java/io/kumare/iqr/app/util/AppUtil.java
new file mode 100644
index 0000000..ca23931
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/app/util/AppUtil.java
@@ -0,0 +1,18 @@
+/*
+ *
+ */
+package io.kumare.iqr.app.util;
+
+import java.util.UUID;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AppUtil {
+
+ public static String randomId() {
+ return UUID.randomUUID().toString();
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/AuthenticationConstants.java b/src/main/java/io/kumare/iqr/mod/authentication/AuthenticationConstants.java
new file mode 100644
index 0000000..574e665
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/AuthenticationConstants.java
@@ -0,0 +1,20 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication;
+
+// base
+import io.kumare.iqr.app.AppConstants;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthenticationConstants {
+
+ // ::: codes
+ //
+ public static final int CODE = AppConstants.AUTHENTICATION_CODE;
+ public static final String NAME = "authentication";
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/AuthenticationController.java b/src/main/java/io/kumare/iqr/mod/authentication/AuthenticationController.java
new file mode 100644
index 0000000..8f6a2de
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/AuthenticationController.java
@@ -0,0 +1,57 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication;
+
+// java
+import io.kumare.iqr.mod.authentication.store.AuthenticationEntities;
+import java.util.Arrays;
+import java.util.List;
+// base
+import io.kumare.lib.base.server.spring.store.jpa.EntityDescriptor;
+// app
+import io.kumare.iqr.app.module.AppModuleController;
+// module
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserStore;
+import io.kumare.iqr.mod.authentication.store.authuserrelation.AuthUserRelationStore;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthenticationController extends AppModuleController {
+
+ // ::: api
+ //
+ @Override
+ public boolean hasStore(String name) {
+ return AuthenticationEntities.hasDescriptor(name);
+ }
+
+ @Override
+ public EntityDescriptor getEntityDescriptor(Class entityClass) {
+ return AuthenticationEntities.descriptorOf(entityClass);
+ }
+
+ @Override
+ public EntityDescriptor getEntityDescriptor(String name) {
+ return AuthenticationEntities.descriptorOf(name);
+ }
+
+ @Override
+ public List getEntityDescriptors() {
+ return Arrays.asList(AuthenticationEntities.values());
+ }
+
+ // ::: stores
+ //
+ public AuthUserStore getAuthUserStore() {
+ return getService(AuthUserStore.class);
+ }
+
+ public AuthUserRelationStore getAuthUserRelationStore() {
+ return getService(AuthUserRelationStore.class);
+ }
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/AuthenticationErrors.java b/src/main/java/io/kumare/iqr/mod/authentication/AuthenticationErrors.java
new file mode 100644
index 0000000..33128e6
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/AuthenticationErrors.java
@@ -0,0 +1,94 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication;
+
+// java
+import java.util.HashMap;
+import java.util.Map;
+// lib
+import io.kumare.lib.transport.TransportCode;
+import static io.kumare.lib.transport.Transports.code;
+import io.kumare.lib.v.ExceptionPrototype;
+// app
+import io.kumare.iqr.app.AppException;
+import io.kumare.iqr.app.endpoint.AppTransports;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public enum AuthenticationErrors implements ExceptionPrototype {
+
+
+ // auth user
+ authuser_notfound(1, code(AppTransports.http, 400)),
+ authuser_data_notfound(1, code(AppTransports.http, 400)),
+ authuser_preload_empty(1, code(AppTransports.http, 400)),
+ authuser_externalid_empty(1, code(AppTransports.http, 400)),
+ authuser_entitykey_empty(1, code(AppTransports.http, 400)),
+ authuser_custom_empty(1, code(AppTransports.http, 400)),
+ authuser_visible_empty(1, code(AppTransports.http, 400)),
+ authuser_email_empty(1, code(AppTransports.http, 400)),
+ authuser_emailconfirmed_empty(1, code(AppTransports.http, 400)),
+ authuser_phone_empty(1, code(AppTransports.http, 400)),
+ authuser_phoneconfirmed_empty(1, code(AppTransports.http, 400)),
+ authuser_name_empty(1, code(AppTransports.http, 400)),
+
+ // auth user relation
+ authuserrelation_notfound(1, code(AppTransports.http, 400)),
+ authuserrelation_data_notfound(1, code(AppTransports.http, 400)),
+ authuserrelation_preload_empty(1, code(AppTransports.http, 400)),
+ authuserrelation_externalid_empty(1, code(AppTransports.http, 400)),
+ authuserrelation_userkey_empty(1, code(AppTransports.http, 400)),
+ authuserrelation_typevalue_empty(1, code(AppTransports.http, 400)),
+ authuserrelation_resourcetype_empty(1, code(AppTransports.http, 400)),
+ authuserrelation_resourcekey_empty(1, code(AppTransports.http, 400)),
+ authuserrelation_resourceid_empty(1, code(AppTransports.http, 400)),
+ authuserrelation_authuser_notfound(1, code(AppTransports.http, 400));
+
+ // ::: vars
+ //
+ private final Map transportCodes = new HashMap();
+ private final int code;
+
+ // ::: constructors
+ //
+ private AuthenticationErrors(int code, TransportCode... codes) {
+ this.code = code;
+ if (codes != null) {
+ for (var i : codes) {
+ if (i != null) {
+ transportCodes.put(i.getId(), i.getCode());
+ }
+ }
+ }
+ }
+
+ // ::: prototype api
+ //
+ @Override
+ public int getCode() {
+ return code;
+ }
+
+ @Override
+ public String getName() {
+ return name();
+ }
+
+ @Override
+ public Map getTransportCodes() {
+ return transportCodes;
+ }
+
+ @Override
+ public RuntimeException newInstance(String msg, Throwable cause, Map extra) {
+ var ex = new AppException(this, msg, cause);
+ ex.setExtra(extra);
+ return ex;
+ }
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/AuthenticationModule.java b/src/main/java/io/kumare/iqr/mod/authentication/AuthenticationModule.java
new file mode 100644
index 0000000..cd00a42
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/AuthenticationModule.java
@@ -0,0 +1,37 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication;
+
+// java
+import io.kumare.lib.base.server.spring.module.BaseModule;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthenticationModule extends BaseModule {
+
+ // :::
+ //
+ public static final AuthenticationController controller = new AuthenticationController();
+
+ // ::: api
+ //
+ @Override
+ public int getId() {
+ return AuthenticationConstants.CODE;
+ }
+
+ @Override
+ public String getName() {
+ return AuthenticationConstants.NAME;
+ }
+
+ @Override
+ public AuthenticationController getController() {
+ return controller;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/AuthenticationPermissions.java b/src/main/java/io/kumare/iqr/mod/authentication/AuthenticationPermissions.java
new file mode 100644
index 0000000..950fad5
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/AuthenticationPermissions.java
@@ -0,0 +1,84 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication;
+
+// base
+import io.kumare.iqr.mod.authentication.store.AuthenticationEntities;
+import io.kumare.lib.app.api.security.PermissionReference;
+// app
+import io.kumare.iqr.app.AppErrors;
+
+/**
+ *
+ * @author afatecha
+ */
+public enum AuthenticationPermissions {
+
+ // auth user
+ //auth_user_add(AuthenticationEntities.authUser),
+ //auth_user_edit(AuthenticationEntities.authUser),
+ //auth_user_find(AuthenticationEntities.authUser),
+ //auth_user_enable(AuthenticationEntities.authUser),
+ //auth_user_disable(AuthenticationEntities.authUser),
+ //auth_user_list(AuthenticationEntities.authUser),
+ //auth_user_delete(AuthenticationEntities.authUser),
+ //auth_user_preload(AuthenticationEntities.authUser),
+ //
+ auth_user_viewer(AuthenticationEntities.authUser),
+ //auth_user_guest(AuthenticationEntities.authUser),
+ //auth_user_collab(AuthenticationEntities.authUser),
+ auth_user_worker(AuthenticationEntities.authUser),
+ //auth_user_control(AuthenticationEntities.authUser),
+ auth_user_manager(AuthenticationEntities.authUser),
+ auth_user_admin(null),
+ auth_user_system(null),
+
+ // auth user relation
+ //auth_user_relation_add(AuthenticationEntities.authUserRelation),
+ //auth_user_relation_edit(AuthenticationEntities.authUserRelation),
+ //auth_user_relation_find(AuthenticationEntities.authUserRelation),
+ //auth_user_relation_enable(AuthenticationEntities.authUserRelation),
+ //auth_user_relation_disable(AuthenticationEntities.authUserRelation),
+ //auth_user_relation_list(AuthenticationEntities.authUserRelation),
+ //auth_user_relation_delete(AuthenticationEntities.authUserRelation),
+ //auth_user_relation_preload(AuthenticationEntities.authUserRelation),
+ //
+ auth_user_relation_viewer(AuthenticationEntities.authUserRelation),
+ //auth_user_relation_guest(AuthenticationEntities.authUserRelation),
+ //auth_user_relation_collab(AuthenticationEntities.authUserRelation),
+ auth_user_relation_worker(AuthenticationEntities.authUserRelation),
+ //auth_user_relation_control(AuthenticationEntities.authUserRelation),
+ auth_user_relation_manager(AuthenticationEntities.authUserRelation),
+ auth_user_relation_admin(null),
+ auth_user_relation_system(null);
+
+
+ // :::
+ //
+ private final AuthenticationEntities resourceType;
+
+ AuthenticationPermissions(AuthenticationEntities entityRef) {
+ this.resourceType = entityRef;
+ }
+
+ //
+ public PermissionReference toReference() {
+ return toReference(null);
+ }
+
+ public PermissionReference toReference(String resourceKey) {
+ var ref = new PermissionReference()
+ .module(AuthenticationConstants.NAME)
+ .permission(name())
+ .error(AppErrors.action_unauthorized);
+
+ if (resourceType != null && resourceKey != null) {
+ ref.resourceType(resourceType.name())
+ .resourceKey(resourceKey);
+ }
+
+ return ref;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserActionArgument.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserActionArgument.java
new file mode 100644
index 0000000..960df42
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserActionArgument.java
@@ -0,0 +1,29 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuser;
+
+// base
+import io.kumare.iqr.app.action.AppEntityActionArgument;
+// entity
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserActionArgument extends AppEntityActionArgument {
+
+ // ::: constructors
+ //
+ public AuthUserActionArgument() {
+ }
+
+ public AuthUserActionArgument(AuthUserEntity entity) {
+ super(entity);
+ }
+
+ // ::: api
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserAddAction.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserAddAction.java
new file mode 100644
index 0000000..5de1a83
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserAddAction.java
@@ -0,0 +1,169 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuser;
+
+// java
+import java.util.List;
+// lib
+import io.kumare.lib.base.server.spring.action.Actions;
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.authentication.AuthenticationErrors;
+// entity
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserEntity;
+
+import io.kumare.iqr.mod.authentication.action.authuserrelation.AuthUserRelationAddAction;
+import io.kumare.iqr.mod.authentication.action.authuserrelation.AuthUserRelationAddArgument;
+import io.kumare.oauthlib.server.app.adapter.oauth.OauthAdapter;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import org.keycloak.admin.client.CreatedResponseUtil;
+import org.keycloak.representations.idm.CredentialRepresentation;
+import org.keycloak.representations.idm.UserRepresentation;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserAddAction extends AppAction> {
+
+ // ::: vars
+ //
+ private AuthUserEntity entity;
+ private UserRepresentation user;
+ private OauthAdapter oauth;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, AuthenticationErrors.authuser_notfound);
+
+ // relations
+ // fields
+ //V.ifEmpty(model.getExternalId(), AuthenticationErrors.authuser_externalid_empty);
+ //V.ifEmpty(model.getEntityKey(), AuthenticationErrors.authuser_entitykey_empty);
+ //V.ifEmpty(model.isCustom(), AuthenticationErrors.authuser_custom_empty);
+ //V.ifEmpty(model.isVisible(), AuthenticationErrors.authuser_visible_empty);
+ V.ifEmpty(model.getEmail(), AuthenticationErrors.authuser_email_empty);
+ //V.ifEmpty(model.isEmailConfirmed(), AuthenticationErrors.authuser_emailconfirmed_empty);
+ //V.ifEmpty(model.getPhone(), AuthenticationErrors.authuser_phone_empty);
+ //V.ifEmpty(model.isPhoneConfirmed(), AuthenticationErrors.authuser_phoneconfirmed_empty);
+ V.ifEmpty(model.getName(), AuthenticationErrors.authuser_name_empty);
+ }
+
+ @Override
+ protected void doAction() {
+
+ // adapters
+ //oauth = getContext().getAdapters().getOauth();
+
+ // controllers
+ //createKeycloakUser();
+ // model
+ var model = makeModel();
+
+ // add
+ entity = saveEntity(model);
+
+ // add others
+ addRelations(getArgument().getRelations());
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private AuthUserEntity makeModel() {
+ var argModel = getArgument().getEntity();
+ var model = new AuthUserEntity();
+
+ // relations
+ // fields
+ //model.setExternalId(user.getId());
+ model.setEntityKey(argModel.getEntityKey());//user.getUsername());
+ model.setCustom(argModel.isCustom());
+ model.setVisible(argModel.isVisible());
+ model.setEmail(argModel.getEmail());
+ model.setEmailConfirmed(argModel.isEmailConfirmed());
+ model.setPhone(argModel.getPhone());
+ model.setPhoneConfirmed(argModel.isPhoneConfirmed());
+ model.setName(argModel.getName());
+ model.setActive(true);
+
+ return model;
+ }
+
+ // ::: save
+ //
+ private AuthUserEntity saveEntity(AuthUserEntity model) {
+
+ var store = AppModules.authentication.getController().getAuthUserStore();
+
+ var saved = store.add(getContext(), model);
+ getContext().attach(saved.getId(), saved);
+ return saved;
+ }
+
+ // ::: add relations
+ //
+ private void addRelations(List list) {
+ if (list != null) {
+ list.forEach(i -> {
+ i.getEntity().authUser(entity);
+ Actions.perform(getContext(), new AuthUserRelationAddAction(), i);
+ });
+ }
+ }
+
+ private void createKeycloakUser() {
+ var arg = getArgument().getEntity();
+
+ user = new UserRepresentation();
+ user.setFirstName(arg.getName());
+ user.setLastName(arg.getName());
+ user.setEmail(arg.getEmail());
+ user.setEmailVerified(false);
+ user.setUsername(arg.getEmail());
+
+ var credential = new CredentialRepresentation();
+ credential.setType("password");
+ credential.setTemporary(false);
+ String password = getArgument().getPassword();
+ credential.setValue(password);
+ user.setCredentials(Collections.singletonList(credential));
+ Map> attributes = new HashMap<>();
+ attributes.put("phone", Collections.singletonList(arg.getPhone()));
+ user.setAttributes(attributes);
+
+ createUserInKeycloak();
+ }
+
+ private void createUserInKeycloak() {
+ user.setEnabled(true);
+ user.setEmailVerified(false);
+
+ var response = oauth.users().create(user);
+ String userId = CreatedResponseUtil.getCreatedId(response);
+ user = oauth.users().find(userId);
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserAddArgument.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserAddArgument.java
new file mode 100644
index 0000000..2e925ef
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserAddArgument.java
@@ -0,0 +1,52 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuser;
+
+// java
+import java.util.List;
+// app
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserEntity;
+import io.kumare.iqr.mod.authentication.action.authuserrelation.AuthUserRelationAddArgument;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserAddArgument extends AuthUserActionArgument {
+
+ // ::: vars
+ //
+ private List relations;
+ private String password;
+
+ // ::: constructors
+ //
+ public AuthUserAddArgument() {
+ }
+
+ public AuthUserAddArgument(AuthUserEntity entity) {
+ super(entity);
+ }
+
+ // ::: fields
+ //
+ public List getRelations() {
+ return relations;
+ }
+
+ public void setRelations(List list) {
+ this.relations = list;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserDeleteAction.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserDeleteAction.java
new file mode 100644
index 0000000..f24f629
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserDeleteAction.java
@@ -0,0 +1,59 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuser;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.authentication.AuthenticationErrors;
+// entity
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserDeleteAction extends AppAction> {
+
+ // ::: vars
+ //
+ private AuthUserEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), AuthenticationErrors.authuser_notfound);
+ V.ifNull(getArgument().getEntity().getId(), AuthenticationErrors.authuser_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var argModel = getArgument().getEntity();
+
+ deleteEntity(argModel);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ }
+
+ // ::: delete
+ //
+ private void deleteEntity(AuthUserEntity model) {
+
+ var store = AppModules.authentication.getController().getAuthUserStore();
+
+ store.deleteById(getContext(), model.getId());
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserEditAction.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserEditAction.java
new file mode 100644
index 0000000..d9386e5
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserEditAction.java
@@ -0,0 +1,109 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuser;
+
+// lib
+import io.kumare.lib.v.V;
+// app
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.authentication.AuthenticationErrors;
+// entity
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserEditAction extends AppAction> {
+
+ // ::: vars
+ //
+ private AuthUserEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, AuthenticationErrors.authuser_notfound);
+
+ // fields
+ V.ifEmpty(model.getExternalId(), AuthenticationErrors.authuser_externalid_empty);
+ V.ifEmpty(model.getEntityKey(), AuthenticationErrors.authuser_entitykey_empty);
+ V.ifEmpty(model.isCustom(), AuthenticationErrors.authuser_custom_empty);
+ V.ifEmpty(model.isVisible(), AuthenticationErrors.authuser_visible_empty);
+ V.ifEmpty(model.getEmail(), AuthenticationErrors.authuser_email_empty);
+ V.ifEmpty(model.isEmailConfirmed(), AuthenticationErrors.authuser_emailconfirmed_empty);
+ V.ifEmpty(model.getPhone(), AuthenticationErrors.authuser_phone_empty);
+ V.ifEmpty(model.isPhoneConfirmed(), AuthenticationErrors.authuser_phoneconfirmed_empty);
+ V.ifEmpty(model.getName(), AuthenticationErrors.authuser_name_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ // arguments
+ var argModel = getArgument().getEntity();
+
+ // controllers
+
+ var authentication = AppModules.authentication.getController();
+ var authUserStore = authentication.getAuthUserStore();
+
+ // edit
+ entity = authUserStore.ensure(getContext(), argModel, AuthenticationErrors.authuser_notfound);
+
+ editEntity();
+
+ entity = saveEntity();
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private void editEntity() {
+
+ var model = getArgument().getEntity();
+
+ // fields
+ entity.setExternalId(V.firstNotEmpty(model.getExternalId(), entity.getExternalId()));
+ entity.setEntityKey(V.firstNotEmpty(model.getEntityKey(), entity.getEntityKey()));
+ entity.setCustom(V.firstNotEmpty(model.isCustom(), entity.isCustom()));
+ entity.setVisible(V.firstNotEmpty(model.isVisible(), entity.isVisible()));
+ entity.setEmail(V.firstNotEmpty(model.getEmail(), entity.getEmail()));
+ entity.setEmailConfirmed(V.firstNotEmpty(model.isEmailConfirmed(), entity.isEmailConfirmed()));
+ entity.setPhone(V.firstNotEmpty(model.getPhone(), entity.getPhone()));
+ entity.setPhoneConfirmed(V.firstNotEmpty(model.isPhoneConfirmed(), entity.isPhoneConfirmed()));
+ entity.setName(V.firstNotEmpty(model.getName(), entity.getName()));
+
+
+ }
+
+ // ::: save
+ //
+ private AuthUserEntity saveEntity() {
+
+ var store = AppModules.authentication.getController().getAuthUserStore();
+
+ var saved = store.edit(getContext(), entity);
+ getContext().attach(saved.getId(), saved);
+ return saved;
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserEditArgument.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserEditArgument.java
new file mode 100644
index 0000000..6dbeae1
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserEditArgument.java
@@ -0,0 +1,32 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuser;
+
+// app
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserEditArgument extends AuthUserActionArgument {
+
+ // ::: vars
+ //
+
+
+ // ::: constructors
+ //
+ public AuthUserEditArgument() {
+ }
+
+ public AuthUserEditArgument(AuthUserEntity entity) {
+ super(entity);
+ }
+
+
+ // ::: fields
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserEnableAction.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserEnableAction.java
new file mode 100644
index 0000000..6e0f8de
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserEnableAction.java
@@ -0,0 +1,60 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuser;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.authentication.AuthenticationErrors;
+// entity
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserEnableAction extends AppAction {
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), AuthenticationErrors.authuser_notfound);
+ V.ifNull(getArgument().getEntity().getId(), AuthenticationErrors.authuser_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var model = getArgument().getEntity();
+
+ enableEntity(model);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ }
+
+ // ::: enable
+ //
+ private void enableEntity(AuthUserEntity model) {
+
+ var store = AppModules.authentication.getController().getAuthUserStore();
+
+ if (getArgument().getEntity().isActive()) {
+ store.enableById(getContext(), model.getId());
+ } else {
+ store.disableById(getContext(), model.getId());
+ }
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserFindAction.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserFindAction.java
new file mode 100644
index 0000000..126471c
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserFindAction.java
@@ -0,0 +1,64 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuser;
+
+// java
+import java.util.HashMap;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.authentication.AuthenticationErrors;
+// entity
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserFindAction extends AppAction {
+
+ // ::: vars
+ //
+ private AuthUserEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), AuthenticationErrors.authuser_notfound);
+ V.ifNull(getArgument().getEntity().getId(), AuthenticationErrors.authuser_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var model = getArgument().getEntity();
+ entity = findEntity(model);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new HashMap();
+ result.put("entity", entity);
+ setResult(result);
+ }
+
+ // ::: find
+ //
+ private AuthUserEntity findEntity(AuthUserEntity model) {
+
+ var store = AppModules.authentication.getController().getAuthUserStore();
+ return store.findById(getContext(), model.getId());
+ }
+
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserListAction.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserListAction.java
new file mode 100644
index 0000000..1937780
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserListAction.java
@@ -0,0 +1,148 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuser;
+
+// java
+import java.util.HashMap;
+import java.util.List;
+import java.util.LinkedList;
+import java.util.Map;
+// spring
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// entity
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserEntity;
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserMapBuilder;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserListAction extends AppAction {
+
+ // ::: vars
+ //
+ private final Map result = new HashMap();
+ private final List entities = new LinkedList<>();
+
+ // ::: public api
+ //
+ public List getEntities() {
+ return entities;
+ }
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ result.put("pageable", getArgument().isPageable());
+ result.put("wrapped", getArgument().isWrapped());
+
+ if (getArgument().isPageable()) {
+
+ var page = makePage();
+ entities.addAll(page.toList());
+
+ if (getArgument().isWrapped()) {
+ result.put("page", makeWrappedPage(page));
+ } else {
+ result.put("page", page);
+ }
+
+ } else {
+
+ var list = makeList();
+ entities.addAll(list);
+
+ if (getArgument().isWrapped()) {
+ result.put("list", makeWrappedList());
+ } else {
+ result.put("list", list);
+ }
+ }
+
+ }
+
+ @Override
+ protected void setResultOnly() {
+ setResult(result);
+ }
+
+ // ::: page
+ //
+ private Page makePage() {
+
+ var page = getArgument().getPageNumber();
+ var size = getArgument().getPageSize();
+ //var sort = getArgument().getSort();
+
+ var pageable = PageRequest.of(page, size);
+
+ var store = AppModules.authentication.getController().getAuthUserStore();
+ return store.getRepository().findAll(pageable);
+ }
+
+ // ::: wrapped page
+ //
+ private Map makeWrappedPage(Page found) {
+
+ var page = new HashMap();
+ var content = new LinkedList();
+
+ wrapList(entities, content);
+
+ page.put("size", found.getSize());
+ page.put("number", found.getNumber());
+ page.put("totalElements", found.getTotalElements());
+ page.put("totalPages", found.getTotalPages());
+ page.put("content", content);
+
+ return page;
+ }
+
+
+ // ::: list
+ //
+
+ private List makeList() {
+
+ var store = AppModules.authentication.getController().getAuthUserStore();
+
+ return store.listAll(getContext());
+ }
+
+ // ::: wrapped list
+ private List makeWrappedList() {
+ var list = new LinkedList();
+
+ wrapList(entities, list);
+
+ return list;
+ }
+
+ // ::: wrapper
+ //
+ private void wrapList(List found, List output) {
+
+ var builder = new AuthUserMapBuilder().addListGroup();
+
+
+ output.addAll(builder.build(getContext(), found));
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserListArgument.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserListArgument.java
new file mode 100644
index 0000000..31b12e5
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserListArgument.java
@@ -0,0 +1,33 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuser;
+
+// app
+import io.kumare.iqr.app.action.AppListActionArgument;
+// store
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserListArgument extends AppListActionArgument {
+
+ // ::: vars
+ //
+
+ // ::: constructors
+ //
+ public AuthUserListArgument() {
+ }
+
+ public AuthUserListArgument(AuthUserEntity entity) {
+ super(entity);
+ }
+
+
+ // ::: fields
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserPreloadAction.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserPreloadAction.java
new file mode 100644
index 0000000..0fcd2ba
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserPreloadAction.java
@@ -0,0 +1,101 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuser;
+
+// java
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.authentication.AuthenticationErrors;
+// entity
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserEntity;
+// relations
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserPreloadAction extends AppAction {
+
+ // ::: vars
+ //
+ private final Map result = new HashMap();
+ private Map params = new HashMap<>();
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifEmpty(getArgument().getAction(), AuthenticationErrors.authuser_preload_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ if(getArgument().getParams() != null) {
+ params = getArgument().getParams();
+ }
+
+ switch (getArgument().getAction()) {
+ case "find" ->
+ prepareFind();
+ case "list" ->
+ prepareList();
+ case "add" ->
+ prepareAdd();
+ case "edit" ->
+ prepareEdit();
+ }
+ }
+
+ @Override
+ protected void setResultOnly() {
+ setResult(result);
+ }
+
+ // ::: preload
+ //
+ private void prepareAdd() {
+
+ }
+
+ private void prepareEdit() {
+ var entity = findEntity();
+ result.put("entity", entity);
+
+ }
+
+ private void prepareList() {
+ }
+
+ private void prepareFind() {
+ var entity = findEntity();
+ result.put("entity", entity);
+
+ }
+
+ // ::: queries
+ //
+ private AuthUserEntity findEntity() {
+ var store = AppModules.authentication.getController().getAuthUserStore();
+
+ var id = (String) params.get("id");
+ if(id == null && getArgument().getEntity() != null) {
+ id = getArgument().getEntity().getId();
+ }
+ return store.findById(getContext(), id);
+ }
+
+
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserPreloadArgument.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserPreloadArgument.java
new file mode 100644
index 0000000..b4ddf7a
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuser/AuthUserPreloadArgument.java
@@ -0,0 +1,26 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuser;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserPreloadArgument extends AuthUserActionArgument {
+
+ // ::: vars
+ //
+ private String action;
+
+ // ::: fields
+ //
+ public String getAction() {
+ return action;
+ }
+
+ public void setAction(String action) {
+ this.action = action;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationActionArgument.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationActionArgument.java
new file mode 100644
index 0000000..d93e0cc
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationActionArgument.java
@@ -0,0 +1,29 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuserrelation;
+
+// base
+import io.kumare.iqr.app.action.AppEntityActionArgument;
+// entity
+import io.kumare.iqr.mod.authentication.store.authuserrelation.AuthUserRelationEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserRelationActionArgument extends AppEntityActionArgument {
+
+ // ::: constructors
+ //
+ public AuthUserRelationActionArgument() {
+ }
+
+ public AuthUserRelationActionArgument(AuthUserRelationEntity entity) {
+ super(entity);
+ }
+
+ // ::: api
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationAddAction.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationAddAction.java
new file mode 100644
index 0000000..b144358
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationAddAction.java
@@ -0,0 +1,123 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuserrelation;
+
+
+// lib
+import io.kumare.lib.base.server.spring.action.Actions;
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.authentication.AuthenticationErrors;
+// entity
+import io.kumare.iqr.mod.authentication.store.authuserrelation.AuthUserRelationEntity;
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserRelationAddAction extends AppAction> {
+
+ // ::: vars
+ //
+ private AuthUserRelationEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, AuthenticationErrors.authuserrelation_notfound);
+
+ // relations
+ V.ifNull(model.getAuthUser(), AuthenticationErrors.authuserrelation_authuser_notfound);
+
+ // fields
+ V.ifEmpty(model.getExternalId(), AuthenticationErrors.authuserrelation_externalid_empty);
+ V.ifEmpty(model.getUserKey(), AuthenticationErrors.authuserrelation_userkey_empty);
+ V.ifEmpty(model.getTypeValue(), AuthenticationErrors.authuserrelation_typevalue_empty);
+ V.ifEmpty(model.getResourceType(), AuthenticationErrors.authuserrelation_resourcetype_empty);
+ V.ifEmpty(model.getResourceKey(), AuthenticationErrors.authuserrelation_resourcekey_empty);
+ V.ifEmpty(model.getResourceId(), AuthenticationErrors.authuserrelation_resourceid_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ // arguments
+ var argModel = getArgument().getEntity();
+
+ // controllers
+ var authentication = AppModules.authentication.getController();
+
+ var authUserStore = authentication.getAuthUserStore();
+
+ var authUser = authUserStore.ensure(getContext(), argModel.getAuthUser(), AuthenticationErrors.authuserrelation_authuser_notfound);
+
+ // model
+ var model = makeModel(authUser);
+
+ // add
+ entity = saveEntity(model);
+
+ // add others
+
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private AuthUserRelationEntity makeModel(AuthUserEntity authUser) {
+
+ var argModel = getArgument().getEntity();
+ var model = new AuthUserRelationEntity();
+
+ // relations
+ model.setAuthUser(authUser);
+
+ // fields
+ model.setExternalId(argModel.getExternalId());
+ model.setUserKey(argModel.getUserKey());
+ model.setTypeValue(argModel.getTypeValue());
+ model.setResourceType(argModel.getResourceType());
+ model.setResourceKey(argModel.getResourceKey());
+ model.setResourceId(argModel.getResourceId());
+ model.setActive(true);
+
+
+
+ return model;
+ }
+
+ // ::: save
+ //
+ private AuthUserRelationEntity saveEntity(AuthUserRelationEntity model) {
+
+ var store = AppModules.authentication.getController().getAuthUserRelationStore();
+
+ var saved = store.add(getContext(), model);
+ getContext().attach(saved.getId(), saved);
+ return saved;
+ }
+
+
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationAddArgument.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationAddArgument.java
new file mode 100644
index 0000000..78cd768
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationAddArgument.java
@@ -0,0 +1,34 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuserrelation;
+
+
+// app
+import io.kumare.iqr.mod.authentication.store.authuserrelation.AuthUserRelationEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserRelationAddArgument extends AuthUserRelationActionArgument {
+
+ // ::: vars
+ //
+
+
+ // ::: constructors
+ //
+ public AuthUserRelationAddArgument() {
+ }
+
+ public AuthUserRelationAddArgument(AuthUserRelationEntity entity) {
+ super(entity);
+ }
+
+ // ::: fields
+ //
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationDeleteAction.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationDeleteAction.java
new file mode 100644
index 0000000..45096da
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationDeleteAction.java
@@ -0,0 +1,59 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuserrelation;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.authentication.AuthenticationErrors;
+// entity
+import io.kumare.iqr.mod.authentication.store.authuserrelation.AuthUserRelationEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserRelationDeleteAction extends AppAction> {
+
+ // ::: vars
+ //
+ private AuthUserRelationEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), AuthenticationErrors.authuserrelation_notfound);
+ V.ifNull(getArgument().getEntity().getId(), AuthenticationErrors.authuserrelation_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var argModel = getArgument().getEntity();
+
+ deleteEntity(argModel);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ }
+
+ // ::: delete
+ //
+ private void deleteEntity(AuthUserRelationEntity model) {
+
+ var store = AppModules.authentication.getController().getAuthUserRelationStore();
+
+ store.deleteById(getContext(), model.getId());
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationEditAction.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationEditAction.java
new file mode 100644
index 0000000..5e9ac7b
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationEditAction.java
@@ -0,0 +1,103 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuserrelation;
+
+// lib
+import io.kumare.lib.v.V;
+// app
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.authentication.AuthenticationErrors;
+// entity
+import io.kumare.iqr.mod.authentication.store.authuserrelation.AuthUserRelationEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserRelationEditAction extends AppAction> {
+
+ // ::: vars
+ //
+ private AuthUserRelationEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, AuthenticationErrors.authuserrelation_notfound);
+
+ // fields
+ V.ifEmpty(model.getExternalId(), AuthenticationErrors.authuserrelation_externalid_empty);
+ V.ifEmpty(model.getUserKey(), AuthenticationErrors.authuserrelation_userkey_empty);
+ V.ifEmpty(model.getTypeValue(), AuthenticationErrors.authuserrelation_typevalue_empty);
+ V.ifEmpty(model.getResourceType(), AuthenticationErrors.authuserrelation_resourcetype_empty);
+ V.ifEmpty(model.getResourceKey(), AuthenticationErrors.authuserrelation_resourcekey_empty);
+ V.ifEmpty(model.getResourceId(), AuthenticationErrors.authuserrelation_resourceid_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ // arguments
+ var argModel = getArgument().getEntity();
+
+ // controllers
+
+ var authentication = AppModules.authentication.getController();
+ var authUserRelationStore = authentication.getAuthUserRelationStore();
+
+ // edit
+ entity = authUserRelationStore.ensure(getContext(), argModel, AuthenticationErrors.authuserrelation_notfound);
+
+ editEntity();
+
+ entity = saveEntity();
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private void editEntity() {
+
+ var model = getArgument().getEntity();
+
+ // fields
+ entity.setExternalId(V.firstNotEmpty(model.getExternalId(), entity.getExternalId()));
+ entity.setUserKey(V.firstNotEmpty(model.getUserKey(), entity.getUserKey()));
+ entity.setTypeValue(V.firstNotEmpty(model.getTypeValue(), entity.getTypeValue()));
+ entity.setResourceType(V.firstNotEmpty(model.getResourceType(), entity.getResourceType()));
+ entity.setResourceKey(V.firstNotEmpty(model.getResourceKey(), entity.getResourceKey()));
+ entity.setResourceId(V.firstNotEmpty(model.getResourceId(), entity.getResourceId()));
+
+
+ }
+
+ // ::: save
+ //
+ private AuthUserRelationEntity saveEntity() {
+
+ var store = AppModules.authentication.getController().getAuthUserRelationStore();
+
+ var saved = store.edit(getContext(), entity);
+ getContext().attach(saved.getId(), saved);
+ return saved;
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationEditArgument.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationEditArgument.java
new file mode 100644
index 0000000..f1755bb
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationEditArgument.java
@@ -0,0 +1,32 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuserrelation;
+
+// app
+import io.kumare.iqr.mod.authentication.store.authuserrelation.AuthUserRelationEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserRelationEditArgument extends AuthUserRelationActionArgument {
+
+ // ::: vars
+ //
+
+
+ // ::: constructors
+ //
+ public AuthUserRelationEditArgument() {
+ }
+
+ public AuthUserRelationEditArgument(AuthUserRelationEntity entity) {
+ super(entity);
+ }
+
+
+ // ::: fields
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationEnableAction.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationEnableAction.java
new file mode 100644
index 0000000..ddbbc0a
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationEnableAction.java
@@ -0,0 +1,60 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuserrelation;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.authentication.AuthenticationErrors;
+// entity
+import io.kumare.iqr.mod.authentication.store.authuserrelation.AuthUserRelationEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserRelationEnableAction extends AppAction {
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), AuthenticationErrors.authuserrelation_notfound);
+ V.ifNull(getArgument().getEntity().getId(), AuthenticationErrors.authuserrelation_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var model = getArgument().getEntity();
+
+ enableEntity(model);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ }
+
+ // ::: enable
+ //
+ private void enableEntity(AuthUserRelationEntity model) {
+
+ var store = AppModules.authentication.getController().getAuthUserRelationStore();
+
+ if (getArgument().getEntity().isActive()) {
+ store.enableById(getContext(), model.getId());
+ } else {
+ store.disableById(getContext(), model.getId());
+ }
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationFindAction.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationFindAction.java
new file mode 100644
index 0000000..fb84b8a
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationFindAction.java
@@ -0,0 +1,64 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuserrelation;
+
+// java
+import java.util.HashMap;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.authentication.AuthenticationErrors;
+// entity
+import io.kumare.iqr.mod.authentication.store.authuserrelation.AuthUserRelationEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserRelationFindAction extends AppAction {
+
+ // ::: vars
+ //
+ private AuthUserRelationEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), AuthenticationErrors.authuserrelation_notfound);
+ V.ifNull(getArgument().getEntity().getId(), AuthenticationErrors.authuserrelation_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var model = getArgument().getEntity();
+ entity = findEntity(model);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new HashMap();
+ result.put("entity", entity);
+ setResult(result);
+ }
+
+ // ::: find
+ //
+ private AuthUserRelationEntity findEntity(AuthUserRelationEntity model) {
+
+ var store = AppModules.authentication.getController().getAuthUserRelationStore();
+ return store.findById(getContext(), model.getId());
+ }
+
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationListAction.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationListAction.java
new file mode 100644
index 0000000..1a6e42d
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationListAction.java
@@ -0,0 +1,148 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuserrelation;
+
+// java
+import java.util.HashMap;
+import java.util.List;
+import java.util.LinkedList;
+import java.util.Map;
+// spring
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// entity
+import io.kumare.iqr.mod.authentication.store.authuserrelation.AuthUserRelationEntity;
+import io.kumare.iqr.mod.authentication.store.authuserrelation.AuthUserRelationMapBuilder;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserRelationListAction extends AppAction {
+
+ // ::: vars
+ //
+ private final Map result = new HashMap();
+ private final List entities = new LinkedList<>();
+
+ // ::: public api
+ //
+ public List getEntities() {
+ return entities;
+ }
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ result.put("pageable", getArgument().isPageable());
+ result.put("wrapped", getArgument().isWrapped());
+
+ if (getArgument().isPageable()) {
+
+ var page = makePage();
+ entities.addAll(page.toList());
+
+ if (getArgument().isWrapped()) {
+ result.put("page", makeWrappedPage(page));
+ } else {
+ result.put("page", page);
+ }
+
+ } else {
+
+ var list = makeList();
+ entities.addAll(list);
+
+ if (getArgument().isWrapped()) {
+ result.put("list", makeWrappedList());
+ } else {
+ result.put("list", list);
+ }
+ }
+
+ }
+
+ @Override
+ protected void setResultOnly() {
+ setResult(result);
+ }
+
+ // ::: page
+ //
+ private Page makePage() {
+
+ var page = getArgument().getPageNumber();
+ var size = getArgument().getPageSize();
+ //var sort = getArgument().getSort();
+
+ var pageable = PageRequest.of(page, size);
+
+ var store = AppModules.authentication.getController().getAuthUserRelationStore();
+ return store.getRepository().findAll(pageable);
+ }
+
+ // ::: wrapped page
+ //
+ private Map makeWrappedPage(Page found) {
+
+ var page = new HashMap();
+ var content = new LinkedList();
+
+ wrapList(entities, content);
+
+ page.put("size", found.getSize());
+ page.put("number", found.getNumber());
+ page.put("totalElements", found.getTotalElements());
+ page.put("totalPages", found.getTotalPages());
+ page.put("content", content);
+
+ return page;
+ }
+
+
+ // ::: list
+ //
+
+ private List makeList() {
+
+ var store = AppModules.authentication.getController().getAuthUserRelationStore();
+
+ return store.listAll(getContext());
+ }
+
+ // ::: wrapped list
+ private List makeWrappedList() {
+ var list = new LinkedList();
+
+ wrapList(entities, list);
+
+ return list;
+ }
+
+ // ::: wrapper
+ //
+ private void wrapList(List found, List output) {
+
+ var builder = new AuthUserRelationMapBuilder().addListGroup();
+ builder.getAuthUserBuilder().addMainGroup();
+
+ output.addAll(builder.build(getContext(), found));
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationListArgument.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationListArgument.java
new file mode 100644
index 0000000..dcadf54
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationListArgument.java
@@ -0,0 +1,33 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuserrelation;
+
+// app
+import io.kumare.iqr.app.action.AppListActionArgument;
+// store
+import io.kumare.iqr.mod.authentication.store.authuserrelation.AuthUserRelationEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserRelationListArgument extends AppListActionArgument {
+
+ // ::: vars
+ //
+
+ // ::: constructors
+ //
+ public AuthUserRelationListArgument() {
+ }
+
+ public AuthUserRelationListArgument(AuthUserRelationEntity entity) {
+ super(entity);
+ }
+
+
+ // ::: fields
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationPreloadAction.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationPreloadAction.java
new file mode 100644
index 0000000..ab6a221
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationPreloadAction.java
@@ -0,0 +1,105 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuserrelation;
+
+// java
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.authentication.AuthenticationErrors;
+// entity
+import io.kumare.iqr.mod.authentication.store.authuserrelation.AuthUserRelationEntity;
+// relations
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserRelationPreloadAction extends AppAction {
+
+ // ::: vars
+ //
+ private final Map result = new HashMap();
+ private Map params = new HashMap<>();
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifEmpty(getArgument().getAction(), AuthenticationErrors.authuserrelation_preload_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ if(getArgument().getParams() != null) {
+ params = getArgument().getParams();
+ }
+
+ switch (getArgument().getAction()) {
+ case "find" ->
+ prepareFind();
+ case "list" ->
+ prepareList();
+ case "add" ->
+ prepareAdd();
+ case "edit" ->
+ prepareEdit();
+ }
+ }
+
+ @Override
+ protected void setResultOnly() {
+ setResult(result);
+ }
+
+ // ::: preload
+ //
+ private void prepareAdd() {
+ result.put("authUsers", listAuthUsers());
+ }
+
+ private void prepareEdit() {
+ var entity = findEntity();
+ result.put("entity", entity);
+ result.put("authUser", entity.getAuthUser());
+ }
+
+ private void prepareList() {
+ }
+
+ private void prepareFind() {
+ var entity = findEntity();
+ result.put("entity", entity);
+ result.put("authUser", entity.getAuthUser());
+ }
+
+ // ::: queries
+ //
+ private AuthUserRelationEntity findEntity() {
+ var store = AppModules.authentication.getController().getAuthUserRelationStore();
+
+ var id = (String) params.get("id");
+ if(id == null && getArgument().getEntity() != null) {
+ id = getArgument().getEntity().getId();
+ }
+ return store.findById(getContext(), id);
+ }
+
+ public List listAuthUsers() {
+ var store = AppModules.authentication.getController().getAuthUserStore();
+
+ return store.listAll(getContext());
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationPreloadArgument.java b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationPreloadArgument.java
new file mode 100644
index 0000000..b91ecc9
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/action/authuserrelation/AuthUserRelationPreloadArgument.java
@@ -0,0 +1,26 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.action.authuserrelation;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserRelationPreloadArgument extends AuthUserRelationActionArgument {
+
+ // ::: vars
+ //
+ private String action;
+
+ // ::: fields
+ //
+ public String getAction() {
+ return action;
+ }
+
+ public void setAction(String action) {
+ this.action = action;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/endpoint/rest/AbstractAuthUserRelationRest.java b/src/main/java/io/kumare/iqr/mod/authentication/endpoint/rest/AbstractAuthUserRelationRest.java
new file mode 100644
index 0000000..7928b85
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/endpoint/rest/AbstractAuthUserRelationRest.java
@@ -0,0 +1,214 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.endpoint.rest;
+
+// java
+import java.util.Map;
+// openapi
+import io.swagger.v3.oas.annotations.*;
+import io.swagger.v3.oas.annotations.media.*;
+import io.swagger.v3.oas.annotations.responses.*;
+// spring
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+// base
+import io.kumare.lib.app.api.operation.TransactionType;
+import io.kumare.lib.app.api.security.PermissionReference;
+// app
+import io.kumare.iqr.app.endpoint.rest.AppEndpointRest;
+import io.kumare.iqr.app.action.*;
+// module
+import io.kumare.iqr.mod.authentication.AuthenticationPermissions;
+import io.kumare.iqr.mod.authentication.store.authuserrelation.AuthUserRelationEntity;
+import io.kumare.iqr.mod.authentication.action.authuserrelation.*;
+
+/**
+*
+* @author afatecha
+*/
+public abstract class AbstractAuthUserRelationRest extends AppEndpointRest {
+
+ // ::: DEFAULT PERMISSIONS
+ //
+ protected PermissionReference getPermission(String action, String ref, Object extra) {
+ switch (action) {
+ case null -> {
+ return null;
+ }
+ case "add" -> {
+ return AuthenticationPermissions.auth_user_relation_worker.toReference(ref);
+ }
+ case "edit" -> {
+ return AuthenticationPermissions.auth_user_relation_worker.toReference(ref);
+ }
+ case "enable" -> {
+ return AuthenticationPermissions.auth_user_relation_manager.toReference(ref);
+ }
+ case "disable" -> {
+ return AuthenticationPermissions.auth_user_relation_manager.toReference(ref);
+ }
+ case "delete" -> {
+ return AuthenticationPermissions.auth_user_relation_manager.toReference(ref);
+ }
+ case "find" -> {
+ return AuthenticationPermissions.auth_user_relation_viewer.toReference(ref);
+ }
+ case "list" -> {
+ return AuthenticationPermissions.auth_user_relation_viewer.toReference(ref);
+ }
+ default -> {
+ return null;
+ }
+ }
+ }
+
+
+ // ::: ADD
+ //
+ @ApiResponses(value = {
+ @ApiResponse(content = @Content(mediaType = "application/json",
+ schema = @Schema(implementation = AppEntityActionResult.class)))
+ })
+ @Operation(summary = "auth user relation add operation", description = "")
+ //
+ @PostMapping
+ public ResponseEntity add(@RequestBody AuthUserRelationAddArgument arg) {
+
+ var permission = getPermission("add", null, arg);
+ return handle(new AuthUserRelationAddAction(), arg, permission, TransactionType.service);
+ }
+
+ // ::: EDIT
+ //
+ @ApiResponses(value = {
+ @ApiResponse(content = @Content(mediaType = "application/json",
+ schema = @Schema(implementation = AppEntityActionResult.class)))
+ })
+ @Operation(summary = "auth user relation edit operation", description = "")
+ //
+ @PutMapping("/{id}")
+ public ResponseEntity edit(@PathVariable("id") String id,
+ @RequestBody AuthUserRelationEditArgument arg) {
+
+ arg.getEntity().id(id);
+
+ var permission = getPermission("edit", id, arg);
+ return handle(new AuthUserRelationEditAction(), arg, permission, TransactionType.service);
+ }
+
+ // ::: FIND
+ //
+ @ApiResponses(value = {
+ @ApiResponse(content = @Content(mediaType = "application/json",
+ schema = @Schema(implementation = Map.class)))
+ })
+ @Operation(summary = "auth user relation find operation", description = "")
+ //
+ @GetMapping("/{id}")
+ public ResponseEntity find(@PathVariable("id") String id,
+ @ModelAttribute AuthUserRelationActionArgument arg) {
+
+
+ arg = arg == null ? new AuthUserRelationActionArgument() : arg;
+
+ arg.entity(new AuthUserRelationEntity(id));
+
+ var permission = getPermission("find", id, arg);
+ return handle(new AuthUserRelationFindAction(), arg, permission);
+ }
+
+ // ::: ENABLE
+ //
+ /*
+ @ApiResponses(value = {
+ @ApiResponse(content = @Content(mediaType = "application/json",
+ schema = @Schema(implementation = AppActionResult.class)))
+ })
+ @Operation(summary = "auth user relation enable operation", description = "")
+ //
+ @PutMapping("/{id}/enable")
+ public ResponseEntity enable(@PathVariable("id") String id) {
+
+ var arg = new AuthUserRelationActionArgument();
+ arg.setEntity(new AuthUserRelationEntity(id));
+ arg.getEntity().setActive(true);
+
+ var permission = getPermission("disable", id, arg);
+ return handle(new AuthUserRelationEnableAction(), arg, permission, TransactionType.service);
+ }
+ */
+
+ // ::: DISABLE
+ //
+ /*
+ @ApiResponses(value = {
+ @ApiResponse(content = @Content(mediaType = "application/json",
+ schema = @Schema(implementation = AppActionResult.class)))
+ })
+ @Operation(summary = "auth user relation disable operation", description = "")
+ //
+ @PutMapping("/{id}/disable")
+ public ResponseEntity disable(@PathVariable("id") String id) {
+
+ var arg = new AuthUserRelationActionArgument();
+ arg.setEntity(new AuthUserRelationEntity(id));
+ arg.getEntity().setActive(false);
+
+ var permission = getPermission("disable", id, arg);
+ return handle(new AuthUserRelationEnableAction(), arg, permission, TransactionType.service);
+ }
+ */
+
+ // ::: LIST
+ //
+ @ApiResponses(value = {
+ @ApiResponse(content = @Content(mediaType = "application/json",
+ schema = @Schema(implementation = Map.class)))
+ })
+ @Operation(summary = "auth user relation list operation", description = "")
+ //
+ @GetMapping
+ public ResponseEntity list(@ModelAttribute AuthUserRelationListArgument arg) {
+
+ arg = arg == null ? new AuthUserRelationListArgument() : arg;
+
+ var permission = getPermission("list", null, arg);
+ return handle(new AuthUserRelationListAction(), arg, permission);
+ }
+
+ // ::: DELETE
+ //
+ @ApiResponses(value = {
+ @ApiResponse(content = @Content(mediaType = "application/json",
+ schema = @Schema(implementation = AppActionResult.class)))
+ })
+ @Operation(summary = "auth user relation delete operation", description = "")
+ //
+ @DeleteMapping("/{id}")
+ public ResponseEntity delete(@PathVariable("id") String id) {
+
+ var arg = new AuthUserRelationActionArgument();
+
+ arg.setEntity(new AuthUserRelationEntity(id));
+
+ var permission = getPermission("delete", id, arg);
+ return handle(new AuthUserRelationDeleteAction(), arg, permission, TransactionType.service);
+ }
+
+ // ::: PRELOAD
+ //
+ @ApiResponses(value = {
+ @ApiResponse(content = @Content(mediaType = "application/json",
+ schema = @Schema(implementation = Map.class)))
+ })
+ @Operation(summary = "auth user relation preload operation", description = "")
+ //
+ @PostMapping("/preload")
+ public ResponseEntity preload(@RequestBody AuthUserRelationPreloadArgument arg) {
+
+ var permission = getPermission(arg.getAction(), null, arg);
+ return handle(new AuthUserRelationPreloadAction(), arg, permission);
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/endpoint/rest/AbstractAuthUserRest.java b/src/main/java/io/kumare/iqr/mod/authentication/endpoint/rest/AbstractAuthUserRest.java
new file mode 100644
index 0000000..6c68580
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/endpoint/rest/AbstractAuthUserRest.java
@@ -0,0 +1,214 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.endpoint.rest;
+
+// java
+import java.util.Map;
+// openapi
+import io.swagger.v3.oas.annotations.*;
+import io.swagger.v3.oas.annotations.media.*;
+import io.swagger.v3.oas.annotations.responses.*;
+// spring
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+// base
+import io.kumare.lib.app.api.operation.TransactionType;
+import io.kumare.lib.app.api.security.PermissionReference;
+// app
+import io.kumare.iqr.app.endpoint.rest.AppEndpointRest;
+import io.kumare.iqr.app.action.*;
+// module
+import io.kumare.iqr.mod.authentication.AuthenticationPermissions;
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserEntity;
+import io.kumare.iqr.mod.authentication.action.authuser.*;
+
+/**
+*
+* @author afatecha
+*/
+public abstract class AbstractAuthUserRest extends AppEndpointRest {
+
+ // ::: DEFAULT PERMISSIONS
+ //
+ protected PermissionReference getPermission(String action, String ref, Object extra) {
+ switch (action) {
+ case null -> {
+ return null;
+ }
+ case "add" -> {
+ return AuthenticationPermissions.auth_user_worker.toReference(ref);
+ }
+ case "edit" -> {
+ return AuthenticationPermissions.auth_user_worker.toReference(ref);
+ }
+ case "enable" -> {
+ return AuthenticationPermissions.auth_user_manager.toReference(ref);
+ }
+ case "disable" -> {
+ return AuthenticationPermissions.auth_user_manager.toReference(ref);
+ }
+ case "delete" -> {
+ return AuthenticationPermissions.auth_user_manager.toReference(ref);
+ }
+ case "find" -> {
+ return AuthenticationPermissions.auth_user_viewer.toReference(ref);
+ }
+ case "list" -> {
+ return AuthenticationPermissions.auth_user_viewer.toReference(ref);
+ }
+ default -> {
+ return null;
+ }
+ }
+ }
+
+
+ // ::: ADD
+ //
+ @ApiResponses(value = {
+ @ApiResponse(content = @Content(mediaType = "application/json",
+ schema = @Schema(implementation = AppEntityActionResult.class)))
+ })
+ @Operation(summary = "auth user add operation", description = "")
+ //
+ @PostMapping
+ public ResponseEntity add(@RequestBody AuthUserAddArgument arg) {
+
+ var permission = getPermission("add", null, arg);
+ return handle(new AuthUserAddAction(), arg, permission, TransactionType.service);
+ }
+
+ // ::: EDIT
+ //
+ @ApiResponses(value = {
+ @ApiResponse(content = @Content(mediaType = "application/json",
+ schema = @Schema(implementation = AppEntityActionResult.class)))
+ })
+ @Operation(summary = "auth user edit operation", description = "")
+ //
+ @PutMapping("/{id}")
+ public ResponseEntity edit(@PathVariable("id") String id,
+ @RequestBody AuthUserEditArgument arg) {
+
+ arg.getEntity().id(id);
+
+ var permission = getPermission("edit", id, arg);
+ return handle(new AuthUserEditAction(), arg, permission, TransactionType.service);
+ }
+
+ // ::: FIND
+ //
+ @ApiResponses(value = {
+ @ApiResponse(content = @Content(mediaType = "application/json",
+ schema = @Schema(implementation = Map.class)))
+ })
+ @Operation(summary = "auth user find operation", description = "")
+ //
+ @GetMapping("/{id}")
+ public ResponseEntity find(@PathVariable("id") String id,
+ @ModelAttribute AuthUserActionArgument arg) {
+
+
+ arg = arg == null ? new AuthUserActionArgument() : arg;
+
+ arg.entity(new AuthUserEntity(id));
+
+ var permission = getPermission("find", id, arg);
+ return handle(new AuthUserFindAction(), arg, permission);
+ }
+
+ // ::: ENABLE
+ //
+ /*
+ @ApiResponses(value = {
+ @ApiResponse(content = @Content(mediaType = "application/json",
+ schema = @Schema(implementation = AppActionResult.class)))
+ })
+ @Operation(summary = "auth user enable operation", description = "")
+ //
+ @PutMapping("/{id}/enable")
+ public ResponseEntity enable(@PathVariable("id") String id) {
+
+ var arg = new AuthUserActionArgument();
+ arg.setEntity(new AuthUserEntity(id));
+ arg.getEntity().setActive(true);
+
+ var permission = getPermission("disable", id, arg);
+ return handle(new AuthUserEnableAction(), arg, permission, TransactionType.service);
+ }
+ */
+
+ // ::: DISABLE
+ //
+ /*
+ @ApiResponses(value = {
+ @ApiResponse(content = @Content(mediaType = "application/json",
+ schema = @Schema(implementation = AppActionResult.class)))
+ })
+ @Operation(summary = "auth user disable operation", description = "")
+ //
+ @PutMapping("/{id}/disable")
+ public ResponseEntity disable(@PathVariable("id") String id) {
+
+ var arg = new AuthUserActionArgument();
+ arg.setEntity(new AuthUserEntity(id));
+ arg.getEntity().setActive(false);
+
+ var permission = getPermission("disable", id, arg);
+ return handle(new AuthUserEnableAction(), arg, permission, TransactionType.service);
+ }
+ */
+
+ // ::: LIST
+ //
+ @ApiResponses(value = {
+ @ApiResponse(content = @Content(mediaType = "application/json",
+ schema = @Schema(implementation = Map.class)))
+ })
+ @Operation(summary = "auth user list operation", description = "")
+ //
+ @GetMapping
+ public ResponseEntity list(@ModelAttribute AuthUserListArgument arg) {
+
+ arg = arg == null ? new AuthUserListArgument() : arg;
+
+ var permission = getPermission("list", null, arg);
+ return handle(new AuthUserListAction(), arg, permission);
+ }
+
+ // ::: DELETE
+ //
+ @ApiResponses(value = {
+ @ApiResponse(content = @Content(mediaType = "application/json",
+ schema = @Schema(implementation = AppActionResult.class)))
+ })
+ @Operation(summary = "auth user delete operation", description = "")
+ //
+ @DeleteMapping("/{id}")
+ public ResponseEntity delete(@PathVariable("id") String id) {
+
+ var arg = new AuthUserActionArgument();
+
+ arg.setEntity(new AuthUserEntity(id));
+
+ var permission = getPermission("delete", id, arg);
+ return handle(new AuthUserDeleteAction(), arg, permission, TransactionType.service);
+ }
+
+ // ::: PRELOAD
+ //
+ @ApiResponses(value = {
+ @ApiResponse(content = @Content(mediaType = "application/json",
+ schema = @Schema(implementation = Map.class)))
+ })
+ @Operation(summary = "auth user preload operation", description = "")
+ //
+ @PostMapping("/preload")
+ public ResponseEntity preload(@RequestBody AuthUserPreloadArgument arg) {
+
+ var permission = getPermission(arg.getAction(), null, arg);
+ return handle(new AuthUserPreloadAction(), arg, permission);
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/endpoint/rest/AuthUserRelationRest.java b/src/main/java/io/kumare/iqr/mod/authentication/endpoint/rest/AuthUserRelationRest.java
new file mode 100644
index 0000000..3e6405b
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/endpoint/rest/AuthUserRelationRest.java
@@ -0,0 +1,24 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.endpoint.rest;
+
+// java
+import io.swagger.v3.oas.annotations.tags.*;
+// spring
+import org.springframework.web.bind.annotation.*;
+
+/**
+*
+* @author afatecha
+*/
+
+// openapi
+//@Tag(name = "auth user relation rest endpoint")
+//
+//@RestController
+//@RequestMapping("/authentication/auth-user-relations")
+public class AuthUserRelationRest extends AbstractAuthUserRelationRest {
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/endpoint/rest/AuthUserRest.java b/src/main/java/io/kumare/iqr/mod/authentication/endpoint/rest/AuthUserRest.java
new file mode 100644
index 0000000..fe7d39a
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/endpoint/rest/AuthUserRest.java
@@ -0,0 +1,24 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.endpoint.rest;
+
+// java
+import io.swagger.v3.oas.annotations.tags.*;
+// spring
+import org.springframework.web.bind.annotation.*;
+
+/**
+*
+* @author afatecha
+*/
+
+// openapi
+//@Tag(name = "auth user rest endpoint")
+//
+//@RestController
+//@RequestMapping("/authentication/auth-users")
+public class AuthUserRest extends AbstractAuthUserRest {
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/store/AuthenticationEntities.java b/src/main/java/io/kumare/iqr/mod/authentication/store/AuthenticationEntities.java
new file mode 100644
index 0000000..d6d3e6b
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/store/AuthenticationEntities.java
@@ -0,0 +1,102 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.store;
+
+// base
+// base
+import io.kumare.lib.app.api.module.ServiceModule;
+import io.kumare.lib.app.api.store.EntityStore;
+import io.kumare.lib.base.server.spring.store.jpa.EntityDescriptor;
+// app
+import io.kumare.iqr.app.AppEngine;
+import io.kumare.iqr.app.module.AppModules;
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserEntity;
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserStore;
+import io.kumare.iqr.mod.authentication.store.authuserrelation.AuthUserRelationEntity;
+import io.kumare.iqr.mod.authentication.store.authuserrelation.AuthUserRelationStore;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public enum AuthenticationEntities implements EntityDescriptor {
+
+ authUser(AuthUserEntity.class, AuthUserStore.class),
+ authUserRelation(AuthUserRelationEntity.class, AuthUserRelationStore.class);
+
+ // ::: vars
+ //
+ private final Class entityClass;
+ private final Class storeClass;
+
+ // ::: constructor
+ //
+ AuthenticationEntities(Class entityClass, Class storeClass) {
+ this.entityClass = entityClass;
+ this.storeClass = storeClass;
+ }
+
+ // ::: entity descriptor api
+ //
+ @Override
+ public String getName() {
+ return name();
+ }
+
+ @Override
+ public ServiceModule getModule() {
+ return AppModules.authentication;
+ }
+
+ @Override
+ public Class getEntityClass() {
+ return entityClass;
+ }
+
+ @Override
+ public Class getStoreClass() {
+ return storeClass;
+ }
+
+ @Override
+ public EntityStore getStore() {
+ return (EntityStore) AppEngine.getEngine().getInnerContext().getBean(storeClass);
+ }
+
+ // ::: statics
+ //
+ public static boolean hasDescriptor(String name) {
+ try {
+ var value = valueOf(name);
+ return value != null;
+
+ } catch (Throwable t) {
+ return false;
+ }
+ }
+
+ public static EntityDescriptor descriptorOf(String name) {
+ try {
+ return valueOf(name);
+
+ } catch (Throwable t) {
+ return null;
+ }
+ }
+
+ public static EntityDescriptor descriptorOf(Class entityClass) {
+ try {
+ for (var i : values()) {
+ if (i.entityClass == entityClass) {
+ return i;
+ }
+ }
+
+ } catch (Throwable t) {
+ }
+
+ return null;
+ }
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserData.java b/src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserData.java
new file mode 100644
index 0000000..a77d4bd
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserData.java
@@ -0,0 +1,25 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.store.authuser;
+
+// base
+import io.kumare.iqr.app.store.AppExtendedEntityData;
+// imports
+
+
+public class AuthUserData extends AppExtendedEntityData {
+
+ // ::: vars
+ //
+
+
+ // ::: fields
+ //
+
+
+ // ::: fluent
+ //
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserEntity.java b/src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserEntity.java
new file mode 100644
index 0000000..d7febb2
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserEntity.java
@@ -0,0 +1,179 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.store.authuser;
+
+// jakarta
+import jakarta.persistence.Entity;
+import jakarta.persistence.Index;
+import jakarta.persistence.Table;
+// base
+import io.kumare.lib.app.api.store.*;
+import io.kumare.iqr.app.store.*;
+// imports
+
+// relations
+// annotations
+@Entity
+@Table(
+ name = "auth_user",
+ indexes = {
+ @Index(name = "idx_auth_user_external_id", columnList = "externalId"),
+ @Index(name = "idx_auth_user_entity_key", columnList = "entityKey"),
+ @Index(name = "idx_auth_user_custom", columnList = "custom"),
+ @Index(name = "idx_auth_user_visible", columnList = "visible"),
+ @Index(name = "idx_auth_user_email", columnList = "email"),
+ @Index(name = "idx_auth_user_email_confirmed", columnList = "emailConfirmed"),
+ @Index(name = "idx_auth_user_phone", columnList = "phone"),
+ @Index(name = "idx_auth_user_phone_confirmed", columnList = "phoneConfirmed"),
+ @Index(name = "idx_auth_user_name", columnList = "name")
+ }
+)
+public class AuthUserEntity extends AppEntity implements SupportedEntityKey {
+
+ // ::: vars
+ //
+ private String externalId;
+ private String entityKey;
+ private boolean custom;
+ private boolean visible;
+ private String email;
+ private boolean emailConfirmed;
+ private String phone;
+ private boolean phoneConfirmed;
+ private String name;
+ // relations
+
+ // ::: constructors
+ //
+ public AuthUserEntity() {
+ }
+
+ public AuthUserEntity(String id) {
+ super(id);
+ }
+
+ // ::: fields
+ //
+ public String getExternalId() {
+ return externalId;
+ }
+
+ public void setExternalId(String externalId) {
+ this.externalId = externalId;
+ }
+
+ public String getEntityKey() {
+ return entityKey;
+ }
+
+ public void setEntityKey(String entityKey) {
+ this.entityKey = entityKey;
+ }
+
+ public boolean isCustom() {
+ return custom;
+ }
+
+ public void setCustom(boolean custom) {
+ this.custom = custom;
+ }
+
+ public boolean isVisible() {
+ return visible;
+ }
+
+ public void setVisible(boolean visible) {
+ this.visible = visible;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public boolean isEmailConfirmed() {
+ return emailConfirmed;
+ }
+
+ public void setEmailConfirmed(boolean emailConfirmed) {
+ this.emailConfirmed = emailConfirmed;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public boolean isPhoneConfirmed() {
+ return phoneConfirmed;
+ }
+
+ public void setPhoneConfirmed(boolean phoneConfirmed) {
+ this.phoneConfirmed = phoneConfirmed;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ // relations
+ // ::: fluent
+ //
+ public AuthUserEntity externalId(String externalId) {
+ setExternalId(externalId);
+ return this;
+ }
+
+ public AuthUserEntity entityKey(String entityKey) {
+ setEntityKey(entityKey);
+ return this;
+ }
+
+ public AuthUserEntity custom(boolean custom) {
+ setCustom(custom);
+ return this;
+ }
+
+ public AuthUserEntity visible(boolean visible) {
+ setVisible(visible);
+ return this;
+ }
+
+ public AuthUserEntity email(String email) {
+ setEmail(email);
+ return this;
+ }
+
+ public AuthUserEntity emailConfirmed(boolean emailConfirmed) {
+ setEmailConfirmed(emailConfirmed);
+ return this;
+ }
+
+ public AuthUserEntity phone(String phone) {
+ setPhone(phone);
+ return this;
+ }
+
+ public AuthUserEntity phoneConfirmed(boolean phoneConfirmed) {
+ setPhoneConfirmed(phoneConfirmed);
+ return this;
+ }
+
+ public AuthUserEntity name(String name) {
+ setName(name);
+ return this;
+ }
+
+ // relations
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserFields.java b/src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserFields.java
new file mode 100644
index 0000000..d5ae3f8
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserFields.java
@@ -0,0 +1,163 @@
+/*
+ */
+package io.kumare.iqr.mod.authentication.store.authuser;
+
+// java
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+// base
+import io.kumare.lib.app.api.store.EntityFieldDescriptor;
+import io.kumare.lib.base.server.spring.store.jpa.EntityDescriptor;
+// app
+
+
+/**
+ *
+ * @author afatecha
+ */
+public enum AuthUserFields implements EntityFieldDescriptor {
+
+ id(MAIN, FIND, LIST),
+ externalId(MAIN, FIND, LIST),
+ entityKey(MAIN, FIND, LIST),
+ custom(MAIN, FIND, LIST),
+ visible(MAIN, FIND, LIST),
+ email(MAIN, FIND, LIST),
+ emailConfirmed(MAIN, FIND, LIST),
+ phone(MAIN, FIND, LIST),
+ phoneConfirmed(MAIN, FIND, LIST),
+ name(MAIN, FIND, LIST),
+ active(MAIN, FIND, LIST),
+ inserted(AUDIT, FIND, LIST),
+ inserter(AUDIT, FIND, LIST),
+ modified(AUDIT, FIND),
+ modifier(AUDIT, FIND),
+ deleted(AUDIT),
+ removed(AUDIT),
+ remover(AUDIT);
+
+ // ::: vars
+ //
+ private final boolean relation;
+ private final EntityDescriptor entityDescriptor;
+ private final Class enumClass;
+ private final List groups;
+
+ // ::: constructors
+ //
+ AuthUserFields(String... groups) {
+ this(false, null, null, groups);
+ }
+
+ AuthUserFields(EntityDescriptor entityDescriptor, Class enumClass, String... groups) {
+ this(true, entityDescriptor, enumClass, groups);
+ }
+
+ AuthUserFields(boolean relation, EntityDescriptor entityDescriptor, Class enumClass, String... groups) {
+ this.relation = relation;
+ this.entityDescriptor = entityDescriptor;
+ this.enumClass = enumClass;
+ this.groups = groups == null ? Collections.EMPTY_LIST : Arrays.asList(groups);
+ }
+
+ // ::: api
+ //
+ @Override
+ public String getName() {
+ return name();
+ }
+
+ @Override
+ public boolean isRelation() {
+ return relation;
+ }
+
+ @Override
+ public Class getRelationEnumClass() {
+ return enumClass;
+ }
+
+ @Override
+ public List getGroups() {
+ return groups;
+ }
+
+ @Override
+ public EntityDescriptor getEntityDescriptor() {
+ return entityDescriptor;
+ }
+
+ @Override
+ public Object fetchValue(AuthUserEntity entity) {
+ if (entity == null) {
+ return null;
+ }
+
+ switch (this) {
+ case null -> {
+ return null;
+ }
+ case id -> {
+ return entity.getId();
+ }
+ case externalId ->{
+ return entity.getExternalId();
+ }
+ case entityKey ->{
+ return entity.getEntityKey();
+ }
+ case custom ->{
+ return entity.isCustom();
+ }
+ case visible ->{
+ return entity.isVisible();
+ }
+ case email ->{
+ return entity.getEmail();
+ }
+ case emailConfirmed ->{
+ return entity.isEmailConfirmed();
+ }
+ case phone ->{
+ return entity.getPhone();
+ }
+ case phoneConfirmed ->{
+ return entity.isPhoneConfirmed();
+ }
+ case name ->{
+ return entity.getName();
+ }
+ case active -> {
+ return entity.isActive();
+ }
+ case inserted -> {
+ return entity.getInserted();
+ }
+ case inserter -> {
+ return entity.getInserter();
+ }
+ case modified -> {
+ return entity.getModified();
+ }
+ case modifier -> {
+ return entity.getModifier();
+ }
+ case deleted -> {
+ return entity.isDeleted();
+ }
+ case removed -> {
+ return entity.getRemoved();
+ }
+ case remover -> {
+ return entity.getRemover();
+ }
+
+ default -> {
+ return null;
+ }
+ }
+
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserMapBuilder.java b/src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserMapBuilder.java
new file mode 100644
index 0000000..8c9865a
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserMapBuilder.java
@@ -0,0 +1,93 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.store.authuser;
+
+// java
+import java.util.List;
+import java.util.Map;
+// base
+import io.kumare.lib.app.api.Context;
+import io.kumare.lib.app.api.store.EntityFieldDescriptor;
+import io.kumare.lib.base.server.spring.store.jpa.BaseEntityMapBuilder;
+// app
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserMapBuilder extends BaseEntityMapBuilder {
+
+ // ::: vars
+ //
+
+
+
+ // ::: fields
+ //
+ @Override
+ public AuthUserMapBuilder addGroup(String name, boolean cascade) {
+ includes.addAll(EntityFieldDescriptor.group(AuthUserFields.values(), name));
+
+ return this;
+ }
+
+ @Override
+ public AuthUserMapBuilder add(String fieldName) {
+ includes.add(AuthUserFields.valueOf(fieldName));
+ return this;
+ }
+
+ @Override
+ public AuthUserMapBuilder addAll(String... names) {
+ for (var i : names) {
+ includes.add(AuthUserFields.valueOf(i));
+ }
+ return this;
+ }
+
+ @Override
+ public AuthUserMapBuilder remove(String fieldName) {
+ excludes.add(AuthUserFields.valueOf(fieldName));
+ return this;
+ }
+
+ @Override
+ public AuthUserMapBuilder removeAll(String... names) {
+ for (var i : names) {
+ excludes.add(AuthUserFields.valueOf(i));
+ }
+ return this;
+ }
+
+ // ::: relations
+ //
+ @Override
+ public AuthUserMapBuilder addPlains(boolean cascade) {
+ includes.addAll(EntityFieldDescriptor.plains(AuthUserFields.values()));
+
+ return this;
+ }
+
+ @Override
+ public AuthUserMapBuilder addRelations(boolean cascade) {
+ includes.addAll(EntityFieldDescriptor.relations(AuthUserFields.values()));
+
+ return this;
+ }
+
+
+
+ // ::: internals
+ //
+ @Override
+ protected void internalAttachRelations(Context context,
+ AuthUserEntity entity,
+ List fields,
+ Map resultMap) {
+
+
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserRepository.java b/src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserRepository.java
new file mode 100644
index 0000000..16ce227
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserRepository.java
@@ -0,0 +1,18 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.store.authuser;
+
+// spring
+import org.springframework.stereotype.Repository;
+// base
+import io.kumare.iqr.app.store.*;
+
+/**
+ *
+ * @author afatecha
+ */
+@Repository
+public interface AuthUserRepository extends AppKeyEntityRepository{
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserStore.java b/src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserStore.java
new file mode 100644
index 0000000..5e900d4
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/store/authuser/AuthUserStore.java
@@ -0,0 +1,35 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.store.authuser;
+
+// spring
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+// base
+import io.kumare.iqr.app.store.*;
+
+/**
+ *
+ * @author afatecha
+ */
+@Service
+public class AuthUserStore extends AppKeyEntityStore {
+
+ // ::: vars
+ //
+ @Autowired
+ private AuthUserRepository repository;
+
+ // ::: override
+ //
+ @Override
+ public AuthUserRepository getRepository() {
+ return repository;
+ }
+
+ // ::: api
+ //
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationData.java b/src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationData.java
new file mode 100644
index 0000000..7ad1af6
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationData.java
@@ -0,0 +1,25 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.store.authuserrelation;
+
+// base
+import io.kumare.iqr.app.store.AppExtendedEntityData;
+// imports
+
+
+public class AuthUserRelationData extends AppExtendedEntityData {
+
+ // ::: vars
+ //
+
+
+ // ::: fields
+ //
+
+
+ // ::: fluent
+ //
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationEntity.java b/src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationEntity.java
new file mode 100644
index 0000000..e0798b2
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationEntity.java
@@ -0,0 +1,153 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.store.authuserrelation;
+
+// jakarta
+import jakarta.persistence.Entity;
+import jakarta.persistence.FetchType;
+import jakarta.persistence.Index;
+import jakarta.persistence.ManyToOne;
+import jakarta.persistence.Table;
+// base
+import io.kumare.lib.app.api.store.*;
+import io.kumare.iqr.app.store.*;
+// imports
+
+// relations
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserEntity;
+
+// annotations
+@Entity
+@Table(
+ name = "auth_user_relation",
+ indexes = {
+ @Index(name = "idx_auth_user_relation_external_id", columnList = "externalId"),
+ @Index(name = "idx_auth_user_relation_user_key", columnList = "userKey"),
+ @Index(name = "idx_auth_user_relation_type_value", columnList = "typeValue"),
+ @Index(name = "idx_auth_user_relation_resource_type", columnList = "resourceType"),
+ @Index(name = "idx_auth_user_relation_resource_key", columnList = "resourceKey"),
+ @Index(name = "idx_auth_user_relation_resource_id", columnList = "resourceId")
+ }
+)
+public class AuthUserRelationEntity extends AppEntity {
+
+ // ::: vars
+ //
+ private String externalId;
+ private String userKey;
+ private String typeValue;
+ private String resourceType;
+ private String resourceKey;
+ private String resourceId;
+ // relations
+ @ManyToOne(fetch = FetchType.LAZY)
+ private AuthUserEntity authUser;
+
+ // ::: constructors
+ //
+ public AuthUserRelationEntity() {
+ }
+
+ public AuthUserRelationEntity(String id) {
+ super(id);
+ }
+
+ // ::: fields
+ //
+ public String getExternalId() {
+ return externalId;
+ }
+
+ public void setExternalId(String externalId) {
+ this.externalId = externalId;
+ }
+
+ public String getUserKey() {
+ return userKey;
+ }
+
+ public void setUserKey(String userKey) {
+ this.userKey = userKey;
+ }
+
+ public String getTypeValue() {
+ return typeValue;
+ }
+
+ public void setTypeValue(String typeValue) {
+ this.typeValue = typeValue;
+ }
+
+ public String getResourceType() {
+ return resourceType;
+ }
+
+ public void setResourceType(String resourceType) {
+ this.resourceType = resourceType;
+ }
+
+ public String getResourceKey() {
+ return resourceKey;
+ }
+
+ public void setResourceKey(String resourceKey) {
+ this.resourceKey = resourceKey;
+ }
+
+ public String getResourceId() {
+ return resourceId;
+ }
+
+ public void setResourceId(String resourceId) {
+ this.resourceId = resourceId;
+ }
+
+ // relations
+ public AuthUserEntity getAuthUser() {
+ return authUser;
+ }
+
+ public void setAuthUser(AuthUserEntity authUser) {
+ this.authUser = authUser;
+ }
+
+ // ::: fluent
+ //
+ public AuthUserRelationEntity externalId(String externalId) {
+ setExternalId(externalId);
+ return this;
+ }
+
+ public AuthUserRelationEntity userKey(String userKey) {
+ setUserKey(userKey);
+ return this;
+ }
+
+ public AuthUserRelationEntity typeValue(String typeValue) {
+ setTypeValue(typeValue);
+ return this;
+ }
+
+ public AuthUserRelationEntity resourceType(String resourceType) {
+ setResourceType(resourceType);
+ return this;
+ }
+
+ public AuthUserRelationEntity resourceKey(String resourceKey) {
+ setResourceKey(resourceKey);
+ return this;
+ }
+
+ public AuthUserRelationEntity resourceId(String resourceId) {
+ setResourceId(resourceId);
+ return this;
+ }
+
+ // relations
+ public AuthUserRelationEntity authUser(AuthUserEntity authUser) {
+ setAuthUser(authUser);
+ return this;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationFields.java b/src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationFields.java
new file mode 100644
index 0000000..ec93337
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationFields.java
@@ -0,0 +1,155 @@
+/*
+ */
+package io.kumare.iqr.mod.authentication.store.authuserrelation;
+
+// java
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+// base
+import io.kumare.lib.app.api.store.EntityFieldDescriptor;
+import io.kumare.lib.base.server.spring.store.jpa.EntityDescriptor;
+// app
+import io.kumare.iqr.mod.authentication.store.AuthenticationEntities;
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserFields;
+
+/**
+ *
+ * @author afatecha
+ */
+public enum AuthUserRelationFields implements EntityFieldDescriptor {
+
+ id(MAIN, FIND, LIST),
+ externalId(MAIN, FIND, LIST),
+ userKey(MAIN, FIND, LIST),
+ typeValue(MAIN, FIND, LIST),
+ resourceType(MAIN, FIND, LIST),
+ resourceKey(MAIN, FIND, LIST),
+ resourceId(MAIN, FIND, LIST),
+ active(MAIN, FIND, LIST),
+ inserted(AUDIT, FIND, LIST),
+ inserter(AUDIT, FIND, LIST),
+ modified(AUDIT, FIND),
+ modifier(AUDIT, FIND),
+ deleted(AUDIT),
+ removed(AUDIT),
+ remover(AUDIT),
+ authUser(AuthenticationEntities.authUser, AuthUserFields.class, FIND, LIST);
+
+ // ::: vars
+ //
+ private final boolean relation;
+ private final EntityDescriptor entityDescriptor;
+ private final Class enumClass;
+ private final List groups;
+
+ // ::: constructors
+ //
+ AuthUserRelationFields(String... groups) {
+ this(false, null, null, groups);
+ }
+
+ AuthUserRelationFields(EntityDescriptor entityDescriptor, Class enumClass, String... groups) {
+ this(true, entityDescriptor, enumClass, groups);
+ }
+
+ AuthUserRelationFields(boolean relation, EntityDescriptor entityDescriptor, Class enumClass, String... groups) {
+ this.relation = relation;
+ this.entityDescriptor = entityDescriptor;
+ this.enumClass = enumClass;
+ this.groups = groups == null ? Collections.EMPTY_LIST : Arrays.asList(groups);
+ }
+
+ // ::: api
+ //
+ @Override
+ public String getName() {
+ return name();
+ }
+
+ @Override
+ public boolean isRelation() {
+ return relation;
+ }
+
+ @Override
+ public Class getRelationEnumClass() {
+ return enumClass;
+ }
+
+ @Override
+ public List getGroups() {
+ return groups;
+ }
+
+ @Override
+ public EntityDescriptor getEntityDescriptor() {
+ return entityDescriptor;
+ }
+
+ @Override
+ public Object fetchValue(AuthUserRelationEntity entity) {
+ if (entity == null) {
+ return null;
+ }
+
+ switch (this) {
+ case null -> {
+ return null;
+ }
+ case id -> {
+ return entity.getId();
+ }
+ case externalId ->{
+ return entity.getExternalId();
+ }
+ case userKey ->{
+ return entity.getUserKey();
+ }
+ case typeValue ->{
+ return entity.getTypeValue();
+ }
+ case resourceType ->{
+ return entity.getResourceType();
+ }
+ case resourceKey ->{
+ return entity.getResourceKey();
+ }
+ case resourceId ->{
+ return entity.getResourceId();
+ }
+ case active -> {
+ return entity.isActive();
+ }
+ case inserted -> {
+ return entity.getInserted();
+ }
+ case inserter -> {
+ return entity.getInserter();
+ }
+ case modified -> {
+ return entity.getModified();
+ }
+ case modifier -> {
+ return entity.getModifier();
+ }
+ case deleted -> {
+ return entity.isDeleted();
+ }
+ case removed -> {
+ return entity.getRemoved();
+ }
+ case remover -> {
+ return entity.getRemover();
+ }
+ case authUser ->{
+ return entity.getAuthUser();
+ }
+ default -> {
+ return null;
+ }
+ }
+
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationMapBuilder.java b/src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationMapBuilder.java
new file mode 100644
index 0000000..94307c5
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationMapBuilder.java
@@ -0,0 +1,139 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.store.authuserrelation;
+
+// java
+import java.util.List;
+import java.util.Map;
+// base
+import io.kumare.lib.app.api.Context;
+import io.kumare.lib.app.api.store.EntityFieldDescriptor;
+import io.kumare.lib.base.server.spring.store.jpa.BaseEntityMapBuilder;
+// app
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserMapBuilder;
+
+/**
+ *
+ * @author afatecha
+ */
+public class AuthUserRelationMapBuilder extends BaseEntityMapBuilder {
+
+ // ::: vars
+ //
+ private AuthUserMapBuilder authUserBuilder;
+
+
+ // ::: fields
+ //
+ @Override
+ public AuthUserRelationMapBuilder addGroup(String name, boolean cascade) {
+ includes.addAll(EntityFieldDescriptor.group(AuthUserRelationFields.values(), name));
+
+ if(cascade) {
+ if (includes.contains(AuthUserRelationFields.authUser)) {
+ getAuthUserBuilder().addGroup(name);
+ }
+ }
+ return this;
+ }
+
+ @Override
+ public AuthUserRelationMapBuilder add(String fieldName) {
+ includes.add(AuthUserRelationFields.valueOf(fieldName));
+ return this;
+ }
+
+ @Override
+ public AuthUserRelationMapBuilder addAll(String... names) {
+ for (var i : names) {
+ includes.add(AuthUserRelationFields.valueOf(i));
+ }
+ return this;
+ }
+
+ @Override
+ public AuthUserRelationMapBuilder remove(String fieldName) {
+ excludes.add(AuthUserRelationFields.valueOf(fieldName));
+ return this;
+ }
+
+ @Override
+ public AuthUserRelationMapBuilder removeAll(String... names) {
+ for (var i : names) {
+ excludes.add(AuthUserRelationFields.valueOf(i));
+ }
+ return this;
+ }
+
+ // ::: relations
+ //
+ @Override
+ public AuthUserRelationMapBuilder addPlains(boolean cascade) {
+ includes.addAll(EntityFieldDescriptor.plains(AuthUserRelationFields.values()));
+
+ if(cascade) {
+ if (includes.contains(AuthUserRelationFields.authUser)) {
+ getAuthUserBuilder().addPlains();
+ }
+ }
+ return this;
+ }
+
+ @Override
+ public AuthUserRelationMapBuilder addRelations(boolean cascade) {
+ includes.addAll(EntityFieldDescriptor.relations(AuthUserRelationFields.values()));
+
+ if(cascade) {
+ if (includes.contains(AuthUserRelationFields.authUser)) {
+ getAuthUserBuilder().addRelations();
+ }
+ }
+ return this;
+ }
+
+ // ::: auth user
+ //
+ public AuthUserRelationMapBuilder addAuthUser() {
+ return addAuthUser(null);
+ }
+
+ public AuthUserRelationMapBuilder addAuthUser(String group) {
+ return addAuthUser(group, false);
+ }
+
+ public AuthUserRelationMapBuilder addAuthUser(String group, boolean cascade) {
+ includes.add(AuthUserRelationFields.authUser);
+
+ if (group != null) {
+ getAuthUserBuilder().addGroup(group);
+ }
+
+ return this;
+ }
+
+ public AuthUserMapBuilder getAuthUserBuilder() {
+ if(authUserBuilder == null) {
+ authUserBuilder = new AuthUserMapBuilder();
+ }
+ return authUserBuilder;
+ }
+
+ // ::: internals
+ //
+ @Override
+ protected void internalAttachRelations(Context context,
+ AuthUserRelationEntity entity,
+ List fields,
+ Map resultMap) {
+
+ if (fields.contains(AuthUserRelationFields.authUser)) {
+ attachRelation(context,
+ entity,
+ AuthUserRelationFields.authUser,
+ getAuthUserBuilder(),
+ resultMap);
+ }
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationRepository.java b/src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationRepository.java
new file mode 100644
index 0000000..4a46242
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationRepository.java
@@ -0,0 +1,18 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.store.authuserrelation;
+
+// spring
+import org.springframework.stereotype.Repository;
+// base
+import io.kumare.iqr.app.store.*;
+
+/**
+ *
+ * @author afatecha
+ */
+@Repository
+public interface AuthUserRelationRepository extends AppEntityRepository{
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationStore.java b/src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationStore.java
new file mode 100644
index 0000000..393c0f0
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/authentication/store/authuserrelation/AuthUserRelationStore.java
@@ -0,0 +1,35 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.authentication.store.authuserrelation;
+
+// spring
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+// base
+import io.kumare.iqr.app.store.*;
+
+/**
+ *
+ * @author afatecha
+ */
+@Service
+public class AuthUserRelationStore extends AppEntityStore {
+
+ // ::: vars
+ //
+ @Autowired
+ private AuthUserRelationRepository repository;
+
+ // ::: override
+ //
+ @Override
+ public AuthUserRelationRepository getRepository() {
+ return repository;
+ }
+
+ // ::: api
+ //
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/BizConstants.java b/src/main/java/io/kumare/iqr/mod/biz/BizConstants.java
new file mode 100644
index 0000000..0d4e317
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/BizConstants.java
@@ -0,0 +1,20 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz;
+
+// base
+import io.kumare.iqr.app.AppConstants;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BizConstants {
+
+ // ::: codes
+ //
+ public static final int CODE = AppConstants.BIZ_CODE;
+ public static final String NAME = "biz";
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/BizController.java b/src/main/java/io/kumare/iqr/mod/biz/BizController.java
new file mode 100644
index 0000000..c932f3c
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/BizController.java
@@ -0,0 +1,87 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz;
+
+// java
+import io.kumare.iqr.mod.biz.store.BizEntities;
+import java.util.Arrays;
+import java.util.List;
+// base
+import io.kumare.lib.base.server.spring.store.jpa.EntityDescriptor;
+// app
+import io.kumare.iqr.app.module.AppModuleController;
+// module
+import io.kumare.iqr.mod.biz.store.business.BusinessStore;
+import io.kumare.iqr.mod.biz.store.businessprofile.BusinessProfileStore;
+import io.kumare.iqr.mod.biz.store.businesssetting.BusinessSettingStore;
+import io.kumare.iqr.mod.biz.store.businesspromo.BusinessPromoStore;
+import io.kumare.iqr.mod.biz.store.businesspromoitem.BusinessPromoItemStore;
+import io.kumare.iqr.mod.biz.store.businessimage.BusinessImageStore;
+import io.kumare.iqr.mod.biz.store.businessworker.BusinessWorkerStore;
+import io.kumare.iqr.mod.biz.store.businesstag.BusinessTagStore;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BizController extends AppModuleController {
+
+ // ::: api
+ //
+ @Override
+ public boolean hasStore(String name) {
+ return BizEntities.hasDescriptor(name);
+ }
+
+ @Override
+ public EntityDescriptor getEntityDescriptor(Class entityClass) {
+ return BizEntities.descriptorOf(entityClass);
+ }
+
+ @Override
+ public EntityDescriptor getEntityDescriptor(String name) {
+ return BizEntities.descriptorOf(name);
+ }
+
+ @Override
+ public List getEntityDescriptors() {
+ return Arrays.asList(BizEntities.values());
+ }
+
+ // ::: stores
+ //
+ public BusinessStore getBusinessStore() {
+ return getService(BusinessStore.class);
+ }
+
+ public BusinessProfileStore getBusinessProfileStore() {
+ return getService(BusinessProfileStore.class);
+ }
+
+ public BusinessSettingStore getBusinessSettingStore() {
+ return getService(BusinessSettingStore.class);
+ }
+
+ public BusinessPromoStore getBusinessPromoStore() {
+ return getService(BusinessPromoStore.class);
+ }
+
+ public BusinessPromoItemStore getBusinessPromoItemStore() {
+ return getService(BusinessPromoItemStore.class);
+ }
+
+ public BusinessImageStore getBusinessImageStore() {
+ return getService(BusinessImageStore.class);
+ }
+
+ public BusinessWorkerStore getBusinessWorkerStore() {
+ return getService(BusinessWorkerStore.class);
+ }
+
+ public BusinessTagStore getBusinessTagStore() {
+ return getService(BusinessTagStore.class);
+ }
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/BizErrors.java b/src/main/java/io/kumare/iqr/mod/biz/BizErrors.java
new file mode 100644
index 0000000..ab9a2da
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/BizErrors.java
@@ -0,0 +1,165 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz;
+
+// java
+import java.util.HashMap;
+import java.util.Map;
+// lib
+import io.kumare.lib.transport.TransportCode;
+import static io.kumare.lib.transport.Transports.code;
+import io.kumare.lib.v.ExceptionPrototype;
+// app
+import io.kumare.iqr.app.AppException;
+import io.kumare.iqr.app.endpoint.AppTransports;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public enum BizErrors implements ExceptionPrototype {
+
+
+ // business
+ business_notfound(1, code(AppTransports.http, 400)),
+ business_data_notfound(1, code(AppTransports.http, 400)),
+ business_preload_empty(1, code(AppTransports.http, 400)),
+ business_entitykey_empty(1, code(AppTransports.http, 400)),
+ business_alias_empty(1, code(AppTransports.http, 400)),
+ business_statevalue_empty(1, code(AppTransports.http, 400)),
+ business_name_empty(1, code(AppTransports.http, 400)),
+ business_description_empty(1, code(AppTransports.http, 400)),
+ business_logo_notfound(1, code(AppTransports.http, 400)),
+ business_state_notfound(1, code(AppTransports.http, 400)),
+
+ // business profile
+ businessprofile_notfound(1, code(AppTransports.http, 400)),
+ businessprofile_data_notfound(1, code(AppTransports.http, 400)),
+ businessprofile_preload_empty(1, code(AppTransports.http, 400)),
+ businessprofile_activityvalue_empty(1, code(AppTransports.http, 400)),
+ businessprofile_gpslatitude_empty(1, code(AppTransports.http, 400)),
+ businessprofile_gpslongitude_empty(1, code(AppTransports.http, 400)),
+ businessprofile_website_empty(1, code(AppTransports.http, 400)),
+ businessprofile_phone_empty(1, code(AppTransports.http, 400)),
+ businessprofile_address_empty(1, code(AppTransports.http, 400)),
+ businessprofile_extrainfo_empty(1, code(AppTransports.http, 400)),
+ businessprofile_description_empty(1, code(AppTransports.http, 400)),
+ businessprofile_business_notfound(1, code(AppTransports.http, 400)),
+ businessprofile_image_notfound(1, code(AppTransports.http, 400)),
+ businessprofile_activity_notfound(1, code(AppTransports.http, 400)),
+
+ // business setting
+ businesssetting_notfound(1, code(AppTransports.http, 400)),
+ businesssetting_data_notfound(1, code(AppTransports.http, 400)),
+ businesssetting_preload_empty(1, code(AppTransports.http, 400)),
+ businesssetting_pointexchange_empty(1, code(AppTransports.http, 400)),
+ businesssetting_leadcapturereward_empty(1, code(AppTransports.http, 400)),
+ businesssetting_customercapturereward_empty(1, code(AppTransports.http, 400)),
+ businesssetting_business_notfound(1, code(AppTransports.http, 400)),
+
+ // business promo
+ businesspromo_notfound(1, code(AppTransports.http, 400)),
+ businesspromo_data_notfound(1, code(AppTransports.http, 400)),
+ businesspromo_preload_empty(1, code(AppTransports.http, 400)),
+ businesspromo_statevalue_empty(1, code(AppTransports.http, 400)),
+ businesspromo_started_empty(1, code(AppTransports.http, 400)),
+ businesspromo_ended_empty(1, code(AppTransports.http, 400)),
+ businesspromo_schedulestart_empty(1, code(AppTransports.http, 400)),
+ businesspromo_scheduleend_empty(1, code(AppTransports.http, 400)),
+ businesspromo_title_empty(1, code(AppTransports.http, 400)),
+ businesspromo_bodyinfo_empty(1, code(AppTransports.http, 400)),
+ businesspromo_footerinfo_empty(1, code(AppTransports.http, 400)),
+ businesspromo_business_notfound(1, code(AppTransports.http, 400)),
+ businesspromo_image_notfound(1, code(AppTransports.http, 400)),
+ businesspromo_state_notfound(1, code(AppTransports.http, 400)),
+
+ // business promo item
+ businesspromoitem_notfound(1, code(AppTransports.http, 400)),
+ businesspromoitem_data_notfound(1, code(AppTransports.http, 400)),
+ businesspromoitem_preload_empty(1, code(AppTransports.http, 400)),
+ businesspromoitem_title_empty(1, code(AppTransports.http, 400)),
+ businesspromoitem_description_empty(1, code(AppTransports.http, 400)),
+ businesspromoitem_points_empty(1, code(AppTransports.http, 400)),
+ businesspromoitem_condition_empty(1, code(AppTransports.http, 400)),
+ businesspromoitem_business_notfound(1, code(AppTransports.http, 400)),
+ businesspromoitem_promo_notfound(1, code(AppTransports.http, 400)),
+ businesspromoitem_image_notfound(1, code(AppTransports.http, 400)),
+
+ // business image
+ businessimage_notfound(1, code(AppTransports.http, 400)),
+ businessimage_data_notfound(1, code(AppTransports.http, 400)),
+ businessimage_preload_empty(1, code(AppTransports.http, 400)),
+ businessimage_typevalue_empty(1, code(AppTransports.http, 400)),
+ businessimage_bytes_empty(1, code(AppTransports.http, 400)),
+ businessimage_business_notfound(1, code(AppTransports.http, 400)),
+ businessimage_type_notfound(1, code(AppTransports.http, 400)),
+
+ // business worker
+ businessworker_notfound(1, code(AppTransports.http, 400)),
+ businessworker_data_notfound(1, code(AppTransports.http, 400)),
+ businessworker_preload_empty(1, code(AppTransports.http, 400)),
+ businessworker_entitykey_empty(1, code(AppTransports.http, 400)),
+ businessworker_rolevalue_empty(1, code(AppTransports.http, 400)),
+ businessworker_statevalue_empty(1, code(AppTransports.http, 400)),
+ businessworker_email_empty(1, code(AppTransports.http, 400)),
+ businessworker_phone_empty(1, code(AppTransports.http, 400)),
+ businessworker_name_empty(1, code(AppTransports.http, 400)),
+ businessworker_description_empty(1, code(AppTransports.http, 400)),
+ businessworker_business_notfound(1, code(AppTransports.http, 400)),
+ businessworker_authuser_notfound(1, code(AppTransports.http, 400)),
+ businessworker_role_notfound(1, code(AppTransports.http, 400)),
+ businessworker_state_notfound(1, code(AppTransports.http, 400)),
+
+ // business tag
+ businesstag_notfound(1, code(AppTransports.http, 400)),
+ businesstag_data_notfound(1, code(AppTransports.http, 400)),
+ businesstag_preload_empty(1, code(AppTransports.http, 400)),
+ businesstag_entitykey_empty(1, code(AppTransports.http, 400)),
+ businesstag_name_empty(1, code(AppTransports.http, 400));
+
+ // ::: vars
+ //
+ private final Map transportCodes = new HashMap();
+ private final int code;
+
+ // ::: constructors
+ //
+ private BizErrors(int code, TransportCode... codes) {
+ this.code = code;
+ if (codes != null) {
+ for (var i : codes) {
+ if (i != null) {
+ transportCodes.put(i.getId(), i.getCode());
+ }
+ }
+ }
+ }
+
+ // ::: prototype api
+ //
+ @Override
+ public int getCode() {
+ return code;
+ }
+
+ @Override
+ public String getName() {
+ return name();
+ }
+
+ @Override
+ public Map getTransportCodes() {
+ return transportCodes;
+ }
+
+ @Override
+ public RuntimeException newInstance(String msg, Throwable cause, Map extra) {
+ var ex = new AppException(this, msg, cause);
+ ex.setExtra(extra);
+ return ex;
+ }
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/BizModule.java b/src/main/java/io/kumare/iqr/mod/biz/BizModule.java
new file mode 100644
index 0000000..a2191c5
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/BizModule.java
@@ -0,0 +1,37 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz;
+
+// java
+import io.kumare.lib.base.server.spring.module.BaseModule;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BizModule extends BaseModule {
+
+ // :::
+ //
+ public static final BizController controller = new BizController();
+
+ // ::: api
+ //
+ @Override
+ public int getId() {
+ return BizConstants.CODE;
+ }
+
+ @Override
+ public String getName() {
+ return BizConstants.NAME;
+ }
+
+ @Override
+ public BizController getController() {
+ return controller;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/BizPermissions.java b/src/main/java/io/kumare/iqr/mod/biz/BizPermissions.java
new file mode 100644
index 0000000..a554fd9
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/BizPermissions.java
@@ -0,0 +1,198 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz;
+
+// base
+import io.kumare.iqr.mod.biz.store.BizEntities;
+import io.kumare.lib.app.api.security.PermissionReference;
+// app
+import io.kumare.iqr.app.AppErrors;
+
+/**
+ *
+ * @author afatecha
+ */
+public enum BizPermissions {
+
+ // business
+ //business_add(BizEntities.business),
+ //business_edit(BizEntities.business),
+ //business_find(BizEntities.business),
+ //business_enable(BizEntities.business),
+ //business_disable(BizEntities.business),
+ //business_list(BizEntities.business),
+ //business_delete(BizEntities.business),
+ //business_preload(BizEntities.business),
+ //
+ business_viewer(BizEntities.business),
+ //business_guest(BizEntities.business),
+ //business_collab(BizEntities.business),
+ business_worker(BizEntities.business),
+ //business_control(BizEntities.business),
+ business_manager(BizEntities.business),
+ business_admin(null),
+ business_system(null),
+
+ // business profile
+ //business_profile_add(BizEntities.businessProfile),
+ //business_profile_edit(BizEntities.businessProfile),
+ //business_profile_find(BizEntities.businessProfile),
+ //business_profile_enable(BizEntities.businessProfile),
+ //business_profile_disable(BizEntities.businessProfile),
+ //business_profile_list(BizEntities.businessProfile),
+ //business_profile_delete(BizEntities.businessProfile),
+ //business_profile_preload(BizEntities.businessProfile),
+ //
+ business_profile_viewer(BizEntities.businessProfile),
+ //business_profile_guest(BizEntities.businessProfile),
+ //business_profile_collab(BizEntities.businessProfile),
+ business_profile_worker(BizEntities.businessProfile),
+ //business_profile_control(BizEntities.businessProfile),
+ business_profile_manager(BizEntities.businessProfile),
+ business_profile_admin(null),
+ business_profile_system(null),
+
+ // business setting
+ //business_setting_add(BizEntities.businessSetting),
+ //business_setting_edit(BizEntities.businessSetting),
+ //business_setting_find(BizEntities.businessSetting),
+ //business_setting_enable(BizEntities.businessSetting),
+ //business_setting_disable(BizEntities.businessSetting),
+ //business_setting_list(BizEntities.businessSetting),
+ //business_setting_delete(BizEntities.businessSetting),
+ //business_setting_preload(BizEntities.businessSetting),
+ //
+ business_setting_viewer(BizEntities.businessSetting),
+ //business_setting_guest(BizEntities.businessSetting),
+ //business_setting_collab(BizEntities.businessSetting),
+ business_setting_worker(BizEntities.businessSetting),
+ //business_setting_control(BizEntities.businessSetting),
+ business_setting_manager(BizEntities.businessSetting),
+ business_setting_admin(null),
+ business_setting_system(null),
+
+ // business promo
+ //business_promo_add(BizEntities.businessPromo),
+ //business_promo_edit(BizEntities.businessPromo),
+ //business_promo_find(BizEntities.businessPromo),
+ //business_promo_enable(BizEntities.businessPromo),
+ //business_promo_disable(BizEntities.businessPromo),
+ //business_promo_list(BizEntities.businessPromo),
+ //business_promo_delete(BizEntities.businessPromo),
+ //business_promo_preload(BizEntities.businessPromo),
+ //
+ business_promo_viewer(BizEntities.businessPromo),
+ //business_promo_guest(BizEntities.businessPromo),
+ //business_promo_collab(BizEntities.businessPromo),
+ business_promo_worker(BizEntities.businessPromo),
+ //business_promo_control(BizEntities.businessPromo),
+ business_promo_manager(BizEntities.businessPromo),
+ business_promo_admin(null),
+ business_promo_system(null),
+
+ // business promo item
+ //business_promo_item_add(BizEntities.businessPromoItem),
+ //business_promo_item_edit(BizEntities.businessPromoItem),
+ //business_promo_item_find(BizEntities.businessPromoItem),
+ //business_promo_item_enable(BizEntities.businessPromoItem),
+ //business_promo_item_disable(BizEntities.businessPromoItem),
+ //business_promo_item_list(BizEntities.businessPromoItem),
+ //business_promo_item_delete(BizEntities.businessPromoItem),
+ //business_promo_item_preload(BizEntities.businessPromoItem),
+ //
+ business_promo_item_viewer(BizEntities.businessPromoItem),
+ //business_promo_item_guest(BizEntities.businessPromoItem),
+ //business_promo_item_collab(BizEntities.businessPromoItem),
+ business_promo_item_worker(BizEntities.businessPromoItem),
+ //business_promo_item_control(BizEntities.businessPromoItem),
+ business_promo_item_manager(BizEntities.businessPromoItem),
+ business_promo_item_admin(null),
+ business_promo_item_system(null),
+
+ // business image
+ //business_image_add(BizEntities.businessImage),
+ //business_image_edit(BizEntities.businessImage),
+ //business_image_find(BizEntities.businessImage),
+ //business_image_enable(BizEntities.businessImage),
+ //business_image_disable(BizEntities.businessImage),
+ //business_image_list(BizEntities.businessImage),
+ //business_image_delete(BizEntities.businessImage),
+ //business_image_preload(BizEntities.businessImage),
+ //
+ business_image_viewer(BizEntities.businessImage),
+ //business_image_guest(BizEntities.businessImage),
+ //business_image_collab(BizEntities.businessImage),
+ business_image_worker(BizEntities.businessImage),
+ //business_image_control(BizEntities.businessImage),
+ business_image_manager(BizEntities.businessImage),
+ business_image_admin(null),
+ business_image_system(null),
+
+ // business worker
+ //business_worker_add(BizEntities.businessWorker),
+ //business_worker_edit(BizEntities.businessWorker),
+ //business_worker_find(BizEntities.businessWorker),
+ //business_worker_enable(BizEntities.businessWorker),
+ //business_worker_disable(BizEntities.businessWorker),
+ //business_worker_list(BizEntities.businessWorker),
+ //business_worker_delete(BizEntities.businessWorker),
+ //business_worker_preload(BizEntities.businessWorker),
+ //
+ business_worker_viewer(BizEntities.businessWorker),
+ //business_worker_guest(BizEntities.businessWorker),
+ //business_worker_collab(BizEntities.businessWorker),
+ business_worker_worker(BizEntities.businessWorker),
+ //business_worker_control(BizEntities.businessWorker),
+ business_worker_manager(BizEntities.businessWorker),
+ business_worker_admin(null),
+ business_worker_system(null),
+
+ // business tag
+ //business_tag_add(BizEntities.businessTag),
+ //business_tag_edit(BizEntities.businessTag),
+ //business_tag_find(BizEntities.businessTag),
+ //business_tag_enable(BizEntities.businessTag),
+ //business_tag_disable(BizEntities.businessTag),
+ //business_tag_list(BizEntities.businessTag),
+ //business_tag_delete(BizEntities.businessTag),
+ //business_tag_preload(BizEntities.businessTag),
+ //
+ business_tag_viewer(BizEntities.businessTag),
+ //business_tag_guest(BizEntities.businessTag),
+ //business_tag_collab(BizEntities.businessTag),
+ business_tag_worker(BizEntities.businessTag),
+ //business_tag_control(BizEntities.businessTag),
+ business_tag_manager(BizEntities.businessTag),
+ business_tag_admin(null),
+ business_tag_system(null);
+
+
+ // :::
+ //
+ private final BizEntities resourceType;
+
+ BizPermissions(BizEntities entityRef) {
+ this.resourceType = entityRef;
+ }
+
+ //
+ public PermissionReference toReference() {
+ return toReference(null);
+ }
+
+ public PermissionReference toReference(String resourceKey) {
+ var ref = new PermissionReference()
+ .module(BizConstants.NAME)
+ .permission(name())
+ .error(AppErrors.action_unauthorized);
+
+ if (resourceType != null && resourceKey != null) {
+ ref.resourceType(resourceType.name())
+ .resourceKey(resourceKey);
+ }
+
+ return ref;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessActionArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessActionArgument.java
new file mode 100644
index 0000000..027eee0
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessActionArgument.java
@@ -0,0 +1,29 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.business;
+
+// base
+import io.kumare.iqr.app.action.AppEntityActionArgument;
+// entity
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessActionArgument extends AppEntityActionArgument {
+
+ // ::: constructors
+ //
+ public BusinessActionArgument() {
+ }
+
+ public BusinessActionArgument(BusinessEntity entity) {
+ super(entity);
+ }
+
+ // ::: api
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessAddAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessAddAction.java
new file mode 100644
index 0000000..def4266
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessAddAction.java
@@ -0,0 +1,161 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.business;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+import io.kumare.iqr.mod.authentication.action.authuser.AuthUserAddArgument;
+import io.kumare.iqr.mod.authentication.store.authuser.AuthUserEntity;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+import io.kumare.iqr.mod.biz.action.businessprofile.BusinessProfileAddAction;
+import io.kumare.iqr.mod.biz.action.businessprofile.BusinessProfileAddArgument;
+import io.kumare.iqr.mod.biz.action.businesstag.BusinessTagAddAction;
+import io.kumare.iqr.mod.biz.action.businesstag.BusinessTagAddArgument;
+import io.kumare.iqr.mod.biz.action.businessworker.BusinessWorkerAddAction;
+import io.kumare.iqr.mod.biz.action.businessworker.BusinessWorkerAddArgument;
+import io.kumare.iqr.mod.biz.store.BizTaxonomies;
+import io.kumare.iqr.mod.biz.store.BizWorkerRoles;
+// entity
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+import io.kumare.iqr.mod.biz.store.businesstag.BusinessTagEntity;
+import io.kumare.iqr.mod.taxonomy.store.taxon.TaxonEntity;
+import io.kumare.lib.base.server.spring.action.Actions;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessAddAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, BizErrors.business_notfound);
+
+ // relations
+ //V.ifNull(model.getState(), BizErrors.business_state_notfound);
+ // fields
+ //V.ifEmpty(model.getEntityKey(), BizErrors.business_entitykey_empty);
+ //V.ifEmpty(model.getAlias(), BizErrors.business_alias_empty);
+ //V.ifEmpty(model.getStateValue(), BizErrors.business_statevalue_empty);
+ V.ifEmpty(model.getName(), BizErrors.business_name_empty);
+ //V.ifEmpty(model.getDescription(), BizErrors.business_description_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ // controllers
+ var state = BizTaxonomies.businessState.ensureDefault(getContext());
+
+ // model
+ var model = makeModel(state);
+
+ // add
+ entity = saveEntity(model);
+
+ // add others
+ addProfile(getArgument().getProfile());
+ addManager(getArgument().getManager());
+ addTags();
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private BusinessEntity makeModel(TaxonEntity state) {
+
+ var argModel = getArgument().getEntity();
+ var model = new BusinessEntity();
+
+ // relations
+ model.setState(state);
+ model.setStateValue(state.getValue());
+
+ // fields
+ model.setEntityKey(generateKey());
+ model.setAlias(argModel.getAlias());
+ model.setName(argModel.getName());
+ model.setDescription(argModel.getDescription());
+ model.setActive(true);
+
+ return model;
+ }
+
+ private String generateKey() {
+ return null;
+ }
+
+ // ::: save
+ //
+ private BusinessEntity saveEntity(BusinessEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessStore();
+
+ var saved = store.add(getContext(), model);
+ getContext().attach(saved.getId(), saved);
+ return saved;
+ }
+
+ // ::: adds
+ //
+ private void addProfile(BusinessProfileAddArgument argument) {
+ argument.getEntity().setBusiness(entity);
+ Actions.perform(getContext(), new BusinessProfileAddAction(), argument);
+ }
+
+ private void addManager(BusinessWorkerAddArgument argument) {
+
+ var worker = argument.getEntity();
+ worker
+ .business(entity)
+ .role(new TaxonEntity()
+ .taxaKey(BizTaxonomies.businessWorkerRole.getKey())
+ .entityKey(BizWorkerRoles.manager.getKey()));
+
+ var addUser = new AuthUserAddArgument();
+ addUser.entity(new AuthUserEntity()
+ .email(worker.getEmail())
+ .phone(worker.getPhone())
+ .name(worker.getName())
+ .visible(true)
+ .entityKey(worker.getEntityKey()));
+
+ argument.setAuthUser(addUser);
+
+ Actions.perform(getContext(), new BusinessWorkerAddAction(), argument);
+ }
+
+ private void addTags() {
+ var tags = BizTaxonomies.businessDefaultTag.list(getContext());
+
+ tags.forEach(i -> {
+ var arg = new BusinessTagAddArgument();
+ arg.entity(new BusinessTagEntity().name(i.getName()));
+ Actions.perform(getContext(), new BusinessTagAddAction(), arg);
+ });
+ }
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessAddArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessAddArgument.java
new file mode 100644
index 0000000..a8a84c9
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessAddArgument.java
@@ -0,0 +1,49 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.business;
+
+// app
+import io.kumare.iqr.mod.biz.action.businessprofile.BusinessProfileAddArgument;
+import io.kumare.iqr.mod.biz.action.businessworker.BusinessWorkerAddArgument;
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessAddArgument extends BusinessActionArgument {
+
+ // ::: vars
+ //
+ private BusinessProfileAddArgument profile;
+ private BusinessWorkerAddArgument manager;
+
+ // ::: constructors
+ //
+ public BusinessAddArgument() {
+ }
+
+ public BusinessAddArgument(BusinessEntity entity) {
+ super(entity);
+ }
+
+ // ::: fields
+ //
+ public BusinessProfileAddArgument getProfile() {
+ return profile;
+ }
+
+ public void setProfile(BusinessProfileAddArgument profile) {
+ this.profile = profile;
+ }
+
+ public BusinessWorkerAddArgument getManager() {
+ return manager;
+ }
+
+ public void setManager(BusinessWorkerAddArgument manager) {
+ this.manager = manager;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessDeleteAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessDeleteAction.java
new file mode 100644
index 0000000..97b46d9
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessDeleteAction.java
@@ -0,0 +1,59 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.business;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessDeleteAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.business_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.business_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var argModel = getArgument().getEntity();
+
+ deleteEntity(argModel);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ }
+
+ // ::: delete
+ //
+ private void deleteEntity(BusinessEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessStore();
+
+ store.deleteById(getContext(), model.getId());
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessEditAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessEditAction.java
new file mode 100644
index 0000000..1bf0cbd
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessEditAction.java
@@ -0,0 +1,110 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.business;
+
+// lib
+import io.kumare.lib.v.V;
+// app
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+import io.kumare.iqr.mod.biz.action.businessprofile.BusinessProfileEditAction;
+import io.kumare.iqr.mod.biz.action.businessprofile.BusinessProfileEditArgument;
+// entity
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+import io.kumare.lib.base.server.spring.action.Actions;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessEditAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, BizErrors.business_notfound);
+
+ // fields
+ //V.ifEmpty(model.getEntityKey(), BizErrors.business_entitykey_empty);
+ //V.ifEmpty(model.getAlias(), BizErrors.business_alias_empty);
+ //V.ifEmpty(model.getStateValue(), BizErrors.business_statevalue_empty);
+ //V.ifEmpty(model.getName(), BizErrors.business_name_empty);
+ //V.ifEmpty(model.getDescription(), BizErrors.business_description_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ // arguments
+ var argModel = getArgument().getEntity();
+
+ // controllers
+ var biz = AppModules.biz.getController();
+ var businessStore = biz.getBusinessStore();
+
+ // edit
+ entity = businessStore.ensure(getContext(), argModel, BizErrors.business_notfound);
+
+ editEntity();
+
+ entity = saveEntity();
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private void editEntity() {
+
+ var model = getArgument().getEntity();
+
+ // fields
+ //entity.setEntityKey(V.firstNotEmpty(model.getEntityKey(), entity.getEntityKey()));
+ entity.setAlias(V.firstNotEmpty(model.getAlias(), entity.getAlias()));
+ //entity.setStateValue(V.firstNotEmpty(model.getStateValue(), entity.getStateValue()));
+ entity.setName(V.firstNotEmpty(model.getName(), entity.getName()));
+ entity.setDescription(V.firstNotEmpty(model.getDescription(), entity.getDescription()));
+
+ }
+
+ // ::: save
+ //
+ private BusinessEntity saveEntity() {
+
+ var store = AppModules.biz.getController().getBusinessStore();
+
+ var saved = store.edit(getContext(), entity);
+ getContext().attach(saved.getId(), saved);
+ return saved;
+ }
+
+ // ::: edit others
+ //
+ public void editProfile(BusinessProfileEditArgument argument) {
+ if (argument != null) {
+ argument.getEntity().setBusiness(entity);
+ Actions.perform(getContext(), new BusinessProfileEditAction(), argument);
+ }
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessEditArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessEditArgument.java
new file mode 100644
index 0000000..f235fb5
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessEditArgument.java
@@ -0,0 +1,39 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.business;
+
+// app
+import io.kumare.iqr.mod.biz.action.businessprofile.BusinessProfileEditArgument;
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessEditArgument extends BusinessActionArgument {
+
+ // ::: vars
+ //
+ private BusinessProfileEditArgument profile;
+
+ // ::: constructors
+ //
+ public BusinessEditArgument() {
+ }
+
+ public BusinessEditArgument(BusinessEntity entity) {
+ super(entity);
+ }
+
+ // ::: fields
+ //
+ public BusinessProfileEditArgument getProfile() {
+ return profile;
+ }
+
+ public void setProfile(BusinessProfileEditArgument profile) {
+ this.profile = profile;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessEnableAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessEnableAction.java
new file mode 100644
index 0000000..da6e12c
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessEnableAction.java
@@ -0,0 +1,60 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.business;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessEnableAction extends AppAction {
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.business_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.business_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var model = getArgument().getEntity();
+
+ enableEntity(model);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ }
+
+ // ::: enable
+ //
+ private void enableEntity(BusinessEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessStore();
+
+ if (getArgument().getEntity().isActive()) {
+ store.enableById(getContext(), model.getId());
+ } else {
+ store.disableById(getContext(), model.getId());
+ }
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessFindAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessFindAction.java
new file mode 100644
index 0000000..2dd483b
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessFindAction.java
@@ -0,0 +1,70 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.business;
+
+// java
+import java.util.HashMap;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessFindAction extends AppAction {
+
+ // ::: vars
+ //
+ private BusinessEntity entity;
+
+ // ::: public api
+ //
+ public BusinessEntity getEntity() {
+ return entity;
+ }
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.business_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.business_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var model = getArgument().getEntity();
+ entity = findEntity(model);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new HashMap();
+ result.put("entity", entity);
+ setResult(result);
+ }
+
+ // ::: find
+ //
+ private BusinessEntity findEntity(BusinessEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessStore();
+ return store.findById(getContext(), model.getId());
+ }
+
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessListAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessListAction.java
new file mode 100644
index 0000000..14ecfa0
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessListAction.java
@@ -0,0 +1,148 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.business;
+
+// java
+import java.util.HashMap;
+import java.util.List;
+import java.util.LinkedList;
+import java.util.Map;
+// spring
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// entity
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+import io.kumare.iqr.mod.biz.store.business.BusinessMapBuilder;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessListAction extends AppAction {
+
+ // ::: vars
+ //
+ private final Map result = new HashMap();
+ private final List entities = new LinkedList<>();
+
+ // ::: public api
+ //
+ public List getEntities() {
+ return entities;
+ }
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ result.put("pageable", getArgument().isPageable());
+ result.put("wrapped", getArgument().isWrapped());
+
+ if (getArgument().isPageable()) {
+
+ var page = makePage();
+ entities.addAll(page.toList());
+
+ if (getArgument().isWrapped()) {
+ result.put("page", makeWrappedPage(page));
+ } else {
+ result.put("page", page);
+ }
+
+ } else {
+
+ var list = makeList();
+ entities.addAll(list);
+
+ if (getArgument().isWrapped()) {
+ result.put("list", makeWrappedList());
+ } else {
+ result.put("list", list);
+ }
+ }
+
+ }
+
+ @Override
+ protected void setResultOnly() {
+ setResult(result);
+ }
+
+ // ::: page
+ //
+ private Page makePage() {
+
+ var page = getArgument().getPageNumber();
+ var size = getArgument().getPageSize();
+ //var sort = getArgument().getSort();
+
+ var pageable = PageRequest.of(page, size);
+
+ var store = AppModules.biz.getController().getBusinessStore();
+ return store.getRepository().findAll(pageable);
+ }
+
+ // ::: wrapped page
+ //
+ private Map makeWrappedPage(Page found) {
+
+ var page = new HashMap();
+ var content = new LinkedList();
+
+ wrapList(entities, content);
+
+ page.put("size", found.getSize());
+ page.put("number", found.getNumber());
+ page.put("totalElements", found.getTotalElements());
+ page.put("totalPages", found.getTotalPages());
+ page.put("content", content);
+
+ return page;
+ }
+
+
+ // ::: list
+ //
+
+ private List makeList() {
+
+ var store = AppModules.biz.getController().getBusinessStore();
+
+ return store.listAll(getContext());
+ }
+
+ // ::: wrapped list
+ private List makeWrappedList() {
+ var list = new LinkedList();
+
+ wrapList(entities, list);
+
+ return list;
+ }
+
+ // ::: wrapper
+ //
+ private void wrapList(List found, List output) {
+
+ var builder = new BusinessMapBuilder().addListGroup();
+ builder.getStateBuilder().addMainGroup();
+
+ output.addAll(builder.build(getContext(), found));
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessListArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessListArgument.java
new file mode 100644
index 0000000..6d02f92
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessListArgument.java
@@ -0,0 +1,33 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.business;
+
+// app
+import io.kumare.iqr.app.action.AppListActionArgument;
+// store
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessListArgument extends AppListActionArgument {
+
+ // ::: vars
+ //
+
+ // ::: constructors
+ //
+ public BusinessListArgument() {
+ }
+
+ public BusinessListArgument(BusinessEntity entity) {
+ super(entity);
+ }
+
+
+ // ::: fields
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessPreloadAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessPreloadAction.java
new file mode 100644
index 0000000..cf70301
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessPreloadAction.java
@@ -0,0 +1,97 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.business;
+
+// java
+import java.util.HashMap;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+import io.kumare.iqr.mod.biz.store.BizTaxonomies;
+// entity
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+// relations
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPreloadAction extends AppAction {
+
+ // ::: vars
+ //
+ private final Map result = new HashMap();
+ private Map params = new HashMap<>();
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifEmpty(getArgument().getAction(), BizErrors.business_preload_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ if (getArgument().getParams() != null) {
+ params = getArgument().getParams();
+ }
+
+ switch (getArgument().getAction()) {
+ case "find" ->
+ prepareFind();
+ case "list" ->
+ prepareList();
+ case "add" ->
+ prepareAdd();
+ case "edit" ->
+ prepareEdit();
+ }
+ }
+
+ @Override
+ protected void setResultOnly() {
+ setResult(result);
+ }
+
+ // ::: preload
+ //
+ private void prepareAdd() {
+ var activities = BizTaxonomies.businessActivity.list(getContext());
+ result.put("activities", activities);
+ }
+
+ private void prepareEdit() {
+ var entity = findEntity();
+ result.put("entity", entity);
+ result.put("state", entity.getState());
+ }
+
+ private void prepareList() {
+ }
+
+ private void prepareFind() {
+ var entity = findEntity();
+ result.put("entity", entity);
+ result.put("state", entity.getState());
+ }
+
+ // ::: queries
+ //
+ private BusinessEntity findEntity() {
+ var store = AppModules.biz.getController().getBusinessStore();
+
+ var id = (String) params.get("id");
+ if (id == null && getArgument().getEntity() != null) {
+ id = getArgument().getEntity().getId();
+ }
+ return store.findById(getContext(), id);
+ }
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessPreloadArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessPreloadArgument.java
new file mode 100644
index 0000000..11e1845
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/business/BusinessPreloadArgument.java
@@ -0,0 +1,26 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.business;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPreloadArgument extends BusinessActionArgument {
+
+ // ::: vars
+ //
+ private String action;
+
+ // ::: fields
+ //
+ public String getAction() {
+ return action;
+ }
+
+ public void setAction(String action) {
+ this.action = action;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageActionArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageActionArgument.java
new file mode 100644
index 0000000..cf94a4e
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageActionArgument.java
@@ -0,0 +1,29 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessimage;
+
+// base
+import io.kumare.iqr.app.action.AppEntityActionArgument;
+// entity
+import io.kumare.iqr.mod.biz.store.businessimage.BusinessImageEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessImageActionArgument extends AppEntityActionArgument {
+
+ // ::: constructors
+ //
+ public BusinessImageActionArgument() {
+ }
+
+ public BusinessImageActionArgument(BusinessImageEntity entity) {
+ super(entity);
+ }
+
+ // ::: api
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageAddAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageAddAction.java
new file mode 100644
index 0000000..dbee95a
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageAddAction.java
@@ -0,0 +1,121 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessimage;
+
+
+// lib
+import io.kumare.lib.base.server.spring.action.Actions;
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businessimage.BusinessImageEntity;
+import io.kumare.iqr.mod.taxonomy.store.taxon.TaxonEntity;
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessImageAddAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessImageEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, BizErrors.businessimage_notfound);
+
+ // relations
+ V.ifNull(model.getBusiness(), BizErrors.businessimage_business_notfound);
+ V.ifNull(model.getType(), BizErrors.businessimage_type_notfound);
+
+ // fields
+ V.ifEmpty(model.getTypeValue(), BizErrors.businessimage_typevalue_empty);
+ V.ifEmpty(model.getBytes(), BizErrors.businessimage_bytes_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ // arguments
+ var argModel = getArgument().getEntity();
+
+ // controllers
+ var biz = AppModules.biz.getController();
+ var taxonomy = AppModules.taxonomy.getController();
+
+ var businessStore = biz.getBusinessStore();
+ var taxonStore = taxonomy.getTaxonStore();
+
+ var business = businessStore.ensure(getContext(), argModel.getBusiness(), BizErrors.businessimage_business_notfound);
+ var type = taxonStore.ensure(getContext(), argModel.getType(), BizErrors.businessimage_type_notfound);
+
+ // model
+ var model = makeModel(business, type);
+
+ // add
+ entity = saveEntity(model);
+
+ // add others
+
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private BusinessImageEntity makeModel(BusinessEntity business, TaxonEntity type) {
+
+ var argModel = getArgument().getEntity();
+ var model = new BusinessImageEntity();
+
+ // relations
+ model.setBusiness(business);
+ model.setType(type);
+
+ // fields
+ model.setTypeValue(argModel.getTypeValue());
+ model.setBytes(argModel.getBytes());
+ model.setActive(true);
+
+
+
+ return model;
+ }
+
+ // ::: save
+ //
+ private BusinessImageEntity saveEntity(BusinessImageEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessImageStore();
+
+ var saved = store.add(getContext(), model);
+ getContext().attach(saved.getId(), saved);
+ return saved;
+ }
+
+
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageAddArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageAddArgument.java
new file mode 100644
index 0000000..75ed559
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageAddArgument.java
@@ -0,0 +1,34 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessimage;
+
+
+// app
+import io.kumare.iqr.mod.biz.store.businessimage.BusinessImageEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessImageAddArgument extends BusinessImageActionArgument {
+
+ // ::: vars
+ //
+
+
+ // ::: constructors
+ //
+ public BusinessImageAddArgument() {
+ }
+
+ public BusinessImageAddArgument(BusinessImageEntity entity) {
+ super(entity);
+ }
+
+ // ::: fields
+ //
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageDeleteAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageDeleteAction.java
new file mode 100644
index 0000000..63fc48e
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageDeleteAction.java
@@ -0,0 +1,59 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessimage;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businessimage.BusinessImageEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessImageDeleteAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessImageEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.businessimage_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.businessimage_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var argModel = getArgument().getEntity();
+
+ deleteEntity(argModel);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ }
+
+ // ::: delete
+ //
+ private void deleteEntity(BusinessImageEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessImageStore();
+
+ store.deleteById(getContext(), model.getId());
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageEditAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageEditAction.java
new file mode 100644
index 0000000..1011c5d
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageEditAction.java
@@ -0,0 +1,95 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessimage;
+
+// lib
+import io.kumare.lib.v.V;
+// app
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businessimage.BusinessImageEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessImageEditAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessImageEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, BizErrors.businessimage_notfound);
+
+ // fields
+ V.ifEmpty(model.getTypeValue(), BizErrors.businessimage_typevalue_empty);
+ V.ifEmpty(model.getBytes(), BizErrors.businessimage_bytes_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ // arguments
+ var argModel = getArgument().getEntity();
+
+ // controllers
+
+ var biz = AppModules.biz.getController();
+ var businessImageStore = biz.getBusinessImageStore();
+
+ // edit
+ entity = businessImageStore.ensure(getContext(), argModel, BizErrors.businessimage_notfound);
+
+ editEntity();
+
+ entity = saveEntity();
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private void editEntity() {
+
+ var model = getArgument().getEntity();
+
+ // fields
+ entity.setTypeValue(V.firstNotEmpty(model.getTypeValue(), entity.getTypeValue()));
+ entity.setBytes(V.firstNotEmpty(model.getBytes(), entity.getBytes()));
+
+
+ }
+
+ // ::: save
+ //
+ private BusinessImageEntity saveEntity() {
+
+ var store = AppModules.biz.getController().getBusinessImageStore();
+
+ var saved = store.edit(getContext(), entity);
+ getContext().attach(saved.getId(), saved);
+ return saved;
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageEditArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageEditArgument.java
new file mode 100644
index 0000000..d8cf47b
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageEditArgument.java
@@ -0,0 +1,32 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessimage;
+
+// app
+import io.kumare.iqr.mod.biz.store.businessimage.BusinessImageEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessImageEditArgument extends BusinessImageActionArgument {
+
+ // ::: vars
+ //
+
+
+ // ::: constructors
+ //
+ public BusinessImageEditArgument() {
+ }
+
+ public BusinessImageEditArgument(BusinessImageEntity entity) {
+ super(entity);
+ }
+
+
+ // ::: fields
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageEnableAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageEnableAction.java
new file mode 100644
index 0000000..941c5ae
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageEnableAction.java
@@ -0,0 +1,60 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessimage;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businessimage.BusinessImageEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessImageEnableAction extends AppAction {
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.businessimage_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.businessimage_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var model = getArgument().getEntity();
+
+ enableEntity(model);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ }
+
+ // ::: enable
+ //
+ private void enableEntity(BusinessImageEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessImageStore();
+
+ if (getArgument().getEntity().isActive()) {
+ store.enableById(getContext(), model.getId());
+ } else {
+ store.disableById(getContext(), model.getId());
+ }
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageFindAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageFindAction.java
new file mode 100644
index 0000000..7387c71
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageFindAction.java
@@ -0,0 +1,64 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessimage;
+
+// java
+import java.util.HashMap;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businessimage.BusinessImageEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessImageFindAction extends AppAction {
+
+ // ::: vars
+ //
+ private BusinessImageEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.businessimage_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.businessimage_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var model = getArgument().getEntity();
+ entity = findEntity(model);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new HashMap();
+ result.put("entity", entity);
+ setResult(result);
+ }
+
+ // ::: find
+ //
+ private BusinessImageEntity findEntity(BusinessImageEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessImageStore();
+ return store.findById(getContext(), model.getId());
+ }
+
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageListAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageListAction.java
new file mode 100644
index 0000000..e18cdc6
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageListAction.java
@@ -0,0 +1,149 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessimage;
+
+// java
+import java.util.HashMap;
+import java.util.List;
+import java.util.LinkedList;
+import java.util.Map;
+// spring
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// entity
+import io.kumare.iqr.mod.biz.store.businessimage.BusinessImageEntity;
+import io.kumare.iqr.mod.biz.store.businessimage.BusinessImageMapBuilder;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessImageListAction extends AppAction {
+
+ // ::: vars
+ //
+ private final Map result = new HashMap();
+ private final List entities = new LinkedList<>();
+
+ // ::: public api
+ //
+ public List getEntities() {
+ return entities;
+ }
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ result.put("pageable", getArgument().isPageable());
+ result.put("wrapped", getArgument().isWrapped());
+
+ if (getArgument().isPageable()) {
+
+ var page = makePage();
+ entities.addAll(page.toList());
+
+ if (getArgument().isWrapped()) {
+ result.put("page", makeWrappedPage(page));
+ } else {
+ result.put("page", page);
+ }
+
+ } else {
+
+ var list = makeList();
+ entities.addAll(list);
+
+ if (getArgument().isWrapped()) {
+ result.put("list", makeWrappedList());
+ } else {
+ result.put("list", list);
+ }
+ }
+
+ }
+
+ @Override
+ protected void setResultOnly() {
+ setResult(result);
+ }
+
+ // ::: page
+ //
+ private Page makePage() {
+
+ var page = getArgument().getPageNumber();
+ var size = getArgument().getPageSize();
+ //var sort = getArgument().getSort();
+
+ var pageable = PageRequest.of(page, size);
+
+ var store = AppModules.biz.getController().getBusinessImageStore();
+ return store.getRepository().findAll(pageable);
+ }
+
+ // ::: wrapped page
+ //
+ private Map makeWrappedPage(Page found) {
+
+ var page = new HashMap();
+ var content = new LinkedList();
+
+ wrapList(entities, content);
+
+ page.put("size", found.getSize());
+ page.put("number", found.getNumber());
+ page.put("totalElements", found.getTotalElements());
+ page.put("totalPages", found.getTotalPages());
+ page.put("content", content);
+
+ return page;
+ }
+
+
+ // ::: list
+ //
+
+ private List makeList() {
+
+ var store = AppModules.biz.getController().getBusinessImageStore();
+
+ return store.listAll(getContext());
+ }
+
+ // ::: wrapped list
+ private List makeWrappedList() {
+ var list = new LinkedList();
+
+ wrapList(entities, list);
+
+ return list;
+ }
+
+ // ::: wrapper
+ //
+ private void wrapList(List found, List output) {
+
+ var builder = new BusinessImageMapBuilder().addListGroup();
+ builder.getBusinessBuilder().addMainGroup();
+ builder.getTypeBuilder().addMainGroup();
+
+ output.addAll(builder.build(getContext(), found));
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageListArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageListArgument.java
new file mode 100644
index 0000000..6855dc2
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImageListArgument.java
@@ -0,0 +1,33 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessimage;
+
+// app
+import io.kumare.iqr.app.action.AppListActionArgument;
+// store
+import io.kumare.iqr.mod.biz.store.businessimage.BusinessImageEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessImageListArgument extends AppListActionArgument {
+
+ // ::: vars
+ //
+
+ // ::: constructors
+ //
+ public BusinessImageListArgument() {
+ }
+
+ public BusinessImageListArgument(BusinessImageEntity entity) {
+ super(entity);
+ }
+
+
+ // ::: fields
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImagePreloadAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImagePreloadAction.java
new file mode 100644
index 0000000..514c893
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImagePreloadAction.java
@@ -0,0 +1,114 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessimage;
+
+// java
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businessimage.BusinessImageEntity;
+// relations
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+import io.kumare.iqr.mod.taxonomy.store.taxon.TaxonEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessImagePreloadAction extends AppAction {
+
+ // ::: vars
+ //
+ private final Map result = new HashMap();
+ private Map params = new HashMap<>();
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifEmpty(getArgument().getAction(), BizErrors.businessimage_preload_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ if(getArgument().getParams() != null) {
+ params = getArgument().getParams();
+ }
+
+ switch (getArgument().getAction()) {
+ case "find" ->
+ prepareFind();
+ case "list" ->
+ prepareList();
+ case "add" ->
+ prepareAdd();
+ case "edit" ->
+ prepareEdit();
+ }
+ }
+
+ @Override
+ protected void setResultOnly() {
+ setResult(result);
+ }
+
+ // ::: preload
+ //
+ private void prepareAdd() {
+ result.put("taxons", listTaxons());
+ result.put("businesss", listBusinesss());
+ }
+
+ private void prepareEdit() {
+ var entity = findEntity();
+ result.put("entity", entity);
+ result.put("business", entity.getBusiness());
+ result.put("type", entity.getType());
+ }
+
+ private void prepareList() {
+ }
+
+ private void prepareFind() {
+ var entity = findEntity();
+ result.put("entity", entity);
+ result.put("business", entity.getBusiness());
+ result.put("type", entity.getType());
+ }
+
+ // ::: queries
+ //
+ private BusinessImageEntity findEntity() {
+ var store = AppModules.biz.getController().getBusinessImageStore();
+
+ var id = (String) params.get("id");
+ if(id == null && getArgument().getEntity() != null) {
+ id = getArgument().getEntity().getId();
+ }
+ return store.findById(getContext(), id);
+ }
+
+ public List listBusinesss() {
+ var store = AppModules.biz.getController().getBusinessStore();
+
+ return store.listAll(getContext());
+ }
+ public List listTaxons() {
+ var store = AppModules.taxonomy.getController().getTaxonStore();
+
+ return store.listAll(getContext());
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImagePreloadArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImagePreloadArgument.java
new file mode 100644
index 0000000..aa6a8db
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessimage/BusinessImagePreloadArgument.java
@@ -0,0 +1,26 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessimage;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessImagePreloadArgument extends BusinessImageActionArgument {
+
+ // ::: vars
+ //
+ private String action;
+
+ // ::: fields
+ //
+ public String getAction() {
+ return action;
+ }
+
+ public void setAction(String action) {
+ this.action = action;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileActionArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileActionArgument.java
new file mode 100644
index 0000000..5b732eb
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileActionArgument.java
@@ -0,0 +1,29 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessprofile;
+
+// base
+import io.kumare.iqr.app.action.AppEntityActionArgument;
+// entity
+import io.kumare.iqr.mod.biz.store.businessprofile.BusinessProfileEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessProfileActionArgument extends AppEntityActionArgument {
+
+ // ::: constructors
+ //
+ public BusinessProfileActionArgument() {
+ }
+
+ public BusinessProfileActionArgument(BusinessProfileEntity entity) {
+ super(entity);
+ }
+
+ // ::: api
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileAddAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileAddAction.java
new file mode 100644
index 0000000..676d2e9
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileAddAction.java
@@ -0,0 +1,133 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessprofile;
+
+
+// lib
+import io.kumare.lib.base.server.spring.action.Actions;
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+import io.kumare.iqr.mod.biz.store.BizTaxonomies;
+// entity
+import io.kumare.iqr.mod.biz.store.businessprofile.BusinessProfileEntity;
+import io.kumare.iqr.mod.taxonomy.store.taxon.TaxonEntity;
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+import io.kumare.iqr.mod.biz.store.businessimage.BusinessImageEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessProfileAddAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessProfileEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, BizErrors.businessprofile_notfound);
+
+ // relations
+ V.ifNull(model.getBusiness(), BizErrors.businessprofile_business_notfound);
+ //V.ifNull(model.getImage(), BizErrors.businessprofile_image_notfound);
+ V.ifNull(model.getActivity(), BizErrors.businessprofile_activity_notfound);
+
+ // fields
+ //V.ifEmpty(model.getActivityValue(), BizErrors.businessprofile_activityvalue_empty);
+ //V.ifEmpty(model.getGpsLatitude(), BizErrors.businessprofile_gpslatitude_empty);
+ //V.ifEmpty(model.getGpsLongitude(), BizErrors.businessprofile_gpslongitude_empty);
+ //V.ifEmpty(model.getWebsite(), BizErrors.businessprofile_website_empty);
+ //V.ifEmpty(model.getPhone(), BizErrors.businessprofile_phone_empty);
+ //V.ifEmpty(model.getAddress(), BizErrors.businessprofile_address_empty);
+ //V.ifEmpty(model.getExtraInfo(), BizErrors.businessprofile_extrainfo_empty);
+ //V.ifEmpty(model.getDescription(), BizErrors.businessprofile_description_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ // arguments
+ var argModel = getArgument().getEntity();
+
+ // controllers
+ var biz = AppModules.biz.getController();
+ var businessStore = biz.getBusinessStore();
+
+ var business = businessStore.ensure(getContext(), argModel.getBusiness(), BizErrors.businessprofile_business_notfound);
+ var activity = BizTaxonomies.businessActivity.ensureDefault(getContext());
+
+ // model
+ var model = makeModel(business, activity);
+
+ // add
+ entity = saveEntity(model);
+
+ // add others
+
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private BusinessProfileEntity makeModel(BusinessEntity business, TaxonEntity activity) {
+
+ var argModel = getArgument().getEntity();
+ var model = new BusinessProfileEntity();
+
+ // relations
+ model.setBusiness(business);
+ model.setActivity(activity);
+ model.setActivityValue(activity.getValue());
+
+ // fields
+ model.setGpsLatitude(argModel.getGpsLatitude());
+ model.setGpsLongitude(argModel.getGpsLongitude());
+ model.setWebsite(argModel.getWebsite());
+ model.setPhone(argModel.getPhone());
+ model.setAddress(argModel.getAddress());
+ model.setExtraInfo(argModel.getExtraInfo());
+ model.setDescription(argModel.getDescription());
+ model.setActive(true);
+
+
+
+ return model;
+ }
+
+ // ::: save
+ //
+ private BusinessProfileEntity saveEntity(BusinessProfileEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessProfileStore();
+
+ var saved = store.add(getContext(), model);
+ getContext().attach(saved.getId(), saved);
+ return saved;
+ }
+
+
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileAddArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileAddArgument.java
new file mode 100644
index 0000000..4593895
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileAddArgument.java
@@ -0,0 +1,34 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessprofile;
+
+
+// app
+import io.kumare.iqr.mod.biz.store.businessprofile.BusinessProfileEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessProfileAddArgument extends BusinessProfileActionArgument {
+
+ // ::: vars
+ //
+
+
+ // ::: constructors
+ //
+ public BusinessProfileAddArgument() {
+ }
+
+ public BusinessProfileAddArgument(BusinessProfileEntity entity) {
+ super(entity);
+ }
+
+ // ::: fields
+ //
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileDeleteAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileDeleteAction.java
new file mode 100644
index 0000000..54766ef
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileDeleteAction.java
@@ -0,0 +1,59 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessprofile;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businessprofile.BusinessProfileEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessProfileDeleteAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessProfileEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.businessprofile_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.businessprofile_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var argModel = getArgument().getEntity();
+
+ deleteEntity(argModel);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ }
+
+ // ::: delete
+ //
+ private void deleteEntity(BusinessProfileEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessProfileStore();
+
+ store.deleteById(getContext(), model.getId());
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileEditAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileEditAction.java
new file mode 100644
index 0000000..c5a5150
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileEditAction.java
@@ -0,0 +1,107 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessprofile;
+
+// lib
+import io.kumare.lib.v.V;
+// app
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businessprofile.BusinessProfileEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessProfileEditAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessProfileEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, BizErrors.businessprofile_notfound);
+
+ // fields
+ V.ifEmpty(model.getActivityValue(), BizErrors.businessprofile_activityvalue_empty);
+ V.ifEmpty(model.getGpsLatitude(), BizErrors.businessprofile_gpslatitude_empty);
+ V.ifEmpty(model.getGpsLongitude(), BizErrors.businessprofile_gpslongitude_empty);
+ V.ifEmpty(model.getWebsite(), BizErrors.businessprofile_website_empty);
+ V.ifEmpty(model.getPhone(), BizErrors.businessprofile_phone_empty);
+ V.ifEmpty(model.getAddress(), BizErrors.businessprofile_address_empty);
+ V.ifEmpty(model.getExtraInfo(), BizErrors.businessprofile_extrainfo_empty);
+ V.ifEmpty(model.getDescription(), BizErrors.businessprofile_description_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ // arguments
+ var argModel = getArgument().getEntity();
+
+ // controllers
+
+ var biz = AppModules.biz.getController();
+ var businessProfileStore = biz.getBusinessProfileStore();
+
+ // edit
+ entity = businessProfileStore.ensure(getContext(), argModel, BizErrors.businessprofile_notfound);
+
+ editEntity();
+
+ entity = saveEntity();
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private void editEntity() {
+
+ var model = getArgument().getEntity();
+
+ // fields
+ entity.setActivityValue(V.firstNotEmpty(model.getActivityValue(), entity.getActivityValue()));
+ entity.setGpsLatitude(V.firstNotEmpty(model.getGpsLatitude(), entity.getGpsLatitude()));
+ entity.setGpsLongitude(V.firstNotEmpty(model.getGpsLongitude(), entity.getGpsLongitude()));
+ entity.setWebsite(V.firstNotEmpty(model.getWebsite(), entity.getWebsite()));
+ entity.setPhone(V.firstNotEmpty(model.getPhone(), entity.getPhone()));
+ entity.setAddress(V.firstNotEmpty(model.getAddress(), entity.getAddress()));
+ entity.setExtraInfo(V.firstNotEmpty(model.getExtraInfo(), entity.getExtraInfo()));
+ entity.setDescription(V.firstNotEmpty(model.getDescription(), entity.getDescription()));
+
+
+ }
+
+ // ::: save
+ //
+ private BusinessProfileEntity saveEntity() {
+
+ var store = AppModules.biz.getController().getBusinessProfileStore();
+
+ var saved = store.edit(getContext(), entity);
+ getContext().attach(saved.getId(), saved);
+ return saved;
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileEditArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileEditArgument.java
new file mode 100644
index 0000000..2a71600
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileEditArgument.java
@@ -0,0 +1,32 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessprofile;
+
+// app
+import io.kumare.iqr.mod.biz.store.businessprofile.BusinessProfileEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessProfileEditArgument extends BusinessProfileActionArgument {
+
+ // ::: vars
+ //
+
+
+ // ::: constructors
+ //
+ public BusinessProfileEditArgument() {
+ }
+
+ public BusinessProfileEditArgument(BusinessProfileEntity entity) {
+ super(entity);
+ }
+
+
+ // ::: fields
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileEnableAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileEnableAction.java
new file mode 100644
index 0000000..46f0aec
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileEnableAction.java
@@ -0,0 +1,60 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessprofile;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businessprofile.BusinessProfileEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessProfileEnableAction extends AppAction {
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.businessprofile_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.businessprofile_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var model = getArgument().getEntity();
+
+ enableEntity(model);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ }
+
+ // ::: enable
+ //
+ private void enableEntity(BusinessProfileEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessProfileStore();
+
+ if (getArgument().getEntity().isActive()) {
+ store.enableById(getContext(), model.getId());
+ } else {
+ store.disableById(getContext(), model.getId());
+ }
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileFindAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileFindAction.java
new file mode 100644
index 0000000..bf8586e
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileFindAction.java
@@ -0,0 +1,64 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessprofile;
+
+// java
+import java.util.HashMap;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businessprofile.BusinessProfileEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessProfileFindAction extends AppAction {
+
+ // ::: vars
+ //
+ private BusinessProfileEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.businessprofile_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.businessprofile_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var model = getArgument().getEntity();
+ entity = findEntity(model);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new HashMap();
+ result.put("entity", entity);
+ setResult(result);
+ }
+
+ // ::: find
+ //
+ private BusinessProfileEntity findEntity(BusinessProfileEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessProfileStore();
+ return store.findById(getContext(), model.getId());
+ }
+
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileListAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileListAction.java
new file mode 100644
index 0000000..92f8842
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileListAction.java
@@ -0,0 +1,149 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessprofile;
+
+// java
+import java.util.HashMap;
+import java.util.List;
+import java.util.LinkedList;
+import java.util.Map;
+// spring
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// entity
+import io.kumare.iqr.mod.biz.store.businessprofile.BusinessProfileEntity;
+import io.kumare.iqr.mod.biz.store.businessprofile.BusinessProfileMapBuilder;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessProfileListAction extends AppAction {
+
+ // ::: vars
+ //
+ private final Map result = new HashMap();
+ private final List entities = new LinkedList<>();
+
+ // ::: public api
+ //
+ public List getEntities() {
+ return entities;
+ }
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ result.put("pageable", getArgument().isPageable());
+ result.put("wrapped", getArgument().isWrapped());
+
+ if (getArgument().isPageable()) {
+
+ var page = makePage();
+ entities.addAll(page.toList());
+
+ if (getArgument().isWrapped()) {
+ result.put("page", makeWrappedPage(page));
+ } else {
+ result.put("page", page);
+ }
+
+ } else {
+
+ var list = makeList();
+ entities.addAll(list);
+
+ if (getArgument().isWrapped()) {
+ result.put("list", makeWrappedList());
+ } else {
+ result.put("list", list);
+ }
+ }
+
+ }
+
+ @Override
+ protected void setResultOnly() {
+ setResult(result);
+ }
+
+ // ::: page
+ //
+ private Page makePage() {
+
+ var page = getArgument().getPageNumber();
+ var size = getArgument().getPageSize();
+ //var sort = getArgument().getSort();
+
+ var pageable = PageRequest.of(page, size);
+
+ var store = AppModules.biz.getController().getBusinessProfileStore();
+ return store.getRepository().findAll(pageable);
+ }
+
+ // ::: wrapped page
+ //
+ private Map makeWrappedPage(Page found) {
+
+ var page = new HashMap();
+ var content = new LinkedList();
+
+ wrapList(entities, content);
+
+ page.put("size", found.getSize());
+ page.put("number", found.getNumber());
+ page.put("totalElements", found.getTotalElements());
+ page.put("totalPages", found.getTotalPages());
+ page.put("content", content);
+
+ return page;
+ }
+
+
+ // ::: list
+ //
+
+ private List makeList() {
+
+ var store = AppModules.biz.getController().getBusinessProfileStore();
+
+ return store.listAll(getContext());
+ }
+
+ // ::: wrapped list
+ private List makeWrappedList() {
+ var list = new LinkedList();
+
+ wrapList(entities, list);
+
+ return list;
+ }
+
+ // ::: wrapper
+ //
+ private void wrapList(List found, List output) {
+
+ var builder = new BusinessProfileMapBuilder().addListGroup();
+ builder.getBusinessBuilder().addMainGroup();
+ builder.getActivityBuilder().addMainGroup();
+
+ output.addAll(builder.build(getContext(), found));
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileListArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileListArgument.java
new file mode 100644
index 0000000..0200fd9
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfileListArgument.java
@@ -0,0 +1,33 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessprofile;
+
+// app
+import io.kumare.iqr.app.action.AppListActionArgument;
+// store
+import io.kumare.iqr.mod.biz.store.businessprofile.BusinessProfileEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessProfileListArgument extends AppListActionArgument {
+
+ // ::: vars
+ //
+
+ // ::: constructors
+ //
+ public BusinessProfileListArgument() {
+ }
+
+ public BusinessProfileListArgument(BusinessProfileEntity entity) {
+ super(entity);
+ }
+
+
+ // ::: fields
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfilePreloadAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfilePreloadAction.java
new file mode 100644
index 0000000..e948fc2
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfilePreloadAction.java
@@ -0,0 +1,114 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessprofile;
+
+// java
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businessprofile.BusinessProfileEntity;
+// relations
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+import io.kumare.iqr.mod.taxonomy.store.taxon.TaxonEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessProfilePreloadAction extends AppAction {
+
+ // ::: vars
+ //
+ private final Map result = new HashMap();
+ private Map params = new HashMap<>();
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifEmpty(getArgument().getAction(), BizErrors.businessprofile_preload_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ if (getArgument().getParams() != null) {
+ params = getArgument().getParams();
+ }
+
+ switch (getArgument().getAction()) {
+ case "find" ->
+ prepareFind();
+ case "list" ->
+ prepareList();
+ case "add" ->
+ prepareAdd();
+ case "edit" ->
+ prepareEdit();
+ }
+ }
+
+ @Override
+ protected void setResultOnly() {
+ setResult(result);
+ }
+
+ // ::: preload
+ //
+ private void prepareAdd() {
+ result.put("taxons", listTaxons());
+ result.put("businesss", listBusinesss());
+ }
+
+ private void prepareEdit() {
+ var entity = findEntity();
+ result.put("entity", entity);
+ result.put("business", entity.getBusiness());
+ result.put("activity", entity.getActivity());
+ }
+
+ private void prepareList() {
+ }
+
+ private void prepareFind() {
+ var entity = findEntity();
+ result.put("entity", entity);
+ result.put("business", entity.getBusiness());
+ result.put("activity", entity.getActivity());
+ }
+
+ // ::: queries
+ //
+ private BusinessProfileEntity findEntity() {
+ var store = AppModules.biz.getController().getBusinessProfileStore();
+
+ var id = (String) params.get("id");
+ if (id == null && getArgument().getEntity() != null) {
+ id = getArgument().getEntity().getId();
+ }
+ return store.findById(getContext(), id);
+ }
+
+ public List listBusinesss() {
+ var store = AppModules.biz.getController().getBusinessStore();
+
+ return store.listAll(getContext());
+ }
+
+ public List listTaxons() {
+ var store = AppModules.taxonomy.getController().getTaxonStore();
+
+ return store.listAll(getContext());
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfilePreloadArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfilePreloadArgument.java
new file mode 100644
index 0000000..6b2ff81
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessprofile/BusinessProfilePreloadArgument.java
@@ -0,0 +1,26 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessprofile;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessProfilePreloadArgument extends BusinessProfileActionArgument {
+
+ // ::: vars
+ //
+ private String action;
+
+ // ::: fields
+ //
+ public String getAction() {
+ return action;
+ }
+
+ public void setAction(String action) {
+ this.action = action;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoActionArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoActionArgument.java
new file mode 100644
index 0000000..adc15d9
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoActionArgument.java
@@ -0,0 +1,29 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromo;
+
+// base
+import io.kumare.iqr.app.action.AppEntityActionArgument;
+// entity
+import io.kumare.iqr.mod.biz.store.businesspromo.BusinessPromoEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoActionArgument extends AppEntityActionArgument {
+
+ // ::: constructors
+ //
+ public BusinessPromoActionArgument() {
+ }
+
+ public BusinessPromoActionArgument(BusinessPromoEntity entity) {
+ super(entity);
+ }
+
+ // ::: api
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoAddAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoAddAction.java
new file mode 100644
index 0000000..1c65200
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoAddAction.java
@@ -0,0 +1,149 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromo;
+
+// java
+import java.util.List;
+// lib
+import io.kumare.lib.base.server.spring.action.Actions;
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesspromo.BusinessPromoEntity;
+import io.kumare.iqr.mod.taxonomy.store.taxon.TaxonEntity;
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+import io.kumare.iqr.mod.biz.store.businessimage.BusinessImageEntity;
+import io.kumare.iqr.mod.biz.action.businesspromoitem.BusinessPromoItemAddAction;
+import io.kumare.iqr.mod.biz.action.businesspromoitem.BusinessPromoItemAddArgument;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoAddAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessPromoEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, BizErrors.businesspromo_notfound);
+
+ // relations
+ V.ifNull(model.getBusiness(), BizErrors.businesspromo_business_notfound);
+ V.ifNull(model.getImage(), BizErrors.businesspromo_image_notfound);
+ V.ifNull(model.getState(), BizErrors.businesspromo_state_notfound);
+
+ // fields
+ V.ifEmpty(model.getStateValue(), BizErrors.businesspromo_statevalue_empty);
+ V.ifEmpty(model.getStarted(), BizErrors.businesspromo_started_empty);
+ V.ifEmpty(model.getEnded(), BizErrors.businesspromo_ended_empty);
+ V.ifEmpty(model.getScheduleStart(), BizErrors.businesspromo_schedulestart_empty);
+ V.ifEmpty(model.getScheduleEnd(), BizErrors.businesspromo_scheduleend_empty);
+ V.ifEmpty(model.getTitle(), BizErrors.businesspromo_title_empty);
+ V.ifEmpty(model.getBodyInfo(), BizErrors.businesspromo_bodyinfo_empty);
+ V.ifEmpty(model.getFooterInfo(), BizErrors.businesspromo_footerinfo_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ // arguments
+ var argModel = getArgument().getEntity();
+
+ // controllers
+ var biz = AppModules.biz.getController();
+ var taxonomy = AppModules.taxonomy.getController();
+
+ var businessStore = biz.getBusinessStore();
+ var businessImageStore = biz.getBusinessImageStore();
+ var taxonStore = taxonomy.getTaxonStore();
+
+ var business = businessStore.ensure(getContext(), argModel.getBusiness(), BizErrors.businesspromo_business_notfound);
+ var image = businessImageStore.ensure(getContext(), argModel.getImage(), BizErrors.businesspromo_image_notfound);
+ var state = taxonStore.ensure(getContext(), argModel.getState(), BizErrors.businesspromo_state_notfound);
+
+ // model
+ var model = makeModel(business, image, state);
+
+ // add
+ entity = saveEntity(model);
+
+ // add others
+ addItems(getArgument().getItems());
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private BusinessPromoEntity makeModel(BusinessEntity business, BusinessImageEntity image, TaxonEntity state) {
+
+ var argModel = getArgument().getEntity();
+ var model = new BusinessPromoEntity();
+
+ // relations
+ model.setBusiness(business);
+ model.setImage(image);
+ model.setState(state);
+
+ // fields
+ model.setStateValue(argModel.getStateValue());
+ model.setStarted(argModel.getStarted());
+ model.setEnded(argModel.getEnded());
+ model.setScheduleStart(argModel.getScheduleStart());
+ model.setScheduleEnd(argModel.getScheduleEnd());
+ model.setTitle(argModel.getTitle());
+ model.setBodyInfo(argModel.getBodyInfo());
+ model.setFooterInfo(argModel.getFooterInfo());
+ model.setActive(true);
+
+
+
+ return model;
+ }
+
+ // ::: save
+ //
+ private BusinessPromoEntity saveEntity(BusinessPromoEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessPromoStore();
+
+ var saved = store.add(getContext(), model);
+ getContext().attach(saved.getId(), saved);
+ return saved;
+ }
+
+ // ::: add items
+ //
+ private void addItems(List list) {
+ if(list != null) {
+ list.forEach(i->{
+ i.getEntity().promo(entity);
+ Actions.perform(getContext(), new BusinessPromoItemAddAction(), i);
+ });
+ }
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoAddArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoAddArgument.java
new file mode 100644
index 0000000..b95dc01
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoAddArgument.java
@@ -0,0 +1,41 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromo;
+
+// java
+import java.util.List;
+// app
+import io.kumare.iqr.mod.biz.store.businesspromo.BusinessPromoEntity;
+import io.kumare.iqr.mod.biz.action.businesspromoitem.BusinessPromoItemAddArgument;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoAddArgument extends BusinessPromoActionArgument {
+
+ // ::: vars
+ //
+ private List items;
+
+ // ::: constructors
+ //
+ public BusinessPromoAddArgument() {
+ }
+
+ public BusinessPromoAddArgument(BusinessPromoEntity entity) {
+ super(entity);
+ }
+
+ // ::: fields
+ //
+ public List getItems() {
+ return items;
+ }
+
+ public void setItems(List list) {
+ this.items = list;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoDeleteAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoDeleteAction.java
new file mode 100644
index 0000000..9472192
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoDeleteAction.java
@@ -0,0 +1,59 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromo;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesspromo.BusinessPromoEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoDeleteAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessPromoEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.businesspromo_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.businesspromo_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var argModel = getArgument().getEntity();
+
+ deleteEntity(argModel);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ }
+
+ // ::: delete
+ //
+ private void deleteEntity(BusinessPromoEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessPromoStore();
+
+ store.deleteById(getContext(), model.getId());
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoEditAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoEditAction.java
new file mode 100644
index 0000000..a8211a3
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoEditAction.java
@@ -0,0 +1,107 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromo;
+
+// lib
+import io.kumare.lib.v.V;
+// app
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesspromo.BusinessPromoEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoEditAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessPromoEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, BizErrors.businesspromo_notfound);
+
+ // fields
+ V.ifEmpty(model.getStateValue(), BizErrors.businesspromo_statevalue_empty);
+ V.ifEmpty(model.getStarted(), BizErrors.businesspromo_started_empty);
+ V.ifEmpty(model.getEnded(), BizErrors.businesspromo_ended_empty);
+ V.ifEmpty(model.getScheduleStart(), BizErrors.businesspromo_schedulestart_empty);
+ V.ifEmpty(model.getScheduleEnd(), BizErrors.businesspromo_scheduleend_empty);
+ V.ifEmpty(model.getTitle(), BizErrors.businesspromo_title_empty);
+ V.ifEmpty(model.getBodyInfo(), BizErrors.businesspromo_bodyinfo_empty);
+ V.ifEmpty(model.getFooterInfo(), BizErrors.businesspromo_footerinfo_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ // arguments
+ var argModel = getArgument().getEntity();
+
+ // controllers
+
+ var biz = AppModules.biz.getController();
+ var businessPromoStore = biz.getBusinessPromoStore();
+
+ // edit
+ entity = businessPromoStore.ensure(getContext(), argModel, BizErrors.businesspromo_notfound);
+
+ editEntity();
+
+ entity = saveEntity();
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private void editEntity() {
+
+ var model = getArgument().getEntity();
+
+ // fields
+ entity.setStateValue(V.firstNotEmpty(model.getStateValue(), entity.getStateValue()));
+ entity.setStarted(V.firstNotEmpty(model.getStarted(), entity.getStarted()));
+ entity.setEnded(V.firstNotEmpty(model.getEnded(), entity.getEnded()));
+ entity.setScheduleStart(V.firstNotEmpty(model.getScheduleStart(), entity.getScheduleStart()));
+ entity.setScheduleEnd(V.firstNotEmpty(model.getScheduleEnd(), entity.getScheduleEnd()));
+ entity.setTitle(V.firstNotEmpty(model.getTitle(), entity.getTitle()));
+ entity.setBodyInfo(V.firstNotEmpty(model.getBodyInfo(), entity.getBodyInfo()));
+ entity.setFooterInfo(V.firstNotEmpty(model.getFooterInfo(), entity.getFooterInfo()));
+
+
+ }
+
+ // ::: save
+ //
+ private BusinessPromoEntity saveEntity() {
+
+ var store = AppModules.biz.getController().getBusinessPromoStore();
+
+ var saved = store.edit(getContext(), entity);
+ getContext().attach(saved.getId(), saved);
+ return saved;
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoEditArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoEditArgument.java
new file mode 100644
index 0000000..97eeccd
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoEditArgument.java
@@ -0,0 +1,32 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromo;
+
+// app
+import io.kumare.iqr.mod.biz.store.businesspromo.BusinessPromoEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoEditArgument extends BusinessPromoActionArgument {
+
+ // ::: vars
+ //
+
+
+ // ::: constructors
+ //
+ public BusinessPromoEditArgument() {
+ }
+
+ public BusinessPromoEditArgument(BusinessPromoEntity entity) {
+ super(entity);
+ }
+
+
+ // ::: fields
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoEnableAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoEnableAction.java
new file mode 100644
index 0000000..d28c556
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoEnableAction.java
@@ -0,0 +1,60 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromo;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesspromo.BusinessPromoEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoEnableAction extends AppAction {
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.businesspromo_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.businesspromo_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var model = getArgument().getEntity();
+
+ enableEntity(model);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ }
+
+ // ::: enable
+ //
+ private void enableEntity(BusinessPromoEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessPromoStore();
+
+ if (getArgument().getEntity().isActive()) {
+ store.enableById(getContext(), model.getId());
+ } else {
+ store.disableById(getContext(), model.getId());
+ }
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoFindAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoFindAction.java
new file mode 100644
index 0000000..80a07aa
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoFindAction.java
@@ -0,0 +1,64 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromo;
+
+// java
+import java.util.HashMap;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesspromo.BusinessPromoEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoFindAction extends AppAction {
+
+ // ::: vars
+ //
+ private BusinessPromoEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.businesspromo_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.businesspromo_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var model = getArgument().getEntity();
+ entity = findEntity(model);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new HashMap();
+ result.put("entity", entity);
+ setResult(result);
+ }
+
+ // ::: find
+ //
+ private BusinessPromoEntity findEntity(BusinessPromoEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessPromoStore();
+ return store.findById(getContext(), model.getId());
+ }
+
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoListAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoListAction.java
new file mode 100644
index 0000000..ceb96fb
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoListAction.java
@@ -0,0 +1,150 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromo;
+
+// java
+import java.util.HashMap;
+import java.util.List;
+import java.util.LinkedList;
+import java.util.Map;
+// spring
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// entity
+import io.kumare.iqr.mod.biz.store.businesspromo.BusinessPromoEntity;
+import io.kumare.iqr.mod.biz.store.businesspromo.BusinessPromoMapBuilder;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoListAction extends AppAction {
+
+ // ::: vars
+ //
+ private final Map result = new HashMap();
+ private final List entities = new LinkedList<>();
+
+ // ::: public api
+ //
+ public List getEntities() {
+ return entities;
+ }
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ result.put("pageable", getArgument().isPageable());
+ result.put("wrapped", getArgument().isWrapped());
+
+ if (getArgument().isPageable()) {
+
+ var page = makePage();
+ entities.addAll(page.toList());
+
+ if (getArgument().isWrapped()) {
+ result.put("page", makeWrappedPage(page));
+ } else {
+ result.put("page", page);
+ }
+
+ } else {
+
+ var list = makeList();
+ entities.addAll(list);
+
+ if (getArgument().isWrapped()) {
+ result.put("list", makeWrappedList());
+ } else {
+ result.put("list", list);
+ }
+ }
+
+ }
+
+ @Override
+ protected void setResultOnly() {
+ setResult(result);
+ }
+
+ // ::: page
+ //
+ private Page makePage() {
+
+ var page = getArgument().getPageNumber();
+ var size = getArgument().getPageSize();
+ //var sort = getArgument().getSort();
+
+ var pageable = PageRequest.of(page, size);
+
+ var store = AppModules.biz.getController().getBusinessPromoStore();
+ return store.getRepository().findAll(pageable);
+ }
+
+ // ::: wrapped page
+ //
+ private Map makeWrappedPage(Page found) {
+
+ var page = new HashMap();
+ var content = new LinkedList();
+
+ wrapList(entities, content);
+
+ page.put("size", found.getSize());
+ page.put("number", found.getNumber());
+ page.put("totalElements", found.getTotalElements());
+ page.put("totalPages", found.getTotalPages());
+ page.put("content", content);
+
+ return page;
+ }
+
+
+ // ::: list
+ //
+
+ private List makeList() {
+
+ var store = AppModules.biz.getController().getBusinessPromoStore();
+
+ return store.listAll(getContext());
+ }
+
+ // ::: wrapped list
+ private List makeWrappedList() {
+ var list = new LinkedList();
+
+ wrapList(entities, list);
+
+ return list;
+ }
+
+ // ::: wrapper
+ //
+ private void wrapList(List found, List output) {
+
+ var builder = new BusinessPromoMapBuilder().addListGroup();
+ builder.getBusinessBuilder().addMainGroup();
+ builder.getImageBuilder().addMainGroup();
+ builder.getStateBuilder().addMainGroup();
+
+ output.addAll(builder.build(getContext(), found));
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoListArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoListArgument.java
new file mode 100644
index 0000000..a6a5100
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoListArgument.java
@@ -0,0 +1,33 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromo;
+
+// app
+import io.kumare.iqr.app.action.AppListActionArgument;
+// store
+import io.kumare.iqr.mod.biz.store.businesspromo.BusinessPromoEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoListArgument extends AppListActionArgument {
+
+ // ::: vars
+ //
+
+ // ::: constructors
+ //
+ public BusinessPromoListArgument() {
+ }
+
+ public BusinessPromoListArgument(BusinessPromoEntity entity) {
+ super(entity);
+ }
+
+
+ // ::: fields
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoPreloadAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoPreloadAction.java
new file mode 100644
index 0000000..c1bceff
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoPreloadAction.java
@@ -0,0 +1,123 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromo;
+
+// java
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesspromo.BusinessPromoEntity;
+// relations
+import io.kumare.iqr.mod.biz.store.businessimage.BusinessImageEntity;
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+import io.kumare.iqr.mod.taxonomy.store.taxon.TaxonEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoPreloadAction extends AppAction {
+
+ // ::: vars
+ //
+ private final Map result = new HashMap();
+ private Map params = new HashMap<>();
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifEmpty(getArgument().getAction(), BizErrors.businesspromo_preload_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ if(getArgument().getParams() != null) {
+ params = getArgument().getParams();
+ }
+
+ switch (getArgument().getAction()) {
+ case "find" ->
+ prepareFind();
+ case "list" ->
+ prepareList();
+ case "add" ->
+ prepareAdd();
+ case "edit" ->
+ prepareEdit();
+ }
+ }
+
+ @Override
+ protected void setResultOnly() {
+ setResult(result);
+ }
+
+ // ::: preload
+ //
+ private void prepareAdd() {
+ result.put("taxons", listTaxons());
+ result.put("businessImages", listBusinessImages());
+ result.put("businesss", listBusinesss());
+ }
+
+ private void prepareEdit() {
+ var entity = findEntity();
+ result.put("entity", entity);
+ result.put("business", entity.getBusiness());
+ result.put("image", entity.getImage());
+ result.put("state", entity.getState());
+ }
+
+ private void prepareList() {
+ }
+
+ private void prepareFind() {
+ var entity = findEntity();
+ result.put("entity", entity);
+ result.put("business", entity.getBusiness());
+ result.put("image", entity.getImage());
+ result.put("state", entity.getState());
+ }
+
+ // ::: queries
+ //
+ private BusinessPromoEntity findEntity() {
+ var store = AppModules.biz.getController().getBusinessPromoStore();
+
+ var id = (String) params.get("id");
+ if(id == null && getArgument().getEntity() != null) {
+ id = getArgument().getEntity().getId();
+ }
+ return store.findById(getContext(), id);
+ }
+
+ public List listBusinessImages() {
+ var store = AppModules.biz.getController().getBusinessImageStore();
+
+ return store.listAll(getContext());
+ }
+ public List listBusinesss() {
+ var store = AppModules.biz.getController().getBusinessStore();
+
+ return store.listAll(getContext());
+ }
+ public List listTaxons() {
+ var store = AppModules.taxonomy.getController().getTaxonStore();
+
+ return store.listAll(getContext());
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoPreloadArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoPreloadArgument.java
new file mode 100644
index 0000000..caf8adf
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromo/BusinessPromoPreloadArgument.java
@@ -0,0 +1,26 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromo;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoPreloadArgument extends BusinessPromoActionArgument {
+
+ // ::: vars
+ //
+ private String action;
+
+ // ::: fields
+ //
+ public String getAction() {
+ return action;
+ }
+
+ public void setAction(String action) {
+ this.action = action;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemActionArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemActionArgument.java
new file mode 100644
index 0000000..913d272
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemActionArgument.java
@@ -0,0 +1,29 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromoitem;
+
+// base
+import io.kumare.iqr.app.action.AppEntityActionArgument;
+// entity
+import io.kumare.iqr.mod.biz.store.businesspromoitem.BusinessPromoItemEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoItemActionArgument extends AppEntityActionArgument {
+
+ // ::: constructors
+ //
+ public BusinessPromoItemActionArgument() {
+ }
+
+ public BusinessPromoItemActionArgument(BusinessPromoItemEntity entity) {
+ super(entity);
+ }
+
+ // ::: api
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemAddAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemAddAction.java
new file mode 100644
index 0000000..b863462
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemAddAction.java
@@ -0,0 +1,129 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromoitem;
+
+
+// lib
+import io.kumare.lib.base.server.spring.action.Actions;
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesspromoitem.BusinessPromoItemEntity;
+import io.kumare.iqr.mod.biz.store.businesspromo.BusinessPromoEntity;
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+import io.kumare.iqr.mod.biz.store.businessimage.BusinessImageEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoItemAddAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessPromoItemEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, BizErrors.businesspromoitem_notfound);
+
+ // relations
+ V.ifNull(model.getBusiness(), BizErrors.businesspromoitem_business_notfound);
+ V.ifNull(model.getPromo(), BizErrors.businesspromoitem_promo_notfound);
+ V.ifNull(model.getImage(), BizErrors.businesspromoitem_image_notfound);
+
+ // fields
+ V.ifEmpty(model.getTitle(), BizErrors.businesspromoitem_title_empty);
+ V.ifEmpty(model.getDescription(), BizErrors.businesspromoitem_description_empty);
+ V.ifEmpty(model.getPoints(), BizErrors.businesspromoitem_points_empty);
+ V.ifEmpty(model.getCondition(), BizErrors.businesspromoitem_condition_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ // arguments
+ var argModel = getArgument().getEntity();
+
+ // controllers
+ var biz = AppModules.biz.getController();
+
+ var businessPromoStore = biz.getBusinessPromoStore();
+ var businessStore = biz.getBusinessStore();
+ var businessImageStore = biz.getBusinessImageStore();
+
+ var business = businessStore.ensure(getContext(), argModel.getBusiness(), BizErrors.businesspromoitem_business_notfound);
+ var promo = businessPromoStore.ensure(getContext(), argModel.getPromo(), BizErrors.businesspromoitem_promo_notfound);
+ var image = businessImageStore.ensure(getContext(), argModel.getImage(), BizErrors.businesspromoitem_image_notfound);
+
+ // model
+ var model = makeModel(business, promo, image);
+
+ // add
+ entity = saveEntity(model);
+
+ // add others
+
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private BusinessPromoItemEntity makeModel(BusinessEntity business, BusinessPromoEntity promo, BusinessImageEntity image) {
+
+ var argModel = getArgument().getEntity();
+ var model = new BusinessPromoItemEntity();
+
+ // relations
+ model.setBusiness(business);
+ model.setPromo(promo);
+ model.setImage(image);
+
+ // fields
+ model.setTitle(argModel.getTitle());
+ model.setDescription(argModel.getDescription());
+ model.setPoints(argModel.getPoints());
+ model.setCondition(argModel.getCondition());
+ model.setActive(true);
+
+
+
+ return model;
+ }
+
+ // ::: save
+ //
+ private BusinessPromoItemEntity saveEntity(BusinessPromoItemEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessPromoItemStore();
+
+ var saved = store.add(getContext(), model);
+ getContext().attach(saved.getId(), saved);
+ return saved;
+ }
+
+
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemAddArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemAddArgument.java
new file mode 100644
index 0000000..a20a0a1
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemAddArgument.java
@@ -0,0 +1,34 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromoitem;
+
+
+// app
+import io.kumare.iqr.mod.biz.store.businesspromoitem.BusinessPromoItemEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoItemAddArgument extends BusinessPromoItemActionArgument {
+
+ // ::: vars
+ //
+
+
+ // ::: constructors
+ //
+ public BusinessPromoItemAddArgument() {
+ }
+
+ public BusinessPromoItemAddArgument(BusinessPromoItemEntity entity) {
+ super(entity);
+ }
+
+ // ::: fields
+ //
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemDeleteAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemDeleteAction.java
new file mode 100644
index 0000000..25f77d9
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemDeleteAction.java
@@ -0,0 +1,59 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromoitem;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesspromoitem.BusinessPromoItemEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoItemDeleteAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessPromoItemEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.businesspromoitem_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.businesspromoitem_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var argModel = getArgument().getEntity();
+
+ deleteEntity(argModel);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ }
+
+ // ::: delete
+ //
+ private void deleteEntity(BusinessPromoItemEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessPromoItemStore();
+
+ store.deleteById(getContext(), model.getId());
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemEditAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemEditAction.java
new file mode 100644
index 0000000..e4aeb0f
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemEditAction.java
@@ -0,0 +1,99 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromoitem;
+
+// lib
+import io.kumare.lib.v.V;
+// app
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesspromoitem.BusinessPromoItemEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoItemEditAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessPromoItemEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, BizErrors.businesspromoitem_notfound);
+
+ // fields
+ V.ifEmpty(model.getTitle(), BizErrors.businesspromoitem_title_empty);
+ V.ifEmpty(model.getDescription(), BizErrors.businesspromoitem_description_empty);
+ V.ifEmpty(model.getPoints(), BizErrors.businesspromoitem_points_empty);
+ V.ifEmpty(model.getCondition(), BizErrors.businesspromoitem_condition_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ // arguments
+ var argModel = getArgument().getEntity();
+
+ // controllers
+
+ var biz = AppModules.biz.getController();
+ var businessPromoItemStore = biz.getBusinessPromoItemStore();
+
+ // edit
+ entity = businessPromoItemStore.ensure(getContext(), argModel, BizErrors.businesspromoitem_notfound);
+
+ editEntity();
+
+ entity = saveEntity();
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private void editEntity() {
+
+ var model = getArgument().getEntity();
+
+ // fields
+ entity.setTitle(V.firstNotEmpty(model.getTitle(), entity.getTitle()));
+ entity.setDescription(V.firstNotEmpty(model.getDescription(), entity.getDescription()));
+ entity.setPoints(V.firstNotEmpty(model.getPoints(), entity.getPoints()));
+ entity.setCondition(V.firstNotEmpty(model.getCondition(), entity.getCondition()));
+
+
+ }
+
+ // ::: save
+ //
+ private BusinessPromoItemEntity saveEntity() {
+
+ var store = AppModules.biz.getController().getBusinessPromoItemStore();
+
+ var saved = store.edit(getContext(), entity);
+ getContext().attach(saved.getId(), saved);
+ return saved;
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemEditArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemEditArgument.java
new file mode 100644
index 0000000..b0b6650
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemEditArgument.java
@@ -0,0 +1,32 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromoitem;
+
+// app
+import io.kumare.iqr.mod.biz.store.businesspromoitem.BusinessPromoItemEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoItemEditArgument extends BusinessPromoItemActionArgument {
+
+ // ::: vars
+ //
+
+
+ // ::: constructors
+ //
+ public BusinessPromoItemEditArgument() {
+ }
+
+ public BusinessPromoItemEditArgument(BusinessPromoItemEntity entity) {
+ super(entity);
+ }
+
+
+ // ::: fields
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemEnableAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemEnableAction.java
new file mode 100644
index 0000000..2c97339
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemEnableAction.java
@@ -0,0 +1,60 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromoitem;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesspromoitem.BusinessPromoItemEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoItemEnableAction extends AppAction {
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.businesspromoitem_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.businesspromoitem_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var model = getArgument().getEntity();
+
+ enableEntity(model);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ }
+
+ // ::: enable
+ //
+ private void enableEntity(BusinessPromoItemEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessPromoItemStore();
+
+ if (getArgument().getEntity().isActive()) {
+ store.enableById(getContext(), model.getId());
+ } else {
+ store.disableById(getContext(), model.getId());
+ }
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemFindAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemFindAction.java
new file mode 100644
index 0000000..32070e3
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemFindAction.java
@@ -0,0 +1,64 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromoitem;
+
+// java
+import java.util.HashMap;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesspromoitem.BusinessPromoItemEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoItemFindAction extends AppAction {
+
+ // ::: vars
+ //
+ private BusinessPromoItemEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.businesspromoitem_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.businesspromoitem_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var model = getArgument().getEntity();
+ entity = findEntity(model);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new HashMap();
+ result.put("entity", entity);
+ setResult(result);
+ }
+
+ // ::: find
+ //
+ private BusinessPromoItemEntity findEntity(BusinessPromoItemEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessPromoItemStore();
+ return store.findById(getContext(), model.getId());
+ }
+
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemListAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemListAction.java
new file mode 100644
index 0000000..6b84481
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemListAction.java
@@ -0,0 +1,150 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromoitem;
+
+// java
+import java.util.HashMap;
+import java.util.List;
+import java.util.LinkedList;
+import java.util.Map;
+// spring
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// entity
+import io.kumare.iqr.mod.biz.store.businesspromoitem.BusinessPromoItemEntity;
+import io.kumare.iqr.mod.biz.store.businesspromoitem.BusinessPromoItemMapBuilder;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoItemListAction extends AppAction {
+
+ // ::: vars
+ //
+ private final Map result = new HashMap();
+ private final List entities = new LinkedList<>();
+
+ // ::: public api
+ //
+ public List getEntities() {
+ return entities;
+ }
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ result.put("pageable", getArgument().isPageable());
+ result.put("wrapped", getArgument().isWrapped());
+
+ if (getArgument().isPageable()) {
+
+ var page = makePage();
+ entities.addAll(page.toList());
+
+ if (getArgument().isWrapped()) {
+ result.put("page", makeWrappedPage(page));
+ } else {
+ result.put("page", page);
+ }
+
+ } else {
+
+ var list = makeList();
+ entities.addAll(list);
+
+ if (getArgument().isWrapped()) {
+ result.put("list", makeWrappedList());
+ } else {
+ result.put("list", list);
+ }
+ }
+
+ }
+
+ @Override
+ protected void setResultOnly() {
+ setResult(result);
+ }
+
+ // ::: page
+ //
+ private Page makePage() {
+
+ var page = getArgument().getPageNumber();
+ var size = getArgument().getPageSize();
+ //var sort = getArgument().getSort();
+
+ var pageable = PageRequest.of(page, size);
+
+ var store = AppModules.biz.getController().getBusinessPromoItemStore();
+ return store.getRepository().findAll(pageable);
+ }
+
+ // ::: wrapped page
+ //
+ private Map makeWrappedPage(Page found) {
+
+ var page = new HashMap();
+ var content = new LinkedList();
+
+ wrapList(entities, content);
+
+ page.put("size", found.getSize());
+ page.put("number", found.getNumber());
+ page.put("totalElements", found.getTotalElements());
+ page.put("totalPages", found.getTotalPages());
+ page.put("content", content);
+
+ return page;
+ }
+
+
+ // ::: list
+ //
+
+ private List makeList() {
+
+ var store = AppModules.biz.getController().getBusinessPromoItemStore();
+
+ return store.listAll(getContext());
+ }
+
+ // ::: wrapped list
+ private List makeWrappedList() {
+ var list = new LinkedList();
+
+ wrapList(entities, list);
+
+ return list;
+ }
+
+ // ::: wrapper
+ //
+ private void wrapList(List found, List output) {
+
+ var builder = new BusinessPromoItemMapBuilder().addListGroup();
+ builder.getBusinessBuilder().addMainGroup();
+ builder.getPromoBuilder().addMainGroup();
+ builder.getImageBuilder().addMainGroup();
+
+ output.addAll(builder.build(getContext(), found));
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemListArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemListArgument.java
new file mode 100644
index 0000000..7e171f4
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemListArgument.java
@@ -0,0 +1,33 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromoitem;
+
+// app
+import io.kumare.iqr.app.action.AppListActionArgument;
+// store
+import io.kumare.iqr.mod.biz.store.businesspromoitem.BusinessPromoItemEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoItemListArgument extends AppListActionArgument {
+
+ // ::: vars
+ //
+
+ // ::: constructors
+ //
+ public BusinessPromoItemListArgument() {
+ }
+
+ public BusinessPromoItemListArgument(BusinessPromoItemEntity entity) {
+ super(entity);
+ }
+
+
+ // ::: fields
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemPreloadAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemPreloadAction.java
new file mode 100644
index 0000000..3c46adc
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemPreloadAction.java
@@ -0,0 +1,123 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromoitem;
+
+// java
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesspromoitem.BusinessPromoItemEntity;
+// relations
+import io.kumare.iqr.mod.biz.store.businessimage.BusinessImageEntity;
+import io.kumare.iqr.mod.biz.store.businesspromo.BusinessPromoEntity;
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoItemPreloadAction extends AppAction {
+
+ // ::: vars
+ //
+ private final Map result = new HashMap();
+ private Map params = new HashMap<>();
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifEmpty(getArgument().getAction(), BizErrors.businesspromoitem_preload_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ if(getArgument().getParams() != null) {
+ params = getArgument().getParams();
+ }
+
+ switch (getArgument().getAction()) {
+ case "find" ->
+ prepareFind();
+ case "list" ->
+ prepareList();
+ case "add" ->
+ prepareAdd();
+ case "edit" ->
+ prepareEdit();
+ }
+ }
+
+ @Override
+ protected void setResultOnly() {
+ setResult(result);
+ }
+
+ // ::: preload
+ //
+ private void prepareAdd() {
+ result.put("businessPromos", listBusinessPromos());
+ result.put("businessImages", listBusinessImages());
+ result.put("businesss", listBusinesss());
+ }
+
+ private void prepareEdit() {
+ var entity = findEntity();
+ result.put("entity", entity);
+ result.put("business", entity.getBusiness());
+ result.put("promo", entity.getPromo());
+ result.put("image", entity.getImage());
+ }
+
+ private void prepareList() {
+ }
+
+ private void prepareFind() {
+ var entity = findEntity();
+ result.put("entity", entity);
+ result.put("business", entity.getBusiness());
+ result.put("promo", entity.getPromo());
+ result.put("image", entity.getImage());
+ }
+
+ // ::: queries
+ //
+ private BusinessPromoItemEntity findEntity() {
+ var store = AppModules.biz.getController().getBusinessPromoItemStore();
+
+ var id = (String) params.get("id");
+ if(id == null && getArgument().getEntity() != null) {
+ id = getArgument().getEntity().getId();
+ }
+ return store.findById(getContext(), id);
+ }
+
+ public List listBusinessPromos() {
+ var store = AppModules.biz.getController().getBusinessPromoStore();
+
+ return store.listAll(getContext());
+ }
+ public List listBusinessImages() {
+ var store = AppModules.biz.getController().getBusinessImageStore();
+
+ return store.listAll(getContext());
+ }
+ public List listBusinesss() {
+ var store = AppModules.biz.getController().getBusinessStore();
+
+ return store.listAll(getContext());
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemPreloadArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemPreloadArgument.java
new file mode 100644
index 0000000..d548cf4
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesspromoitem/BusinessPromoItemPreloadArgument.java
@@ -0,0 +1,26 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesspromoitem;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessPromoItemPreloadArgument extends BusinessPromoItemActionArgument {
+
+ // ::: vars
+ //
+ private String action;
+
+ // ::: fields
+ //
+ public String getAction() {
+ return action;
+ }
+
+ public void setAction(String action) {
+ this.action = action;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingActionArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingActionArgument.java
new file mode 100644
index 0000000..193126d
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingActionArgument.java
@@ -0,0 +1,29 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesssetting;
+
+// base
+import io.kumare.iqr.app.action.AppEntityActionArgument;
+// entity
+import io.kumare.iqr.mod.biz.store.businesssetting.BusinessSettingEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessSettingActionArgument extends AppEntityActionArgument {
+
+ // ::: constructors
+ //
+ public BusinessSettingActionArgument() {
+ }
+
+ public BusinessSettingActionArgument(BusinessSettingEntity entity) {
+ super(entity);
+ }
+
+ // ::: api
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingAddAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingAddAction.java
new file mode 100644
index 0000000..6957297
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingAddAction.java
@@ -0,0 +1,117 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesssetting;
+
+
+// lib
+import io.kumare.lib.base.server.spring.action.Actions;
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesssetting.BusinessSettingEntity;
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessSettingAddAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessSettingEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, BizErrors.businesssetting_notfound);
+
+ // relations
+ V.ifNull(model.getBusiness(), BizErrors.businesssetting_business_notfound);
+
+ // fields
+ V.ifEmpty(model.getPointExchange(), BizErrors.businesssetting_pointexchange_empty);
+ V.ifEmpty(model.getLeadCaptureReward(), BizErrors.businesssetting_leadcapturereward_empty);
+ V.ifEmpty(model.getCustomerCaptureReward(), BizErrors.businesssetting_customercapturereward_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ // arguments
+ var argModel = getArgument().getEntity();
+
+ // controllers
+ var biz = AppModules.biz.getController();
+
+ var businessStore = biz.getBusinessStore();
+
+ var business = businessStore.ensure(getContext(), argModel.getBusiness(), BizErrors.businesssetting_business_notfound);
+
+ // model
+ var model = makeModel(business);
+
+ // add
+ entity = saveEntity(model);
+
+ // add others
+
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private BusinessSettingEntity makeModel(BusinessEntity business) {
+
+ var argModel = getArgument().getEntity();
+ var model = new BusinessSettingEntity();
+
+ // relations
+ model.setBusiness(business);
+
+ // fields
+ model.setPointExchange(argModel.getPointExchange());
+ model.setLeadCaptureReward(argModel.getLeadCaptureReward());
+ model.setCustomerCaptureReward(argModel.getCustomerCaptureReward());
+ model.setActive(true);
+
+
+
+ return model;
+ }
+
+ // ::: save
+ //
+ private BusinessSettingEntity saveEntity(BusinessSettingEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessSettingStore();
+
+ var saved = store.add(getContext(), model);
+ getContext().attach(saved.getId(), saved);
+ return saved;
+ }
+
+
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingAddArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingAddArgument.java
new file mode 100644
index 0000000..281791c
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingAddArgument.java
@@ -0,0 +1,34 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesssetting;
+
+
+// app
+import io.kumare.iqr.mod.biz.store.businesssetting.BusinessSettingEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessSettingAddArgument extends BusinessSettingActionArgument {
+
+ // ::: vars
+ //
+
+
+ // ::: constructors
+ //
+ public BusinessSettingAddArgument() {
+ }
+
+ public BusinessSettingAddArgument(BusinessSettingEntity entity) {
+ super(entity);
+ }
+
+ // ::: fields
+ //
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingDeleteAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingDeleteAction.java
new file mode 100644
index 0000000..8857d95
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingDeleteAction.java
@@ -0,0 +1,59 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesssetting;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesssetting.BusinessSettingEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessSettingDeleteAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessSettingEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.businesssetting_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.businesssetting_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var argModel = getArgument().getEntity();
+
+ deleteEntity(argModel);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ }
+
+ // ::: delete
+ //
+ private void deleteEntity(BusinessSettingEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessSettingStore();
+
+ store.deleteById(getContext(), model.getId());
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingEditAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingEditAction.java
new file mode 100644
index 0000000..ad36b9c
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingEditAction.java
@@ -0,0 +1,97 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesssetting;
+
+// lib
+import io.kumare.lib.v.V;
+// app
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesssetting.BusinessSettingEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessSettingEditAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessSettingEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, BizErrors.businesssetting_notfound);
+
+ // fields
+ V.ifEmpty(model.getPointExchange(), BizErrors.businesssetting_pointexchange_empty);
+ V.ifEmpty(model.getLeadCaptureReward(), BizErrors.businesssetting_leadcapturereward_empty);
+ V.ifEmpty(model.getCustomerCaptureReward(), BizErrors.businesssetting_customercapturereward_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ // arguments
+ var argModel = getArgument().getEntity();
+
+ // controllers
+
+ var biz = AppModules.biz.getController();
+ var businessSettingStore = biz.getBusinessSettingStore();
+
+ // edit
+ entity = businessSettingStore.ensure(getContext(), argModel, BizErrors.businesssetting_notfound);
+
+ editEntity();
+
+ entity = saveEntity();
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private void editEntity() {
+
+ var model = getArgument().getEntity();
+
+ // fields
+ entity.setPointExchange(V.firstNotEmpty(model.getPointExchange(), entity.getPointExchange()));
+ entity.setLeadCaptureReward(V.firstNotEmpty(model.getLeadCaptureReward(), entity.getLeadCaptureReward()));
+ entity.setCustomerCaptureReward(V.firstNotEmpty(model.getCustomerCaptureReward(), entity.getCustomerCaptureReward()));
+
+
+ }
+
+ // ::: save
+ //
+ private BusinessSettingEntity saveEntity() {
+
+ var store = AppModules.biz.getController().getBusinessSettingStore();
+
+ var saved = store.edit(getContext(), entity);
+ getContext().attach(saved.getId(), saved);
+ return saved;
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingEditArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingEditArgument.java
new file mode 100644
index 0000000..91f45dd
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingEditArgument.java
@@ -0,0 +1,32 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesssetting;
+
+// app
+import io.kumare.iqr.mod.biz.store.businesssetting.BusinessSettingEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessSettingEditArgument extends BusinessSettingActionArgument {
+
+ // ::: vars
+ //
+
+
+ // ::: constructors
+ //
+ public BusinessSettingEditArgument() {
+ }
+
+ public BusinessSettingEditArgument(BusinessSettingEntity entity) {
+ super(entity);
+ }
+
+
+ // ::: fields
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingEnableAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingEnableAction.java
new file mode 100644
index 0000000..ebb07c8
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingEnableAction.java
@@ -0,0 +1,60 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesssetting;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesssetting.BusinessSettingEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessSettingEnableAction extends AppAction {
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.businesssetting_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.businesssetting_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var model = getArgument().getEntity();
+
+ enableEntity(model);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ }
+
+ // ::: enable
+ //
+ private void enableEntity(BusinessSettingEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessSettingStore();
+
+ if (getArgument().getEntity().isActive()) {
+ store.enableById(getContext(), model.getId());
+ } else {
+ store.disableById(getContext(), model.getId());
+ }
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingFindAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingFindAction.java
new file mode 100644
index 0000000..83570c7
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingFindAction.java
@@ -0,0 +1,64 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesssetting;
+
+// java
+import java.util.HashMap;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesssetting.BusinessSettingEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessSettingFindAction extends AppAction {
+
+ // ::: vars
+ //
+ private BusinessSettingEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.businesssetting_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.businesssetting_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var model = getArgument().getEntity();
+ entity = findEntity(model);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new HashMap();
+ result.put("entity", entity);
+ setResult(result);
+ }
+
+ // ::: find
+ //
+ private BusinessSettingEntity findEntity(BusinessSettingEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessSettingStore();
+ return store.findById(getContext(), model.getId());
+ }
+
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingListAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingListAction.java
new file mode 100644
index 0000000..449169a
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingListAction.java
@@ -0,0 +1,148 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesssetting;
+
+// java
+import java.util.HashMap;
+import java.util.List;
+import java.util.LinkedList;
+import java.util.Map;
+// spring
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// entity
+import io.kumare.iqr.mod.biz.store.businesssetting.BusinessSettingEntity;
+import io.kumare.iqr.mod.biz.store.businesssetting.BusinessSettingMapBuilder;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessSettingListAction extends AppAction {
+
+ // ::: vars
+ //
+ private final Map result = new HashMap();
+ private final List entities = new LinkedList<>();
+
+ // ::: public api
+ //
+ public List getEntities() {
+ return entities;
+ }
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ result.put("pageable", getArgument().isPageable());
+ result.put("wrapped", getArgument().isWrapped());
+
+ if (getArgument().isPageable()) {
+
+ var page = makePage();
+ entities.addAll(page.toList());
+
+ if (getArgument().isWrapped()) {
+ result.put("page", makeWrappedPage(page));
+ } else {
+ result.put("page", page);
+ }
+
+ } else {
+
+ var list = makeList();
+ entities.addAll(list);
+
+ if (getArgument().isWrapped()) {
+ result.put("list", makeWrappedList());
+ } else {
+ result.put("list", list);
+ }
+ }
+
+ }
+
+ @Override
+ protected void setResultOnly() {
+ setResult(result);
+ }
+
+ // ::: page
+ //
+ private Page makePage() {
+
+ var page = getArgument().getPageNumber();
+ var size = getArgument().getPageSize();
+ //var sort = getArgument().getSort();
+
+ var pageable = PageRequest.of(page, size);
+
+ var store = AppModules.biz.getController().getBusinessSettingStore();
+ return store.getRepository().findAll(pageable);
+ }
+
+ // ::: wrapped page
+ //
+ private Map makeWrappedPage(Page found) {
+
+ var page = new HashMap();
+ var content = new LinkedList();
+
+ wrapList(entities, content);
+
+ page.put("size", found.getSize());
+ page.put("number", found.getNumber());
+ page.put("totalElements", found.getTotalElements());
+ page.put("totalPages", found.getTotalPages());
+ page.put("content", content);
+
+ return page;
+ }
+
+
+ // ::: list
+ //
+
+ private List makeList() {
+
+ var store = AppModules.biz.getController().getBusinessSettingStore();
+
+ return store.listAll(getContext());
+ }
+
+ // ::: wrapped list
+ private List makeWrappedList() {
+ var list = new LinkedList();
+
+ wrapList(entities, list);
+
+ return list;
+ }
+
+ // ::: wrapper
+ //
+ private void wrapList(List found, List output) {
+
+ var builder = new BusinessSettingMapBuilder().addListGroup();
+ builder.getBusinessBuilder().addMainGroup();
+
+ output.addAll(builder.build(getContext(), found));
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingListArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingListArgument.java
new file mode 100644
index 0000000..3cbb260
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingListArgument.java
@@ -0,0 +1,33 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesssetting;
+
+// app
+import io.kumare.iqr.app.action.AppListActionArgument;
+// store
+import io.kumare.iqr.mod.biz.store.businesssetting.BusinessSettingEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessSettingListArgument extends AppListActionArgument {
+
+ // ::: vars
+ //
+
+ // ::: constructors
+ //
+ public BusinessSettingListArgument() {
+ }
+
+ public BusinessSettingListArgument(BusinessSettingEntity entity) {
+ super(entity);
+ }
+
+
+ // ::: fields
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingPreloadAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingPreloadAction.java
new file mode 100644
index 0000000..e9fac28
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingPreloadAction.java
@@ -0,0 +1,105 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesssetting;
+
+// java
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesssetting.BusinessSettingEntity;
+// relations
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessSettingPreloadAction extends AppAction {
+
+ // ::: vars
+ //
+ private final Map result = new HashMap();
+ private Map params = new HashMap<>();
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifEmpty(getArgument().getAction(), BizErrors.businesssetting_preload_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ if(getArgument().getParams() != null) {
+ params = getArgument().getParams();
+ }
+
+ switch (getArgument().getAction()) {
+ case "find" ->
+ prepareFind();
+ case "list" ->
+ prepareList();
+ case "add" ->
+ prepareAdd();
+ case "edit" ->
+ prepareEdit();
+ }
+ }
+
+ @Override
+ protected void setResultOnly() {
+ setResult(result);
+ }
+
+ // ::: preload
+ //
+ private void prepareAdd() {
+ result.put("businesss", listBusinesss());
+ }
+
+ private void prepareEdit() {
+ var entity = findEntity();
+ result.put("entity", entity);
+ result.put("business", entity.getBusiness());
+ }
+
+ private void prepareList() {
+ }
+
+ private void prepareFind() {
+ var entity = findEntity();
+ result.put("entity", entity);
+ result.put("business", entity.getBusiness());
+ }
+
+ // ::: queries
+ //
+ private BusinessSettingEntity findEntity() {
+ var store = AppModules.biz.getController().getBusinessSettingStore();
+
+ var id = (String) params.get("id");
+ if(id == null && getArgument().getEntity() != null) {
+ id = getArgument().getEntity().getId();
+ }
+ return store.findById(getContext(), id);
+ }
+
+ public List listBusinesss() {
+ var store = AppModules.biz.getController().getBusinessStore();
+
+ return store.listAll(getContext());
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingPreloadArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingPreloadArgument.java
new file mode 100644
index 0000000..a1de782
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesssetting/BusinessSettingPreloadArgument.java
@@ -0,0 +1,26 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesssetting;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessSettingPreloadArgument extends BusinessSettingActionArgument {
+
+ // ::: vars
+ //
+ private String action;
+
+ // ::: fields
+ //
+ public String getAction() {
+ return action;
+ }
+
+ public void setAction(String action) {
+ this.action = action;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagActionArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagActionArgument.java
new file mode 100644
index 0000000..0337387
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagActionArgument.java
@@ -0,0 +1,29 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesstag;
+
+// base
+import io.kumare.iqr.app.action.AppEntityActionArgument;
+// entity
+import io.kumare.iqr.mod.biz.store.businesstag.BusinessTagEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessTagActionArgument extends AppEntityActionArgument {
+
+ // ::: constructors
+ //
+ public BusinessTagActionArgument() {
+ }
+
+ public BusinessTagActionArgument(BusinessTagEntity entity) {
+ super(entity);
+ }
+
+ // ::: api
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagAddAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagAddAction.java
new file mode 100644
index 0000000..0237abb
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagAddAction.java
@@ -0,0 +1,114 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesstag;
+
+
+// lib
+import io.kumare.lib.base.server.spring.action.Actions;
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesstag.BusinessTagEntity;
+
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessTagAddAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessTagEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, BizErrors.businesstag_notfound);
+
+ // relations
+
+ // fields
+ V.ifEmpty(model.getEntityKey(), BizErrors.businesstag_entitykey_empty);
+ V.ifEmpty(model.getName(), BizErrors.businesstag_name_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ // arguments
+ var argModel = getArgument().getEntity();
+
+ // controllers
+
+
+
+
+
+
+ // model
+ var model = makeModel();
+
+ // add
+ entity = saveEntity(model);
+
+ // add others
+
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private BusinessTagEntity makeModel() {
+
+ var argModel = getArgument().getEntity();
+ var model = new BusinessTagEntity();
+
+ // relations
+
+
+ // fields
+ model.setEntityKey(argModel.getEntityKey());
+ model.setName(argModel.getName());
+ model.setActive(true);
+
+
+
+ return model;
+ }
+
+ // ::: save
+ //
+ private BusinessTagEntity saveEntity(BusinessTagEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessTagStore();
+
+ var saved = store.add(getContext(), model);
+ getContext().attach(saved.getId(), saved);
+ return saved;
+ }
+
+
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagAddArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagAddArgument.java
new file mode 100644
index 0000000..4d9d197
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagAddArgument.java
@@ -0,0 +1,34 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesstag;
+
+
+// app
+import io.kumare.iqr.mod.biz.store.businesstag.BusinessTagEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessTagAddArgument extends BusinessTagActionArgument {
+
+ // ::: vars
+ //
+
+
+ // ::: constructors
+ //
+ public BusinessTagAddArgument() {
+ }
+
+ public BusinessTagAddArgument(BusinessTagEntity entity) {
+ super(entity);
+ }
+
+ // ::: fields
+ //
+
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagDeleteAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagDeleteAction.java
new file mode 100644
index 0000000..6890dbd
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagDeleteAction.java
@@ -0,0 +1,59 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesstag;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesstag.BusinessTagEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessTagDeleteAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessTagEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.businesstag_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.businesstag_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var argModel = getArgument().getEntity();
+
+ deleteEntity(argModel);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ }
+
+ // ::: delete
+ //
+ private void deleteEntity(BusinessTagEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessTagStore();
+
+ store.deleteById(getContext(), model.getId());
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagEditAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagEditAction.java
new file mode 100644
index 0000000..8a370bc
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagEditAction.java
@@ -0,0 +1,95 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesstag;
+
+// lib
+import io.kumare.lib.v.V;
+// app
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesstag.BusinessTagEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessTagEditAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessTagEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, BizErrors.businesstag_notfound);
+
+ // fields
+ V.ifEmpty(model.getEntityKey(), BizErrors.businesstag_entitykey_empty);
+ V.ifEmpty(model.getName(), BizErrors.businesstag_name_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ // arguments
+ var argModel = getArgument().getEntity();
+
+ // controllers
+
+ var biz = AppModules.biz.getController();
+ var businessTagStore = biz.getBusinessTagStore();
+
+ // edit
+ entity = businessTagStore.ensure(getContext(), argModel, BizErrors.businesstag_notfound);
+
+ editEntity();
+
+ entity = saveEntity();
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private void editEntity() {
+
+ var model = getArgument().getEntity();
+
+ // fields
+ entity.setEntityKey(V.firstNotEmpty(model.getEntityKey(), entity.getEntityKey()));
+ entity.setName(V.firstNotEmpty(model.getName(), entity.getName()));
+
+
+ }
+
+ // ::: save
+ //
+ private BusinessTagEntity saveEntity() {
+
+ var store = AppModules.biz.getController().getBusinessTagStore();
+
+ var saved = store.edit(getContext(), entity);
+ getContext().attach(saved.getId(), saved);
+ return saved;
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagEditArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagEditArgument.java
new file mode 100644
index 0000000..167f7e1
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagEditArgument.java
@@ -0,0 +1,32 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesstag;
+
+// app
+import io.kumare.iqr.mod.biz.store.businesstag.BusinessTagEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessTagEditArgument extends BusinessTagActionArgument {
+
+ // ::: vars
+ //
+
+
+ // ::: constructors
+ //
+ public BusinessTagEditArgument() {
+ }
+
+ public BusinessTagEditArgument(BusinessTagEntity entity) {
+ super(entity);
+ }
+
+
+ // ::: fields
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagEnableAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagEnableAction.java
new file mode 100644
index 0000000..847c9ea
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagEnableAction.java
@@ -0,0 +1,60 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesstag;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppActionResult;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesstag.BusinessTagEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessTagEnableAction extends AppAction {
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.businesstag_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.businesstag_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var model = getArgument().getEntity();
+
+ enableEntity(model);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ }
+
+ // ::: enable
+ //
+ private void enableEntity(BusinessTagEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessTagStore();
+
+ if (getArgument().getEntity().isActive()) {
+ store.enableById(getContext(), model.getId());
+ } else {
+ store.disableById(getContext(), model.getId());
+ }
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagFindAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagFindAction.java
new file mode 100644
index 0000000..338153c
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagFindAction.java
@@ -0,0 +1,64 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesstag;
+
+// java
+import java.util.HashMap;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesstag.BusinessTagEntity;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessTagFindAction extends AppAction {
+
+ // ::: vars
+ //
+ private BusinessTagEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifNull(getArgument().getEntity(), BizErrors.businesstag_notfound);
+ V.ifNull(getArgument().getEntity().getId(), BizErrors.businesstag_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ var model = getArgument().getEntity();
+ entity = findEntity(model);
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new HashMap();
+ result.put("entity", entity);
+ setResult(result);
+ }
+
+ // ::: find
+ //
+ private BusinessTagEntity findEntity(BusinessTagEntity model) {
+
+ var store = AppModules.biz.getController().getBusinessTagStore();
+ return store.findById(getContext(), model.getId());
+ }
+
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagListAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagListAction.java
new file mode 100644
index 0000000..68f6157
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagListAction.java
@@ -0,0 +1,148 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesstag;
+
+// java
+import java.util.HashMap;
+import java.util.List;
+import java.util.LinkedList;
+import java.util.Map;
+// spring
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// entity
+import io.kumare.iqr.mod.biz.store.businesstag.BusinessTagEntity;
+import io.kumare.iqr.mod.biz.store.businesstag.BusinessTagMapBuilder;
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessTagListAction extends AppAction {
+
+ // ::: vars
+ //
+ private final Map result = new HashMap();
+ private final List entities = new LinkedList<>();
+
+ // ::: public api
+ //
+ public List getEntities() {
+ return entities;
+ }
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+
+ result.put("pageable", getArgument().isPageable());
+ result.put("wrapped", getArgument().isWrapped());
+
+ if (getArgument().isPageable()) {
+
+ var page = makePage();
+ entities.addAll(page.toList());
+
+ if (getArgument().isWrapped()) {
+ result.put("page", makeWrappedPage(page));
+ } else {
+ result.put("page", page);
+ }
+
+ } else {
+
+ var list = makeList();
+ entities.addAll(list);
+
+ if (getArgument().isWrapped()) {
+ result.put("list", makeWrappedList());
+ } else {
+ result.put("list", list);
+ }
+ }
+
+ }
+
+ @Override
+ protected void setResultOnly() {
+ setResult(result);
+ }
+
+ // ::: page
+ //
+ private Page makePage() {
+
+ var page = getArgument().getPageNumber();
+ var size = getArgument().getPageSize();
+ //var sort = getArgument().getSort();
+
+ var pageable = PageRequest.of(page, size);
+
+ var store = AppModules.biz.getController().getBusinessTagStore();
+ return store.getRepository().findAll(pageable);
+ }
+
+ // ::: wrapped page
+ //
+ private Map makeWrappedPage(Page found) {
+
+ var page = new HashMap();
+ var content = new LinkedList();
+
+ wrapList(entities, content);
+
+ page.put("size", found.getSize());
+ page.put("number", found.getNumber());
+ page.put("totalElements", found.getTotalElements());
+ page.put("totalPages", found.getTotalPages());
+ page.put("content", content);
+
+ return page;
+ }
+
+
+ // ::: list
+ //
+
+ private List makeList() {
+
+ var store = AppModules.biz.getController().getBusinessTagStore();
+
+ return store.listAll(getContext());
+ }
+
+ // ::: wrapped list
+ private List makeWrappedList() {
+ var list = new LinkedList();
+
+ wrapList(entities, list);
+
+ return list;
+ }
+
+ // ::: wrapper
+ //
+ private void wrapList(List found, List output) {
+
+ var builder = new BusinessTagMapBuilder().addListGroup();
+
+
+ output.addAll(builder.build(getContext(), found));
+ }
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagListArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagListArgument.java
new file mode 100644
index 0000000..e8c4453
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagListArgument.java
@@ -0,0 +1,33 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesstag;
+
+// app
+import io.kumare.iqr.app.action.AppListActionArgument;
+// store
+import io.kumare.iqr.mod.biz.store.businesstag.BusinessTagEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessTagListArgument extends AppListActionArgument {
+
+ // ::: vars
+ //
+
+ // ::: constructors
+ //
+ public BusinessTagListArgument() {
+ }
+
+ public BusinessTagListArgument(BusinessTagEntity entity) {
+ super(entity);
+ }
+
+
+ // ::: fields
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagPreloadAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagPreloadAction.java
new file mode 100644
index 0000000..3a58daa
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagPreloadAction.java
@@ -0,0 +1,101 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesstag;
+
+// java
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.module.AppModules;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businesstag.BusinessTagEntity;
+// relations
+
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessTagPreloadAction extends AppAction {
+
+ // ::: vars
+ //
+ private final Map result = new HashMap();
+ private Map params = new HashMap<>();
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+ V.ifEmpty(getArgument().getAction(), BizErrors.businesstag_preload_empty);
+ }
+
+ @Override
+ protected void doAction() {
+ if(getArgument().getParams() != null) {
+ params = getArgument().getParams();
+ }
+
+ switch (getArgument().getAction()) {
+ case "find" ->
+ prepareFind();
+ case "list" ->
+ prepareList();
+ case "add" ->
+ prepareAdd();
+ case "edit" ->
+ prepareEdit();
+ }
+ }
+
+ @Override
+ protected void setResultOnly() {
+ setResult(result);
+ }
+
+ // ::: preload
+ //
+ private void prepareAdd() {
+
+ }
+
+ private void prepareEdit() {
+ var entity = findEntity();
+ result.put("entity", entity);
+
+ }
+
+ private void prepareList() {
+ }
+
+ private void prepareFind() {
+ var entity = findEntity();
+ result.put("entity", entity);
+
+ }
+
+ // ::: queries
+ //
+ private BusinessTagEntity findEntity() {
+ var store = AppModules.biz.getController().getBusinessTagStore();
+
+ var id = (String) params.get("id");
+ if(id == null && getArgument().getEntity() != null) {
+ id = getArgument().getEntity().getId();
+ }
+ return store.findById(getContext(), id);
+ }
+
+
+
+}
+
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagPreloadArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagPreloadArgument.java
new file mode 100644
index 0000000..7792cc2
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businesstag/BusinessTagPreloadArgument.java
@@ -0,0 +1,26 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businesstag;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessTagPreloadArgument extends BusinessTagActionArgument {
+
+ // ::: vars
+ //
+ private String action;
+
+ // ::: fields
+ //
+ public String getAction() {
+ return action;
+ }
+
+ public void setAction(String action) {
+ this.action = action;
+ }
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessworker/BusinessWorkerActionArgument.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessworker/BusinessWorkerActionArgument.java
new file mode 100644
index 0000000..cb865d3
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessworker/BusinessWorkerActionArgument.java
@@ -0,0 +1,29 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessworker;
+
+// base
+import io.kumare.iqr.app.action.AppEntityActionArgument;
+// entity
+import io.kumare.iqr.mod.biz.store.businessworker.BusinessWorkerEntity;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessWorkerActionArgument extends AppEntityActionArgument {
+
+ // ::: constructors
+ //
+ public BusinessWorkerActionArgument() {
+ }
+
+ public BusinessWorkerActionArgument(BusinessWorkerEntity entity) {
+ super(entity);
+ }
+
+ // ::: api
+ //
+
+}
diff --git a/src/main/java/io/kumare/iqr/mod/biz/action/businessworker/BusinessWorkerAddAction.java b/src/main/java/io/kumare/iqr/mod/biz/action/businessworker/BusinessWorkerAddAction.java
new file mode 100644
index 0000000..f41357b
--- /dev/null
+++ b/src/main/java/io/kumare/iqr/mod/biz/action/businessworker/BusinessWorkerAddAction.java
@@ -0,0 +1,146 @@
+/*
+ *
+ */
+package io.kumare.iqr.mod.biz.action.businessworker;
+
+// lib
+import io.kumare.lib.v.V;
+// base
+import io.kumare.iqr.app.AppErrors;
+import io.kumare.iqr.app.action.AppAction;
+import io.kumare.iqr.app.action.AppEntityActionResult;
+import io.kumare.iqr.app.module.AppModules;
+import io.kumare.iqr.mod.authentication.action.authuser.AuthUserAddArgument;
+// module
+import io.kumare.iqr.mod.biz.BizErrors;
+// entity
+import io.kumare.iqr.mod.biz.store.businessworker.BusinessWorkerEntity;
+import io.kumare.iqr.mod.taxonomy.store.taxon.TaxonEntity;
+import io.kumare.iqr.mod.biz.store.business.BusinessEntity;
+import io.kumare.iqr.mod.biz.store.BizTaxonomies;
+import io.kumare.iqr.mod.biz.store.BizWorkerRoles;
+
+/**
+ *
+ * @author afatecha
+ */
+public class BusinessWorkerAddAction extends AppAction> {
+
+ // ::: vars
+ //
+ private BusinessWorkerEntity entity;
+
+ // ::: protected api
+ //
+ @Override
+ protected void checkArgument() {
+ V.ifNull(getArgument(), AppErrors.action_arg_notfound);
+
+ // entity
+ var model = getArgument().getEntity();
+ V.ifNull(model, BizErrors.businessworker_notfound);
+
+ // relations
+ V.ifNull(model.getBusiness(), BizErrors.businessworker_business_notfound);
+ //V.ifNull(model.getAuthUser(), BizErrors.businessworker_authuser_notfound);
+ V.ifNull(model.getRole(), BizErrors.businessworker_role_notfound);
+ //V.ifNull(model.getState(), BizErrors.businessworker_state_notfound);
+
+ // fields
+ //V.ifEmpty(model.getEntityKey(), BizErrors.businessworker_entitykey_empty);
+ //V.ifEmpty(model.getRoleValue(), BizErrors.businessworker_rolevalue_empty);
+ //V.ifEmpty(model.getStateValue(), BizErrors.businessworker_statevalue_empty);
+ //V.ifEmpty(model.getEmail(), BizErrors.businessworker_email_empty);
+ //V.ifEmpty(model.getPhone(), BizErrors.businessworker_phone_empty);
+ V.ifEmpty(model.getName(), BizErrors.businessworker_name_empty);
+ //V.ifEmpty(model.getDescription(), BizErrors.businessworker_description_empty);
+
+ // other arguments
+ V.ifNull(getArgument().getAuthUser(), BizErrors.businessworker_authuser_notfound);
+ }
+
+ @Override
+ protected void doAction() {
+ // arguments
+ var argModel = getArgument().getEntity();
+
+ // controllers
+ var biz = AppModules.biz.getController();
+ var businessStore = biz.getBusinessStore();
+
+ var business = businessStore.ensure(getContext(),
+ argModel.getBusiness(),
+ BizErrors.businessworker_business_notfound);
+
+ var roleKey = argModel.getRole().getEntityKey();
+ var role = BizTaxonomies.businessWorkerRole.ensureByKey(getContext(), roleKey);
+ var state = BizTaxonomies.businessWorkerState.ensureDefault(getContext());
+
+ // model
+ var model = makeModel(business, role, state);
+
+ // add
+ entity = saveEntity(model);
+
+ // add others
+ addAuthUser(getArgument().getAuthUser());
+
+ // dispatchEvents
+ }
+
+ @Override
+ protected void setResultOnly() {
+ var result = new AppEntityActionResult();
+ result.setEntity(entity);
+ setResult(result);
+ }
+
+ // ::: model
+ //
+ private BusinessWorkerEntity makeModel(BusinessEntity business, TaxonEntity role, TaxonEntity state) {
+
+ var argModel = getArgument().getEntity();
+ var model = new BusinessWorkerEntity();
+
+ // relations
+ model.setBusiness(business);
+ model.setRole(role);
+ model.setRoleValue(role.getValue());
+ model.setState(state);
+ model.setStateValue(state.getValue());
+
+ // fields
+ model.setEntityKey(generateKey());
+ model.setEmail(argModel.getEmail());
+ model.setPhone(argModel.getPhone());
+ model.setName(argModel.getName());
+ model.setDescription(argModel.getDescription());
+ model.setActive(true);
+
+ return model;
+ }
+
+ private String generateKey() {
+ return "XXX-CHANGE-XXX";// base64 de un json...
+ //"http://iqr.site/pub/w/ID"
+ //