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