Merge branch 'trisha-dev' into 'master'
Added Tenant Settings See merge request theappsmith/internal-tools-server!1
This commit is contained in:
commit
00a588cbc5
|
|
@ -8,4 +8,5 @@ public interface Url {
|
|||
String LAYOUT_URL = BASE_URL + VERSION + "/layouts";
|
||||
String PLUGIN_URL = BASE_URL + VERSION + "/plugins";
|
||||
String QUERY_URL = BASE_URL + VERSION + "/queries";
|
||||
String SETTING_URL = BASE_URL + VERSION + "/settings";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ import org.springframework.web.bind.annotation.RestController;
|
|||
|
||||
@RestController
|
||||
@RequestMapping(Url.LAYOUT_URL)
|
||||
public class LayoutController extends BaseController<LayoutService, Layout, String> {
|
||||
public class LayoutController extends BaseController<LayoutService, Layout, String> {
|
||||
|
||||
@Autowired
|
||||
public LayoutController(LayoutService service) {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,18 @@
|
|||
package com.mobtools.server.controllers;
|
||||
|
||||
import com.mobtools.server.constants.Url;
|
||||
import com.mobtools.server.domains.Setting;
|
||||
import com.mobtools.server.services.SettingService;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
@RequestMapping(Url.SETTING_URL)
|
||||
public class SettingController extends BaseController<SettingService, Setting, String> {
|
||||
|
||||
@Autowired
|
||||
public SettingController(SettingService settingService) {
|
||||
super(settingService);
|
||||
}
|
||||
}
|
||||
|
|
@ -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.Document;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@ToString
|
||||
@NoArgsConstructor
|
||||
@Document
|
||||
public class Setting extends BaseDomain {
|
||||
|
||||
@Indexed(unique = true)
|
||||
private String key;
|
||||
|
||||
private String defaultValue;
|
||||
|
||||
private Boolean isTenantSetting;
|
||||
|
||||
}
|
||||
|
|
@ -6,6 +6,8 @@ import lombok.Setter;
|
|||
import lombok.ToString;
|
||||
import org.springframework.data.mongodb.core.mapping.Document;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
|
|
@ -20,4 +22,6 @@ public class Tenant extends BaseDomain {
|
|||
|
||||
private String website;
|
||||
|
||||
private List<TenantSetting> tenantSettings;
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,25 @@
|
|||
package com.mobtools.server.domains;
|
||||
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
import org.springframework.data.mongodb.core.mapping.DBRef;
|
||||
|
||||
|
||||
/*
|
||||
* Only used to store the settings that are different from the default values already set in setting collection
|
||||
*/
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@ToString
|
||||
@NoArgsConstructor
|
||||
public class TenantSetting extends BaseDomain {
|
||||
|
||||
@DBRef
|
||||
private Setting setting;
|
||||
|
||||
private String settingValue;
|
||||
|
||||
}
|
||||
|
|
@ -34,8 +34,8 @@ public class PostgresDBPluginExecutor extends PluginExecutor {
|
|||
|
||||
@Override
|
||||
public Flux<Object> execute(Query queryObj, CommandQueryParams params) {
|
||||
if(conn == null) {
|
||||
init();
|
||||
if (conn == null) {
|
||||
init();
|
||||
}
|
||||
ArrayList list = new ArrayList(50);
|
||||
try {
|
||||
|
|
@ -45,9 +45,9 @@ public class PostgresDBPluginExecutor extends PluginExecutor {
|
|||
ResultSet resultSet = statement.executeQuery(queryTemplate);
|
||||
ResultSetMetaData metaData = resultSet.getMetaData();
|
||||
Integer colCount = metaData.getColumnCount();
|
||||
while(resultSet.next()) {
|
||||
while (resultSet.next()) {
|
||||
HashMap row = new HashMap(colCount);
|
||||
for(int i = 1; i<=colCount; i++) {
|
||||
for (int i = 1; i <= colCount; i++) {
|
||||
row.put(metaData.getColumnName(i), resultSet.getObject(i));
|
||||
}
|
||||
list.add(row);
|
||||
|
|
|
|||
|
|
@ -31,8 +31,8 @@ public class RestTemplatePluginExecutor extends PluginExecutor {
|
|||
protected Flux<Object> execute(Query query, CommandQueryParams params) {
|
||||
String requestBody = query.getCommandTemplate();
|
||||
Map<String, Property> propertyMap = query.getProperties()
|
||||
.stream()
|
||||
.collect(Collectors.toMap(Property::getKey, prop -> prop));
|
||||
.stream()
|
||||
.collect(Collectors.toMap(Property::getKey, prop -> prop));
|
||||
|
||||
String url = propertyMap.get(PROP_URL).getValue();
|
||||
String httpMethod = propertyMap.get(PROP_HTTP_METHOD).getValue();
|
||||
|
|
@ -43,7 +43,7 @@ public class RestTemplatePluginExecutor extends PluginExecutor {
|
|||
.build();
|
||||
|
||||
WebClient.RequestHeadersSpec<?> request = webClient.method(HttpMethod.resolve(httpMethod))
|
||||
.body(BodyInserters.fromObject(requestBody));
|
||||
.body(BodyInserters.fromObject(requestBody));
|
||||
|
||||
Mono<ClientResponse> responseMono = request.exchange();
|
||||
ClientResponse clientResponse = responseMono.block();
|
||||
|
|
@ -51,14 +51,14 @@ public class RestTemplatePluginExecutor extends PluginExecutor {
|
|||
List<String> contentTypes = clientResponse.headers().header(HttpHeaders.CONTENT_TYPE);
|
||||
|
||||
Class clazz = String.class;
|
||||
if(contentTypes != null && contentTypes.size() > 0) {
|
||||
if (contentTypes != null && contentTypes.size() > 0) {
|
||||
String contentType = contentTypes.get(0);
|
||||
boolean isJson = MediaType.APPLICATION_JSON_UTF8_VALUE.toLowerCase()
|
||||
.equals(contentType.toLowerCase()
|
||||
.replaceAll("\\s", ""))
|
||||
|| MediaType.APPLICATION_JSON_VALUE.equals(contentType.toLowerCase());
|
||||
|
||||
if(isJson) {
|
||||
if (isJson) {
|
||||
clazz = JSONObject.class;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,5 +4,5 @@ import com.mobtools.server.domains.Layout;
|
|||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public interface LayoutRepository extends BaseRepository<Layout, String>{
|
||||
public interface LayoutRepository extends BaseRepository<Layout, String> {
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
package com.mobtools.server.repositories;
|
||||
|
||||
import com.mobtools.server.domains.Setting;
|
||||
import org.springframework.stereotype.Repository;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
@Repository
|
||||
public interface SettingRepository extends BaseRepository<Setting, String> {
|
||||
|
||||
Mono<Setting> findByKey(String key);
|
||||
}
|
||||
|
|
@ -65,8 +65,8 @@ public abstract class BaseService<R extends BaseRepository, T extends BaseDomain
|
|||
}
|
||||
|
||||
@Override
|
||||
public Mono<T> create(T widget) {
|
||||
return repository.save(widget);
|
||||
public Mono<T> create(T object) {
|
||||
return repository.save(object);
|
||||
}
|
||||
|
||||
private DBObject getDbObject(Object o) {
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ public abstract class PluginExecutor {
|
|||
* This function replaces the variables in the query commandTemplate with the actual params
|
||||
* Executors can override this function to provide their own implementation if they wish to do something custom
|
||||
*
|
||||
* @param query Query
|
||||
* @param query Query
|
||||
* @param params CommandQueryParams
|
||||
*/
|
||||
protected Query replaceTemplate(Query query, CommandQueryParams params) {
|
||||
|
|
@ -52,7 +52,7 @@ public abstract class PluginExecutor {
|
|||
|
||||
Map<String, String> queryMap = new HashMap<>();
|
||||
Map<String, String> headerMap = new HashMap<>();
|
||||
if(params.getQueryParams() != null) {
|
||||
if (params.getQueryParams() != null) {
|
||||
queryMap = params
|
||||
.getQueryParams()
|
||||
.stream()
|
||||
|
|
@ -61,7 +61,7 @@ public abstract class PluginExecutor {
|
|||
// Incase there's a conflict, we pick the older value
|
||||
(oldValue, newValue) -> oldValue));
|
||||
}
|
||||
if(params.getHeaderParams() != null) {
|
||||
if (params.getHeaderParams() != null) {
|
||||
headerMap = params
|
||||
.getHeaderParams()
|
||||
.stream()
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ public interface PluginService extends CrudService<Plugin, String> {
|
|||
/**
|
||||
* Return an instance of PluginExecutor based on the classname available.
|
||||
* If the classname is not available, null is returned.
|
||||
*
|
||||
* @param pluginType
|
||||
* @param className
|
||||
* @return PluginExecutor
|
||||
|
|
|
|||
|
|
@ -0,0 +1,9 @@
|
|||
package com.mobtools.server.services;
|
||||
|
||||
import com.mobtools.server.domains.Setting;
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
public interface SettingService extends CrudService<Setting, String> {
|
||||
|
||||
Mono<Setting> getByKey(String key);
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
package com.mobtools.server.services;
|
||||
|
||||
import com.mobtools.server.domains.Setting;
|
||||
import com.mobtools.server.repositories.SettingRepository;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
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;
|
||||
|
||||
@Service
|
||||
public class SettingServiceImpl extends BaseService<SettingRepository, Setting, String> implements SettingService {
|
||||
|
||||
private final SettingRepository repository;
|
||||
|
||||
@Autowired
|
||||
public SettingServiceImpl(Scheduler scheduler,
|
||||
MongoConverter mongoConverter,
|
||||
ReactiveMongoTemplate reactiveMongoTemplate,
|
||||
SettingRepository repository) {
|
||||
super(scheduler, mongoConverter, reactiveMongoTemplate, repository);
|
||||
this.repository = repository;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Setting> getByKey(String key) {
|
||||
return repository.findByKey(key);
|
||||
}
|
||||
}
|
||||
|
|
@ -6,4 +6,6 @@ import reactor.core.publisher.Mono;
|
|||
public interface TenantService extends CrudService<Tenant, String> {
|
||||
|
||||
Mono<Tenant> getByName(String name);
|
||||
|
||||
Mono<Tenant> create(Tenant object);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,30 +1,67 @@
|
|||
package com.mobtools.server.services;
|
||||
|
||||
import com.mobtools.server.domains.Setting;
|
||||
import com.mobtools.server.domains.Tenant;
|
||||
import com.mobtools.server.domains.TenantSetting;
|
||||
import com.mobtools.server.repositories.TenantRepository;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
|
||||
import org.springframework.data.mongodb.core.convert.MongoConverter;
|
||||
import org.springframework.stereotype.Service;
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
import reactor.core.scheduler.Scheduler;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@Slf4j
|
||||
@Service
|
||||
public class TenantServiceImpl extends BaseService<TenantRepository, Tenant, String> implements TenantService {
|
||||
|
||||
private final TenantRepository repository;
|
||||
private final SettingService settingService;
|
||||
|
||||
@Autowired
|
||||
public TenantServiceImpl(Scheduler scheduler,
|
||||
MongoConverter mongoConverter,
|
||||
ReactiveMongoTemplate reactiveMongoTemplate,
|
||||
TenantRepository repository) {
|
||||
TenantRepository repository,
|
||||
SettingService settingService) {
|
||||
super(scheduler, mongoConverter, reactiveMongoTemplate, repository);
|
||||
this.repository = repository;
|
||||
this.settingService = settingService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Tenant> getByName(String name) {
|
||||
return repository.findByName(name);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Tenant> create(@NotNull Tenant tenant) {
|
||||
|
||||
//Embed the setting object into tenantSetting. This is done only for settings for which the values deviate from the default.
|
||||
//It is assumed that the tenant create API body would only contain the settings for which the default value and
|
||||
//true value are different.
|
||||
if (tenant.getTenantSettings() != null) {
|
||||
|
||||
try (Stream<TenantSetting> stream = tenant.getTenantSettings().stream()) {
|
||||
Flux<TenantSetting> tenantSettingFlux = Flux.fromStream(stream);
|
||||
tenantSettingFlux.map(this::getAndStoreSettingObjectInTenantSetting).subscribe();
|
||||
}
|
||||
}
|
||||
|
||||
return repository.save(tenant);
|
||||
|
||||
}
|
||||
|
||||
private Object getAndStoreSettingObjectInTenantSetting(TenantSetting tenantSetting) {
|
||||
String key = tenantSetting.getSetting().getKey();
|
||||
Mono<Setting> setting = settingService.getByKey(key);
|
||||
return setting.doOnNext(set -> tenantSetting.setSetting(set))
|
||||
.thenReturn(tenantSetting)
|
||||
.subscribe();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user