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
+}