diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/constants/AnalyticsEvents.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/constants/AnalyticsEvents.java new file mode 100644 index 0000000000..76819a59ff --- /dev/null +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/constants/AnalyticsEvents.java @@ -0,0 +1,6 @@ +package com.appsmith.server.constants; + +public interface AnalyticsEvents { + String CREATE = "create"; + String UPDATE = "update"; +} diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionServiceImpl.java index 1a86786123..a0dd46a7da 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionServiceImpl.java @@ -5,6 +5,7 @@ import com.appsmith.external.models.ActionExecutionResult; import com.appsmith.external.models.Param; import com.appsmith.external.models.ResourceConfiguration; import com.appsmith.external.plugins.PluginExecutor; +import com.appsmith.server.constants.AnalyticsEvents; import com.appsmith.server.domains.Action; import com.appsmith.server.domains.Page; import com.appsmith.server.domains.PageAction; @@ -61,10 +62,10 @@ public class ActionServiceImpl extends BaseService userMono = super.sessionUserService.getCurrentUser(); Mono resourceMono = resourceService.findById(action.getResourceId()); Mono pluginMono = resourceMono.flatMap(resource -> pluginService.findById(resource.getPluginId())); Mono pageMono = pageService.findById(action.getPageId()); @@ -94,34 +94,32 @@ public class ActionServiceImpl extends BaseService { - return pageMono - .map(page -> { - PageAction pageAction = new PageAction(); - pageAction.setId(action1.getId()); - pageAction.setName(action1.getName()); - pageAction.setJsonPathKeys(new ArrayList<>()); + .flatMap(action1 -> pageMono + .map(page -> { + PageAction pageAction = new PageAction(); + pageAction.setId(action1.getId()); + pageAction.setName(action1.getName()); + pageAction.setJsonPathKeys(new ArrayList<>()); - List actions = page.getActions(); + List actions = page.getActions(); - if (actions == null) { - actions = new ArrayList<>(); - } + if (actions == null) { + actions = new ArrayList<>(); + } - actions.add(pageAction); - page.setActions(actions); - return page; - }) - .flatMap(pageService::save) - .then(Mono.just(action1)) - //Now publish this event - .flatMap(this::segmentTrackCreate); - }); + actions.add(pageAction); + page.setActions(actions); + return page; + }) + .flatMap(pageService::save) + //Finally return the saved action + .then(Mono.just(action1)) + ); } @Override diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/AnalyticsService.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/AnalyticsService.java new file mode 100644 index 0000000000..b45d0f31e4 --- /dev/null +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/AnalyticsService.java @@ -0,0 +1,63 @@ +package com.appsmith.server.services; + +import com.appsmith.server.domains.BaseDomain; +import com.appsmith.server.domains.User; +import com.segment.analytics.Analytics; +import com.segment.analytics.messages.IdentifyMessage; +import com.segment.analytics.messages.TrackMessage; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Mono; + +import java.util.HashMap; +import java.util.Map; + +@Service +@Slf4j +public class AnalyticsService { + + private final Analytics analytics; + private final SessionUserService sessionUserService; + + @Autowired + public AnalyticsService(Analytics analytics, SessionUserService sessionUserService) { + this.analytics = analytics; + this.sessionUserService = sessionUserService; + } + + public Mono trackNewUser(User user) { + return Mono.just(user) + .map(savedUser -> { + Map traitsMap = new HashMap<>(); + traitsMap.put("name", savedUser.getName()); + traitsMap.put("email", savedUser.getEmail()); + analytics.enqueue(IdentifyMessage.builder() + .userId(savedUser.getId()) + .traits(traitsMap) + ); + analytics.flush(); + return savedUser; + }); + } + + public Mono sendEvent(String eventTag, T object) { + Mono userMono = sessionUserService.getCurrentUser(); + return userMono + .map(user -> { + HashMap analyticsProperties = new HashMap<>(); + analyticsProperties.put("id", ((BaseDomain) object).getId()); + analyticsProperties.put("object", object.toString()); + if(user.getOrganizationId() != null) { + analyticsProperties.put("organizationId", user.getOrganizationId()); + } + + analytics.enqueue( + TrackMessage.builder(eventTag) + .userId(user.getId()) + .properties(analyticsProperties) + ); + return (T) object; + }); + } +} diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ApplicationServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ApplicationServiceImpl.java index 513e8199f4..7ba833195c 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ApplicationServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ApplicationServiceImpl.java @@ -1,12 +1,12 @@ package com.appsmith.server.services; +import com.appsmith.server.constants.AnalyticsEvents; import com.appsmith.server.constants.FieldName; import com.appsmith.server.domains.Application; import com.appsmith.server.domains.User; import com.appsmith.server.exceptions.AppsmithError; import com.appsmith.server.exceptions.AppsmithException; import com.appsmith.server.repositories.ApplicationRepository; -import com.segment.analytics.Analytics; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.ReactiveMongoTemplate; @@ -23,12 +23,18 @@ import javax.validation.Validator; @Service public class ApplicationServiceImpl extends BaseService implements ApplicationService { - private final Analytics analytics; + private final SessionUserService sessionUserService; @Autowired - public ApplicationServiceImpl(Scheduler scheduler, Validator validator, MongoConverter mongoConverter, ReactiveMongoTemplate reactiveMongoTemplate, ApplicationRepository repository, SessionUserService sessionUserService, Analytics analytics) { - super(scheduler, validator, mongoConverter, reactiveMongoTemplate, repository, analytics, sessionUserService); - this.analytics = analytics; + public ApplicationServiceImpl(Scheduler scheduler, + Validator validator, + MongoConverter mongoConverter, + ReactiveMongoTemplate reactiveMongoTemplate, + ApplicationRepository repository, + AnalyticsService analyticsService, + SessionUserService sessionUserService) { + super(scheduler, validator, mongoConverter, reactiveMongoTemplate, repository, analyticsService); + this.sessionUserService = sessionUserService; } @Override @@ -37,7 +43,7 @@ public class ApplicationServiceImpl extends BaseService userMono = super.sessionUserService.getCurrentUser(); + Mono userMono = sessionUserService.getCurrentUser(); return userMono .map(user -> user.getOrganizationId()) @@ -45,14 +51,12 @@ public class ApplicationServiceImpl extends BaseService get() { - Mono userMono = super.sessionUserService.getCurrentUser(); + Mono userMono = sessionUserService.getCurrentUser(); return userMono .map(user -> user.getOrganizationId()) @@ -65,7 +69,7 @@ public class ApplicationServiceImpl extends BaseService userMono = super.sessionUserService.getCurrentUser(); + Mono userMono = sessionUserService.getCurrentUser(); return userMono .map(user -> user.getOrganizationId()) diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/BaseService.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/BaseService.java index 10b576c69f..1e704e8637 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/BaseService.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/BaseService.java @@ -1,5 +1,6 @@ package com.appsmith.server.services; +import com.appsmith.server.constants.AnalyticsEvents; import com.appsmith.server.constants.FieldName; import com.appsmith.server.domains.BaseDomain; import com.appsmith.server.domains.User; @@ -35,22 +36,19 @@ public abstract class BaseService updateObj.set(entry.getKey(), entry.getValue())); return mongoTemplate.updateFirst(query, updateObj, resource.getClass()) - .flatMap(obj -> repository.findById(id)); + .flatMap(obj -> repository.findById(id)) + .flatMap(updatedObj -> analyticsService.sendEvent(AnalyticsEvents.UPDATE+"_"+updatedObj.getClass().getSimpleName().toUpperCase(), (T) updatedObj)); } @Override @@ -88,11 +87,10 @@ public abstract class BaseService create(T object) { - Mono userMono = sessionUserService.getCurrentUser(); return Mono.just(object) .flatMap(this::validateObject) .flatMap(repository::save) - .flatMap(this::segmentTrackCreate); + .flatMap(savedObj -> analyticsService.sendEvent(AnalyticsEvents.CREATE+"_"+savedObj.getClass().getSimpleName().toUpperCase(), (T) savedObj)); } private DBObject getDbObject(Object o) { @@ -118,24 +116,4 @@ public abstract class BaseService segmentTrackCreate(Object savedObject) { - Mono userMono = sessionUserService.getCurrentUser(); - return userMono - .map(user -> { - HashMap analyticsProperties = new HashMap<>(); - analyticsProperties.put("id", ((BaseDomain) savedObject).getId()); - if(user.getOrganizationId() != null) { - analyticsProperties.put("organizationId", user.getOrganizationId()); - } - - analytics.enqueue( - TrackMessage.builder("MONGO_DB_CREATE_" + savedObject.getClass().getSimpleName().toUpperCase()) - .userId(user.getId()) - .properties(analyticsProperties) - ); - return (T) savedObject; - }) - .switchIfEmpty(Mono.just((T) savedObject)); - } } \ No newline at end of file diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/GroupServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/GroupServiceImpl.java index 7b46e0138b..30f79c3367 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/GroupServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/GroupServiceImpl.java @@ -24,9 +24,8 @@ public class GroupServiceImpl extends BaseService enhanceOrganizationSettingList(Organization organization) { diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/PageServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/PageServiceImpl.java index 4171fe84c6..85304a8d43 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/PageServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/PageServiceImpl.java @@ -7,7 +7,6 @@ import com.appsmith.server.domains.User; import com.appsmith.server.exceptions.AppsmithError; import com.appsmith.server.exceptions.AppsmithException; import com.appsmith.server.repositories.PageRepository; -import com.segment.analytics.Analytics; import lombok.extern.slf4j.Slf4j; import org.bson.types.ObjectId; import org.springframework.beans.factory.annotation.Autowired; @@ -26,12 +25,20 @@ import java.util.List; public class PageServiceImpl extends BaseService implements PageService { private final ApplicationService applicationService; + private final SessionUserService sessionUserService; @Autowired - public PageServiceImpl(Scheduler scheduler, Validator validator, MongoConverter mongoConverter, ReactiveMongoTemplate reactiveMongoTemplate, PageRepository repository, ApplicationService applicationService, - Analytics analytics, SessionUserService sessionUserService) { - super(scheduler, validator, mongoConverter, reactiveMongoTemplate, repository, analytics, sessionUserService); + public PageServiceImpl(Scheduler scheduler, + Validator validator, + MongoConverter mongoConverter, + ReactiveMongoTemplate reactiveMongoTemplate, + PageRepository repository, + ApplicationService applicationService, + AnalyticsService analyticsService, + SessionUserService sessionUserService) { + super(scheduler, validator, mongoConverter, reactiveMongoTemplate, repository, analyticsService); this.applicationService = applicationService; + this.sessionUserService = sessionUserService; } @Override @@ -44,8 +51,6 @@ public class PageServiceImpl extends BaseService i return Mono.error(new AppsmithException(AppsmithError.INVALID_PARAMETER, FieldName.APPLICATIONID)); } - Mono userMono = super.sessionUserService.getCurrentUser(); - List layoutList = page.getLayouts(); if (layoutList == null) { layoutList = new ArrayList<>(); @@ -54,9 +59,7 @@ public class PageServiceImpl extends BaseService i layoutList.add(createDefaultLayout()); page.setLayouts(layoutList); } - return repository - .save(page) - .flatMap(this::segmentTrackCreate); + return super.create(page); } @@ -77,7 +80,7 @@ public class PageServiceImpl extends BaseService i @Override public Mono doesPageIdBelongToCurrentUserOrganization(Page page) { - Mono userMono = super.sessionUserService.getCurrentUser(); + Mono userMono = sessionUserService.getCurrentUser(); final String[] username = {null}; return userMono diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/PermissionServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/PermissionServiceImpl.java index 329876506f..8c87e96638 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/PermissionServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/PermissionServiceImpl.java @@ -22,9 +22,8 @@ public class PermissionServiceImpl extends BaseService reactiveTemplate; private final ChannelTopic topic; private final ObjectMapper objectMapper; + private final SessionUserService sessionUserService; private static final int CONNECTION_TIMEOUT = 10000; private static final int READ_TIMEOUT = 10000; @@ -54,19 +54,22 @@ public class PluginServiceImpl extends BaseService reactiveTemplate, - ChannelTopic topic, ObjectMapper objectMapper) { - super(scheduler, validator, mongoConverter, reactiveMongoTemplate, repository, analytics, sessionUserService); + ChannelTopic topic, + ObjectMapper objectMapper, + SessionUserService sessionUserService) { + super(scheduler, validator, mongoConverter, reactiveMongoTemplate, repository, analyticsService); this.applicationContext = applicationContext; this.organizationService = organizationService; this.pluginManager = pluginManager; this.reactiveTemplate = reactiveTemplate; this.topic = topic; this.objectMapper = objectMapper; + this.sessionUserService = sessionUserService; } public OldPluginExecutor getPluginExecutor(PluginType pluginType, String className) { @@ -86,12 +89,8 @@ public class PluginServiceImpl extends BaseService userMono = super.sessionUserService.getCurrentUser(); - plugin.setDeleted(false); - return repository - .save(plugin) - .flatMap(this::segmentTrackCreate); + return super.create(plugin); } @Override @@ -112,7 +111,7 @@ public class PluginServiceImpl extends BaseService This is to find if the organization has the plugin installed - Mono userMono = super.sessionUserService.getCurrentUser(); + Mono userMono = sessionUserService.getCurrentUser(); Mono organizationMono = userMono.flatMap(user -> organizationService.findByIdAndPluginsPluginId(user.getOrganizationId(), pluginDTO.getPluginId())); @@ -133,7 +132,7 @@ public class PluginServiceImpl extends BaseService storeOrganizationPlugin(PluginOrgDTO pluginDTO, OrganizationPluginStatus status) { //Find the organization using id and plugin id -> This is to find if the organization already has the plugin installed - Mono userMono = super.sessionUserService.getCurrentUser(); + Mono userMono = sessionUserService.getCurrentUser(); Mono pluginInOrganizationMono = userMono.flatMap(user -> organizationService.findByIdAndPluginsPluginId(user.getOrganizationId(), pluginDTO.getPluginId())); diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/PropertyPaneServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/PropertyPaneServiceImpl.java index abc2f3901a..9f2076fcc0 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/PropertyPaneServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/PropertyPaneServiceImpl.java @@ -9,6 +9,7 @@ import com.appsmith.server.repositories.PropertyPaneRepository; import com.segment.analytics.Analytics; import lombok.extern.slf4j.Slf4j; import org.bson.types.ObjectId; +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; @@ -22,8 +23,15 @@ import java.util.Map; @Slf4j @Service public class PropertyPaneServiceImpl extends BaseService implements PropertyPaneService { - public PropertyPaneServiceImpl(Scheduler scheduler, Validator validator, MongoConverter mongoConverter, ReactiveMongoTemplate reactiveMongoTemplate, PropertyPaneRepository repository, Analytics analytics, SessionUserService sessionUserService) { - super(scheduler, validator, mongoConverter, reactiveMongoTemplate, repository, analytics, sessionUserService); + + @Autowired + public PropertyPaneServiceImpl(Scheduler scheduler, + Validator validator, + MongoConverter mongoConverter, + ReactiveMongoTemplate reactiveMongoTemplate, + PropertyPaneRepository repository, + AnalyticsService analyticsService) { + super(scheduler, validator, mongoConverter, reactiveMongoTemplate, repository, analyticsService); } @Override @@ -47,8 +55,6 @@ public class PropertyPaneServiceImpl extends BaseService userMono = super.sessionUserService.getCurrentUser(); + Mono userMono = sessionUserService.getCurrentUser(); Mono organizationMono = userMono.flatMap(user -> organizationService.findByIdAndPluginsPluginId(user.getOrganizationId(), resource.getPluginId())); @@ -55,8 +62,7 @@ public class ResourceServiceImpl extends BaseService i private UserRepository repository; private final OrganizationService organizationService; - private final Analytics analytics; - + private final AnalyticsService analyticsService; @Autowired public UserServiceImpl(Scheduler scheduler, Validator validator, @@ -37,12 +36,11 @@ public class UserServiceImpl extends BaseService i ReactiveMongoTemplate reactiveMongoTemplate, UserRepository repository, OrganizationService organizationService, - Analytics analytics, - SessionUserService sessionUserService) { - super(scheduler, validator, mongoConverter, reactiveMongoTemplate, repository, analytics, sessionUserService); + AnalyticsService analyticsService) { + super(scheduler, validator, mongoConverter, reactiveMongoTemplate, repository, analyticsService); this.repository = repository; this.organizationService = organizationService; - this.analytics = analytics; + this.analyticsService = analyticsService; } @Override @@ -58,19 +56,9 @@ public class UserServiceImpl extends BaseService i @Override public Mono create(User user) { - Mono savedUserMono = repository.save(user); + Mono savedUserMono = super.create(user); return savedUserMono - .map(savedUser -> { - Map traitsMap = new HashMap<>(); - traitsMap.put("name", savedUser.getName()); - traitsMap.put("email", savedUser.getEmail()); - analytics.enqueue(IdentifyMessage.builder() - .userId(savedUser.getId()) - .traits(traitsMap) - ); - analytics.flush(); - return savedUser; - }); + .flatMap(analyticsService::trackNewUser); } @Override diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/WidgetServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/WidgetServiceImpl.java index bb4065677c..eeee0d5028 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/WidgetServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/WidgetServiceImpl.java @@ -25,9 +25,8 @@ public class WidgetServiceImpl extends BaseService