diff --git a/app/server/src/main/java/com/appsmith/server/configurations/ClientUserRepository.java b/app/server/src/main/java/com/appsmith/server/configurations/ClientUserRepository.java index 06910d2122..05e9649261 100644 --- a/app/server/src/main/java/com/appsmith/server/configurations/ClientUserRepository.java +++ b/app/server/src/main/java/com/appsmith/server/configurations/ClientUserRepository.java @@ -3,8 +3,8 @@ package com.appsmith.server.configurations; import com.appsmith.server.domains.LoginSource; import com.appsmith.server.domains.User; import com.appsmith.server.domains.UserState; -import com.appsmith.server.services.UserService; import com.appsmith.server.services.TenantService; +import com.appsmith.server.services.UserService; import org.springframework.context.annotation.Configuration; import org.springframework.security.core.Authentication; import org.springframework.security.oauth2.client.OAuth2AuthorizedClient; diff --git a/app/server/src/main/java/com/appsmith/server/configurations/SecurityConfig.java b/app/server/src/main/java/com/appsmith/server/configurations/SecurityConfig.java index 9d1253ee79..ab7c20d460 100644 --- a/app/server/src/main/java/com/appsmith/server/configurations/SecurityConfig.java +++ b/app/server/src/main/java/com/appsmith/server/configurations/SecurityConfig.java @@ -1,9 +1,9 @@ package com.appsmith.server.configurations; -import com.appsmith.server.services.UserService; import com.appsmith.server.constants.Security; import com.appsmith.server.services.TenantService; +import com.appsmith.server.services.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; diff --git a/app/server/src/main/java/com/appsmith/server/controllers/BaseController.java b/app/server/src/main/java/com/appsmith/server/controllers/BaseController.java index 5060aae58b..deccd3d0a5 100644 --- a/app/server/src/main/java/com/appsmith/server/controllers/BaseController.java +++ b/app/server/src/main/java/com/appsmith/server/controllers/BaseController.java @@ -2,12 +2,17 @@ package com.appsmith.server.controllers; import com.appsmith.server.domains.BaseDomain; import com.appsmith.server.dtos.ResponseDto; -import com.appsmith.server.services.CrudService; import com.appsmith.server.exceptions.AppsmithException; +import com.appsmith.server.services.CrudService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseStatus; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; diff --git a/app/server/src/main/java/com/appsmith/server/controllers/LayoutController.java b/app/server/src/main/java/com/appsmith/server/controllers/LayoutController.java index c291869fc3..8b893f6bd2 100644 --- a/app/server/src/main/java/com/appsmith/server/controllers/LayoutController.java +++ b/app/server/src/main/java/com/appsmith/server/controllers/LayoutController.java @@ -1,8 +1,8 @@ package com.appsmith.server.controllers; +import com.appsmith.server.constants.Url; import com.appsmith.server.domains.Layout; import com.appsmith.server.services.LayoutService; -import com.appsmith.server.constants.Url; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/app/server/src/main/java/com/appsmith/server/controllers/PluginController.java b/app/server/src/main/java/com/appsmith/server/controllers/PluginController.java index 91b5261308..ee4def6e30 100644 --- a/app/server/src/main/java/com/appsmith/server/controllers/PluginController.java +++ b/app/server/src/main/java/com/appsmith/server/controllers/PluginController.java @@ -1,14 +1,18 @@ package com.appsmith.server.controllers; +import com.appsmith.server.constants.Url; import com.appsmith.server.domains.Plugin; import com.appsmith.server.domains.Tenant; import com.appsmith.server.dtos.PluginTenantDTO; import com.appsmith.server.dtos.ResponseDto; import com.appsmith.server.services.PluginService; -import com.appsmith.server.constants.Url; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Mono; import javax.validation.Valid; diff --git a/app/server/src/main/java/com/appsmith/server/controllers/QueryController.java b/app/server/src/main/java/com/appsmith/server/controllers/QueryController.java index be65d64f7a..d661039bf8 100644 --- a/app/server/src/main/java/com/appsmith/server/controllers/QueryController.java +++ b/app/server/src/main/java/com/appsmith/server/controllers/QueryController.java @@ -1,11 +1,15 @@ package com.appsmith.server.controllers; +import com.appsmith.server.constants.Url; import com.appsmith.server.domains.Query; import com.appsmith.server.dtos.CommandQueryParams; import com.appsmith.server.services.QueryService; -import com.appsmith.server.constants.Url; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Flux; @RestController diff --git a/app/server/src/main/java/com/appsmith/server/controllers/ResourceController.java b/app/server/src/main/java/com/appsmith/server/controllers/ResourceController.java index 69a8fcf1e1..62e260af2e 100644 --- a/app/server/src/main/java/com/appsmith/server/controllers/ResourceController.java +++ b/app/server/src/main/java/com/appsmith/server/controllers/ResourceController.java @@ -1,8 +1,8 @@ package com.appsmith.server.controllers; -import com.appsmith.server.services.ResourceService; import com.appsmith.server.constants.Url; import com.appsmith.server.domains.Resource; +import com.appsmith.server.services.ResourceService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/app/server/src/main/java/com/appsmith/server/controllers/SettingController.java b/app/server/src/main/java/com/appsmith/server/controllers/SettingController.java index e81b4d1dd4..1313d9a1b7 100644 --- a/app/server/src/main/java/com/appsmith/server/controllers/SettingController.java +++ b/app/server/src/main/java/com/appsmith/server/controllers/SettingController.java @@ -1,8 +1,8 @@ package com.appsmith.server.controllers; +import com.appsmith.server.constants.Url; import com.appsmith.server.domains.Setting; import com.appsmith.server.services.SettingService; -import com.appsmith.server.constants.Url; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/app/server/src/main/java/com/appsmith/server/controllers/TenantController.java b/app/server/src/main/java/com/appsmith/server/controllers/TenantController.java index 05257a0887..1ebc8cbbab 100644 --- a/app/server/src/main/java/com/appsmith/server/controllers/TenantController.java +++ b/app/server/src/main/java/com/appsmith/server/controllers/TenantController.java @@ -1,7 +1,7 @@ package com.appsmith.server.controllers; -import com.appsmith.server.domains.Tenant; import com.appsmith.server.constants.Url; +import com.appsmith.server.domains.Tenant; import com.appsmith.server.services.TenantService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; diff --git a/app/server/src/main/java/com/appsmith/server/controllers/WidgetController.java b/app/server/src/main/java/com/appsmith/server/controllers/WidgetController.java index 6ed8c2b208..db08919535 100644 --- a/app/server/src/main/java/com/appsmith/server/controllers/WidgetController.java +++ b/app/server/src/main/java/com/appsmith/server/controllers/WidgetController.java @@ -1,9 +1,9 @@ package com.appsmith.server.controllers; +import com.appsmith.server.constants.Url; import com.appsmith.server.domains.Widget; import com.appsmith.server.dtos.ResponseDto; import com.appsmith.server.services.WidgetService; -import com.appsmith.server.constants.Url; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.GetMapping; diff --git a/app/server/src/main/java/com/appsmith/server/domains/Action.java b/app/server/src/main/java/com/appsmith/server/domains/Action.java index f1c89e0949..cfb7ffbeca 100644 --- a/app/server/src/main/java/com/appsmith/server/domains/Action.java +++ b/app/server/src/main/java/com/appsmith/server/domains/Action.java @@ -5,7 +5,6 @@ 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 @@ -17,8 +16,9 @@ public class Action extends BaseDomain { @Indexed(unique = true) String name; - @DBRef - Resource resource; + String resourceId; + + String pluginId; ActionConfiguration actionConfiguration; } diff --git a/app/server/src/main/java/com/appsmith/server/domains/BaseDomain.java b/app/server/src/main/java/com/appsmith/server/domains/BaseDomain.java index cbe5ee10dc..11d38bea08 100644 --- a/app/server/src/main/java/com/appsmith/server/domains/BaseDomain.java +++ b/app/server/src/main/java/com/appsmith/server/domains/BaseDomain.java @@ -3,7 +3,11 @@ package com.appsmith.server.domains; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import org.springframework.data.annotation.*; +import org.springframework.data.annotation.CreatedBy; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.Id; +import org.springframework.data.annotation.LastModifiedBy; +import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.domain.Persistable; import java.util.Date; diff --git a/app/server/src/main/java/com/appsmith/server/domains/Resource.java b/app/server/src/main/java/com/appsmith/server/domains/Resource.java index ef946cb7e9..bf9be7404a 100644 --- a/app/server/src/main/java/com/appsmith/server/domains/Resource.java +++ b/app/server/src/main/java/com/appsmith/server/domains/Resource.java @@ -5,7 +5,6 @@ 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 @@ -17,11 +16,9 @@ public class Resource extends BaseDomain { @Indexed(unique = true) String name; - @DBRef - Plugin plugin; + String pluginId; - @DBRef - Tenant tenant; + String tenantId; ResourceConfiguration resourceConfiguration; diff --git a/app/server/src/main/java/com/appsmith/server/domains/TenantPlugin.java b/app/server/src/main/java/com/appsmith/server/domains/TenantPlugin.java index b93e2d9b73..e30176ac96 100644 --- a/app/server/src/main/java/com/appsmith/server/domains/TenantPlugin.java +++ b/app/server/src/main/java/com/appsmith/server/domains/TenantPlugin.java @@ -5,7 +5,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; -import org.springframework.data.mongodb.core.mapping.DBRef; @Getter @Setter @@ -13,8 +12,7 @@ import org.springframework.data.mongodb.core.mapping.DBRef; @NoArgsConstructor public class TenantPlugin extends BaseDomain { - @DBRef - private Plugin plugin; + private String pluginId; TenantPluginStatus status; diff --git a/app/server/src/main/java/com/appsmith/server/domains/User.java b/app/server/src/main/java/com/appsmith/server/domains/User.java index d542b01c6b..ab087e4bc1 100644 --- a/app/server/src/main/java/com/appsmith/server/domains/User.java +++ b/app/server/src/main/java/com/appsmith/server/domains/User.java @@ -19,7 +19,7 @@ import java.util.stream.Collectors; @ToString @NoArgsConstructor @Document -public class User extends BaseDomain implements UserDetails { +public class User extends BaseDomain implements UserDetails { private String name; diff --git a/app/server/src/main/java/com/appsmith/server/dtos/AuthenticationDTO.java b/app/server/src/main/java/com/appsmith/server/dtos/AuthenticationDTO.java index 706c93786f..0e21a64ce0 100644 --- a/app/server/src/main/java/com/appsmith/server/dtos/AuthenticationDTO.java +++ b/app/server/src/main/java/com/appsmith/server/dtos/AuthenticationDTO.java @@ -1,6 +1,10 @@ package com.appsmith.server.dtos; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; @Getter @Setter diff --git a/app/server/src/main/java/com/appsmith/server/dtos/PluginTenantDTO.java b/app/server/src/main/java/com/appsmith/server/dtos/PluginTenantDTO.java index 1104c2840a..f5dd221fd8 100644 --- a/app/server/src/main/java/com/appsmith/server/dtos/PluginTenantDTO.java +++ b/app/server/src/main/java/com/appsmith/server/dtos/PluginTenantDTO.java @@ -6,6 +6,6 @@ import lombok.Setter; @Getter @Setter public class PluginTenantDTO { - String name; + String pluginId; TenantPluginStatus status; } diff --git a/app/server/src/main/java/com/appsmith/server/dtos/ResponseDto.java b/app/server/src/main/java/com/appsmith/server/dtos/ResponseDto.java index 6699234b32..a931983b60 100644 --- a/app/server/src/main/java/com/appsmith/server/dtos/ResponseDto.java +++ b/app/server/src/main/java/com/appsmith/server/dtos/ResponseDto.java @@ -1,6 +1,10 @@ package com.appsmith.server.dtos; -import lombok.*; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; import java.io.Serializable; diff --git a/app/server/src/main/java/com/appsmith/server/exceptions/AppsmithError.java b/app/server/src/main/java/com/appsmith/server/exceptions/AppsmithError.java index 0dab1465f1..1b09e9e727 100644 --- a/app/server/src/main/java/com/appsmith/server/exceptions/AppsmithError.java +++ b/app/server/src/main/java/com/appsmith/server/exceptions/AppsmithError.java @@ -9,6 +9,9 @@ public enum AppsmithError { NO_RESOURCE_FOUND(404, 1000, "Unable to find {0} with id {1}"), INVALID_PARAMETER(400, 4000, "Invalid parameter {0} provided in the input"), + PLUGIN_NOT_INSTALLED(400, 4001, "Plugin not installed for tenant {0}"), + PLUGIN_ID_NOT_GIVEN(400, 4002, "Missing plugin id. Please input correct plugin id"), + RESOURCE_ID_NOT_GIVEN(400, 4003, "Missing resource id. Please input correct resource id"), INTERNAL_SERVER_ERROR(500, 5000, "Internal server error while processing request"); private Integer httpErrorCode; diff --git a/app/server/src/main/java/com/appsmith/server/exceptions/GlobalExceptionHandler.java b/app/server/src/main/java/com/appsmith/server/exceptions/GlobalExceptionHandler.java index 113e1db21f..d2f29b184b 100644 --- a/app/server/src/main/java/com/appsmith/server/exceptions/GlobalExceptionHandler.java +++ b/app/server/src/main/java/com/appsmith/server/exceptions/GlobalExceptionHandler.java @@ -1,6 +1,7 @@ package com.appsmith.server.exceptions; import com.appsmith.server.dtos.ResponseDto; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -13,20 +14,23 @@ import reactor.core.publisher.Mono; * sending it to the client. */ @ControllerAdvice +@Slf4j public class GlobalExceptionHandler { /** * This function only catches the AppsmithException type and formats it into ResponseEntity object * Ideally, we should only be throwing AppsmithException from our code. This ensures that we can standardize * and set proper error messages and codes. - * @param e AppsmithException that will be caught by the function + * + * @param e AppsmithException that will be caught by the function * @param exchange ServerWebExchange contract in order to extract the response and set the http status code - * @return Mono> + * @return Mono> */ @ExceptionHandler @ResponseBody public Mono> catchAppsmithException(AppsmithException e, ServerWebExchange exchange) { exchange.getResponse().setStatusCode(HttpStatus.resolve(e.getHttpStatus())); + log.error("", e); return Mono.just(new ResponseDto<>(e.getHttpStatus(), new ErrorDTO(e.getAppErrorCode(), e.getMessage()), null, false)); } @@ -34,14 +38,15 @@ public class GlobalExceptionHandler { * This function catches the generic Exception class and is meant to be a catch all to ensure that we don't leak * any information to the client. Ideally, the function #catchAppsmithException should be used * - * @param e Exception that will be caught by the function + * @param e Exception that will be caught by the function * @param exchange ServerWebExchange contract in order to extract the response and set the http status code - * @return Mono> + * @return Mono> */ @ExceptionHandler @ResponseBody public Mono> catchException(Exception e, ServerWebExchange exchange) { exchange.getResponse().setStatusCode(HttpStatus.INTERNAL_SERVER_ERROR); + log.error("", e); return Mono.just(new ResponseDto<>(HttpStatus.INTERNAL_SERVER_ERROR.value(), new ErrorDTO(AppsmithError.INTERNAL_SERVER_ERROR.getHttpErrorCode(), AppsmithError.INTERNAL_SERVER_ERROR.getMessage()), null, false)); } diff --git a/app/server/src/main/java/com/appsmith/server/filters/MDCFilter.java b/app/server/src/main/java/com/appsmith/server/filters/MDCFilter.java index a233c8c602..4519b34450 100644 --- a/app/server/src/main/java/com/appsmith/server/filters/MDCFilter.java +++ b/app/server/src/main/java/com/appsmith/server/filters/MDCFilter.java @@ -59,7 +59,7 @@ public class MDCFilter implements WebFilter { private Mono addContextToHttpResponse(final ServerHttpResponse response) { return Mono.subscriberContext().doOnNext(ctx -> { - if(!ctx.hasKey(LogHelper.CONTEXT_MAP)) { + if (!ctx.hasKey(LogHelper.CONTEXT_MAP)) { return; } @@ -67,12 +67,12 @@ public class MDCFilter implements WebFilter { // Add all the request MDC keys to the response object ctx.>get(LogHelper.CONTEXT_MAP) .forEach((key, value) -> { - if(!key.contains(REQUEST_ID_LOG)) { + if (!key.contains(REQUEST_ID_LOG)) { httpHeaders.add(MDC_HEADER_PREFIX + key, value); } else { httpHeaders.add(REQUEST_ID_HEADER, value); } - }); + }); }).then(); } diff --git a/app/server/src/main/java/com/appsmith/server/plugins/PostgresDBPluginExecutor.java b/app/server/src/main/java/com/appsmith/server/plugins/PostgresDBPluginExecutor.java index 3e1499c3db..fc80629ba7 100644 --- a/app/server/src/main/java/com/appsmith/server/plugins/PostgresDBPluginExecutor.java +++ b/app/server/src/main/java/com/appsmith/server/plugins/PostgresDBPluginExecutor.java @@ -1,14 +1,19 @@ package com.appsmith.server.plugins; -import com.appsmith.server.services.PluginExecutor; import com.appsmith.server.domains.Query; import com.appsmith.server.dtos.CommandQueryParams; +import com.appsmith.server.services.PluginExecutor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import reactor.core.publisher.Flux; -import java.sql.*; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.sql.Statement; import java.util.ArrayList; import java.util.HashMap; diff --git a/app/server/src/main/java/com/appsmith/server/plugins/RestTemplatePluginExecutor.java b/app/server/src/main/java/com/appsmith/server/plugins/RestTemplatePluginExecutor.java index 62b6dbbf2f..74a10883fc 100644 --- a/app/server/src/main/java/com/appsmith/server/plugins/RestTemplatePluginExecutor.java +++ b/app/server/src/main/java/com/appsmith/server/plugins/RestTemplatePluginExecutor.java @@ -1,9 +1,9 @@ package com.appsmith.server.plugins; -import com.appsmith.server.services.PluginExecutor; import com.appsmith.server.domains.Property; import com.appsmith.server.domains.Query; import com.appsmith.server.dtos.CommandQueryParams; +import com.appsmith.server.services.PluginExecutor; import lombok.extern.slf4j.Slf4j; import net.minidev.json.JSONObject; import org.springframework.http.HttpHeaders; diff --git a/app/server/src/main/java/com/appsmith/server/repositories/PluginRepository.java b/app/server/src/main/java/com/appsmith/server/repositories/PluginRepository.java index 6fb8e3869f..a1e799fe77 100644 --- a/app/server/src/main/java/com/appsmith/server/repositories/PluginRepository.java +++ b/app/server/src/main/java/com/appsmith/server/repositories/PluginRepository.java @@ -7,4 +7,6 @@ import reactor.core.publisher.Mono; @Repository public interface PluginRepository extends BaseRepository { Mono findByName(String name); + + Mono findById(String id); } diff --git a/app/server/src/main/java/com/appsmith/server/repositories/ResourceRepository.java b/app/server/src/main/java/com/appsmith/server/repositories/ResourceRepository.java index 9dba3f38bd..0fe7cbd190 100644 --- a/app/server/src/main/java/com/appsmith/server/repositories/ResourceRepository.java +++ b/app/server/src/main/java/com/appsmith/server/repositories/ResourceRepository.java @@ -7,4 +7,6 @@ import reactor.core.publisher.Mono; @Repository public interface ResourceRepository extends BaseRepository { Mono findByName(String name); + + Mono findById(String id); } diff --git a/app/server/src/main/java/com/appsmith/server/repositories/TenantRepository.java b/app/server/src/main/java/com/appsmith/server/repositories/TenantRepository.java index 8bfb464cc6..8d399aac81 100644 --- a/app/server/src/main/java/com/appsmith/server/repositories/TenantRepository.java +++ b/app/server/src/main/java/com/appsmith/server/repositories/TenantRepository.java @@ -7,4 +7,6 @@ import reactor.core.publisher.Mono; @Repository public interface TenantRepository extends BaseRepository { Mono findByName(String name); + + Mono findByIdAndPluginsPluginId(String tenantId, String pluginId); } diff --git a/app/server/src/main/java/com/appsmith/server/repositories/UserRepository.java b/app/server/src/main/java/com/appsmith/server/repositories/UserRepository.java index 3f230f47ae..3a22d165a7 100644 --- a/app/server/src/main/java/com/appsmith/server/repositories/UserRepository.java +++ b/app/server/src/main/java/com/appsmith/server/repositories/UserRepository.java @@ -8,5 +8,6 @@ import reactor.core.publisher.Mono; public interface UserRepository extends BaseRepository { Mono findByName(String name); + Mono findByEmail(String email); } diff --git a/app/server/src/main/java/com/appsmith/server/services/ActionServiceImpl.java b/app/server/src/main/java/com/appsmith/server/services/ActionServiceImpl.java index ba9a9dc2d4..bca83c9989 100644 --- a/app/server/src/main/java/com/appsmith/server/services/ActionServiceImpl.java +++ b/app/server/src/main/java/com/appsmith/server/services/ActionServiceImpl.java @@ -1,7 +1,9 @@ package com.appsmith.server.services; import com.appsmith.server.domains.Action; +import com.appsmith.server.domains.Plugin; import com.appsmith.server.domains.Resource; +import com.appsmith.server.exceptions.AppsmithError; import com.appsmith.server.exceptions.AppsmithException; import com.appsmith.server.repositories.ActionRepository; import lombok.extern.slf4j.Slf4j; @@ -20,25 +22,32 @@ public class ActionServiceImpl extends BaseService create(@NotNull Action action) throws AppsmithException { if (action.getId() != null) { throw new AppsmithException("During create action, Id is not null. Can't create new action."); + } else if (action.getResourceId() == null) { + throw new AppsmithException(AppsmithError.RESOURCE_ID_NOT_GIVEN); } - Mono resourceMono = resourceService.findByName(action.getResource().getName()); + Mono resourceMono = resourceService.findById(action.getResourceId()); + Mono pluginMono = resourceMono.flatMap(resource -> pluginService.findById(resource.getPluginId())); - return resourceMono - .map(resource -> { - action.setResource(resource); + + return pluginMono + //Set plugin in the action before saving. + .map(plugin -> { + action.setPluginId(plugin.getId()); return action; }) .flatMap(repository::save); diff --git a/app/server/src/main/java/com/appsmith/server/services/BaseService.java b/app/server/src/main/java/com/appsmith/server/services/BaseService.java index 3ec6e0dcb9..412f2072f8 100644 --- a/app/server/src/main/java/com/appsmith/server/services/BaseService.java +++ b/app/server/src/main/java/com/appsmith/server/services/BaseService.java @@ -4,7 +4,6 @@ import com.appsmith.server.domains.BaseDomain; import com.appsmith.server.exceptions.AppsmithError; import com.appsmith.server.exceptions.AppsmithException; import com.appsmith.server.repositories.BaseRepository; - import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import org.springframework.data.mongodb.core.ReactiveMongoTemplate; diff --git a/app/server/src/main/java/com/appsmith/server/services/PluginExecutor.java b/app/server/src/main/java/com/appsmith/server/services/PluginExecutor.java index 2a0a67d87e..8bfb3ae059 100644 --- a/app/server/src/main/java/com/appsmith/server/services/PluginExecutor.java +++ b/app/server/src/main/java/com/appsmith/server/services/PluginExecutor.java @@ -1,11 +1,11 @@ package com.appsmith.server.services; -import com.github.mustachejava.DefaultMustacheFactory; -import com.github.mustachejava.Mustache; -import com.github.mustachejava.MustacheFactory; import com.appsmith.server.domains.Query; import com.appsmith.server.dtos.CommandQueryParams; import com.appsmith.server.dtos.Param; +import com.github.mustachejava.DefaultMustacheFactory; +import com.github.mustachejava.Mustache; +import com.github.mustachejava.MustacheFactory; import reactor.core.publisher.Flux; import java.io.StringReader; diff --git a/app/server/src/main/java/com/appsmith/server/services/PluginService.java b/app/server/src/main/java/com/appsmith/server/services/PluginService.java index 9153dbeb4e..fcf16fc17d 100644 --- a/app/server/src/main/java/com/appsmith/server/services/PluginService.java +++ b/app/server/src/main/java/com/appsmith/server/services/PluginService.java @@ -4,7 +4,6 @@ import com.appsmith.server.domains.Plugin; import com.appsmith.server.domains.PluginType; import com.appsmith.server.domains.Tenant; import com.appsmith.server.dtos.PluginTenantDTO; -import com.appsmith.server.exceptions.AppsmithException; import reactor.core.publisher.Mono; public interface PluginService extends CrudService { @@ -25,4 +24,6 @@ public interface PluginService extends CrudService { public Mono findByName(String name); + public Mono findById(String id); + } diff --git a/app/server/src/main/java/com/appsmith/server/services/PluginServiceImpl.java b/app/server/src/main/java/com/appsmith/server/services/PluginServiceImpl.java index 33248736a5..44073e9625 100644 --- a/app/server/src/main/java/com/appsmith/server/services/PluginServiceImpl.java +++ b/app/server/src/main/java/com/appsmith/server/services/PluginServiceImpl.java @@ -12,15 +12,11 @@ import com.appsmith.server.exceptions.AppsmithException; import com.appsmith.server.repositories.PluginRepository; import com.appsmith.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; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.context.ReactiveSecurityContextHolder; -import org.springframework.security.core.context.SecurityContext; import org.springframework.stereotype.Service; import reactor.core.publisher.Mono; import reactor.core.scheduler.Scheduler; @@ -80,14 +76,17 @@ public class PluginServiceImpl extends BaseService installPlugin(PluginTenantDTO pluginTenantDTO) { - return pluginRepository - .findByName(pluginTenantDTO.getName()) - .flatMap(plugin1 -> storeTenantPlugin(plugin1, pluginTenantDTO.getStatus())) + if (pluginTenantDTO.getPluginId() == null) { + return Mono.error(new AppsmithException(AppsmithError.PLUGIN_ID_NOT_GIVEN)); + } + + return Mono.just(pluginTenantDTO) + .flatMap(plugin -> storeTenantPlugin(plugin, pluginTenantDTO.getStatus())) .switchIfEmpty(Mono.empty()); } @Override - public Mono uninstallPlugin(PluginTenantDTO plugin) { + public Mono uninstallPlugin(PluginTenantDTO pluginDTO) { /*TODO * Tenant & user association is being mocked here by forcefully * only using a hardcoded tenant. This needs to be replaced by @@ -102,36 +101,28 @@ public class PluginServiceImpl extends BaseService tenantMono = tenantService.findById(tenantId); + if (pluginDTO.getPluginId() == null) { + return Mono.error(new AppsmithException(AppsmithError.PLUGIN_ID_NOT_GIVEN)); + } + + //Find the tenant using id and plugin id -> This is to find if the tenant has the plugin installed + Mono tenantMono = tenantService.findByIdAndPluginsPluginId(tenantId, pluginDTO.getPluginId()); return tenantMono + .switchIfEmpty(Mono.error(new AppsmithException(AppsmithError.PLUGIN_NOT_INSTALLED, tenantId))) + //In case the plugin is not found for the tenant, the tenantMono would not emit and the rest of the flow would stop + //i.e. the rest of the code flow would only happen when there is a plugin found for the tenant that can + //be uninstalled. .map(tenant -> { List tenantPluginList = tenant.getPlugins(); - if (tenantPluginList == null || tenantPluginList.isEmpty()) { - return tenant; - } - for (TenantPlugin listPlugin : tenantPluginList) { - if (listPlugin.getPlugin().getName().equals(plugin.getName())) { - log.debug("Plugin {} found. Uninstalling now from Tenant {}.", - plugin.getName(), tenant.getName()); - tenantPluginList.remove(listPlugin); - tenant.setPlugins(tenantPluginList); - return tenant; - } - } - log.debug("Plugin {} not found. Can't uninstall a plugin which is not installed", - plugin.getName()); + tenantPluginList.removeIf(listPlugin -> listPlugin.getPluginId().equals(pluginDTO.getPluginId())); + tenant.setPlugins(tenantPluginList); return tenant; }) - /* TODO - * Extra save is happening below in the edge case scenario of a plugin - * which needs to be removed from the installed list, didnt exist in this list - * to be begin with. Small optimization opportunity. - */ .flatMap(tenantService::save); } - private Mono storeTenantPlugin(Plugin plugin, TenantPluginStatus status) { + private Mono storeTenantPlugin(PluginTenantDTO pluginDTO, TenantPluginStatus status) { /*TODO * Tenant & user association is being mocked here by forcefully * only using a hardcoded tenant. This needs to be replaced by @@ -144,40 +135,37 @@ public class PluginServiceImpl extends BaseService tenantMono = tenantService.findById(tenantId); - Mono userObjectMono = ReactiveSecurityContextHolder.getContext() - .map(SecurityContext::getAuthentication) - .map(Authentication::getPrincipal); + //Find the tenant using id and plugin id -> This is to find if the tenant already has the plugin installed + Mono tenantMono = tenantService.findByIdAndPluginsPluginId(tenantId, pluginDTO.getPluginId()); - return Mono.zip(tenantMono, userObjectMono, (tenant, user) -> { - List tenantPluginList = tenant.getPlugins(); - if (tenantPluginList == null) { - tenantPluginList = new ArrayList(); - } - - for (TenantPlugin listPlugin : tenantPluginList) { - if (listPlugin.getPlugin().getName().equals(plugin.getName())) { - log.debug("Plugin {} is already installed for Tenant {}. Don't add again.", - plugin.getName(), tenant.getName()); - return tenant; - } - } - TenantPlugin tenantPlugin = new TenantPlugin(); - //Set an ID in the nested document so that installed plugins can be referred to uniquely using IDs - ObjectId objectId = new ObjectId(); - tenantPlugin.setId(objectId.toString()); - tenantPlugin.setPlugin(plugin); - tenantPlugin.setStatus(status); - tenantPluginList.add(tenantPlugin); - tenant.setPlugins(tenantPluginList); - return tenant; - }).flatMap(tenantService::save); + return tenantMono + .switchIfEmpty(Mono.defer(() -> { + //If the plugin is not found in the tenant, its not already installed. Install now. + return tenantService.findById(tenantId).map(tenant -> { + List tenantPluginList = tenant.getPlugins(); + if (tenantPluginList == null) { + tenantPluginList = new ArrayList(); + } + log.debug("Installing plugin {} for tenant {}", pluginDTO.getPluginId(), tenant.getName()); + TenantPlugin tenantPlugin = new TenantPlugin(); + tenantPlugin.setPluginId(pluginDTO.getPluginId()); + tenantPlugin.setStatus(status); + tenantPluginList.add(tenantPlugin); + tenant.setPlugins(tenantPluginList); + return tenant; + }).flatMap(tenantService::save); + })); } public Mono findByName(String name) { return repository.findByName(name); } + + @Override + public Mono findById(String id) { + return repository.findById(id); + } } diff --git a/app/server/src/main/java/com/appsmith/server/services/ResourceService.java b/app/server/src/main/java/com/appsmith/server/services/ResourceService.java index 227f0e3164..97709c88ab 100644 --- a/app/server/src/main/java/com/appsmith/server/services/ResourceService.java +++ b/app/server/src/main/java/com/appsmith/server/services/ResourceService.java @@ -4,5 +4,8 @@ import com.appsmith.server.domains.Resource; import reactor.core.publisher.Mono; public interface ResourceService extends CrudService { + Mono findByName(String name); + + Mono findById(String id); } diff --git a/app/server/src/main/java/com/appsmith/server/services/ResourceServiceImpl.java b/app/server/src/main/java/com/appsmith/server/services/ResourceServiceImpl.java index fa3dfec22b..f73c8e1392 100644 --- a/app/server/src/main/java/com/appsmith/server/services/ResourceServiceImpl.java +++ b/app/server/src/main/java/com/appsmith/server/services/ResourceServiceImpl.java @@ -1,9 +1,7 @@ package com.appsmith.server.services; -import com.appsmith.server.domains.Plugin; import com.appsmith.server.domains.Resource; import com.appsmith.server.domains.Tenant; -import com.appsmith.server.domains.TenantPlugin; import com.appsmith.server.exceptions.AppsmithError; import com.appsmith.server.exceptions.AppsmithException; import com.appsmith.server.repositories.ResourceRepository; @@ -17,8 +15,6 @@ 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 @@ -43,36 +39,22 @@ public class ResourceServiceImpl extends BaseService create(@NotNull Resource resource) throws AppsmithException { if (resource.getId() != null) { throw new AppsmithException(AppsmithError.INVALID_PARAMETER, "id"); + } else if (resource.getPluginId() == null) { + throw new AppsmithException(AppsmithError.PLUGIN_ID_NOT_GIVEN); } - 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; - }); + Mono tenantMono = tenantService.findByIdAndPluginsPluginId(tenantId, resource.getPluginId()); - 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(); - }) + //Add tenant id to the resource. + Mono updatedResourceMono = Mono.just(resource) + .map(updatedResource -> { + updatedResource.setTenantId(tenantId); + return updatedResource; + }); + + return tenantMono + .switchIfEmpty(Mono.error(new AppsmithException(AppsmithError.PLUGIN_NOT_INSTALLED, tenantId))) + .then(updatedResourceMono) .flatMap(repository::save); } @@ -80,4 +62,9 @@ public class ResourceServiceImpl extends BaseService findByName(String name) { return repository.findByName(name); } + + @Override + public Mono findById(String id) { + return repository.findById(id); + } } diff --git a/app/server/src/main/java/com/appsmith/server/services/TenantService.java b/app/server/src/main/java/com/appsmith/server/services/TenantService.java index be44a4da5b..6c8832e174 100644 --- a/app/server/src/main/java/com/appsmith/server/services/TenantService.java +++ b/app/server/src/main/java/com/appsmith/server/services/TenantService.java @@ -12,4 +12,6 @@ public interface TenantService extends CrudService { Mono findById(String id); Mono save(Tenant tenant); + + Mono findByIdAndPluginsPluginId(String tenantId, String pluginId); } diff --git a/app/server/src/main/java/com/appsmith/server/services/TenantServiceImpl.java b/app/server/src/main/java/com/appsmith/server/services/TenantServiceImpl.java index e27d6b40e3..db45d15d8b 100644 --- a/app/server/src/main/java/com/appsmith/server/services/TenantServiceImpl.java +++ b/app/server/src/main/java/com/appsmith/server/services/TenantServiceImpl.java @@ -91,5 +91,10 @@ public class TenantServiceImpl extends BaseService findByIdAndPluginsPluginId(String tenantId, String pluginId) { + return repository.findByIdAndPluginsPluginId(tenantId, pluginId); + } + } diff --git a/app/server/src/main/java/com/appsmith/server/services/UserService.java b/app/server/src/main/java/com/appsmith/server/services/UserService.java index 7560c79605..426a83ca9e 100644 --- a/app/server/src/main/java/com/appsmith/server/services/UserService.java +++ b/app/server/src/main/java/com/appsmith/server/services/UserService.java @@ -6,6 +6,8 @@ import reactor.core.publisher.Mono; public interface UserService extends CrudService { Mono findByUsername(String name); + Mono findByEmail(String email); + Mono save(User newUser); }