From 43780a655043a790356b6c503a265f5bfa20c8bb Mon Sep 17 00:00:00 2001 From: Trisha Anand Date: Tue, 27 Aug 2019 09:37:38 +0000 Subject: [PATCH] Action configuration now contains all the configurations. The global and mustache configurations now exist under the same object. Data template object has been removed. This is inline with the design discussion. --- .../com/mobtools/server/constants/Url.java | 1 + .../controllers/ResourceController.java | 18 +++++ .../com/mobtools/server/domains/Action.java | 24 ++++++ .../server/domains/ActionConfiguration.java | 41 ++++++++++ .../com/mobtools/server/domains/Resource.java | 28 +++++++ .../server/domains/ResourceConfiguration.java | 25 ++++++ .../repositories/ResourceRepository.java | 8 ++ .../server/services/PluginService.java | 2 + .../server/services/PluginServiceImpl.java | 14 +++- .../server/services/ResourceService.java | 6 ++ .../server/services/ResourceServiceImpl.java | 77 +++++++++++++++++++ .../server/services/TenantService.java | 2 +- .../server/services/TenantServiceImpl.java | 2 + .../src/main/resources/application.properties | 2 + 14 files changed, 246 insertions(+), 4 deletions(-) create mode 100644 app/server/src/main/java/com/mobtools/server/controllers/ResourceController.java create mode 100644 app/server/src/main/java/com/mobtools/server/domains/Action.java create mode 100644 app/server/src/main/java/com/mobtools/server/domains/ActionConfiguration.java create mode 100644 app/server/src/main/java/com/mobtools/server/domains/Resource.java create mode 100644 app/server/src/main/java/com/mobtools/server/domains/ResourceConfiguration.java create mode 100644 app/server/src/main/java/com/mobtools/server/repositories/ResourceRepository.java create mode 100644 app/server/src/main/java/com/mobtools/server/services/ResourceService.java create mode 100644 app/server/src/main/java/com/mobtools/server/services/ResourceServiceImpl.java diff --git a/app/server/src/main/java/com/mobtools/server/constants/Url.java b/app/server/src/main/java/com/mobtools/server/constants/Url.java index 88c6af6116..c7b6486982 100644 --- a/app/server/src/main/java/com/mobtools/server/constants/Url.java +++ b/app/server/src/main/java/com/mobtools/server/constants/Url.java @@ -9,4 +9,5 @@ public interface Url { String PLUGIN_URL = BASE_URL + VERSION + "/plugins"; String QUERY_URL = BASE_URL + VERSION + "/queries"; String SETTING_URL = BASE_URL + VERSION + "/settings"; + String RESOURCE_URL = BASE_URL + VERSION + "/resources"; } diff --git a/app/server/src/main/java/com/mobtools/server/controllers/ResourceController.java b/app/server/src/main/java/com/mobtools/server/controllers/ResourceController.java new file mode 100644 index 0000000000..ea04fac1e5 --- /dev/null +++ b/app/server/src/main/java/com/mobtools/server/controllers/ResourceController.java @@ -0,0 +1,18 @@ +package com.mobtools.server.controllers; + +import com.mobtools.server.constants.Url; +import com.mobtools.server.domains.Resource; +import com.mobtools.server.services.ResourceService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping(Url.RESOURCE_URL) +public class ResourceController extends BaseController { + + @Autowired + public ResourceController(ResourceService service) { + super(service); + } +} diff --git a/app/server/src/main/java/com/mobtools/server/domains/Action.java b/app/server/src/main/java/com/mobtools/server/domains/Action.java new file mode 100644 index 0000000000..9994fcef6e --- /dev/null +++ b/app/server/src/main/java/com/mobtools/server/domains/Action.java @@ -0,0 +1,24 @@ +package com.mobtools.server.domains; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.springframework.data.mongodb.core.index.Indexed; +import org.springframework.data.mongodb.core.mapping.DBRef; +import org.springframework.data.mongodb.core.mapping.Document; + +@Getter +@Setter +@ToString +@NoArgsConstructor +@Document +public class Action extends BaseDomain { + @Indexed(unique = true) + String name; + + @DBRef + Resource resource; + + ActionConfiguration actionConfiguration; +} diff --git a/app/server/src/main/java/com/mobtools/server/domains/ActionConfiguration.java b/app/server/src/main/java/com/mobtools/server/domains/ActionConfiguration.java new file mode 100644 index 0000000000..d796a0d90e --- /dev/null +++ b/app/server/src/main/java/com/mobtools/server/domains/ActionConfiguration.java @@ -0,0 +1,41 @@ +package com.mobtools.server.domains; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.util.List; + +@Getter +@Setter +@ToString +@NoArgsConstructor +@Document +public class ActionConfiguration extends BaseDomain { + /* + * Any of the fields mentioned below could be represented in mustache + * template. If the mustache template is found, it would be replaced + * realtime every time the action needs to be executed. If no {{}} braces + * are found, that implies the configuration is global for this action. + * Global signifies that the configuration remains constant for each + * action execution. + */ + + // API fields + String resourceEndPoint; + List headers; + List queryParameters; + String body; + + // DB action fields + String query; + + /* + * Future plugins could require more fields that are not covered above. + * They will have to represented in a key-value format where the plugin + * understands what the keys stand for. + */ + List pluginSpecifiedTemplates; +} diff --git a/app/server/src/main/java/com/mobtools/server/domains/Resource.java b/app/server/src/main/java/com/mobtools/server/domains/Resource.java new file mode 100644 index 0000000000..52e2da7ba6 --- /dev/null +++ b/app/server/src/main/java/com/mobtools/server/domains/Resource.java @@ -0,0 +1,28 @@ +package com.mobtools.server.domains; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.springframework.data.mongodb.core.index.Indexed; +import org.springframework.data.mongodb.core.mapping.DBRef; +import org.springframework.data.mongodb.core.mapping.Document; + +@Getter +@Setter +@ToString +@NoArgsConstructor +@Document +public class Resource extends BaseDomain { + @Indexed(unique = true) + String name; + + @DBRef + Plugin plugin; + + @DBRef + Tenant tenant; + + ResourceConfiguration resourceConfiguration; + +} diff --git a/app/server/src/main/java/com/mobtools/server/domains/ResourceConfiguration.java b/app/server/src/main/java/com/mobtools/server/domains/ResourceConfiguration.java new file mode 100644 index 0000000000..35008d9a19 --- /dev/null +++ b/app/server/src/main/java/com/mobtools/server/domains/ResourceConfiguration.java @@ -0,0 +1,25 @@ +package com.mobtools.server.domains; + +import com.mobtools.server.dtos.AuthenticationDTO; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.util.List; + +@Getter +@Setter +@ToString +@NoArgsConstructor +@Document +public class ResourceConfiguration extends BaseDomain { + + String url; + + AuthenticationDTO authentication; + + List properties; + +} diff --git a/app/server/src/main/java/com/mobtools/server/repositories/ResourceRepository.java b/app/server/src/main/java/com/mobtools/server/repositories/ResourceRepository.java new file mode 100644 index 0000000000..9465e2438e --- /dev/null +++ b/app/server/src/main/java/com/mobtools/server/repositories/ResourceRepository.java @@ -0,0 +1,8 @@ +package com.mobtools.server.repositories; + +import com.mobtools.server.domains.Resource; +import org.springframework.stereotype.Repository; + +@Repository +public interface ResourceRepository extends BaseRepository{ +} diff --git a/app/server/src/main/java/com/mobtools/server/services/PluginService.java b/app/server/src/main/java/com/mobtools/server/services/PluginService.java index 14a4242b37..f1653090a4 100644 --- a/app/server/src/main/java/com/mobtools/server/services/PluginService.java +++ b/app/server/src/main/java/com/mobtools/server/services/PluginService.java @@ -25,4 +25,6 @@ public interface PluginService extends CrudService { public Mono uninstallPlugin(PluginTenantDTO plugin); + public Mono findByName(String name); + } diff --git a/app/server/src/main/java/com/mobtools/server/services/PluginServiceImpl.java b/app/server/src/main/java/com/mobtools/server/services/PluginServiceImpl.java index 830f149f55..2a99552cf1 100644 --- a/app/server/src/main/java/com/mobtools/server/services/PluginServiceImpl.java +++ b/app/server/src/main/java/com/mobtools/server/services/PluginServiceImpl.java @@ -13,6 +13,7 @@ import com.mobtools.server.repositories.UserRepository; import lombok.extern.slf4j.Slf4j; import org.bson.types.ObjectId; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; import org.springframework.data.mongodb.core.ReactiveMongoTemplate; import org.springframework.data.mongodb.core.convert.MongoConverter; @@ -36,6 +37,9 @@ public class PluginServiceImpl extends BaseService tenantMono = tenantService.findById("5d3e90a2dfec7c00047a81ea"); + Mono tenantMono = tenantService.findById(tenantId); return tenantMono .map(tenant -> { @@ -141,7 +145,7 @@ public class PluginServiceImpl extends BaseService tenantMono = tenantService.findById("5d3e90a2dfec7c00047a81ea"); + Mono tenantMono = tenantService.findById(tenantId); Mono userObjectMono = ReactiveSecurityContextHolder.getContext() .map(SecurityContext::getAuthentication) @@ -156,7 +160,7 @@ public class PluginServiceImpl extends BaseService findByName(String name) { + return repository.findByName(name); + } } diff --git a/app/server/src/main/java/com/mobtools/server/services/ResourceService.java b/app/server/src/main/java/com/mobtools/server/services/ResourceService.java new file mode 100644 index 0000000000..e15dd1a97b --- /dev/null +++ b/app/server/src/main/java/com/mobtools/server/services/ResourceService.java @@ -0,0 +1,6 @@ +package com.mobtools.server.services; + +import com.mobtools.server.domains.Resource; + +public interface ResourceService extends CrudService { +} diff --git a/app/server/src/main/java/com/mobtools/server/services/ResourceServiceImpl.java b/app/server/src/main/java/com/mobtools/server/services/ResourceServiceImpl.java new file mode 100644 index 0000000000..1c6ca9c111 --- /dev/null +++ b/app/server/src/main/java/com/mobtools/server/services/ResourceServiceImpl.java @@ -0,0 +1,77 @@ +package com.mobtools.server.services; + +import com.mobtools.server.domains.Plugin; +import com.mobtools.server.domains.Resource; +import com.mobtools.server.domains.Tenant; +import com.mobtools.server.domains.TenantPlugin; +import com.mobtools.server.exceptions.MobtoolsException; +import com.mobtools.server.repositories.ResourceRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.mongodb.core.ReactiveMongoTemplate; +import org.springframework.data.mongodb.core.convert.MongoConverter; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Mono; +import reactor.core.scheduler.Scheduler; + +import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + +@Slf4j +@Service +public class ResourceServiceImpl extends BaseService implements ResourceService { + + @Value("${tenant.id}") + private String tenantId; + + private final ResourceRepository repository; + private final TenantService tenantService; + private final PluginService pluginService; + + @Autowired + public ResourceServiceImpl(Scheduler scheduler, MongoConverter mongoConverter, ReactiveMongoTemplate reactiveMongoTemplate, ResourceRepository repository, TenantService tenantService, PluginService pluginService) { + super(scheduler, mongoConverter, reactiveMongoTemplate, repository); + this.repository = repository; + this.tenantService = tenantService; + this.pluginService = pluginService; + } + + @Override + public Mono create(@NotNull Resource resource) throws MobtoolsException { + if (resource.getId() != null) { + throw new MobtoolsException("During create resource, Id is not null. Can't create new resource."); + } + + Mono tenantMono = tenantService.findById(tenantId); + Mono pluginMono = pluginService.findByName(resource.getPlugin().getName()); + Mono updatedResourceMono = Mono.zip(tenantMono, pluginMono, (tenant, plugin) -> { + resource.setTenant(tenant); + resource.setPlugin(plugin); + return resource; + }); + + return updatedResourceMono + .filter(updatedResource -> { + AtomicReference temp = new AtomicReference<>(false); + tenantMono.map(tenant -> { + List tenantPlugins = tenant.getPlugins(); + if (tenantPlugins == null || tenantPlugins.isEmpty()) { + temp.set(false); + return temp; + } + for (TenantPlugin tenantPlugin : tenantPlugins) { + if (tenantPlugin.getPlugin().getName().equals(resource.getPlugin().getName())) { + temp.set(true); + return temp; + } + } + temp.set(false); + return temp; + }).block(); + return temp.get(); + }) + .flatMap(repository::save); + } +} diff --git a/app/server/src/main/java/com/mobtools/server/services/TenantService.java b/app/server/src/main/java/com/mobtools/server/services/TenantService.java index 9cabfe93e6..645bf80152 100644 --- a/app/server/src/main/java/com/mobtools/server/services/TenantService.java +++ b/app/server/src/main/java/com/mobtools/server/services/TenantService.java @@ -11,5 +11,5 @@ public interface TenantService extends CrudService { Mono findById(String id); - Mono save (Tenant tenant); + Mono save(Tenant tenant); } diff --git a/app/server/src/main/java/com/mobtools/server/services/TenantServiceImpl.java b/app/server/src/main/java/com/mobtools/server/services/TenantServiceImpl.java index ec43ff1598..5c2301072c 100644 --- a/app/server/src/main/java/com/mobtools/server/services/TenantServiceImpl.java +++ b/app/server/src/main/java/com/mobtools/server/services/TenantServiceImpl.java @@ -90,4 +90,6 @@ public class TenantServiceImpl extends BaseService save(Tenant tenant) { return repository.save(tenant); } + } + diff --git a/app/server/src/main/resources/application.properties b/app/server/src/main/resources/application.properties index d3250adf5a..b5eec7f76d 100644 --- a/app/server/src/main/resources/application.properties +++ b/app/server/src/main/resources/application.properties @@ -14,3 +14,5 @@ spring.jpa.show-sql=true # Jackson Properties spring.jackson.default-property-inclusion=non_null +#Hard coded tenant properties +tenant.id=5d5e7c29006cb4e82ea75075 \ No newline at end of file