chore: Moving settings from organization configuration to instance variables (#39736)
## Description > [!TIP] > _Add a TL;DR when the description is longer than 500 words or extremely technical (helps the content, marketing, and DevRel team)._ > > _Please also include relevant motivation and context. List any dependencies that are required for this change. Add links to Notion, Figma or any other documents that might be relevant to the PR._ Fixes #`Issue Number` _or_ Fixes `Issue URL` > [!WARNING] > _If no issue exists, please create an issue first, and check with the maintainers if the issue is valid._ ## Automation /test all ### 🔍 Cypress test results <!-- This is an auto-generated comment: Cypress test results --> > [!IMPORTANT] > 🟣 🟣 🟣 Your tests are running. > Tests running at: <https://github.com/appsmithorg/appsmith/actions/runs/13901423078> > Commit: 0744f07a7ca5e30225dedd4de3c07371ce2a3083 > Workflow: `PR Automation test suite` > Tags: `@tag.All` > Spec: `` > <hr>Mon, 17 Mar 2025 14:04:22 UTC <!-- end of auto-generated comment: Cypress test results --> ## Communication Should the DevRel and Marketing teams inform users about this change? - [ ] Yes - [ ] No <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Upgraded configuration management now uses a unified instance-level approach, ensuring more consistent handling of service settings such as email verification and integrations. - Legacy settings have been migrated to improve reliability and streamline system behavior. - **Tests** - Comprehensive tests have been added to verify the stability and accuracy of the new configuration processes. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
parent
37051762af
commit
5364a6c0c9
|
|
@ -1,6 +1,7 @@
|
|||
package com.appsmith.server.authentication.handlers;
|
||||
|
||||
import com.appsmith.server.authentication.handlers.ce.AuthenticationSuccessHandlerCE;
|
||||
import com.appsmith.server.helpers.InstanceVariablesHelper;
|
||||
import com.appsmith.server.helpers.RedirectHelper;
|
||||
import com.appsmith.server.helpers.WorkspaceServiceHelper;
|
||||
import com.appsmith.server.ratelimiting.RateLimitService;
|
||||
|
|
@ -34,7 +35,8 @@ public class AuthenticationSuccessHandler extends AuthenticationSuccessHandlerCE
|
|||
RateLimitService rateLimitService,
|
||||
OrganizationService organizationService,
|
||||
UserService userService,
|
||||
WorkspaceServiceHelper workspaceServiceHelper) {
|
||||
WorkspaceServiceHelper workspaceServiceHelper,
|
||||
InstanceVariablesHelper instanceVariablesHelper) {
|
||||
super(
|
||||
redirectHelper,
|
||||
sessionUserService,
|
||||
|
|
@ -48,6 +50,7 @@ public class AuthenticationSuccessHandler extends AuthenticationSuccessHandlerCE
|
|||
rateLimitService,
|
||||
organizationService,
|
||||
userService,
|
||||
workspaceServiceHelper);
|
||||
workspaceServiceHelper,
|
||||
instanceVariablesHelper);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import com.appsmith.server.domains.LoginSource;
|
|||
import com.appsmith.server.domains.User;
|
||||
import com.appsmith.server.domains.Workspace;
|
||||
import com.appsmith.server.dtos.ResendEmailVerificationDTO;
|
||||
import com.appsmith.server.helpers.InstanceVariablesHelper;
|
||||
import com.appsmith.server.helpers.RedirectHelper;
|
||||
import com.appsmith.server.helpers.WorkspaceServiceHelper;
|
||||
import com.appsmith.server.ratelimiting.RateLimitService;
|
||||
|
|
@ -26,7 +27,6 @@ import com.appsmith.server.solutions.WorkspacePermission;
|
|||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
import org.springframework.security.core.Authentication;
|
||||
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
|
||||
import org.springframework.security.web.server.DefaultServerRedirectStrategy;
|
||||
|
|
@ -68,12 +68,11 @@ public class AuthenticationSuccessHandlerCE implements ServerAuthenticationSucce
|
|||
private final OrganizationService organizationService;
|
||||
private final UserService userService;
|
||||
private final WorkspaceServiceHelper workspaceServiceHelper;
|
||||
private final InstanceVariablesHelper instanceVariablesHelper;
|
||||
|
||||
private Mono<Boolean> isVerificationRequired(String userEmail, String method) {
|
||||
Mono<Boolean> emailVerificationEnabledMono = organizationService
|
||||
.getOrganizationConfiguration()
|
||||
.map(organization -> organization.getOrganizationConfiguration().isEmailVerificationEnabled())
|
||||
.cache();
|
||||
Mono<Boolean> emailVerificationEnabledMono =
|
||||
instanceVariablesHelper.isEmailVerificationEnabled().cache();
|
||||
|
||||
Mono<User> userMono = organizationService
|
||||
.getCurrentUserOrganizationId()
|
||||
|
|
|
|||
|
|
@ -208,4 +208,5 @@ public class FieldNameCE {
|
|||
public static final String ORGANIZATION_ID = "organizationId";
|
||||
public static final String NONE = "none";
|
||||
public static final String ORGANIZATION_ADMINISTRATOR_ROLE = "Organization Administrator Role";
|
||||
public static final String INSTANCE_VARIABLES = "instanceVariables";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,15 +20,18 @@ import java.util.Map;
|
|||
@FieldNameConstants
|
||||
public class OrganizationConfigurationCE implements Serializable {
|
||||
|
||||
@Deprecated(forRemoval = true, since = "v1.65")
|
||||
private String googleMapsKey;
|
||||
|
||||
private Boolean isFormLoginEnabled;
|
||||
|
||||
@Deprecated(forRemoval = true, since = "v1.65")
|
||||
private String instanceName;
|
||||
|
||||
protected License license;
|
||||
|
||||
// organization admin can toggle this field to enable/disable email verification
|
||||
@Deprecated(forRemoval = true, since = "v1.65")
|
||||
private Boolean emailVerificationEnabled;
|
||||
|
||||
// We add `JsonInclude` here, so that this field is included in the JSON response, even if it is `null`. Reason is,
|
||||
|
|
@ -91,5 +94,9 @@ public class OrganizationConfigurationCE implements Serializable {
|
|||
return Boolean.TRUE.equals(this.emailVerificationEnabled);
|
||||
}
|
||||
|
||||
public static class Fields {}
|
||||
public static class Fields {
|
||||
public Fields() {
|
||||
// Public constructor for Fields class
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,18 @@
|
|||
package com.appsmith.server.helpers;
|
||||
|
||||
import com.appsmith.server.helpers.ce.InstanceVariablesHelperCE;
|
||||
import com.appsmith.server.services.ConfigService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* Helper class for accessing instance variables from the instance config
|
||||
*/
|
||||
@Component
|
||||
@Slf4j
|
||||
public class InstanceVariablesHelper extends InstanceVariablesHelperCE {
|
||||
|
||||
public InstanceVariablesHelper(ConfigService configService) {
|
||||
super(configService);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
package com.appsmith.server.helpers.ce;
|
||||
|
||||
import com.appsmith.server.constants.Appsmith;
|
||||
import com.appsmith.server.services.ConfigService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
/**
|
||||
* Helper class for accessing instance variables from the instance config
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
public class InstanceVariablesHelperCE {
|
||||
private final ConfigService configService;
|
||||
|
||||
/**
|
||||
* Get the instance name from the instance variables
|
||||
* @return The instance name, or the default instance name if not set
|
||||
*/
|
||||
public Mono<String> getInstanceName() {
|
||||
return configService.getInstanceVariables().map(instanceVariables -> {
|
||||
Object value = instanceVariables.getOrDefault("instanceName", Appsmith.DEFAULT_INSTANCE_NAME);
|
||||
return value != null ? value.toString() : Appsmith.DEFAULT_INSTANCE_NAME;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the email verification enabled flag from the instance variables
|
||||
* @return True if email verification is enabled, false otherwise
|
||||
*/
|
||||
public Mono<Boolean> isEmailVerificationEnabled() {
|
||||
return configService.getInstanceVariables().map(instanceVariables -> {
|
||||
Object value = instanceVariables.getOrDefault("emailVerificationEnabled", false);
|
||||
if (value instanceof Boolean) {
|
||||
return (Boolean) value;
|
||||
}
|
||||
return Boolean.FALSE;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Google Maps API key from the instance variables
|
||||
* @return The Google Maps API key, or an empty string if not set
|
||||
*/
|
||||
public Mono<String> getGoogleMapsKey() {
|
||||
return configService.getInstanceVariables().map(instanceVariables -> {
|
||||
Object value = instanceVariables.getOrDefault("googleMapsKey", "");
|
||||
return value != null ? value.toString() : "";
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,85 @@
|
|||
package com.appsmith.server.migrations.db.ce;
|
||||
|
||||
import com.appsmith.server.constants.Appsmith;
|
||||
import com.appsmith.server.constants.FieldName;
|
||||
import com.appsmith.server.domains.Config;
|
||||
import com.appsmith.server.domains.Organization;
|
||||
import com.appsmith.server.domains.OrganizationConfiguration;
|
||||
import io.mongock.api.annotations.ChangeUnit;
|
||||
import io.mongock.api.annotations.Execution;
|
||||
import io.mongock.api.annotations.RollbackExecution;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import net.minidev.json.JSONObject;
|
||||
import org.springframework.data.mongodb.core.MongoTemplate;
|
||||
import org.springframework.data.mongodb.core.query.Query;
|
||||
|
||||
import static org.springframework.data.mongodb.core.query.Criteria.where;
|
||||
|
||||
@Slf4j
|
||||
@ChangeUnit(order = "069", id = "migrate-organization-config-to-instance-config", author = "")
|
||||
public class Migration069MigrateOrganizationConfigToInstanceConfig {
|
||||
|
||||
private final MongoTemplate mongoTemplate;
|
||||
|
||||
public Migration069MigrateOrganizationConfigToInstanceConfig(MongoTemplate mongoTemplate) {
|
||||
this.mongoTemplate = mongoTemplate;
|
||||
}
|
||||
|
||||
@RollbackExecution
|
||||
public void rollbackExecution() {
|
||||
// This is a data migration, no rollback required
|
||||
}
|
||||
|
||||
@Execution
|
||||
public void migrateOrganizationConfigToInstanceConfig() {
|
||||
log.info("Starting migration of organization configuration fields to instance config");
|
||||
|
||||
// 1. Fetch the instanceConfig from Config collection
|
||||
Query instanceConfigQuery = new Query();
|
||||
instanceConfigQuery.addCriteria(where(Config.Fields.name).is(FieldName.INSTANCE_CONFIG));
|
||||
Config instanceConfig = mongoTemplate.findOne(instanceConfigQuery, Config.class);
|
||||
|
||||
if (instanceConfig == null) {
|
||||
log.error("Instance config not found. Migration cannot proceed.");
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. Fetch the Organization with its OrganizationConfiguration
|
||||
Query organizationQuery = new Query();
|
||||
Organization organization = mongoTemplate.findOne(organizationQuery, Organization.class);
|
||||
|
||||
if (organization == null || organization.getOrganizationConfiguration() == null) {
|
||||
log.info("No organization or organization configuration found. Nothing to migrate.");
|
||||
return;
|
||||
}
|
||||
|
||||
// 3. Create instanceVariables JSON object with the required fields
|
||||
OrganizationConfiguration orgConfig = organization.getOrganizationConfiguration();
|
||||
JSONObject config = instanceConfig.getConfig();
|
||||
if (config == null) {
|
||||
config = new JSONObject();
|
||||
}
|
||||
|
||||
// Create instanceVariables object
|
||||
JSONObject instanceVariables = new JSONObject();
|
||||
|
||||
// Copy values from OrganizationConfiguration to instanceVariables
|
||||
if (orgConfig.getInstanceName() != null) {
|
||||
instanceVariables.put("instanceName", orgConfig.getInstanceName());
|
||||
} else {
|
||||
instanceVariables.put("instanceName", Appsmith.DEFAULT_INSTANCE_NAME);
|
||||
}
|
||||
|
||||
instanceVariables.put("emailVerificationEnabled", orgConfig.isEmailVerificationEnabled());
|
||||
instanceVariables.put("googleMapsKey", orgConfig.getGoogleMapsKey());
|
||||
|
||||
// Add instanceVariables to config
|
||||
config.put("instanceVariables", instanceVariables);
|
||||
instanceConfig.setConfig(config);
|
||||
|
||||
// 4. Save the updated instanceConfig
|
||||
mongoTemplate.save(instanceConfig);
|
||||
|
||||
log.info("Successfully migrated organization configuration fields to instance config");
|
||||
}
|
||||
}
|
||||
|
|
@ -2,6 +2,7 @@ package com.appsmith.server.services;
|
|||
|
||||
import com.appsmith.server.configurations.CommonConfig;
|
||||
import com.appsmith.server.helpers.FeatureFlagMigrationHelper;
|
||||
import com.appsmith.server.helpers.InstanceVariablesHelper;
|
||||
import com.appsmith.server.helpers.UserOrganizationHelper;
|
||||
import com.appsmith.server.repositories.CacheableRepositoryHelper;
|
||||
import com.appsmith.server.repositories.OrganizationRepository;
|
||||
|
|
@ -25,7 +26,8 @@ public class OrganizationServiceImpl extends OrganizationServiceCEImpl implement
|
|||
CacheableRepositoryHelper cacheableRepositoryHelper,
|
||||
CommonConfig commonConfig,
|
||||
ObservationRegistry observationRegistry,
|
||||
UserOrganizationHelper userOrganizationHelper) {
|
||||
UserOrganizationHelper userOrganizationHelper,
|
||||
InstanceVariablesHelper instanceVariablesHelper) {
|
||||
super(
|
||||
validator,
|
||||
repository,
|
||||
|
|
@ -36,6 +38,7 @@ public class OrganizationServiceImpl extends OrganizationServiceCEImpl implement
|
|||
cacheableRepositoryHelper,
|
||||
commonConfig,
|
||||
observationRegistry,
|
||||
userOrganizationHelper);
|
||||
userOrganizationHelper,
|
||||
instanceVariablesHelper);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@ package com.appsmith.server.services;
|
|||
|
||||
import com.appsmith.server.configurations.CommonConfig;
|
||||
import com.appsmith.server.configurations.EmailConfig;
|
||||
import com.appsmith.server.helpers.InstanceVariablesHelper;
|
||||
import com.appsmith.server.helpers.UserServiceHelper;
|
||||
import com.appsmith.server.helpers.UserUtils;
|
||||
import com.appsmith.server.notifications.EmailSender;
|
||||
|
|
@ -42,7 +43,8 @@ public class UserServiceImpl extends UserServiceCECompatibleImpl implements User
|
|||
EmailService emailService,
|
||||
RateLimitService rateLimitService,
|
||||
PACConfigurationService pacConfigurationService,
|
||||
UserServiceHelper userServiceHelper) {
|
||||
UserServiceHelper userServiceHelper,
|
||||
InstanceVariablesHelper instanceVariablesHelper) {
|
||||
super(
|
||||
validator,
|
||||
repository,
|
||||
|
|
@ -59,6 +61,7 @@ public class UserServiceImpl extends UserServiceCECompatibleImpl implements User
|
|||
emailService,
|
||||
rateLimitService,
|
||||
pacConfigurationService,
|
||||
userServiceHelper);
|
||||
userServiceHelper,
|
||||
instanceVariablesHelper);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package com.appsmith.server.services.ce;
|
|||
import com.appsmith.server.acl.AclPermission;
|
||||
import com.appsmith.server.domains.Config;
|
||||
import com.appsmith.server.domains.User;
|
||||
import net.minidev.json.JSONObject;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import java.util.Map;
|
||||
|
|
@ -24,4 +25,17 @@ public interface ConfigServiceCE {
|
|||
Mono<Config> getByName(String name, AclPermission permission);
|
||||
|
||||
Mono<Config> getByNameAsUser(String name, User user, AclPermission permission);
|
||||
|
||||
/**
|
||||
* Get the instance variables from the instance config
|
||||
* @return Map containing the instance variables
|
||||
*/
|
||||
Mono<Map<String, Object>> getInstanceVariables();
|
||||
|
||||
/**
|
||||
* Update the instance variables in the instance config
|
||||
* @param instanceVariables JSONObject containing the instance variables to update
|
||||
* @return Updated Config object
|
||||
*/
|
||||
Mono<Config> updateInstanceVariables(JSONObject instanceVariables);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,8 @@ import reactor.core.publisher.Mono;
|
|||
|
||||
import java.util.Map;
|
||||
|
||||
import static com.appsmith.server.constants.ce.FieldNameCE.INSTANCE_VARIABLES;
|
||||
|
||||
@Slf4j
|
||||
public class ConfigServiceCEImpl implements ConfigServiceCE {
|
||||
private final ConfigRepository repository;
|
||||
|
|
@ -92,4 +94,33 @@ public class ConfigServiceCEImpl implements ConfigServiceCE {
|
|||
public Mono<Config> getByNameAsUser(String name, User user, AclPermission permission) {
|
||||
return repository.findByNameAsUser(name, user, permission);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Map<String, Object>> getInstanceVariables() {
|
||||
return getByName(FieldName.INSTANCE_CONFIG).map(config -> {
|
||||
Object instanceVariablesObj = config.getConfig().getOrDefault(INSTANCE_VARIABLES, new JSONObject());
|
||||
Map<String, Object> instanceVariables;
|
||||
|
||||
if (instanceVariablesObj instanceof JSONObject) {
|
||||
instanceVariables = ((JSONObject) instanceVariablesObj);
|
||||
} else if (instanceVariablesObj instanceof Map) {
|
||||
instanceVariables = (Map<String, Object>) instanceVariablesObj;
|
||||
} else {
|
||||
instanceVariables = new JSONObject();
|
||||
}
|
||||
|
||||
return instanceVariables;
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Config> updateInstanceVariables(JSONObject instanceVariables) {
|
||||
return getByName(FieldName.INSTANCE_CONFIG, AclPermission.MANAGE_INSTANCE_CONFIGURATION)
|
||||
.flatMap(config -> {
|
||||
JSONObject configObj = config.getConfig();
|
||||
configObj.put(INSTANCE_VARIABLES, instanceVariables);
|
||||
config.setConfig(configObj);
|
||||
return repository.save(config);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ import com.appsmith.server.exceptions.AppsmithError;
|
|||
import com.appsmith.server.exceptions.AppsmithException;
|
||||
import com.appsmith.server.helpers.CollectionUtils;
|
||||
import com.appsmith.server.helpers.FeatureFlagMigrationHelper;
|
||||
import com.appsmith.server.helpers.InstanceVariablesHelper;
|
||||
import com.appsmith.server.helpers.UserOrganizationHelper;
|
||||
import com.appsmith.server.repositories.CacheableRepositoryHelper;
|
||||
import com.appsmith.server.repositories.OrganizationRepository;
|
||||
|
|
@ -56,6 +57,8 @@ public class OrganizationServiceCEImpl extends BaseService<OrganizationRepositor
|
|||
|
||||
private final UserOrganizationHelper userOrganizationHelper;
|
||||
|
||||
private final InstanceVariablesHelper instanceVariablesHelper;
|
||||
|
||||
public OrganizationServiceCEImpl(
|
||||
Validator validator,
|
||||
OrganizationRepository repository,
|
||||
|
|
@ -66,7 +69,8 @@ public class OrganizationServiceCEImpl extends BaseService<OrganizationRepositor
|
|||
CacheableRepositoryHelper cacheableRepositoryHelper,
|
||||
CommonConfig commonConfig,
|
||||
ObservationRegistry observationRegistry,
|
||||
UserOrganizationHelper userOrganizationHelper) {
|
||||
UserOrganizationHelper userOrganizationHelper,
|
||||
InstanceVariablesHelper instanceVariablesHelper) {
|
||||
super(validator, repository, analyticsService);
|
||||
this.configService = configService;
|
||||
this.envManager = envManager;
|
||||
|
|
@ -75,6 +79,7 @@ public class OrganizationServiceCEImpl extends BaseService<OrganizationRepositor
|
|||
this.commonConfig = commonConfig;
|
||||
this.observationRegistry = observationRegistry;
|
||||
this.userOrganizationHelper = userOrganizationHelper;
|
||||
this.instanceVariablesHelper = instanceVariablesHelper;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -149,9 +154,12 @@ public class OrganizationServiceCEImpl extends BaseService<OrganizationRepositor
|
|||
@Override
|
||||
public Mono<Organization> getOrganizationConfiguration(Mono<Organization> dbOrganizationMono) {
|
||||
String adminEmailDomainHash = commonConfig.getAdminEmailDomainHash();
|
||||
Mono<Organization> clientOrganizationMono = configService
|
||||
.getInstanceId()
|
||||
.map(instanceId -> {
|
||||
Mono<Organization> clientOrganizationMono = Mono.zip(
|
||||
configService.getInstanceId(), instanceVariablesHelper.getGoogleMapsKey())
|
||||
.map(tuple -> {
|
||||
final String instanceId = tuple.getT1();
|
||||
final String googleMapsKey = tuple.getT2();
|
||||
|
||||
final Organization organization = new Organization();
|
||||
organization.setInstanceId(instanceId);
|
||||
organization.setAdminEmailDomainHash(adminEmailDomainHash);
|
||||
|
|
@ -159,7 +167,7 @@ public class OrganizationServiceCEImpl extends BaseService<OrganizationRepositor
|
|||
final OrganizationConfiguration config = new OrganizationConfiguration();
|
||||
organization.setOrganizationConfiguration(config);
|
||||
|
||||
config.setGoogleMapsKey(System.getenv("APPSMITH_GOOGLE_MAPS_API_KEY"));
|
||||
config.setGoogleMapsKey(googleMapsKey);
|
||||
|
||||
if (StringUtils.hasText(System.getenv("APPSMITH_OAUTH2_GOOGLE_CLIENT_ID"))) {
|
||||
config.addThirdPartyAuth("google");
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@ import com.appsmith.server.dtos.UserSignupDTO;
|
|||
import com.appsmith.server.dtos.UserUpdateDTO;
|
||||
import com.appsmith.server.exceptions.AppsmithError;
|
||||
import com.appsmith.server.exceptions.AppsmithException;
|
||||
import com.appsmith.server.helpers.InstanceVariablesHelper;
|
||||
import com.appsmith.server.helpers.UserServiceHelper;
|
||||
import com.appsmith.server.helpers.UserUtils;
|
||||
import com.appsmith.server.ratelimiting.RateLimitService;
|
||||
|
|
@ -104,6 +105,7 @@ public class UserServiceCEImpl extends BaseService<UserRepository, User, String>
|
|||
private final PACConfigurationService pacConfigurationService;
|
||||
|
||||
private final UserServiceHelper userPoliciesComputeHelper;
|
||||
private final InstanceVariablesHelper instanceVariablesHelper;
|
||||
|
||||
private static final WebFilterChain EMPTY_WEB_FILTER_CHAIN = serverWebExchange -> Mono.empty();
|
||||
private static final String FORGOT_PASSWORD_CLIENT_URL_FORMAT = "%s/user/resetPassword?token=%s";
|
||||
|
|
@ -134,7 +136,8 @@ public class UserServiceCEImpl extends BaseService<UserRepository, User, String>
|
|||
EmailService emailService,
|
||||
RateLimitService rateLimitService,
|
||||
PACConfigurationService pacConfigurationService,
|
||||
UserServiceHelper userServiceHelper) {
|
||||
UserServiceHelper userServiceHelper,
|
||||
InstanceVariablesHelper instanceVariablesHelper) {
|
||||
|
||||
super(validator, repository, analyticsService);
|
||||
this.workspaceService = workspaceService;
|
||||
|
|
@ -150,6 +153,7 @@ public class UserServiceCEImpl extends BaseService<UserRepository, User, String>
|
|||
this.emailService = emailService;
|
||||
this.userPoliciesComputeHelper = userServiceHelper;
|
||||
this.pacConfigurationService = pacConfigurationService;
|
||||
this.instanceVariablesHelper = instanceVariablesHelper;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -789,10 +793,8 @@ public class UserServiceCEImpl extends BaseService<UserRepository, User, String>
|
|||
if (TRUE.equals(user.getEmailVerified())) {
|
||||
return Mono.error(new AppsmithException(AppsmithError.USER_ALREADY_VERIFIED));
|
||||
}
|
||||
return organizationService.getOrganizationConfiguration().flatMap(organization -> {
|
||||
Boolean emailVerificationEnabled =
|
||||
organization.getOrganizationConfiguration().isEmailVerificationEnabled();
|
||||
// Email verification not enabled at organization level
|
||||
return instanceVariablesHelper.isEmailVerificationEnabled().flatMap(emailVerificationEnabled -> {
|
||||
// Email verification not enabled at instance level
|
||||
if (!TRUE.equals(emailVerificationEnabled)) {
|
||||
return Mono.error(
|
||||
new AppsmithException(AppsmithError.ORGANIZATION_EMAIL_VERIFICATION_NOT_ENABLED));
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package com.appsmith.server.services.ce_compatible;
|
||||
|
||||
import com.appsmith.server.configurations.CommonConfig;
|
||||
import com.appsmith.server.helpers.InstanceVariablesHelper;
|
||||
import com.appsmith.server.helpers.UserServiceHelper;
|
||||
import com.appsmith.server.helpers.UserUtils;
|
||||
import com.appsmith.server.ratelimiting.RateLimitService;
|
||||
|
|
@ -37,7 +38,8 @@ public class UserServiceCECompatibleImpl extends UserServiceCEImpl implements Us
|
|||
EmailService emailService,
|
||||
RateLimitService rateLimitService,
|
||||
PACConfigurationService pacConfigurationService,
|
||||
UserServiceHelper userServiceHelper) {
|
||||
UserServiceHelper userServiceHelper,
|
||||
InstanceVariablesHelper instanceVariablesHelper) {
|
||||
super(
|
||||
validator,
|
||||
repository,
|
||||
|
|
@ -54,6 +56,7 @@ public class UserServiceCECompatibleImpl extends UserServiceCEImpl implements Us
|
|||
emailService,
|
||||
rateLimitService,
|
||||
pacConfigurationService,
|
||||
userServiceHelper);
|
||||
userServiceHelper,
|
||||
instanceVariablesHelper);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,116 @@
|
|||
package com.appsmith.server.helpers.ce;
|
||||
|
||||
import com.appsmith.server.constants.Appsmith;
|
||||
import com.appsmith.server.helpers.InstanceVariablesHelper;
|
||||
import com.appsmith.server.services.ConfigService;
|
||||
import net.minidev.json.JSONObject;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.ExtendWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.junit.jupiter.MockitoExtension;
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.test.StepVerifier;
|
||||
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@ExtendWith(MockitoExtension.class)
|
||||
public class InstanceVariablesTest {
|
||||
|
||||
@Mock
|
||||
private ConfigService configService;
|
||||
|
||||
private InstanceVariablesHelper instanceVariablesHelper;
|
||||
|
||||
@BeforeEach
|
||||
public void setUp() {
|
||||
instanceVariablesHelper = new InstanceVariablesHelper(configService);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetInstanceName() {
|
||||
// Setup test data
|
||||
JSONObject instanceVariables = new JSONObject();
|
||||
instanceVariables.put("instanceName", "Test Instance");
|
||||
|
||||
// Mock service call
|
||||
when(configService.getInstanceVariables()).thenReturn(Mono.just(instanceVariables));
|
||||
|
||||
// Execute and verify
|
||||
StepVerifier.create(instanceVariablesHelper.getInstanceName())
|
||||
.expectNext("Test Instance")
|
||||
.verifyComplete();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetInstanceNameWithDefault() {
|
||||
// Setup test data with no instanceName
|
||||
JSONObject instanceVariables = new JSONObject();
|
||||
|
||||
// Mock service call
|
||||
when(configService.getInstanceVariables()).thenReturn(Mono.just(instanceVariables));
|
||||
|
||||
// Execute and verify
|
||||
StepVerifier.create(instanceVariablesHelper.getInstanceName())
|
||||
.expectNext(Appsmith.DEFAULT_INSTANCE_NAME)
|
||||
.verifyComplete();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsEmailVerificationEnabled() {
|
||||
// Setup test data
|
||||
JSONObject instanceVariables = new JSONObject();
|
||||
instanceVariables.put("emailVerificationEnabled", true);
|
||||
|
||||
// Mock service call
|
||||
when(configService.getInstanceVariables()).thenReturn(Mono.just(instanceVariables));
|
||||
|
||||
// Execute and verify
|
||||
StepVerifier.create(instanceVariablesHelper.isEmailVerificationEnabled())
|
||||
.expectNext(true)
|
||||
.verifyComplete();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsEmailVerificationEnabledWithDefault() {
|
||||
// Setup test data with no emailVerificationEnabled
|
||||
JSONObject instanceVariables = new JSONObject();
|
||||
|
||||
// Mock service call
|
||||
when(configService.getInstanceVariables()).thenReturn(Mono.just(instanceVariables));
|
||||
|
||||
// Execute and verify
|
||||
StepVerifier.create(instanceVariablesHelper.isEmailVerificationEnabled())
|
||||
.expectNext(false)
|
||||
.verifyComplete();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetGoogleMapsKey() {
|
||||
// Setup test data
|
||||
JSONObject instanceVariables = new JSONObject();
|
||||
instanceVariables.put("googleMapsKey", "test-maps-key");
|
||||
|
||||
// Mock service call
|
||||
when(configService.getInstanceVariables()).thenReturn(Mono.just(instanceVariables));
|
||||
|
||||
// Execute and verify
|
||||
StepVerifier.create(instanceVariablesHelper.getGoogleMapsKey())
|
||||
.expectNext("test-maps-key")
|
||||
.verifyComplete();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetGoogleMapsKeyWithDefault() {
|
||||
// Setup test data with no googleMapsKey
|
||||
JSONObject instanceVariables = new JSONObject();
|
||||
|
||||
// Mock service call
|
||||
when(configService.getInstanceVariables()).thenReturn(Mono.just(instanceVariables));
|
||||
|
||||
// Execute and verify
|
||||
StepVerifier.create(instanceVariablesHelper.getGoogleMapsKey())
|
||||
.expectNext("")
|
||||
.verifyComplete();
|
||||
}
|
||||
}
|
||||
|
|
@ -119,16 +119,6 @@ class OrganizationServiceCETest {
|
|||
.block();
|
||||
}
|
||||
|
||||
@Test
|
||||
void ensureMapsKey() {
|
||||
StepVerifier.create(organizationService.getOrganizationConfiguration())
|
||||
.assertNext(organization -> {
|
||||
assertThat(organization.getOrganizationConfiguration().getGoogleMapsKey())
|
||||
.isNull();
|
||||
})
|
||||
.verifyComplete();
|
||||
}
|
||||
|
||||
@Test
|
||||
@WithUserDetails("api_user")
|
||||
void setMapsKeyAndGetItBack() {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user