diff --git a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/AbstractAPIAction.java b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/AbstractAPIAction.java index 8425fbfb..6a32ae17 100644 --- a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/AbstractAPIAction.java +++ b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/AbstractAPIAction.java @@ -61,7 +61,6 @@ public abstract class AbstractAPIAction apiActionUtil.setBackendMetaData(this.backendMetaData); apiActionUtil.setActionInput(actionInput); - apiActionUtil.setSession(session); } } diff --git a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java index 209285e0..3623db11 100644 --- a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java +++ b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/actions/BaseAPIActionUtil.java @@ -61,6 +61,8 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.update.UpdateOutput; import com.kingsrook.qqq.backend.core.model.data.QRecord; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.tables.QTableMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.variants.BackendVariantSetting; +import com.kingsrook.qqq.backend.core.model.metadata.variants.LegacyBackendVariantSetting; import com.kingsrook.qqq.backend.core.model.session.QSession; import com.kingsrook.qqq.backend.core.model.statusmessages.SystemErrorStatusMessage; import com.kingsrook.qqq.backend.core.utils.CollectionUtils; @@ -77,6 +79,7 @@ import com.kingsrook.qqq.backend.module.api.exceptions.RetryableServerErrorExcep import com.kingsrook.qqq.backend.module.api.model.AuthorizationType; import com.kingsrook.qqq.backend.module.api.model.OutboundAPILog; import com.kingsrook.qqq.backend.module.api.model.metadata.APIBackendMetaData; +import com.kingsrook.qqq.backend.module.api.model.metadata.APIBackendVariantSetting; import com.kingsrook.qqq.backend.module.api.model.metadata.APITableBackendDetails; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.BooleanUtils; @@ -114,7 +117,6 @@ public class BaseAPIActionUtil { private final QLogger LOG = QLogger.getLogger(BaseAPIActionUtil.class); - protected QSession session; // todo not commit - delete!! protected APIBackendMetaData backendMetaData; protected AbstractTableActionInput actionInput; @@ -778,7 +780,7 @@ public class BaseAPIActionUtil if(backendMetaData.getUsesVariants()) { QRecord record = getVariantRecord(); - return (record.getValueString(backendMetaData.getVariantOptionsTableApiKeyField())); + return (record.getValueString(getVariantSettingSourceFieldName(backendMetaData, LegacyBackendVariantSetting.API_KEY, APIBackendVariantSetting.API_KEY))); } return (backendMetaData.getApiKey()); @@ -786,6 +788,18 @@ public class BaseAPIActionUtil + /*************************************************************************** + ** todo - once deprecated variant methods are removed from QBackendMetaData, + ** then we can remove the LegacyBackendVariantSetting enum, and this param. + ***************************************************************************/ + private String getVariantSettingSourceFieldName(APIBackendMetaData backendMetaData, LegacyBackendVariantSetting legacyBackendVariantSetting, APIBackendVariantSetting apiBackendVariantSetting) + { + Map map = CollectionUtils.nonNullMap(backendMetaData.getBackendVariantsConfig().getBackendSettingSourceFieldNameMap()); + return map.getOrDefault(legacyBackendVariantSetting, map.get(apiBackendVariantSetting)); + } + + + /*************************************************************************** ** ***************************************************************************/ @@ -794,7 +808,10 @@ public class BaseAPIActionUtil if(backendMetaData.getUsesVariants()) { QRecord record = getVariantRecord(); - return (Pair.of(record.getValueString(backendMetaData.getVariantOptionsTableUsernameField()), record.getValueString(backendMetaData.getVariantOptionsTablePasswordField()))); + return (Pair.of( + record.getValueString(getVariantSettingSourceFieldName(backendMetaData, LegacyBackendVariantSetting.USERNAME, APIBackendVariantSetting.USERNAME)), + record.getValueString(getVariantSettingSourceFieldName(backendMetaData, LegacyBackendVariantSetting.PASSWORD, APIBackendVariantSetting.PASSWORD)) + )); } return (Pair.of(backendMetaData.getUsername(), backendMetaData.getPassword())); @@ -812,14 +829,14 @@ public class BaseAPIActionUtil Serializable variantId = getVariantId(); GetInput getInput = new GetInput(); getInput.setShouldMaskPasswords(false); - getInput.setTableName(backendMetaData.getVariantOptionsTableName()); + getInput.setTableName(backendMetaData.getBackendVariantsConfig().getOptionsTableName()); getInput.setPrimaryKey(variantId); GetOutput getOutput = new GetAction().execute(getInput); QRecord record = getOutput.getRecord(); if(record == null) { - throw (new QException("Could not find Backend Variant in table " + backendMetaData.getVariantOptionsTableName() + " with id '" + variantId + "'")); + throw (new QException("Could not find Backend Variant in table " + backendMetaData.getBackendVariantsConfig().getOptionsTableName() + " with id '" + variantId + "'")); } return record; } @@ -832,11 +849,11 @@ public class BaseAPIActionUtil protected Serializable getVariantId() throws QException { QSession session = QContext.getQSession(); - if(session.getBackendVariants() == null || !session.getBackendVariants().containsKey(backendMetaData.getVariantOptionsTableTypeValue())) + if(session.getBackendVariants() == null || !session.getBackendVariants().containsKey(backendMetaData.getBackendVariantsConfig().getVariantTypeKey())) { throw (new QException("Could not find Backend Variant information for Backend '" + backendMetaData.getName() + "'")); } - Serializable variantId = session.getBackendVariants().get(backendMetaData.getVariantOptionsTableTypeValue()); + Serializable variantId = session.getBackendVariants().get(backendMetaData.getBackendVariantsConfig().getVariantTypeKey()); return variantId; } @@ -945,7 +962,10 @@ public class BaseAPIActionUtil if(backendMetaData.getUsesVariants()) { QRecord record = getVariantRecord(); - return (Pair.of(record.getValueString(backendMetaData.getVariantOptionsTableClientIdField()), record.getValueString(backendMetaData.getVariantOptionsTableClientSecretField()))); + return (Pair.of( + record.getValueString(getVariantSettingSourceFieldName(backendMetaData, LegacyBackendVariantSetting.CLIENT_ID, APIBackendVariantSetting.CLIENT_ID)), + record.getValueString(getVariantSettingSourceFieldName(backendMetaData, LegacyBackendVariantSetting.CLIENT_SECRET, APIBackendVariantSetting.CLIENT_SECRET)) + )); } return (Pair.of(backendMetaData.getClientId(), backendMetaData.getClientSecret())); @@ -1480,9 +1500,9 @@ public class BaseAPIActionUtil ** Setter for session ** *******************************************************************************/ + @Deprecated(since = "wasn't used.") public void setSession(QSession session) { - this.session = session; } diff --git a/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/model/metadata/APIBackendVariantSetting.java b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/model/metadata/APIBackendVariantSetting.java new file mode 100644 index 00000000..681977d3 --- /dev/null +++ b/qqq-backend-module-api/src/main/java/com/kingsrook/qqq/backend/module/api/model/metadata/APIBackendVariantSetting.java @@ -0,0 +1,38 @@ +/* + * QQQ - Low-code Application Framework for Engineers. + * Copyright (C) 2021-2025. Kingsrook, LLC + * 651 N Broad St Ste 205 # 6917 | Middletown DE 19709 | United States + * contact@kingsrook.com + * https://github.com/Kingsrook/ + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package com.kingsrook.qqq.backend.module.api.model.metadata; + + +import com.kingsrook.qqq.backend.core.model.metadata.variants.BackendVariantSetting; + + +/******************************************************************************* + ** settings that the API backend module can get from a backend variant. + *******************************************************************************/ +public enum APIBackendVariantSetting implements BackendVariantSetting +{ + USERNAME, + PASSWORD, + API_KEY, + CLIENT_ID, + CLIENT_SECRET +} diff --git a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java index c82274d6..80f227d3 100644 --- a/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java +++ b/qqq-middleware-javalin/src/main/java/com/kingsrook/qqq/backend/javalin/QJavalinImplementation.java @@ -95,8 +95,6 @@ import com.kingsrook.qqq.backend.core.model.actions.tables.get.GetInput; import com.kingsrook.qqq.backend.core.model.actions.tables.get.GetOutput; import com.kingsrook.qqq.backend.core.model.actions.tables.insert.InsertInput; import com.kingsrook.qqq.backend.core.model.actions.tables.insert.InsertOutput; -import com.kingsrook.qqq.backend.core.model.actions.tables.query.QCriteriaOperator; -import com.kingsrook.qqq.backend.core.model.actions.tables.query.QFilterCriteria; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QQueryFilter; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryInput; import com.kingsrook.qqq.backend.core.model.actions.tables.query.QueryJoin; @@ -1200,15 +1198,18 @@ public class QJavalinImplementation ///////////////////////////////////////////////////////////////////////////////////// if(backend != null && backend.getUsesVariants()) { - queryInput.setTableName(backend.getVariantOptionsTableName()); - queryInput.setFilter(new QQueryFilter(new QFilterCriteria(backend.getVariantOptionsTableTypeField(), QCriteriaOperator.EQUALS, backend.getVariantOptionsTableTypeValue()))); + QTableMetaData variantsTable = QContext.getQInstance().getTable(backend.getBackendVariantsConfig().getOptionsTableName()); + + queryInput.setTableName(variantsTable.getName()); + queryInput.setFilter(backend.getBackendVariantsConfig().getOptionsFilter()); + queryInput.setShouldGenerateDisplayValues(true); QueryOutput output = new QueryAction().execute(queryInput); for(QRecord qRecord : output.getRecords()) { variants.add(new QFrontendVariant() - .withId(qRecord.getValue(backend.getVariantOptionsTableIdField())) - .withType(backend.getVariantOptionsTableTypeValue()) - .withName(qRecord.getValueString(backend.getVariantOptionsTableNameField()))); + .withId(qRecord.getValue(variantsTable.getPrimaryKeyField())) + .withType(backend.getBackendVariantsConfig().getVariantTypeKey()) + .withName(qRecord.getRecordLabel())); } QJavalinAccessLogger.logStartSilent("variants");