From 48b8d295e3ebd62204449e186e0c3b1c922a1344 Mon Sep 17 00:00:00 2001 From: Tim Chamberlain Date: Tue, 30 Aug 2022 11:46:46 -0500 Subject: [PATCH] initial checkin of quicksight dashboard widget POC, updated to remove hard coded credentials --- qqq-backend-core/pom.xml | 15 + .../dashboard/AbstractWidgetRenderer.java | 3 +- .../dashboard/QuickSightChartRenderer.java | 77 +++++ .../actions/dashboard/WidgetDataLoader.java | 9 +- .../model/dashboard/widgets/BarChart.java | 55 +--- .../core/model/dashboard/widgets/QWidget.java | 14 + .../dashboard/widgets/QuickSightChart.java | 139 ++++++++ .../core/model/metadata/QInstance.java | 14 +- .../metadata/dashboard/QWidgetMetaData.java | 6 +- .../dashboard/QWidgetMetaDataInterface.java | 42 +++ .../dashboard/QuickSightChartMetaData.java | 305 ++++++++++++++++++ .../PersonsByCreateDateBarChart.java | 3 +- .../rdbms/jdbc/ConnectionManagerTest.java | 15 +- .../javalin/PersonsByCreateDateBarChart.java | 3 +- qqq-sample-project/pom.xml | 6 +- .../sampleapp/SampleMetaDataProvider.java | 59 ++-- .../widgets/PersonsByCreateDateBarChart.java | 3 +- .../PersonsByCreateDateBarChartTest.java | 4 +- 18 files changed, 684 insertions(+), 88 deletions(-) create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/QuickSightChartRenderer.java create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/QWidget.java create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/QuickSightChart.java create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/QWidgetMetaDataInterface.java create mode 100644 qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/QuickSightChartMetaData.java diff --git a/qqq-backend-core/pom.xml b/qqq-backend-core/pom.xml index 268945bc..8a952f04 100644 --- a/qqq-backend-core/pom.xml +++ b/qqq-backend-core/pom.xml @@ -36,11 +36,26 @@ + + + + software.amazon.awssdk + bom + 2.17.259 + pom + import + + + + + software.amazon.awssdk + quicksight + com.fasterxml.jackson.core jackson-databind diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractWidgetRenderer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractWidgetRenderer.java index bf8ca097..7919b928 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractWidgetRenderer.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/AbstractWidgetRenderer.java @@ -3,6 +3,7 @@ package com.kingsrook.qqq.backend.core.actions.dashboard; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaDataInterface; import com.kingsrook.qqq.backend.core.model.session.QSession; @@ -15,6 +16,6 @@ public abstract class AbstractWidgetRenderer /******************************************************************************* ** *******************************************************************************/ - public abstract Object render(QInstance qInstance, QSession session) throws QException; + public abstract Object render(QInstance qInstance, QSession session, QWidgetMetaDataInterface qWidgetMetaData) throws QException; } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/QuickSightChartRenderer.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/QuickSightChartRenderer.java new file mode 100644 index 00000000..fd352e3e --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/QuickSightChartRenderer.java @@ -0,0 +1,77 @@ +package com.kingsrook.qqq.backend.core.actions.dashboard; + + +import com.kingsrook.qqq.backend.core.exceptions.QException; +import com.kingsrook.qqq.backend.core.model.dashboard.widgets.QuickSightChart; +import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaDataInterface; +import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QuickSightChartMetaData; +import com.kingsrook.qqq.backend.core.model.session.QSession; +import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; +import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.services.quicksight.QuickSightClient; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.quicksight.model.GenerateEmbedUrlForRegisteredUserRequest; +import software.amazon.awssdk.services.quicksight.model.GenerateEmbedUrlForRegisteredUserResponse; +import software.amazon.awssdk.services.quicksight.model.RegisteredUserDashboardEmbeddingConfiguration; +import software.amazon.awssdk.services.quicksight.model.RegisteredUserEmbeddingExperienceConfiguration; + + +/******************************************************************************* + ** + *******************************************************************************/ +public class QuickSightChartRenderer extends AbstractWidgetRenderer +{ + /******************************************************************************* + ** + *******************************************************************************/ + @Override + public Object render(QInstance qInstance, QSession session, QWidgetMetaDataInterface metaData) throws QException + { + try + { + QuickSightChartMetaData quickSightMetaData = (QuickSightChartMetaData) metaData; + QuickSightClient quickSightClient = getQuickSightClient(quickSightMetaData); + + final RegisteredUserEmbeddingExperienceConfiguration experienceConfiguration = RegisteredUserEmbeddingExperienceConfiguration.builder() + .dashboard( + RegisteredUserDashboardEmbeddingConfiguration.builder() + .initialDashboardId(quickSightMetaData.getDashboardId()) + .build()) + .build(); + + final GenerateEmbedUrlForRegisteredUserRequest generateEmbedUrlForRegisteredUserRequest = GenerateEmbedUrlForRegisteredUserRequest.builder() + .awsAccountId(quickSightMetaData.getAccountId()) + .userArn(quickSightMetaData.getUserArn()) + .experienceConfiguration(experienceConfiguration) + .build(); + + final GenerateEmbedUrlForRegisteredUserResponse generateEmbedUrlForRegisteredUserResponse = quickSightClient.generateEmbedUrlForRegisteredUser(generateEmbedUrlForRegisteredUserRequest); + + String embedUrl = generateEmbedUrlForRegisteredUserResponse.embedUrl(); + return (new QuickSightChart(metaData.getName(), quickSightMetaData.getLabel(), embedUrl)); + } + catch(Exception e) + { + throw (new QException("Error rendering widget", e)); + } + } + + + + /******************************************************************************* + ** + *******************************************************************************/ + private QuickSightClient getQuickSightClient(QuickSightChartMetaData metaData) + { + AwsBasicCredentials awsCredentials = AwsBasicCredentials.create(metaData.getAccessKey(), metaData.getSecretKey()); + + QuickSightClient amazonQuickSightClient = QuickSightClient.builder() + .credentialsProvider(StaticCredentialsProvider.create(awsCredentials)) + .region(Region.of(metaData.getRegion())) + .build(); + + return (amazonQuickSightClient); + } + +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/WidgetDataLoader.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/WidgetDataLoader.java index a0e5d214..de346886 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/WidgetDataLoader.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/actions/dashboard/WidgetDataLoader.java @@ -4,7 +4,7 @@ package com.kingsrook.qqq.backend.core.actions.dashboard; import com.kingsrook.qqq.backend.core.actions.customizers.QCodeLoader; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; -import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaDataInterface; import com.kingsrook.qqq.backend.core.model.session.QSession; @@ -19,8 +19,9 @@ public class WidgetDataLoader *******************************************************************************/ public Object execute(QInstance qInstance, QSession session, String name) throws QException { - QWidgetMetaData widget = qInstance.getWidget(name); - AbstractWidgetRenderer widgetRenderer = QCodeLoader.getAdHoc(AbstractWidgetRenderer.class, widget.getCodeReference()); - return (widgetRenderer.render(qInstance, session)); + QWidgetMetaDataInterface widget = qInstance.getWidget(name); + AbstractWidgetRenderer widgetRenderer = QCodeLoader.getAdHoc(AbstractWidgetRenderer.class, widget.getCodeReference()); + Object w = widgetRenderer.render(qInstance, session, widget); + return (widgetRenderer.render(qInstance, session, widget)); } } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/BarChart.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/BarChart.java index f71f0c66..2d8e8667 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/BarChart.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/BarChart.java @@ -7,7 +7,7 @@ import java.util.List; /******************************************************************************* ** *******************************************************************************/ -public class BarChart +public class BarChart implements QWidget { /* @@ -19,9 +19,8 @@ public class BarChart }, */ - private String type = "barChart"; private String title; - private Data barChartData; + private Data barChartData; @@ -34,12 +33,23 @@ public class BarChart setBarChartData(new BarChart.Data() .withLabels(labels) .withDatasets(new BarChart.Data.DataSet() - .withLabel("Parcel Invoice Lines") + .withLabel(seriesLabel) .withData(data))); } + /******************************************************************************* + ** Getter for type + ** + *******************************************************************************/ + public String getType() + { + return "barChart"; + } + + + /******************************************************************************* ** Getter for title ** @@ -108,46 +118,13 @@ public class BarChart - /******************************************************************************* - ** Getter for type - ** - *******************************************************************************/ - public String getType() - { - return type; - } - - - - /******************************************************************************* - ** Setter for type - ** - *******************************************************************************/ - public void setType(String type) - { - this.type = type; - } - - - /******************************************************************************* - ** Fluent setter for type - ** - *******************************************************************************/ - public BarChart withType(String type) - { - this.type = type; - return (this); - } - - - /******************************************************************************* ** *******************************************************************************/ public static class Data { private List labels; - private DataSet datasets; + private DataSet datasets; @@ -224,7 +201,7 @@ public class BarChart *******************************************************************************/ public static class DataSet { - private String label; + private String label; private List data; diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/QWidget.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/QWidget.java new file mode 100644 index 00000000..8c76fc52 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/QWidget.java @@ -0,0 +1,14 @@ +package com.kingsrook.qqq.backend.core.model.dashboard.widgets; + + +/******************************************************************************* + ** + *******************************************************************************/ +public interface QWidget +{ + /******************************************************************************* + ** Getter for type + *******************************************************************************/ + String getType(); + +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/QuickSightChart.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/QuickSightChart.java new file mode 100644 index 00000000..9cccd508 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/dashboard/widgets/QuickSightChart.java @@ -0,0 +1,139 @@ +package com.kingsrook.qqq.backend.core.model.dashboard.widgets; + + +/******************************************************************************* + ** + *******************************************************************************/ +public class QuickSightChart implements QWidget +{ + private String label; + private String name; + private String url; + + + + /******************************************************************************* + ** + *******************************************************************************/ + public QuickSightChart(String name, String label, String url) + { + this.url = url; + this.name = name; + this.label = label; + } + + + + /******************************************************************************* + ** Getter for type + ** + *******************************************************************************/ + public String getType() + { + return "quickSightChart"; + } + + + + /******************************************************************************* + ** Getter for url + ** + *******************************************************************************/ + public String getUrl() + { + return url; + } + + + + /******************************************************************************* + ** Setter for url + ** + *******************************************************************************/ + public void setUrl(String url) + { + this.url = url; + } + + + + /******************************************************************************* + ** Fluent setter for url + ** + *******************************************************************************/ + public QuickSightChart withUrl(String url) + { + this.url = url; + return (this); + } + + + + /******************************************************************************* + ** Getter for name + ** + *******************************************************************************/ + public String getName() + { + return name; + } + + + + /******************************************************************************* + ** Setter for name + ** + *******************************************************************************/ + public void setName(String name) + { + this.name = name; + } + + + + /******************************************************************************* + ** Fluent setter for name + ** + *******************************************************************************/ + public QuickSightChart withName(String name) + { + this.name = name; + return (this); + } + + + + /******************************************************************************* + ** Getter for label + ** + *******************************************************************************/ + public String getLabel() + { + + return label; + } + + + + /******************************************************************************* + ** Setter for label + ** + *******************************************************************************/ + public void setLabel(String label) + { + this.label = label; + } + + + + /******************************************************************************* + ** Fluent setter for label + ** + *******************************************************************************/ + public QuickSightChart withLabel(String label) + { + this.label = label; + return (this); + } + +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QInstance.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QInstance.java index 02718a01..d67e4ac6 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QInstance.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/QInstance.java @@ -29,7 +29,7 @@ import java.util.List; import java.util.Map; import com.fasterxml.jackson.annotation.JsonIgnore; import com.kingsrook.qqq.backend.core.instances.QInstanceValidationKey; -import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaDataInterface; import com.kingsrook.qqq.backend.core.model.metadata.layout.QAppMetaData; import com.kingsrook.qqq.backend.core.model.metadata.possiblevalues.QPossibleValueSource; import com.kingsrook.qqq.backend.core.model.metadata.processes.QProcessMetaData; @@ -60,7 +60,7 @@ public class QInstance private Map processes = new LinkedHashMap<>(); private Map apps = new LinkedHashMap<>(); - private Map widgets = new LinkedHashMap<>(); + private Map widgets = new LinkedHashMap<>(); // todo - lock down the object (no more changes allowed) after it's been validated? @@ -455,7 +455,7 @@ public class QInstance ** Getter for widgets ** *******************************************************************************/ - public Map getWidgets() + public Map getWidgets() { return widgets; } @@ -466,7 +466,7 @@ public class QInstance ** Setter for widgets ** *******************************************************************************/ - public void setWidgets(Map widgets) + public void setWidgets(Map widgets) { this.widgets = widgets; } @@ -475,7 +475,7 @@ public class QInstance /******************************************************************************* ** *******************************************************************************/ - public void addWidget(QWidgetMetaData widget) + public void addWidget(QWidgetMetaDataInterface widget) { this.addWidget(widget.getName(), widget); } @@ -485,7 +485,7 @@ public class QInstance /******************************************************************************* ** *******************************************************************************/ - public void addWidget(String name, QWidgetMetaData widget) + public void addWidget(String name, QWidgetMetaDataInterface widget) { if(this.widgets.containsKey(name)) { @@ -499,7 +499,7 @@ public class QInstance /******************************************************************************* ** *******************************************************************************/ - public QWidgetMetaData getWidget(String name) + public QWidgetMetaDataInterface getWidget(String name) { return (this.widgets.get(name)); } diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/QWidgetMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/QWidgetMetaData.java index 0efb0dfe..2a9594b7 100644 --- a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/QWidgetMetaData.java +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/QWidgetMetaData.java @@ -7,10 +7,10 @@ import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; /******************************************************************************* ** *******************************************************************************/ -public class QWidgetMetaData +public class QWidgetMetaData implements QWidgetMetaDataInterface { - private String name; - private QCodeReference codeReference; + protected String name; + protected QCodeReference codeReference; diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/QWidgetMetaDataInterface.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/QWidgetMetaDataInterface.java new file mode 100644 index 00000000..771c8d33 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/QWidgetMetaDataInterface.java @@ -0,0 +1,42 @@ +package com.kingsrook.qqq.backend.core.model.metadata.dashboard; + + +import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; + + +/******************************************************************************* + ** + *******************************************************************************/ +public interface QWidgetMetaDataInterface +{ + /******************************************************************************* + ** Getter for name + *******************************************************************************/ + String getName(); + + /******************************************************************************* + ** Setter for name + *******************************************************************************/ + void setName(String name); + + /******************************************************************************* + ** Fluent setter for name + *******************************************************************************/ + QWidgetMetaDataInterface withName(String name); + + /******************************************************************************* + ** Getter for codeReference + *******************************************************************************/ + QCodeReference getCodeReference(); + + /******************************************************************************* + ** Setter for codeReference + *******************************************************************************/ + void setCodeReference(QCodeReference codeReference); + + /******************************************************************************* + ** Fluent setter for codeReference + *******************************************************************************/ + QWidgetMetaDataInterface withCodeReference(QCodeReference codeReference); + +} diff --git a/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/QuickSightChartMetaData.java b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/QuickSightChartMetaData.java new file mode 100644 index 00000000..114804a4 --- /dev/null +++ b/qqq-backend-core/src/main/java/com/kingsrook/qqq/backend/core/model/metadata/dashboard/QuickSightChartMetaData.java @@ -0,0 +1,305 @@ +package com.kingsrook.qqq.backend.core.model.metadata.dashboard; + + +import java.util.Collection; + + +/******************************************************************************* + ** + *******************************************************************************/ +public class QuickSightChartMetaData extends QWidgetMetaData implements QWidgetMetaDataInterface +{ + private String label; + private String accessKey; + private String secretKey; + private String dashboardId; + private String accountId; + private String userArn; + private String region; + private Collection allowedDomains; + + + + /******************************************************************************* + ** Fluent setter for name + ** + *******************************************************************************/ + public QuickSightChartMetaData withName(String name) + { + this.name = name; + return (this); + } + + + + /******************************************************************************* + ** Getter for accessKey + ** + *******************************************************************************/ + public String getAccessKey() + { + return accessKey; + } + + + + /******************************************************************************* + ** Setter for accessKey + ** + *******************************************************************************/ + public void setAccessKey(String accessKey) + { + this.accessKey = accessKey; + } + + + + /******************************************************************************* + ** Fluent setter for accessKey + ** + *******************************************************************************/ + public QuickSightChartMetaData withAccessKey(String accessKey) + { + this.accessKey = accessKey; + return (this); + } + + + + /******************************************************************************* + ** Getter for label + ** + *******************************************************************************/ + public String getLabel() + { + + return label; + } + + + + /******************************************************************************* + ** Setter for label + ** + *******************************************************************************/ + public void setLabel(String label) + { + this.label = label; + } + + + + /******************************************************************************* + ** Fluent setter for label + ** + *******************************************************************************/ + public QuickSightChartMetaData withLabel(String label) + { + this.label = label; + return (this); + } + + + + /******************************************************************************* + ** Getter for secretKey + ** + *******************************************************************************/ + public String getSecretKey() + { + return secretKey; + } + + + + /******************************************************************************* + ** Setter for secretKey + ** + *******************************************************************************/ + public void setSecretKey(String secretKey) + { + this.secretKey = secretKey; + } + + + + /******************************************************************************* + ** Fluent setter for secretKey + ** + *******************************************************************************/ + public QuickSightChartMetaData withSecretKey(String secretKey) + { + this.secretKey = secretKey; + return (this); + } + + + + /******************************************************************************* + ** Getter for dashboardId + ** + *******************************************************************************/ + public String getDashboardId() + { + return dashboardId; + } + + + + /******************************************************************************* + ** Setter for dashboardId + ** + *******************************************************************************/ + public void setDashboardId(String dashboardId) + { + this.dashboardId = dashboardId; + } + + + + /******************************************************************************* + ** Fluent setter for dashboardId + ** + *******************************************************************************/ + public QuickSightChartMetaData withDashboardId(String dashboardId) + { + this.dashboardId = dashboardId; + return (this); + } + + + + /******************************************************************************* + ** Getter for accountId + ** + *******************************************************************************/ + public String getAccountId() + { + return accountId; + } + + + + /******************************************************************************* + ** Setter for accountId + ** + *******************************************************************************/ + public void setAccountId(String accountId) + { + this.accountId = accountId; + } + + + + /******************************************************************************* + ** Fluent setter for accountId + ** + *******************************************************************************/ + public QuickSightChartMetaData withAccountId(String accountId) + { + this.accountId = accountId; + return this; + } + + + + /******************************************************************************* + ** Getter for userArn + ** + *******************************************************************************/ + public String getUserArn() + { + return userArn; + } + + + + /******************************************************************************* + ** Setter for userArn + ** + *******************************************************************************/ + public void setUserArn(String userArn) + { + this.userArn = userArn; + } + + + + /******************************************************************************* + ** Fluent setter for userArn + ** + *******************************************************************************/ + public QuickSightChartMetaData withUserArn(String userArn) + { + this.userArn = userArn; + return this; + } + + + + /******************************************************************************* + ** Getter for region + ** + *******************************************************************************/ + public String getRegion() + { + return region; + } + + + + /******************************************************************************* + ** Setter for region + ** + *******************************************************************************/ + public void setRegion(String region) + { + this.region = region; + } + + + + /******************************************************************************* + ** Fluent setter for region + ** + *******************************************************************************/ + public QuickSightChartMetaData withRegion(String region) + { + this.region = region; + return this; + } + + + + /******************************************************************************* + ** Getter for allowedDomains + ** + *******************************************************************************/ + public Collection getAllowedDomains() + { + return allowedDomains; + } + + + + /******************************************************************************* + ** Setter for allowedDomains + ** + *******************************************************************************/ + public void setAllowedDomains(Collection allowedDomains) + { + this.allowedDomains = allowedDomains; + } + + + + /******************************************************************************* + ** Fluent setter for allowedDomains + ** + *******************************************************************************/ + public QuickSightChartMetaData withAllowedDomains(Collection allowedDomains) + { + this.allowedDomains = allowedDomains; + return this; + } +} diff --git a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/PersonsByCreateDateBarChart.java b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/PersonsByCreateDateBarChart.java index da2c1ff7..06997d0a 100644 --- a/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/PersonsByCreateDateBarChart.java +++ b/qqq-backend-core/src/test/java/com/kingsrook/qqq/backend/core/actions/dashboard/PersonsByCreateDateBarChart.java @@ -6,6 +6,7 @@ import java.util.List; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.dashboard.widgets.BarChart; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaDataInterface; import com.kingsrook.qqq.backend.core.model.session.QSession; @@ -18,7 +19,7 @@ public class PersonsByCreateDateBarChart extends AbstractWidgetRenderer ** *******************************************************************************/ @Override - public Object render(QInstance qInstance, QSession session) throws QException + public Object render(QInstance qInstance, QSession session, QWidgetMetaDataInterface metaData) throws QException { try { diff --git a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/jdbc/ConnectionManagerTest.java b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/jdbc/ConnectionManagerTest.java index a51a041b..c23cd928 100644 --- a/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/jdbc/ConnectionManagerTest.java +++ b/qqq-backend-module-rdbms/src/test/java/com/kingsrook/qqq/backend/module/rdbms/jdbc/ConnectionManagerTest.java @@ -25,7 +25,9 @@ package com.kingsrook.qqq.backend.module.rdbms.jdbc; import java.sql.Connection; import java.sql.SQLException; import java.util.Collections; +import java.util.Objects; import com.kingsrook.qqq.backend.module.rdbms.model.metadata.RDBMSBackendMetaData; +import io.github.cdimascio.dotenv.Dotenv; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -101,13 +103,14 @@ class ConnectionManagerTest private RDBMSBackendMetaData getAuroraBacked() { + Dotenv dotenv = Dotenv.configure().load(); return new RDBMSBackendMetaData() .withName("aurora-test") - .withVendor("aurora") - .withHostName("nf-one-development-aurora.cwuhqcx1inwx.us-east-2.rds.amazonaws.com") - .withPort(3306) - .withDatabaseName("nutrifresh_one") - .withUsername("nf_admin") - .withPassword("%!2rwcH+fb#WgPg"); + .withVendor(dotenv.get("RDBMS_VENDOR")) + .withHostName(dotenv.get("RDBMS_HOSTNAME")) + .withPort(Integer.valueOf(Objects.requireNonNull(dotenv.get("RDBMS_PORT")))) + .withDatabaseName(dotenv.get("RDBMS_DATABASE_NAME")) + .withUsername(dotenv.get("RDBMS_USERNAME")) + .withPassword(dotenv.get("RDBMS_PASSWORD")); } } diff --git a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/PersonsByCreateDateBarChart.java b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/PersonsByCreateDateBarChart.java index 506b099e..5afbf0d6 100644 --- a/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/PersonsByCreateDateBarChart.java +++ b/qqq-middleware-javalin/src/test/java/com/kingsrook/qqq/backend/javalin/PersonsByCreateDateBarChart.java @@ -7,6 +7,7 @@ import com.kingsrook.qqq.backend.core.actions.dashboard.AbstractWidgetRenderer; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.dashboard.widgets.BarChart; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaDataInterface; import com.kingsrook.qqq.backend.core.model.session.QSession; @@ -19,7 +20,7 @@ public class PersonsByCreateDateBarChart extends AbstractWidgetRenderer ** *******************************************************************************/ @Override - public Object render(QInstance qInstance, QSession session) throws QException + public Object render(QInstance qInstance, QSession session, QWidgetMetaDataInterface metaData) throws QException { try { diff --git a/qqq-sample-project/pom.xml b/qqq-sample-project/pom.xml index 23f84047..e1d80a71 100644 --- a/qqq-sample-project/pom.xml +++ b/qqq-sample-project/pom.xml @@ -128,9 +128,9 @@ 4.10.0 /src/main/resources/liquibase/liquibase.properties - ${env.LB_DB_URL} - ${env.LB_DB_USERNAME} - ${env.LB_DB_PASSWORD} + ${env.RDBMS_URL} + ${env.RDBMS_USERNAME} + ${env.RDBMS_PASSWORD} ${env.LB_CONTEXTS} diff --git a/qqq-sample-project/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java b/qqq-sample-project/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java index 76086502..2330845c 100644 --- a/qqq-sample-project/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java +++ b/qqq-sample-project/src/main/java/com/kingsrook/sampleapp/SampleMetaDataProvider.java @@ -23,6 +23,9 @@ package com.kingsrook.sampleapp; import java.util.List; +import java.util.Objects; +import com.amazonaws.regions.Regions; +import com.kingsrook.qqq.backend.core.actions.dashboard.QuickSightChartRenderer; import com.kingsrook.qqq.backend.core.actions.processes.BackendStep; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.exceptions.QValueException; @@ -35,6 +38,8 @@ import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeReference; import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeType; import com.kingsrook.qqq.backend.core.model.metadata.code.QCodeUsage; import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaData; +import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaDataInterface; +import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QuickSightChartMetaData; import com.kingsrook.qqq.backend.core.model.metadata.fields.DisplayFormat; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldMetaData; import com.kingsrook.qqq.backend.core.model.metadata.fields.QFieldType; @@ -68,26 +73,22 @@ public class SampleMetaDataProvider { public static boolean USE_MYSQL = true; - public static final String RDBMS_BACKEND_NAME = "rdbms"; + public static final String RDBMS_BACKEND_NAME = "rdbms"; public static final String FILESYSTEM_BACKEND_NAME = "filesystem"; - public static final String AUTH0_AUTHENTICATION_MODULE_NAME = "auth0"; - // public static final String AUTH0_BASE_URL = "https://kingsrook.us.auth0.com/"; - public static final String AUTH0_BASE_URL = "https://nutrifresh-one-development.us.auth0.com/"; - - public static final String APP_NAME_GREETINGS = "greetingsApp"; - public static final String APP_NAME_PEOPLE = "peopleApp"; + public static final String APP_NAME_GREETINGS = "greetingsApp"; + public static final String APP_NAME_PEOPLE = "peopleApp"; public static final String APP_NAME_MISCELLANEOUS = "miscellaneous"; - public static final String PROCESS_NAME_GREET = "greet"; + public static final String PROCESS_NAME_GREET = "greet"; public static final String PROCESS_NAME_GREET_INTERACTIVE = "greetInteractive"; - public static final String PROCESS_NAME_SIMPLE_SLEEP = "simpleSleep"; - public static final String PROCESS_NAME_SIMPLE_THROW = "simpleThrow"; + public static final String PROCESS_NAME_SIMPLE_SLEEP = "simpleSleep"; + public static final String PROCESS_NAME_SIMPLE_THROW = "simpleThrow"; public static final String PROCESS_NAME_SLEEP_INTERACTIVE = "sleepInteractive"; - public static final String TABLE_NAME_PERSON = "person"; + public static final String TABLE_NAME_PERSON = "person"; public static final String TABLE_NAME_CARRIER = "carrier"; - public static final String TABLE_NAME_CITY = "city"; + public static final String TABLE_NAME_CITY = "city"; public static final String STEP_NAME_SLEEPER = "sleeper"; public static final String STEP_NAME_THROWER = "thrower"; @@ -133,6 +134,20 @@ public class SampleMetaDataProvider qInstance.addWidget(new QWidgetMetaData() .withName(PersonsByCreateDateBarChart.class.getSimpleName()) .withCodeReference(new QCodeReference(PersonsByCreateDateBarChart.class, null))); + + Dotenv dotenv = Dotenv.configure().load(); + QWidgetMetaDataInterface quickSightChartMetaData = new QuickSightChartMetaData() + .withAccountId(dotenv.get("QUICKSIGHT_ACCCOUNT_ID")) + .withAccessKey(dotenv.get("QUICKSIGHT_ACCESS_KEY")) + .withSecretKey(dotenv.get("QUICKSIGHT_SECRET_KEY")) + .withUserArn(dotenv.get("QUICKSIGHT_USER_ARN")) + .withDashboardId("9e452e78-8509-4c81-bb7f-967abfc356da") + .withRegion(Regions.US_EAST_2.getName()) + .withName(QuickSightChartRenderer.class.getSimpleName()) + .withLabel("Example Quicksight Chart") + .withCodeReference(new QCodeReference(QuickSightChartRenderer.class, null)); + + qInstance.addWidget(quickSightChartMetaData); } @@ -153,7 +168,11 @@ public class SampleMetaDataProvider .withIcon(new QIcon().withName("location_city"))) .withChild(qInstance.getProcess(PROCESS_NAME_GREET_INTERACTIVE)) .withIcon(new QIcon().withName("waving_hand")) - .withWidgets(List.of(PersonsByCreateDateBarChart.class.getSimpleName())) + .withWidgets(List.of + ( + PersonsByCreateDateBarChart.class.getSimpleName(), + QuickSightChartRenderer.class.getSimpleName() + )) ); qInstance.addApp(new QAppMetaData() @@ -194,11 +213,11 @@ public class SampleMetaDataProvider Dotenv dotenv = Dotenv.configure().load(); return new RDBMSBackendMetaData() .withName(RDBMS_BACKEND_NAME) - .withVendor("mysql") - .withHostName("127.0.0.1") - .withPort(3306) - .withDatabaseName("qqq") - .withUsername("root") + .withVendor(dotenv.get("RDBMS_VENDOR")) + .withHostName(dotenv.get("RDBMS_HOSTNAME")) + .withPort(Integer.valueOf(Objects.requireNonNull(dotenv.get("RDBMS_PORT")))) + .withDatabaseName(dotenv.get("RDBMS_DATABASE_NAME")) + .withUsername(dotenv.get("RDBMS_USERNAME")) .withPassword(dotenv.get("RDBMS_PASSWORD")); } else @@ -249,8 +268,8 @@ public class SampleMetaDataProvider .withBackendName("company_code")); table.addField(new QFieldMetaData("service_level", QFieldType.STRING) // todo PVS - .withLabel("Service Level") - .withIsRequired(true)); + .withLabel("Service Level") + .withIsRequired(true)); table.addSection(new QFieldSection("identity", "Identity", new QIcon("badge"), Tier.T1, List.of("id", "name"))); table.addSection(new QFieldSection("basicInfo", "Basic Info", new QIcon("dataset"), Tier.T2, List.of("company_code", "service_level"))); diff --git a/qqq-sample-project/src/main/java/com/kingsrook/sampleapp/dashboard/widgets/PersonsByCreateDateBarChart.java b/qqq-sample-project/src/main/java/com/kingsrook/sampleapp/dashboard/widgets/PersonsByCreateDateBarChart.java index 29ec412b..490ac39f 100644 --- a/qqq-sample-project/src/main/java/com/kingsrook/sampleapp/dashboard/widgets/PersonsByCreateDateBarChart.java +++ b/qqq-sample-project/src/main/java/com/kingsrook/sampleapp/dashboard/widgets/PersonsByCreateDateBarChart.java @@ -7,6 +7,7 @@ import com.kingsrook.qqq.backend.core.actions.dashboard.AbstractWidgetRenderer; import com.kingsrook.qqq.backend.core.exceptions.QException; import com.kingsrook.qqq.backend.core.model.dashboard.widgets.BarChart; import com.kingsrook.qqq.backend.core.model.metadata.QInstance; +import com.kingsrook.qqq.backend.core.model.metadata.dashboard.QWidgetMetaDataInterface; import com.kingsrook.qqq.backend.core.model.session.QSession; @@ -19,7 +20,7 @@ public class PersonsByCreateDateBarChart extends AbstractWidgetRenderer ** *******************************************************************************/ @Override - public Object render(QInstance qInstance, QSession session) throws QException + public Object render(QInstance qInstance, QSession session, QWidgetMetaDataInterface metaData) throws QException { try { diff --git a/qqq-sample-project/src/test/java/com/kingsrook/sampleapp/dashboard/widgets/PersonsByCreateDateBarChartTest.java b/qqq-sample-project/src/test/java/com/kingsrook/sampleapp/dashboard/widgets/PersonsByCreateDateBarChartTest.java index 09d8a3ae..b74f98ba 100644 --- a/qqq-sample-project/src/test/java/com/kingsrook/sampleapp/dashboard/widgets/PersonsByCreateDateBarChartTest.java +++ b/qqq-sample-project/src/test/java/com/kingsrook/sampleapp/dashboard/widgets/PersonsByCreateDateBarChartTest.java @@ -23,7 +23,7 @@ class PersonsByCreateDateBarChartTest @Test void test() throws QException { - Object widgetData = new PersonsByCreateDateBarChart().render(SampleMetaDataProvider.defineInstance(), new QSession()); + Object widgetData = new PersonsByCreateDateBarChart().render(SampleMetaDataProvider.defineInstance(), new QSession(), null); assertThat(widgetData).isInstanceOf(BarChart.class); BarChart barChart = (BarChart) widgetData; assertEquals("barChart", barChart.getType()); @@ -31,4 +31,4 @@ class PersonsByCreateDateBarChartTest assertNotNull(barChart.getBarChartData()); } -} \ No newline at end of file +}