diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 14ff0eb7..889d0053 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -1,18 +1,18 @@
-
-
-
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 6ed36dd3..3338eab6 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index 35eb1ddf..9db25eef 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -1,6 +1,6 @@
-
-
-
+
+
+
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ffb3c2ee..d7b13708 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,18 +9,17 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [7.1.0]
+- Compatible with plugin interface version 6.2
- Adds implementation for a new method `getConfigFieldsInfo` to fetch the plugin config fields.
-- Adds `null` state for `firstFactors` and `providers` by adding `is_first_factors_null`
- and `is_third_party_providers_null` fields in `tenant_configs` table
+- Adds `DashboardInfo` annotations to the config properties in `PostgreSQLConfig`
+- Adds `null` state for `firstFactors` by adding `is_first_factors_null` field in `tenant_configs` table. The value of
+ this column is only applicable when there are no entries in the `tenant_first_factors` table for the tenant.
### Migration
```sql
ALTER TABLE tenant_configs ADD COLUMN IF NOT EXISTS is_first_factors_null BOOLEAN DEFAULT TRUE;
-ALTER TABLE tenant_configs ADD COLUMN IF NOT EXISTS is_third_party_providers_null BOOLEAN DEFAULT TRUE;
-
ALTER TABLE tenant_configs ALTER COLUMN is_first_factors_null DROP DEFAULT;
-ALTER TABLE tenant_configs ALTER COLUMN is_third_party_providers_null DROP DEFAULT;
```
## [7.0.1] - 2024-04-17
diff --git a/src/main/java/io/supertokens/storage/postgresql/queries/MultitenancyQueries.java b/src/main/java/io/supertokens/storage/postgresql/queries/MultitenancyQueries.java
index a6c9b749..b0c7ffe1 100644
--- a/src/main/java/io/supertokens/storage/postgresql/queries/MultitenancyQueries.java
+++ b/src/main/java/io/supertokens/storage/postgresql/queries/MultitenancyQueries.java
@@ -18,7 +18,9 @@
import io.supertokens.pluginInterface.exceptions.StorageQueryException;
import io.supertokens.pluginInterface.exceptions.StorageTransactionLogicException;
-import io.supertokens.pluginInterface.multitenancy.*;
+import io.supertokens.pluginInterface.multitenancy.TenantConfig;
+import io.supertokens.pluginInterface.multitenancy.TenantIdentifier;
+import io.supertokens.pluginInterface.multitenancy.ThirdPartyConfig;
import io.supertokens.pluginInterface.multitenancy.exceptions.TenantOrAppNotFoundException;
import io.supertokens.storage.postgresql.Start;
import io.supertokens.storage.postgresql.config.Config;
@@ -32,8 +34,8 @@
import java.sql.SQLException;
import java.util.HashMap;
-import static io.supertokens.storage.postgresql.QueryExecutorTemplate.update;
import static io.supertokens.storage.postgresql.QueryExecutorTemplate.execute;
+import static io.supertokens.storage.postgresql.QueryExecutorTemplate.update;
import static io.supertokens.storage.postgresql.config.Config.getConfig;
public class MultitenancyQueries {
@@ -52,7 +54,6 @@ static String getQueryToCreateTenantConfigsTable(Start start) {
+ "passwordless_enabled BOOLEAN,"
+ "third_party_enabled BOOLEAN,"
+ "is_first_factors_null BOOLEAN,"
- + "is_third_party_providers_null BOOLEAN,"
+ "CONSTRAINT " + Utils.getConstraintName(schema, tenantConfigsTable, null, "pkey") +
" PRIMARY KEY (connection_uri_domain, app_id, tenant_id)"
+ ");";
diff --git a/src/main/java/io/supertokens/storage/postgresql/queries/multitenancy/TenantConfigSQLHelper.java b/src/main/java/io/supertokens/storage/postgresql/queries/multitenancy/TenantConfigSQLHelper.java
index 3a57f9aa..79b4fb18 100644
--- a/src/main/java/io/supertokens/storage/postgresql/queries/multitenancy/TenantConfigSQLHelper.java
+++ b/src/main/java/io/supertokens/storage/postgresql/queries/multitenancy/TenantConfigSQLHelper.java
@@ -56,14 +56,13 @@ public static TenantConfigSQLHelper.TenantConfigRowMapper getInstance(ThirdParty
public TenantConfig map(ResultSet result) throws StorageQueryException {
try {
boolean isFirstFactorsNull = result.getBoolean("is_first_factors_null");
- boolean isThirdPartyProvidersNull = result.getBoolean("is_third_party_providers_null");
return new TenantConfig(
new TenantIdentifier(result.getString("connection_uri_domain"), result.getString("app_id"),
result.getString("tenant_id")),
new EmailPasswordConfig(result.getBoolean("email_password_enabled")),
new ThirdPartyConfig(
result.getBoolean("third_party_enabled"),
- providers.length == 0 && isThirdPartyProvidersNull ? null : providers),
+ providers),
new PasswordlessConfig(result.getBoolean("passwordless_enabled")),
firstFactors.length == 0 && isFirstFactorsNull ? null : firstFactors,
requiredSecondaryFactors.length == 0 ? null : requiredSecondaryFactors,
@@ -82,7 +81,7 @@ public static TenantConfig[] selectAll(Start start,
throws SQLException, StorageQueryException {
String QUERY = "SELECT connection_uri_domain, app_id, tenant_id, core_config,"
+ " email_password_enabled, passwordless_enabled, third_party_enabled, "
- + " is_first_factors_null, is_third_party_providers_null FROM "
+ + " is_first_factors_null FROM "
+ getConfig(start).getTenantConfigsTable() + ";";
TenantConfig[] tenantConfigs = execute(start, QUERY, pst -> {
@@ -121,8 +120,8 @@ public static void create(Start start, Connection sqlCon, TenantConfig tenantCon
String QUERY = "INSERT INTO " + getConfig(start).getTenantConfigsTable()
+ "(connection_uri_domain, app_id, tenant_id, core_config,"
+ " email_password_enabled, passwordless_enabled, third_party_enabled,"
- + " is_first_factors_null, is_third_party_providers_null)"
- + " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)";
+ + " is_first_factors_null)"
+ + " VALUES(?, ?, ?, ?, ?, ?, ?, ?)";
update(sqlCon, QUERY, pst -> {
pst.setString(1, tenantConfig.tenantIdentifier.getConnectionUriDomain());
@@ -133,7 +132,6 @@ public static void create(Start start, Connection sqlCon, TenantConfig tenantCon
pst.setBoolean(6, tenantConfig.passwordlessConfig.enabled);
pst.setBoolean(7, tenantConfig.thirdPartyConfig.enabled);
pst.setBoolean(8, tenantConfig.firstFactors == null);
- pst.setBoolean(9, tenantConfig.thirdPartyConfig.providers == null);
});
}
diff --git a/src/test/java/io/supertokens/storage/postgresql/test/multitenancy/StorageLayerTest.java b/src/test/java/io/supertokens/storage/postgresql/test/multitenancy/StorageLayerTest.java
index 257fb60e..dc592a21 100644
--- a/src/test/java/io/supertokens/storage/postgresql/test/multitenancy/StorageLayerTest.java
+++ b/src/test/java/io/supertokens/storage/postgresql/test/multitenancy/StorageLayerTest.java
@@ -174,11 +174,12 @@ public void storageInstanceIsReusedAcrossTenants()
StorageLayer.getStorage(new TenantIdentifier(null, null, null), process.getProcess()));
Assert.assertEquals(
- Config.getConfig(new TenantIdentifier(null, null, null), process.getProcess()).getAccessTokenValidity(),
+ Config.getConfig(new TenantIdentifier(null, null, null), process.getProcess())
+ .getAccessTokenValidityInMillis(),
(long) 3600 * 1000);
Assert.assertEquals(Config.getConfig(new TenantIdentifier(null, "abc", null), process.getProcess())
- .getAccessTokenValidity(),
+ .getAccessTokenValidityInMillis(),
(long) 3601 * 1000);
Assert.assertEquals(
@@ -238,11 +239,12 @@ public void storageInstanceIsReusedAcrossTenantsComplex()
StorageLayer.getStorage(new TenantIdentifier(null, null, null), process.getProcess()));
Assert.assertEquals(
- Config.getConfig(new TenantIdentifier(null, null, null), process.getProcess()).getAccessTokenValidity(),
+ Config.getConfig(new TenantIdentifier(null, null, null), process.getProcess())
+ .getAccessTokenValidityInMillis(),
(long) 3600 * 1000);
Assert.assertEquals(Config.getConfig(new TenantIdentifier(null, "abc", null), process.getProcess())
- .getAccessTokenValidity(),
+ .getAccessTokenValidityInMillis(),
(long) 3601 * 1000);
Assert.assertEquals(
@@ -454,11 +456,12 @@ public void newStorageIsNotCreatedWhenSameTenantIsAdded()
existingStorage);
Assert.assertEquals(
- Config.getConfig(new TenantIdentifier(null, null, null), process.getProcess()).getAccessTokenValidity(),
+ Config.getConfig(new TenantIdentifier(null, null, null), process.getProcess())
+ .getAccessTokenValidityInMillis(),
(long) 3600 * 1000);
Assert.assertEquals(Config.getConfig(new TenantIdentifier(null, "abc", null), process.getProcess())
- .getAccessTokenValidity(),
+ .getAccessTokenValidityInMillis(),
(long) 3601 * 1000);
Assert.assertEquals(