diff --git a/deploy/docker/Dockerfile b/deploy/docker/Dockerfile
index 2561dc9863..5e32885cae 100644
--- a/deploy/docker/Dockerfile
+++ b/deploy/docker/Dockerfile
@@ -1,5 +1,5 @@
-FROM eclipse-temurin:17.0.4.1_1-jre-focal
-#adoptopenjdk/openjdk11:jdk-11.0.12_7-ubuntu-slim
+ARG ARCH=amd64
+FROM ${ARCH}/eclipse-temurin:17.0.4.1_1-jre-focal
COPY cloudbeaver /opt/cloudbeaver
diff --git a/server/bundles/io.cloudbeaver.model/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.model/META-INF/MANIFEST.MF
index a99f1bcca3..b5d46e70fe 100644
--- a/server/bundles/io.cloudbeaver.model/META-INF/MANIFEST.MF
+++ b/server/bundles/io.cloudbeaver.model/META-INF/MANIFEST.MF
@@ -9,6 +9,7 @@ Bundle-RequiredExecutionEnvironment: JavaSE-11
Bundle-ActivationPolicy: lazy
Bundle-ClassPath: .
Require-Bundle: org.jkiss.dbeaver.model;visibility:=reexport,
+ org.jkiss.dbeaver.model.sm;visibility:=reexport,
org.jkiss.dbeaver.registry;visibility:=reexport,
org.jkiss.dbeaver.net.ssh,
org.jkiss.bundle.graphql.java;visibility:=reexport,
diff --git a/server/bundles/io.cloudbeaver.model/plugin.xml b/server/bundles/io.cloudbeaver.model/plugin.xml
index 96847f47d7..ec0dd5a019 100644
--- a/server/bundles/io.cloudbeaver.model/plugin.xml
+++ b/server/bundles/io.cloudbeaver.model/plugin.xml
@@ -7,4 +7,6 @@
+
+
diff --git a/server/bundles/io.cloudbeaver.service.auth/schema/io.cloudbeaver.userProfile.exsd b/server/bundles/io.cloudbeaver.model/schema/io.cloudbeaver.metaParameters.exsd
similarity index 85%
rename from server/bundles/io.cloudbeaver.service.auth/schema/io.cloudbeaver.userProfile.exsd
rename to server/bundles/io.cloudbeaver.model/schema/io.cloudbeaver.metaParameters.exsd
index 5901571b6a..fe9b6f92fb 100644
--- a/server/bundles/io.cloudbeaver.service.auth/schema/io.cloudbeaver.userProfile.exsd
+++ b/server/bundles/io.cloudbeaver.model/schema/io.cloudbeaver.metaParameters.exsd
@@ -2,7 +2,7 @@
-
+
diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMUtils.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMUtils.java
index 4060ef878b..5b53c616e9 100644
--- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMUtils.java
+++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/RMUtils.java
@@ -3,10 +3,12 @@ package io.cloudbeaver.model.rm;
import io.cloudbeaver.DBWConstants;
import io.cloudbeaver.model.app.BaseWebApplication;
import org.jkiss.code.NotNull;
+import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.model.rm.RMProject;
import org.jkiss.dbeaver.model.rm.RMProjectPermission;
import org.jkiss.dbeaver.model.rm.RMProjectType;
import org.jkiss.dbeaver.runtime.DBWorkbench;
+import org.jkiss.utils.CommonUtils;
import java.nio.file.Path;
import java.util.Objects;
@@ -46,18 +48,25 @@ public class RMUtils {
* @return path to the project based on the name of projects and prefixes that it contains
*/
@NotNull
- public static Path getProjectPathByName(@NotNull String projectId) {
- if (!projectId.contains("_") || projectId.startsWith("_")) {
- return getRootPath().resolve(BaseWebApplication.getInstance().getDefaultProjectName());
+ public static Path getProjectPathByName(@NotNull String projectId) throws DBException {
+ int divPos = projectId.indexOf("_");
+ if (divPos <= 0) {
+ throw new DBException("Bad project ID");
}
- String prefix = projectId.substring(0, projectId.indexOf("_"));
+
+ String prefix = projectId.substring(0, divPos);
+ String projectName = projectId.substring(divPos + 1);
switch (RMProjectType.getByPrefix(prefix)) {
case GLOBAL:
- return getRootPath().resolve(BaseWebApplication.getInstance().getDefaultProjectName());
+ String defaultProjectName = BaseWebApplication.getInstance().getDefaultProjectName();
+ if (CommonUtils.isEmpty(defaultProjectName)) {
+ throw new DBException("Global projects are not supported");
+ }
+ return getRootPath().resolve(defaultProjectName);
case SHARED:
- return getSharedProjectsPath().resolve(projectId);
+ return getSharedProjectsPath().resolve(projectName);
default:
- return getUserProjectsPath().resolve(projectId);
+ return getUserProjectsPath().resolve(projectName);
}
}
diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java
index 31f7bab26a..6463d8ccd0 100644
--- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java
+++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/rm/local/LocalResourceController.java
@@ -29,6 +29,7 @@ import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.model.DBPDataSourceConfigurationStorage;
import org.jkiss.dbeaver.model.DBPDataSourceContainer;
+import org.jkiss.dbeaver.model.DBPDataSourceFolder;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.auth.SMCredentials;
@@ -332,6 +333,25 @@ public class LocalResourceController implements RMController {
registry.checkForErrors();
}
+ @Override
+ public void deleteProjectConnectionFolders(
+ @NotNull String projectId,
+ @NotNull String[] folderPaths,
+ boolean dropContents
+ ) throws DBException {
+ DBPProject project = getProjectMetadata(projectId);
+ DBPDataSourceRegistry registry = project.getDataSourceRegistry();
+ for (String folderPath : folderPaths) {
+ DBPDataSourceFolder folder = registry.getFolder(folderPath);
+ if (folder != null) {
+ registry.removeFolder(folder, dropContents);
+ } else {
+ log.warn("Can not find folder by path [" + folderPath + "] for deletion");
+ }
+ }
+ registry.checkForErrors();
+ }
+
@NotNull
@Override
public RMResource[] listResources(
@@ -426,6 +446,9 @@ public class LocalResourceController implements RMController {
} catch (IOException e) {
throw new DBException("Error moving resource '" + oldResourcePath + "'", e);
}
+ // Move properties
+ getProjectMetadata(projectId).moveResourceProperties(oldResourcePath, newResourcePath);
+
fireRmResourceDeleteEvent(projectId, rmOldResourcePath);
fireRmResourceAddEvent(projectId, newResourcePath);
return DEFAULT_CHANGE_ID;
diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebAuthInfo.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebAuthInfo.java
index a651608295..7fda561baf 100644
--- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebAuthInfo.java
+++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebAuthInfo.java
@@ -19,7 +19,6 @@ package io.cloudbeaver.model.session;
import io.cloudbeaver.DBWUserIdentity;
import io.cloudbeaver.model.user.WebUser;
import io.cloudbeaver.model.user.WebUserOriginInfo;
-import io.cloudbeaver.registry.WebAuthProviderConfiguration;
import io.cloudbeaver.registry.WebAuthProviderDescriptor;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.Log;
@@ -41,7 +40,7 @@ public class WebAuthInfo implements SMSessionPrincipal {
private final WebSession session;
private final WebUser user;
private final WebAuthProviderDescriptor authProvider;
- private WebAuthProviderConfiguration authProviderConfiguration;
+ private String authProviderConfigurationId;
private SMSession authSession;
private final OffsetDateTime loginTime;
private final DBWUserIdentity userIdentity;
@@ -101,7 +100,11 @@ public class WebAuthInfo implements SMSessionPrincipal {
@Property
public String getAuthConfiguration() {
- return authProviderConfiguration == null ? null : authProviderConfiguration.getId();
+ return authProviderConfigurationId;
+ }
+
+ public void setAuthProviderConfigurationId(String authProviderConfigurationId) {
+ this.authProviderConfigurationId = authProviderConfigurationId;
}
public WebUser getUser() {
@@ -116,14 +119,6 @@ public class WebAuthInfo implements SMSessionPrincipal {
return authProvider;
}
- public WebAuthProviderConfiguration getAuthProviderConfiguration() {
- return authProviderConfiguration;
- }
-
- public void setAuthProviderConfiguration(WebAuthProviderConfiguration authProviderConfiguration) {
- this.authProviderConfiguration = authProviderConfiguration;
- }
-
public SMSession getAuthSession() {
return authSession;
}
diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSessionAuthProcessor.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSessionAuthProcessor.java
index 849b304422..2878925b5d 100644
--- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSessionAuthProcessor.java
+++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/model/session/WebSessionAuthProcessor.java
@@ -29,6 +29,7 @@ import io.cloudbeaver.utils.WebAppUtils;
import org.jkiss.code.NotNull;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.Log;
+import org.jkiss.dbeaver.model.auth.SMAuthConfigurationReference;
import org.jkiss.dbeaver.model.auth.SMAuthInfo;
import org.jkiss.dbeaver.model.auth.SMAuthProvider;
import org.jkiss.dbeaver.model.auth.SMSession;
@@ -87,8 +88,8 @@ public class WebSessionAuthProcessor {
try {
if (configMode && alreadyLoggedIn) {
- for (String providerId : authInfo.getAuthData().keySet()) {
- webSession.removeAuthInfo(providerId);
+ for (SMAuthConfigurationReference authConfiguration : authInfo.getAuthData().keySet()) {
+ webSession.removeAuthInfo(authConfiguration.getAuthProviderId());
}
}
webSession.updateSMAuthInfo(authInfo);
@@ -102,8 +103,9 @@ public class WebSessionAuthProcessor {
var securityController = webSession.getSecurityController();
Map providerConfig = Collections.emptyMap();
var newAuthInfos = new ArrayList();
- for (Map.Entry entry : authInfo.getAuthData().entrySet()) {
- String providerId = entry.getKey();
+ for (Map.Entry entry : authInfo.getAuthData().entrySet()) {
+ SMAuthConfigurationReference authConfiguration = entry.getKey();
+ String providerId = authConfiguration.getAuthProviderId();
Map authAttrs = (Map) entry.getValue();
var authProviderDescriptor = getAuthProvider(providerId);
@@ -111,15 +113,13 @@ public class WebSessionAuthProcessor {
SMAuthProviderExternal> authProviderExternal = authProviderInstance instanceof SMAuthProviderExternal> ?
(SMAuthProviderExternal>) authProviderInstance : null;
- boolean providerEnabled = isProviderEnabled(providerId);
+ boolean providerDisabled = !isProviderEnabled(providerId);
if (configMode || webSession.hasPermission(DBWConstants.PERMISSION_ADMIN)) {
// 1. Admin can authorize in any providers
// 2. When it authorizes in non-local provider for the first time we force linkUser flag
- if (!providerEnabled && webSession.getUser() != null) {
+ if (providerDisabled && webSession.getUser() != null) {
linkWithActiveUser = true;
}
- } else if (!providerEnabled && !webSession.hasPermission(DBWConstants.PERMISSION_ADMIN)) {
- throw new DBWebException("Authentication provider '" + providerId + "' is disabled");
}
SMSession authSession;
@@ -174,7 +174,9 @@ public class WebSessionAuthProcessor {
authProviderDescriptor,
userIdentity,
authSession,
- OffsetDateTime.now());
+ OffsetDateTime.now()
+ );
+ webAuthInfo.setAuthProviderConfigurationId(authConfiguration.getAuthProviderConfigurationId());
webAuthInfo.setMessage("Authenticated with " + authProviderDescriptor.getLabel() + " provider");
if (configMode) {
webAuthInfo.setUserCredentials(authAttrs);
diff --git a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebAuthProviderDescriptor.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebAuthProviderDescriptor.java
index a6c46bebc1..087dfda5b0 100644
--- a/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebAuthProviderDescriptor.java
+++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebAuthProviderDescriptor.java
@@ -46,7 +46,7 @@ public class WebAuthProviderDescriptor extends AbstractDescriptor {
private final IConfigurationElement cfg;
private final ObjectType implType;
- private final Map> metaProperties = new HashMap<>();
+ private final Map> metaParameters = new HashMap<>();
private SMAuthProvider> instance;
private final DBPImage icon;
private final Map configurationParameters = new LinkedHashMap<>();
@@ -76,13 +76,13 @@ public class WebAuthProviderDescriptor extends AbstractDescriptor {
for (IConfigurationElement credElement : cfg.getChildren("credentials")) {
credentialProfiles.add(new SMAuthCredentialsProfile(credElement));
}
- for (IConfigurationElement mpElement : cfg.getChildren("metaProperties")) {
+ for (IConfigurationElement mpElement : cfg.getChildren("metaParameters")) {
SMSubjectType subjectType = CommonUtils.valueOf(SMSubjectType.class, mpElement.getAttribute("type"), SMSubjectType.user);
List metaProps = new ArrayList<>();
for (IConfigurationElement propGroup : ArrayUtils.safeArray(mpElement.getChildren(PropertyDescriptor.TAG_PROPERTY_GROUP))) {
metaProps.addAll(PropertyDescriptor.extractProperties(propGroup));
}
- metaProperties.put(subjectType, metaProps);
+ metaParameters.put(subjectType, metaProps);
}
String rfList = cfg.getAttribute("requiredFeatures");
@@ -182,8 +182,8 @@ public class WebAuthProviderDescriptor extends AbstractDescriptor {
}
@Nullable
- public List getMetaProperties(SMSubjectType subjectType) {
- return metaProperties.get(subjectType);
+ public List getMetaParameters(SMSubjectType subjectType) {
+ return metaParameters.get(subjectType);
}
}
diff --git a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/registry/WebUserProfileRegistry.java b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebMetaParametersRegistry.java
similarity index 57%
rename from server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/registry/WebUserProfileRegistry.java
rename to server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebMetaParametersRegistry.java
index 796f62b3e2..c8f11f6211 100644
--- a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/registry/WebUserProfileRegistry.java
+++ b/server/bundles/io.cloudbeaver.model/src/io/cloudbeaver/registry/WebMetaParametersRegistry.java
@@ -27,36 +27,47 @@ import org.jkiss.utils.ArrayUtils;
import java.util.ArrayList;
import java.util.List;
-public class WebUserProfileRegistry {
+public class WebMetaParametersRegistry {
- private static final Log log = Log.getLog(WebUserProfileRegistry.class);
+ private static final Log log = Log.getLog(WebMetaParametersRegistry.class);
- public static final String EXTENSION_ID = "io.cloudbeaver.userProfile"; //$NON-NLS-1$
+ public static final String EXTENSION_ID = "io.cloudbeaver.metaParameters"; //$NON-NLS-1$
- private static WebUserProfileRegistry instance = null;
- private final List properties = new ArrayList<>();
+ private static WebMetaParametersRegistry instance = null;
+ private final List userParameters = new ArrayList<>();
+ private final List teamParameters = new ArrayList<>();
- public synchronized static WebUserProfileRegistry getInstance() {
+ public synchronized static WebMetaParametersRegistry getInstance() {
if (instance == null) {
- instance = new WebUserProfileRegistry();
+ instance = new WebMetaParametersRegistry();
instance.loadExtensions(Platform.getExtensionRegistry());
}
return instance;
}
- private WebUserProfileRegistry() {
+ private WebMetaParametersRegistry() {
}
- public List getProperties() {
- return properties;
+ public List getUserParameters() {
+ return userParameters;
+ }
+
+ public List getTeamParameters() {
+ return teamParameters;
}
private void loadExtensions(IExtensionRegistry registry) {
IConfigurationElement[] extConfigs = registry.getConfigurationElementsFor(EXTENSION_ID);
for (IConfigurationElement ext : extConfigs) {
- if (ext.getName().equals("userProfileProperties")) {
+ if (ext.getName().equals("metaParameters")) {
+ boolean isUser = "user".equals(ext.getAttribute("type"));
for (IConfigurationElement propGroup : ArrayUtils.safeArray(ext.getChildren(PropertyDescriptor.TAG_PROPERTY_GROUP))) {
- properties.addAll(PropertyDescriptor.extractProperties(propGroup));
+ List props = PropertyDescriptor.extractProperties(propGroup);
+ if (isUser) {
+ userParameters.addAll(props);
+ } else {
+ teamParameters.addAll(props);
+ }
}
}
}
diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java
index 7bc2d11d30..767f3563ac 100644
--- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java
+++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/navigator/impl/WebServiceNavigator.java
@@ -415,7 +415,9 @@ public class WebServiceNavigator implements DBWServiceNavigator {
ne.getValue().deleteObject(commandContext, object, options);
commandContext.saveChanges(session.getProgressMonitor(), options);
} else if (node instanceof DBNLocalFolder) {
+
node.getOwnerProject().getDataSourceRegistry().removeFolder(((DBNLocalFolder) node).getFolder(), false);
+
} else if (node instanceof DBNResourceManagerResource) {
DBNResourceManagerResource rmResource = ((DBNResourceManagerResource) node);
String resourceProjectId = rmResource.getResourceProject().getId();
diff --git a/server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls b/server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls
index 895c8168f2..2b463c236d 100644
--- a/server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls
+++ b/server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls
@@ -50,6 +50,8 @@ type AdminTeamInfo {
teamName: String
description: String
+ metaParameters: Object!
+
grantedUsers: [ID!]!
grantedConnections: [AdminConnectionGrantInfo!]!
@@ -120,6 +122,7 @@ extend type Query {
listTeams(teamId: ID): [AdminTeamInfo!]!
listPermissions: [AdminPermissionInfo!]!
listAuthRoles: [String!]!
+ listTeamMetaParameters: [ObjectPropertyInfo!]!
createUser(userId: ID!, enabled: Boolean!, authRole: String): AdminUserInfo!
deleteUser(userId: ID!): Boolean
@@ -179,6 +182,8 @@ extend type Query {
setUserMetaParameterValues(userId: ID!, parameters: Object!): Boolean!
+ setTeamMetaParameterValues(teamId: ID!, parameters: Object!): Boolean!
+
#### Global configuration
configureServer(configuration: ServerConfigInput!): Boolean!
diff --git a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminTeamInfo.java b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminTeamInfo.java
index 5826d36239..37ea11b0e3 100644
--- a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminTeamInfo.java
+++ b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminTeamInfo.java
@@ -25,6 +25,7 @@ import org.jkiss.dbeaver.model.security.user.SMTeam;
import java.util.ArrayList;
import java.util.List;
+import java.util.Map;
/**
* Web team info
@@ -45,14 +46,22 @@ public class AdminTeamInfo {
return team.getTeamId();
}
+ @Property
public String getTeamName() {
return team.getName();
}
+ @Property
public String getDescription() {
return team.getDescription();
}
+ @Property
+ public Map getMetaParameters() {
+ return team.getMetaParameters();
+ }
+
+ @Property
public List getTeamPermissions() {
return teamPermissions;
}
diff --git a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/DBWServiceAdmin.java b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/DBWServiceAdmin.java
index 315990ac04..9a183de67b 100644
--- a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/DBWServiceAdmin.java
+++ b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/DBWServiceAdmin.java
@@ -50,6 +50,9 @@ public interface DBWServiceAdmin extends DBWService {
@NotNull
List listPermissions(@NotNull WebSession webSession) throws DBWebException;
+ @WebAction()
+ WebPropertyInfo[] listTeamMetaParameters(@NotNull WebSession webSession);
+
@WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
@NotNull
AdminUserInfo createUser(
@@ -164,6 +167,8 @@ public interface DBWServiceAdmin extends DBWService {
@WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
Boolean setUserMetaParameterValues(WebSession webSession, String userId, Map parameters) throws DBWebException;
@WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
+ Boolean setTeamMetaParameterValues(WebSession webSession, String teamId, Map parameters) throws DBWebException;
+ @WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
Boolean enableUser(WebSession webSession, String userId, Boolean enabled) throws DBWebException;
@WebAction(requirePermissions = DBWConstants.PERMISSION_ADMIN)
diff --git a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/WebServiceBindingAdmin.java b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/WebServiceBindingAdmin.java
index ee6f46afce..3a0dabe8f7 100644
--- a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/WebServiceBindingAdmin.java
+++ b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/WebServiceBindingAdmin.java
@@ -50,6 +50,8 @@ public class WebServiceBindingAdmin extends WebServiceBindingBase getService(env).listPermissions(getWebSession(env)))
.dataFetcher("listAuthRoles",
env -> getService(env).listAuthRoles())
+ .dataFetcher("listTeamMetaParameters",
+ env -> getService(env).listTeamMetaParameters(getWebSession(env)))
.dataFetcher("createUser",
env -> getService(env).createUser(
getWebSession(env),
@@ -143,6 +145,11 @@ public class WebServiceBindingAdmin extends WebServiceBindingBase getService(env).setTeamMetaParameterValues(
+ getWebSession(env),
+ env.getArgument("teamId"),
+ env.getArgument("parameters")))
.dataFetcher("configureServer",
env -> getService(env).configureServer(getWebSession(env), env.getArgument("configuration")))
diff --git a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/WebServiceAdmin.java b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/WebServiceAdmin.java
index 5215b35597..85ef850d9a 100644
--- a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/WebServiceAdmin.java
+++ b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/WebServiceAdmin.java
@@ -41,10 +41,8 @@ import org.jkiss.dbeaver.model.DBPDataSourceContainer;
import org.jkiss.dbeaver.model.app.DBPDataSourceRegistry;
import org.jkiss.dbeaver.model.app.DBPProject;
import org.jkiss.dbeaver.model.navigator.DBNBrowseSettings;
-import org.jkiss.dbeaver.model.security.SMAuthProviderCustomConfiguration;
-import org.jkiss.dbeaver.model.security.SMConstants;
-import org.jkiss.dbeaver.model.security.SMDataSourceGrant;
-import org.jkiss.dbeaver.model.security.SMObjects;
+import org.jkiss.dbeaver.model.preferences.DBPPropertyDescriptor;
+import org.jkiss.dbeaver.model.security.*;
import org.jkiss.dbeaver.model.security.user.SMTeam;
import org.jkiss.dbeaver.model.security.user.SMUser;
import org.jkiss.utils.CommonUtils;
@@ -113,6 +111,25 @@ public class WebServiceAdmin implements DBWServiceAdmin {
}
}
+ @Override
+ public WebPropertyInfo[] listTeamMetaParameters(@NotNull WebSession webSession) {
+ // First add user profile properties
+ List props = new ArrayList<>(
+ WebMetaParametersRegistry.getInstance().getTeamParameters());
+
+ // Add metas from enabled auth providers
+ for (WebAuthProviderDescriptor ap : WebServiceUtils.getEnabledAuthProviders()) {
+ List metaProps = ap.getMetaParameters(SMSubjectType.team);
+ if (!CommonUtils.isEmpty(metaProps)) {
+ props.addAll(metaProps);
+ }
+ }
+
+ return props.stream()
+ .map(p -> new WebPropertyInfo(webSession, p, null))
+ .toArray(WebPropertyInfo[]::new);
+ }
+
@NotNull
@Override
public AdminUserInfo createUser(
@@ -657,6 +674,16 @@ public class WebServiceAdmin implements DBWServiceAdmin {
}
}
+ @Override
+ public Boolean setTeamMetaParameterValues(WebSession webSession, String teamId, Map parameters) throws DBWebException {
+ try {
+ webSession.getAdminSecurityController().setSubjectMetas(teamId, parameters);
+ return true;
+ } catch (DBException e) {
+ throw new DBWebException("Error changing team '" + teamId + "' meta parameters", e);
+ }
+ }
+
private DBPDataSourceRegistry getDataSourceRegistry(WebSession session, String projectId) throws DBWebException {
WebProjectImpl project = session.getProjectById(projectId);
if (project == null) {
diff --git a/server/bundles/io.cloudbeaver.service.auth/plugin.xml b/server/bundles/io.cloudbeaver.service.auth/plugin.xml
index 3cbc26b47e..36baf6d3c9 100644
--- a/server/bundles/io.cloudbeaver.service.auth/plugin.xml
+++ b/server/bundles/io.cloudbeaver.service.auth/plugin.xml
@@ -3,21 +3,18 @@
-
-
-
-
-
+
+
-
+
diff --git a/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls b/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls
index a48c41491d..e72b4b0d88 100644
--- a/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls
+++ b/server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls
@@ -109,16 +109,19 @@ type UserInfo {
# Human readable display name. It is taken from the first auth provider which was used for user login.
displayName: String
+ # User auth role ID. Optional.
+ authRole: ID
+ # All authentication tokens used during current session
authTokens: [UserAuthToken!]!
linkedAuthProviders: [String!]!
# User profile properties map
metaParameters: Object!
-
- # USer configuiraiton parameters
+ # User configuration parameters
configurationParameters: Object!
+
}
extend type Query {
diff --git a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebUserInfo.java b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebUserInfo.java
index 7a78e7d5e0..dd2d72482b 100644
--- a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebUserInfo.java
+++ b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebUserInfo.java
@@ -54,6 +54,11 @@ public class WebUserInfo {
return user == null ? null : user.getDisplayName();
}
+ @Property
+ public String getAuthRole() {
+ return user == null ? null : user.getAuthRole();
+ }
+
@Property
public List getAuthTokens() {
return session.getAllAuthInfo().stream()
diff --git a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/impl/WebServiceAuthImpl.java b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/impl/WebServiceAuthImpl.java
index 7d31bb5268..949ba5fb1e 100644
--- a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/impl/WebServiceAuthImpl.java
+++ b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/impl/WebServiceAuthImpl.java
@@ -27,7 +27,7 @@ import io.cloudbeaver.model.user.WebAuthProviderInfo;
import io.cloudbeaver.model.user.WebUser;
import io.cloudbeaver.registry.WebAuthProviderDescriptor;
import io.cloudbeaver.registry.WebAuthProviderRegistry;
-import io.cloudbeaver.registry.WebUserProfileRegistry;
+import io.cloudbeaver.registry.WebMetaParametersRegistry;
import io.cloudbeaver.server.CBApplication;
import io.cloudbeaver.service.auth.DBWServiceAuth;
import io.cloudbeaver.service.auth.WebAuthStatus;
@@ -191,14 +191,13 @@ public class WebServiceAuthImpl implements DBWServiceAuth {
@Override
public WebPropertyInfo[] listUserProfileProperties(@NotNull WebSession webSession) {
- List props = new ArrayList<>();
-
// First add user profile properties
- props.addAll(WebUserProfileRegistry.getInstance().getProperties());
+ List props = new ArrayList<>(
+ WebMetaParametersRegistry.getInstance().getUserParameters());
// Add metas from enabled auth providers
for (WebAuthProviderDescriptor ap : WebServiceUtils.getEnabledAuthProviders()) {
- List metaProps = ap.getMetaProperties(SMSubjectType.user);
+ List metaProps = ap.getMetaParameters(SMSubjectType.user);
if (!CommonUtils.isEmpty(metaProps)) {
props.addAll(metaProps);
}
diff --git a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/CBEmbeddedSecurityController.java b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/CBEmbeddedSecurityController.java
index a0e9a62b59..28d736399b 100644
--- a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/CBEmbeddedSecurityController.java
+++ b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/CBEmbeddedSecurityController.java
@@ -44,11 +44,11 @@ import org.jkiss.dbeaver.model.impl.jdbc.JDBCUtils;
import org.jkiss.dbeaver.model.impl.jdbc.exec.JDBCTransaction;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.LoggingProgressMonitor;
-import org.jkiss.dbeaver.model.security.*;
import org.jkiss.dbeaver.model.security.exception.SMAccessTokenExpiredException;
import org.jkiss.dbeaver.model.security.exception.SMException;
import org.jkiss.dbeaver.model.security.exception.SMRefreshTokenExpiredException;
import org.jkiss.dbeaver.model.security.user.*;
+import org.jkiss.dbeaver.model.security.*;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.utils.ArrayUtils;
import org.jkiss.utils.CommonUtils;
@@ -1037,17 +1037,17 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
if (SMAuthProviderFederated.class.isAssignableFrom(authProviderInstance.getClass())) {
//async auth
var authProviderFederated = (SMAuthProviderFederated) authProviderInstance;
- var redirectUrl = buildRedirectLink(
- authProviderFederated.getSignInLink(authProviderConfigurationId, Map.of()),
+ var redirectUrl = buildRedirectLink(authProviderFederated.getSignInLink(authProviderConfigurationId, Map.of()),
authAttemptId);
- return SMAuthInfo.inProgress(authAttemptId, redirectUrl, filteredUserCreds);
+ Map authData = Map.of(new SMAuthConfigurationReference(authProviderId,
+ authProviderConfigurationId), filteredUserCreds);
+ return SMAuthInfo.inProgress(authAttemptId, redirectUrl, authData);
}
txn.commit();
return finishAuthentication(
SMAuthInfo.inProgress(
authAttemptId,
- null,
- Map.of(authProviderId, securedUserIdentifyingCredentials)
+ null, Map.of(new SMAuthConfigurationReference(authProviderId, null), securedUserIdentifyingCredentials)
),
true,
false
@@ -1125,10 +1125,12 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
}
@Override
- public void updateAuthStatus(@NotNull String authId,
- @NotNull SMAuthStatus authStatus,
- @NotNull Map authInfo,
- @Nullable String error) throws DBException {
+ public void updateAuthStatus(
+ @NotNull String authId,
+ @NotNull SMAuthStatus authStatus,
+ @NotNull Map authInfo,
+ @Nullable String error
+ ) throws DBException {
var existAuthInfo = getAuthStatus(authId);
if (existAuthInfo.getAuthStatus() != SMAuthStatus.IN_PROGRESS) {
throw new SMException("Authorization already finished and cannot be updated");
@@ -1137,13 +1139,14 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
updateAuthStatus(authId, authStatus, authInfo, error, authSessionInfo.getSmSessionId());
}
- private void updateAuthStatus(@NotNull String authId,
- @NotNull SMAuthStatus authStatus,
- @NotNull Map authInfo,
- @Nullable String error,
- @Nullable String smSessionId) throws DBException {
- try (Connection dbCon = database.openConnection();
- JDBCTransaction txn = new JDBCTransaction(dbCon)) {
+ private void updateAuthStatus(
+ @NotNull String authId,
+ @NotNull SMAuthStatus authStatus,
+ @NotNull Map authInfo,
+ @Nullable String error,
+ @Nullable String smSessionId
+ ) throws DBException {
+ try (Connection dbCon = database.openConnection(); JDBCTransaction txn = new JDBCTransaction(dbCon)) {
try (PreparedStatement dbStat = dbCon.prepareStatement(
"UPDATE CB_AUTH_ATTEMPT SET AUTH_STATUS=?,AUTH_ERROR=?,SESSION_ID=? WHERE AUTH_ID=?")) {
dbStat.setString(1, authStatus.toString());
@@ -1155,20 +1158,29 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
}
}
- for (Map.Entry entry : authInfo.entrySet()) {
- String providerId = entry.getKey();
+ for (Map.Entry entry : authInfo.entrySet()) {
+ SMAuthConfigurationReference providerId = entry.getKey();
String authJson = gson.toJson(entry.getValue());
- try (PreparedStatement dbStat = dbCon.prepareStatement(
- "UPDATE CB_AUTH_ATTEMPT_INFO SET AUTH_STATE=? WHERE AUTH_ID=? AND AUTH_PROVIDER_ID=?")) {
+ boolean configIdExist = providerId.getAuthProviderConfigurationId() != null;
+ var sqlBuilder = new StringBuilder();
+ sqlBuilder.append("UPDATE CB_AUTH_ATTEMPT_INFO SET AUTH_STATE=? ")
+ .append("WHERE AUTH_ID=? AND AUTH_PROVIDER_ID=? AND ")
+ .append(configIdExist ? "AUTH_PROVIDER_CONFIGURATION_ID=?" : "AUTH_PROVIDER_CONFIGURATION_ID IS NULL");
+ try (PreparedStatement dbStat = dbCon.prepareStatement(sqlBuilder.toString())) {
dbStat.setString(1, authJson);
dbStat.setString(2, authId);
- dbStat.setString(3, providerId);
+ dbStat.setString(3, providerId.getAuthProviderId());
+ if (configIdExist) {
+ dbStat.setString(4, providerId.getAuthProviderConfigurationId());
+ }
if (dbStat.executeUpdate() <= 0) {
try (PreparedStatement dbStatIns = dbCon.prepareStatement(
- "INSERT INTO CB_AUTH_ATTEMPT_INFO (AUTH_ID,AUTH_PROVIDER_ID,AUTH_STATE) VALUES(?,?,?)")) {
+ "INSERT INTO CB_AUTH_ATTEMPT_INFO (AUTH_ID,AUTH_PROVIDER_ID,AUTH_PROVIDER_CONFIGURATION_ID,AUTH_STATE) "
+ + "VALUES(?,?,?,?)")) {
dbStatIns.setString(1, authId);
- dbStatIns.setString(2, providerId);
- dbStatIns.setString(3, authJson);
+ dbStatIns.setString(2, providerId.getAuthProviderId());
+ dbStatIns.setString(3, providerId.getAuthProviderConfigurationId());
+ dbStatIns.setString(4, authJson);
dbStatIns.execute();
}
}
@@ -1199,7 +1211,7 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
smSessionId = dbResult.getString(3);
}
}
- Map authData = new LinkedHashMap<>();
+ Map authData = new LinkedHashMap<>();
String redirectUrl = null;
try (PreparedStatement dbStat = dbCon.prepareStatement(
@@ -1217,14 +1229,13 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
WebAuthProviderDescriptor authProviderDescriptor = getAuthProvider(authProviderId);
var authProviderInstance = authProviderDescriptor.getInstance();
if (SMAuthProviderFederated.class.isAssignableFrom(authProviderInstance.getClass())) {
- redirectUrl = buildRedirectLink(
- ((SMAuthProviderFederated) authProviderInstance).getRedirectLink(authProviderConfiguration, Map.of()),
- authId
- );
+ redirectUrl = buildRedirectLink(((SMAuthProviderFederated) authProviderInstance).getRedirectLink(
+ authProviderConfiguration,
+ Map.of()), authId);
}
}
- authData.put(authProviderId, authProviderData);
+ authData.put(new SMAuthConfigurationReference(authProviderId, authProviderConfiguration), authProviderData);
}
}
}
@@ -1368,7 +1379,7 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
if (authInfo.getAuthStatus() != SMAuthStatus.IN_PROGRESS) {
throw new SMException("Authorization has already been completed with status: " + authInfo.getAuthStatus());
}
- Set authProviderIds = authInfo.getAuthData().keySet();
+ Set authProviderIds = authInfo.getAuthData().keySet();
if (authProviderIds.isEmpty()) {
throw new SMException("Authorization providers are not defined");
}
@@ -1386,20 +1397,19 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
}
String activeUserId = permissions == null ? null : permissions.getUserId();
- Map storedUserData = new LinkedHashMap<>();
+ Map storedUserData = new LinkedHashMap<>();
SMTeam[] allTeams = null;
String detectedAuthRole = null;
- for (String authProviderId : authProviderIds) {
+ for (SMAuthConfigurationReference authConfiguration : authProviderIds) {
+ String authProviderId = authConfiguration.getAuthProviderId();
WebAuthProviderDescriptor authProvider = getAuthProvider(authProviderId);
- var userAuthData = (Map) authInfo.getAuthData().get(authProviderId);
+ var userAuthData = (Map) authInfo.getAuthData().get(authConfiguration);
SMAutoAssign autoAssign = getAutoAssignUserData(authId, authProvider, userAuthData, finishAuthMonitor);
if (autoAssign != null) {
detectedAuthRole = autoAssign.getAuthRole();
}
- var userIdFromCreds = findOrCreateExternalUserByCredentials(
- authProvider,
- authAttemptSessionInfo.getSessionParams(),
+ var userIdFromCreds = findOrCreateExternalUserByCredentials(authProvider, authAttemptSessionInfo.getSessionParams(),
userAuthData,
finishAuthMonitor,
activeUserId,
@@ -1423,10 +1433,8 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
if (activeUserId == null) {
activeUserId = userIdFromCreds;
}
- storedUserData.put(
- authProviderId,
- saveSecuredCreds ? userAuthData : filterSecuredUserData(userAuthData, getAuthProvider(authProviderId))
- );
+ storedUserData.put(authConfiguration,
+ saveSecuredCreds ? userAuthData : filterSecuredUserData(userAuthData, getAuthProvider(authProviderId)));
}
String tokenAuthRole = updateUserAuthRoleIfNeeded(activeUserId, detectedAuthRole);
@@ -2156,4 +2164,8 @@ public class CBEmbeddedSecurityController implements SMAdminController, SMAuthen
return activeUserCredentials.getUserId();
}
+ private boolean isProviderEnabled(@NotNull String providerId) {
+ WebAuthConfiguration appConfiguration = application.getAuthConfiguration();
+ return appConfiguration.isAuthProviderEnabled(providerId);
+ }
}
diff --git a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/internal/AuthAttemptSessionInfo.java b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/internal/AuthAttemptSessionInfo.java
index 7c5aee36e3..28c972bdeb 100644
--- a/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/internal/AuthAttemptSessionInfo.java
+++ b/server/bundles/io.cloudbeaver.service.security/src/io/cloudbeaver/service/security/internal/AuthAttemptSessionInfo.java
@@ -19,7 +19,7 @@ package io.cloudbeaver.service.security.internal;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
-import org.jkiss.dbeaver.model.security.SMSessionType;
+import org.jkiss.dbeaver.model.auth.SMSessionType;
import java.util.Map;
diff --git a/webapp/packages/core-authentication/src/AuthInfoService.ts b/webapp/packages/core-authentication/src/AuthInfoService.ts
index fe38e6c7eb..6ad4f359bd 100644
--- a/webapp/packages/core-authentication/src/AuthInfoService.ts
+++ b/webapp/packages/core-authentication/src/AuthInfoService.ts
@@ -15,15 +15,20 @@ import { uuid } from '@cloudbeaver/core-utils';
import { AuthProvidersResource, AuthProviderConfiguration } from './AuthProvidersResource';
import { type ILoginOptions, UserInfoResource } from './UserInfoResource';
+export interface IUserAuthConfiguration {
+ providerId: string;
+ configuration: AuthProviderConfiguration;
+}
+
@injectable()
export class AuthInfoService {
get userInfo(): UserInfo | null {
return this.userInfoResource.data;
}
- get userAuthConfigurations(): AuthProviderConfiguration[] {
+ get userAuthConfigurations(): IUserAuthConfiguration[] {
const tokens = this.userInfo?.authTokens;
- const result: AuthProviderConfiguration[] = [];
+ const result: IUserAuthConfiguration[] = [];
if (!tokens) {
return result;
@@ -41,7 +46,7 @@ export class AuthInfoService {
);
if (configuration) {
- result.push(configuration);
+ result.push({ providerId: provider.id, configuration });
}
}
}
diff --git a/webapp/packages/core-authentication/src/TeamMetaParametersResource.ts b/webapp/packages/core-authentication/src/TeamMetaParametersResource.ts
new file mode 100644
index 0000000000..f5026e9f29
--- /dev/null
+++ b/webapp/packages/core-authentication/src/TeamMetaParametersResource.ts
@@ -0,0 +1,30 @@
+/*
+ * CloudBeaver - Cloud Database Manager
+ * Copyright (C) 2020-2022 DBeaver Corp and others
+ *
+ * Licensed under the Apache License, Version 2.0.
+ * you may not use this file except in compliance with the License.
+ */
+
+import { injectable } from '@cloudbeaver/core-di';
+import { SessionResource } from '@cloudbeaver/core-root';
+import { CachedDataResource, GraphQLService, ObjectPropertyInfo } from '@cloudbeaver/core-sdk';
+
+export type TeamMetaParameter = ObjectPropertyInfo;
+
+@injectable()
+export class TeamMetaParametersResource extends CachedDataResource {
+ constructor(
+ private readonly graphQLService: GraphQLService,
+ sessionResource: SessionResource,
+ ) {
+ super([]);
+
+ this.sync(sessionResource, () => { }, () => { });
+ }
+
+ protected async loader(): Promise {
+ const { parameters } = await this.graphQLService.sdk.getTeamMetaParameters();
+ return parameters;
+ }
+}
diff --git a/webapp/packages/core-authentication/src/TeamsResource.ts b/webapp/packages/core-authentication/src/TeamsResource.ts
index 47cc793a75..ba3c8bb42d 100644
--- a/webapp/packages/core-authentication/src/TeamsResource.ts
+++ b/webapp/packages/core-authentication/src/TeamsResource.ts
@@ -16,17 +16,20 @@ import {
ResourceKeyUtils,
AdminTeamInfoFragment,
AdminConnectionGrantInfo,
- CachedMapAllKey
+ CachedMapAllKey,
+ GetTeamsListQueryVariables
} from '@cloudbeaver/core-sdk';
import { isArraysEqual } from '@cloudbeaver/core-utils';
const NEW_TEAM_SYMBOL = Symbol('new-team');
export type TeamInfo = AdminTeamInfoFragment;
+
+type TeamResourceIncludes = Omit;
type NewTeam = TeamInfo & { [NEW_TEAM_SYMBOL]: boolean; timestamp: number };
@injectable()
-export class TeamsResource extends CachedMapResource {
+export class TeamsResource extends CachedMapResource {
constructor(private readonly graphQLService: GraphQLService) {
super();
}
@@ -41,8 +44,20 @@ export class TeamsResource extends CachedMapResource {
return this.data;
}
- async createTeam(teamInfo: TeamInfo): Promise {
- const response = await this.graphQLService.sdk.createTeam(teamInfo);
+ async createTeam({
+ teamId,
+ teamPermissions,
+ teamName,
+ description,
+ metaParameters,
+ }: TeamInfo): Promise {
+ const response = await this.graphQLService.sdk.createTeam({
+ teamId,
+ teamName,
+ description,
+ ...this.getDefaultIncludes(),
+ ...this.getIncludesMap(teamId),
+ });
const newTeam: NewTeam = {
...response.team,
@@ -52,19 +67,35 @@ export class TeamsResource extends CachedMapResource {
this.updateTeams(newTeam);
- await this.setSubjectPermissions(newTeam.teamId, teamInfo.teamPermissions);
+ await this.setMetaParameters(newTeam.teamId, metaParameters);
+ await this.setSubjectPermissions(newTeam.teamId, teamPermissions);
- return this.get(teamInfo.teamId)!;
+ return this.get(teamId)!;
}
- async updateTeam(teamInfo: TeamInfo): Promise {
- const { team } = await this.graphQLService.sdk.updateTeam(teamInfo);
+ async updateTeam({
+ teamId,
+ teamPermissions,
+ teamName,
+ description,
+ metaParameters,
+ }: TeamInfo): Promise {
+ const { team } = await this.graphQLService.sdk.updateTeam({
+ teamId,
+ teamName,
+ description,
+ ...this.getDefaultIncludes(),
+ ...this.getIncludesMap(teamId),
+ });
this.updateTeams(team);
- await this.setSubjectPermissions(team.teamId, teamInfo.teamPermissions);
+ await this.setMetaParameters(team.teamId, metaParameters);
+ await this.setSubjectPermissions(team.teamId, teamPermissions);
- return this.get(teamInfo.teamId)!;
+ this.markOutdated(team.teamId);
+
+ return this.get(teamId)!;
}
async deleteTeam(key: ResourceKey): Promise