chore: Slim seed data (#30671)

This commit is contained in:
Shrikant Sharat Kandula 2024-01-30 19:19:53 +05:30 committed by GitHub
parent 3404d3a38b
commit e473070045
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -2,18 +2,13 @@ package com.appsmith.server.configurations;
import com.appsmith.external.models.PluginType;
import com.appsmith.external.models.Policy;
import com.appsmith.server.domains.Application;
import com.appsmith.server.domains.PermissionGroup;
import com.appsmith.server.domains.Plugin;
import com.appsmith.server.domains.PricingPlan;
import com.appsmith.server.domains.Tenant;
import com.appsmith.server.domains.User;
import com.appsmith.server.domains.UserState;
import com.appsmith.server.domains.Workspace;
import com.appsmith.server.domains.WorkspacePlugin;
import com.appsmith.server.dtos.Permission;
import com.appsmith.server.dtos.WorkspacePluginStatus;
import com.appsmith.server.repositories.ApplicationRepository;
import com.appsmith.server.repositories.PermissionGroupRepository;
import com.appsmith.server.repositories.PluginRepository;
import com.appsmith.server.repositories.TenantRepository;
@ -24,29 +19,17 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import static com.appsmith.server.acl.AclPermission.MANAGE_APPLICATIONS;
import static com.appsmith.server.acl.AclPermission.MANAGE_USERS;
import static com.appsmith.server.acl.AclPermission.MANAGE_WORKSPACES;
import static com.appsmith.server.acl.AclPermission.READ_APPLICATIONS;
import static com.appsmith.server.acl.AclPermission.READ_USERS;
import static com.appsmith.server.acl.AclPermission.READ_WORKSPACES;
import static com.appsmith.server.acl.AclPermission.USER_MANAGE_WORKSPACES;
import static com.appsmith.server.acl.AclPermission.WORKSPACE_EXPORT_APPLICATIONS;
import static com.appsmith.server.acl.AclPermission.WORKSPACE_INVITE_USERS;
import static com.appsmith.server.acl.AclPermission.WORKSPACE_MANAGE_APPLICATIONS;
import static org.springframework.data.mongodb.core.query.Criteria.where;
@Slf4j
@Configuration
@ -56,9 +39,7 @@ public class SeedMongoData {
ApplicationRunner init(
UserRepository userRepository,
WorkspaceRepository workspaceRepository,
ApplicationRepository applicationRepository,
PluginRepository pluginRepository,
ReactiveMongoTemplate mongoTemplate,
TenantRepository tenantRepository,
PermissionGroupRepository permissionGroupRepository,
PolicySolution policySolution) {
@ -69,32 +50,9 @@ public class SeedMongoData {
final String ADMIN_USER_EMAIL = "admin@solutiontest.com";
final String DEV_USER_EMAIL = "developer@solutiontest.com";
Policy manageAppPolicy =
Policy.builder().permission(MANAGE_APPLICATIONS.getValue()).build();
Policy readAppPolicy =
Policy.builder().permission(READ_APPLICATIONS.getValue()).build();
Policy manageWorkspaceAppPolicy = Policy.builder()
.permission(WORKSPACE_MANAGE_APPLICATIONS.getValue())
.build();
Policy exportWorkspaceAppPolicy = Policy.builder()
.permission(WORKSPACE_EXPORT_APPLICATIONS.getValue())
.build();
Policy userManageWorkspacePolicy =
Policy.builder().permission(USER_MANAGE_WORKSPACES.getValue()).build();
Policy inviteUserWorkspacePolicy =
Policy.builder().permission(WORKSPACE_INVITE_USERS.getValue()).build();
Policy readWorkspacePolicy =
Policy.builder().permission(READ_WORKSPACES.getValue()).build();
Policy manageWorkspacePolicy =
Policy.builder().permission(MANAGE_WORKSPACES.getValue()).build();
Policy readApiUserPolicy =
Policy.builder().permission(READ_USERS.getValue()).build();
@ -136,38 +94,7 @@ public class SeedMongoData {
new HashSet<>(Arrays.asList(readDevUserPolicy, userManageWorkspacePolicy))
},
};
Object[][] workspaceData = {
{
"Spring Test Workspace",
"appsmith-spring-test.com",
"appsmith.com",
"spring-test-workspace",
Set.of(
manageWorkspaceAppPolicy,
manageWorkspacePolicy,
readWorkspacePolicy,
inviteUserWorkspacePolicy,
exportWorkspaceAppPolicy)
},
{
"Another Test Workspace",
"appsmith-another-test.com",
"appsmith.com",
"another-test-workspace",
Set.of(
manageWorkspaceAppPolicy,
manageWorkspacePolicy,
readWorkspacePolicy,
inviteUserWorkspacePolicy,
exportWorkspaceAppPolicy)
}
};
Object[][] appData = {
{"LayoutServiceTest TestApplications", Set.of(manageAppPolicy, readAppPolicy)},
{"TestApplications", Set.of(manageAppPolicy, readAppPolicy)},
{"Another TestApplications", Set.of(manageAppPolicy, readAppPolicy)}
};
Object[][] pluginData = {
{"Installed Plugin Name", PluginType.API, "installed-plugin", true},
{"Installed DB Plugin Name", PluginType.DB, "installed-db-plugin", true},
@ -188,8 +115,7 @@ public class SeedMongoData {
log.debug("Create plugin: {}", plugin);
return plugin;
})
.flatMap(pluginRepository::save)
.cache();
.flatMap(pluginRepository::save);
Tenant defaultTenant = new Tenant();
defaultTenant.setDisplayName("Default");
@ -203,13 +129,17 @@ public class SeedMongoData {
.cache();
Flux<User> userFlux = Flux.just(userData)
.flatMap(array -> {
.zipWith(defaultTenantId.repeat())
.flatMap(tuple -> {
Object[] array = tuple.getT1();
String tenantId = tuple.getT2();
log.debug("Going to create bare users");
User user = new User();
user.setName((String) array[0]);
user.setEmail((String) array[1]);
user.setState((UserState) array[2]);
user.setPolicies((Set<Policy>) array[3]);
user.setTenantId(tenantId);
return userRepository.save(user);
})
.flatMap(user -> {
@ -226,104 +156,10 @@ public class SeedMongoData {
return userRepository.save(updatedWithPolicies);
});
})
.collectList()
.zipWith(defaultTenantId)
.flatMapMany(tuple -> {
List<User> users = tuple.getT1();
String tenantId = tuple.getT2();
return Flux.fromIterable(users).map(user -> {
user.setTenantId(tenantId);
log.debug("Creating user: {}", user);
return user;
});
})
.flatMap(userRepository::save)
.cache();
});
// Seed the workspace data into the DB
Flux<Workspace> workspaceFlux = mongoTemplate
.find(
new Query().addCriteria(where("name").in(pluginData[0][0], pluginData[1][0], pluginData[2][0])),
Plugin.class)
.map(plugin -> new WorkspacePlugin(plugin.getId(), WorkspacePluginStatus.FREE))
.collect(Collectors.toSet())
.cache()
.repeat()
.zipWithIterable(List.of(workspaceData))
.map(tuple -> {
final Set<WorkspacePlugin> workspacePlugins = tuple.getT1();
final Object[] workspaceArray = tuple.getT2();
Workspace workspace = new Workspace();
workspace.setName((String) workspaceArray[0]);
workspace.setDomain((String) workspaceArray[1]);
workspace.setWebsite((String) workspaceArray[2]);
workspace.setSlug((String) workspaceArray[3]);
workspace.setPolicies((Set<Policy>) workspaceArray[4]);
workspace.setPlugins(workspacePlugins);
log.debug("In the workspaceFlux. Create Workspace: {}", workspace);
return workspace;
})
.flatMap(workspaceRepository::save);
Flux<Workspace> workspaceFlux1 = workspaceRepository
.deleteAll()
.thenMany(pluginFlux)
.thenMany(userFlux)
.thenMany(workspaceFlux);
Flux<User> addUserWorkspaceFlux = workspaceFlux1.flatMap(workspace -> userFlux.flatMap(user -> {
log.debug("**** In the addUserWorkspaceFlux");
log.debug("User: {}", user);
log.debug("Workspace: {}", workspace);
user.setCurrentWorkspaceId(workspace.getId());
Set<String> workspaceIds = user.getWorkspaceIds();
if (workspaceIds == null) {
workspaceIds = new HashSet<>();
}
workspaceIds.add(workspace.getId());
user.setWorkspaceIds(workspaceIds);
log.debug("AddUserWorkspace User: {}, Workspace: {}", user, workspace);
return userRepository.save(user).map(u -> {
log.debug("Saved the workspace to user. User: {}", u);
return u;
});
}));
Query workspaceNameQuery = new Query(where("slug").is(workspaceData[0][3]));
Mono<Workspace> workspaceByNameMono = mongoTemplate
.findOne(workspaceNameQuery, Workspace.class)
.switchIfEmpty(Mono.error(new Exception("Can't find workspace")));
Query appNameQuery = new Query(where("name").is(appData[0][0]));
Mono<Application> appByNameMono = mongoTemplate
.findOne(appNameQuery, Application.class)
.switchIfEmpty(Mono.error(new Exception("Can't find app")));
return args -> {
workspaceFlux1
.thenMany(addUserWorkspaceFlux)
// Query the seed data to get the workspaceId (required for application creation)
.then(workspaceByNameMono)
.map(workspace -> workspace.getId())
// Seed the user data into the DB
.flatMapMany(
workspaceId ->
// Seed the application data into the DB
Flux.just(appData)
.map(array -> {
Application app = new Application();
app.setName((String) array[0]);
app.setWorkspaceId(workspaceId);
app.setPolicies((Set<Policy>) array[1]);
return app;
})
.flatMap(applicationRepository::save)
// Query the seed data to get the applicationId (required for page creation)
)
.then(appByNameMono)
.block();
Mono.when(workspaceRepository.deleteAll(), pluginFlux, userFlux).block();
};
}
}