diff --git a/app/server/server/pom.xml b/app/server/server/pom.xml index 04045af41f..3dcaa8d94c 100644 --- a/app/server/server/pom.xml +++ b/app/server/server/pom.xml @@ -23,10 +23,10 @@ org.springframework.boot spring-boot-starter-cache - - org.springframework.boot - spring-boot-starter-data-jpa - + + + + org.springframework.boot spring-boot-starter-security @@ -41,6 +41,10 @@ postgresql runtime + + org.springframework.boot + spring-boot-starter-data-mongodb-reactive + org.projectlombok lombok diff --git a/app/server/server/src/main/java/com/mobtools/server/configurations/CommonConfig.java b/app/server/server/src/main/java/com/mobtools/server/configurations/CommonConfig.java index bd9d22c57e..da1d16ef71 100644 --- a/app/server/server/src/main/java/com/mobtools/server/configurations/CommonConfig.java +++ b/app/server/server/src/main/java/com/mobtools/server/configurations/CommonConfig.java @@ -2,12 +2,12 @@ package com.mobtools.server.configurations; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.data.mongodb.config.EnableMongoAuditing; import reactor.core.scheduler.Scheduler; import reactor.core.scheduler.Schedulers; @Configuration -@EnableJpaAuditing +@EnableMongoAuditing public class CommonConfig { private String ELASTIC_THREAD_POOL_NAME = "mobtools-elastic-pool"; @@ -16,4 +16,5 @@ public class CommonConfig { public Scheduler scheduler() { return Schedulers.newElastic(ELASTIC_THREAD_POOL_NAME); } + } diff --git a/app/server/server/src/main/java/com/mobtools/server/configurations/MongoConfig.java b/app/server/server/src/main/java/com/mobtools/server/configurations/MongoConfig.java new file mode 100644 index 0000000000..e634c09136 --- /dev/null +++ b/app/server/server/src/main/java/com/mobtools/server/configurations/MongoConfig.java @@ -0,0 +1,27 @@ +package com.mobtools.server.configurations; + +import com.mongodb.reactivestreams.client.MongoClient; +import com.mongodb.reactivestreams.client.MongoClients; +import org.springframework.context.annotation.Bean; +import org.springframework.data.mongodb.config.AbstractReactiveMongoConfiguration; +import org.springframework.data.mongodb.core.ReactiveMongoTemplate; +import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories; + +@EnableReactiveMongoRepositories +public class MongoConfig extends AbstractReactiveMongoConfiguration { + + @Override + public MongoClient reactiveMongoClient() { + return MongoClients.create(); + } + + @Bean + public ReactiveMongoTemplate reactiveMongoTemplate() throws Exception { + return new ReactiveMongoTemplate(reactiveMongoClient(), "mobtools"); + } + + @Override + protected String getDatabaseName() { + return "mobtools"; + } +} diff --git a/app/server/server/src/main/java/com/mobtools/server/controllers/WidgetController.java b/app/server/server/src/main/java/com/mobtools/server/controllers/WidgetController.java index 717836e17d..5ff12f2910 100644 --- a/app/server/server/src/main/java/com/mobtools/server/controllers/WidgetController.java +++ b/app/server/server/src/main/java/com/mobtools/server/controllers/WidgetController.java @@ -38,9 +38,9 @@ public class WidgetController extends BaseController { .map(widget -> new ResponseDto<>(HttpStatus.OK.value(), widget, null)); } - @PutMapping("") - public Mono> update(@RequestBody Widget widget) throws Exception { - return widgetService.update(widget) + @PutMapping("/{id}") + public Mono> update(@PathVariable String id, @RequestBody Widget widget) throws Exception { + return widgetService.update(id, widget) .map(updatedWidget -> new ResponseDto<>(HttpStatus.OK.value(), updatedWidget, null)); } diff --git a/app/server/server/src/main/java/com/mobtools/server/domains/BaseDomain.java b/app/server/server/src/main/java/com/mobtools/server/domains/BaseDomain.java index 9539c62fbe..96c6b9ce9d 100644 --- a/app/server/server/src/main/java/com/mobtools/server/domains/BaseDomain.java +++ b/app/server/server/src/main/java/com/mobtools/server/domains/BaseDomain.java @@ -3,45 +3,41 @@ package com.mobtools.server.domains; import lombok.Getter; import lombok.Setter; import lombok.ToString; -import org.hibernate.annotations.DynamicUpdate; -import org.springframework.data.annotation.CreatedBy; -import org.springframework.data.annotation.CreatedDate; -import org.springframework.data.annotation.LastModifiedBy; -import org.springframework.data.annotation.LastModifiedDate; -import org.springframework.data.jpa.domain.support.AuditingEntityListener; +import org.springframework.data.annotation.*; +import org.springframework.data.domain.Persistable; -import javax.persistence.*; -import java.io.Serializable; import java.util.Date; -@EntityListeners(AuditingEntityListener.class) -@MappedSuperclass @Getter @Setter @ToString -@DynamicUpdate -public abstract class BaseDomain implements Serializable { +public abstract class BaseDomain implements Persistable { private static final long serialVersionUID = 7459916000501322517L; - @Temporal(TemporalType.TIMESTAMP) - @Column(nullable = false, updatable = false) + @Id + private String id; + @CreatedDate protected Date createdAt; - @Temporal(TemporalType.TIMESTAMP) - @Column(nullable = false) @LastModifiedDate protected Date updatedAt; - @Column @CreatedBy protected String createdBy; - @Column @LastModifiedBy protected String modifiedBy; - @Column(nullable = false) protected Boolean deleted = false; + +// @Version +// protected Long version; + + @Override + public boolean isNew() { + return this.getId() == null; + } + } diff --git a/app/server/server/src/main/java/com/mobtools/server/domains/Tenant.java b/app/server/server/src/main/java/com/mobtools/server/domains/Tenant.java index e40fc2e720..180b568ab0 100644 --- a/app/server/server/src/main/java/com/mobtools/server/domains/Tenant.java +++ b/app/server/server/src/main/java/com/mobtools/server/domains/Tenant.java @@ -4,20 +4,15 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +import org.springframework.data.mongodb.core.mapping.Document; -import javax.persistence.*; -@Entity @Getter @Setter @ToString @NoArgsConstructor -@SequenceGenerator(initialValue = 1, name = "tenant_gen", sequenceName = "tenant_gen") +@Document public class Tenant extends BaseDomain { - @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "tenant_gen") - @Column(nullable = false, updatable = false) - private Long id; private String domain; diff --git a/app/server/server/src/main/java/com/mobtools/server/domains/User.java b/app/server/server/src/main/java/com/mobtools/server/domains/User.java index 81103d4f6a..548c8f1c40 100644 --- a/app/server/server/src/main/java/com/mobtools/server/domains/User.java +++ b/app/server/server/src/main/java/com/mobtools/server/domains/User.java @@ -4,27 +4,17 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +import org.springframework.data.mongodb.core.mapping.Document; -import javax.persistence.*; -@Entity -// Specially adding the table name here because the keyword "User" is reserved in Postgres -@Table(name = "users") @Getter @Setter @ToString @NoArgsConstructor -@SequenceGenerator(initialValue = 1, name = "user_gen", sequenceName = "user_gen") +@Document public class User extends BaseDomain { - @Id - @Column(nullable = false) - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_gen") - private Long id; - - @Column private String name; - @Column private String email; } diff --git a/app/server/server/src/main/java/com/mobtools/server/domains/Widget.java b/app/server/server/src/main/java/com/mobtools/server/domains/Widget.java index b0cc9ef331..9e67c07732 100644 --- a/app/server/server/src/main/java/com/mobtools/server/domains/Widget.java +++ b/app/server/server/src/main/java/com/mobtools/server/domains/Widget.java @@ -4,30 +4,19 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; +import org.springframework.data.mongodb.core.mapping.Document; -import javax.persistence.*; -@Entity @Getter @Setter @ToString @NoArgsConstructor -@SequenceGenerator(initialValue = 1, name = "widget_gen", sequenceName = "widget_gen") +@Document public class Widget extends BaseDomain { - - @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "widget_gen") - @Column(nullable = false, updatable = false) - private Long id; - - @Column private String name; - @Column private WidgetType type; - @Column private PricingPlan pricingPlan; - } diff --git a/app/server/server/src/main/java/com/mobtools/server/repositories/BaseRepository.java b/app/server/server/src/main/java/com/mobtools/server/repositories/BaseRepository.java index 540f84838f..d427e5f80b 100644 --- a/app/server/server/src/main/java/com/mobtools/server/repositories/BaseRepository.java +++ b/app/server/server/src/main/java/com/mobtools/server/repositories/BaseRepository.java @@ -1,11 +1,11 @@ package com.mobtools.server.repositories; -import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.NoRepositoryBean; +import org.springframework.data.repository.reactive.ReactiveCrudRepository; import java.io.Serializable; @NoRepositoryBean -public interface BaseRepository extends JpaRepository { +public interface BaseRepository extends ReactiveCrudRepository { } diff --git a/app/server/server/src/main/java/com/mobtools/server/repositories/WidgetRepository.java b/app/server/server/src/main/java/com/mobtools/server/repositories/WidgetRepository.java index 319ca38962..9a60d022aa 100644 --- a/app/server/server/src/main/java/com/mobtools/server/repositories/WidgetRepository.java +++ b/app/server/server/src/main/java/com/mobtools/server/repositories/WidgetRepository.java @@ -2,9 +2,10 @@ package com.mobtools.server.repositories; import com.mobtools.server.domains.Widget; import org.springframework.stereotype.Repository; +import reactor.core.publisher.Mono; @Repository public interface WidgetRepository extends BaseRepository { - Widget findByName(String name); + Mono findByName(String name); } diff --git a/app/server/server/src/main/java/com/mobtools/server/services/WidgetService.java b/app/server/server/src/main/java/com/mobtools/server/services/WidgetService.java index 9f0751778b..484c73dd61 100644 --- a/app/server/server/src/main/java/com/mobtools/server/services/WidgetService.java +++ b/app/server/server/src/main/java/com/mobtools/server/services/WidgetService.java @@ -12,5 +12,5 @@ public interface WidgetService { Mono create(Widget widget); - Mono update(Widget widget) throws Exception; + Mono update(String id, Widget widget) throws Exception; } diff --git a/app/server/server/src/main/java/com/mobtools/server/services/WidgetServiceImpl.java b/app/server/server/src/main/java/com/mobtools/server/services/WidgetServiceImpl.java index 0e1edae772..a9d1ecd40b 100644 --- a/app/server/server/src/main/java/com/mobtools/server/services/WidgetServiceImpl.java +++ b/app/server/server/src/main/java/com/mobtools/server/services/WidgetServiceImpl.java @@ -2,8 +2,15 @@ package com.mobtools.server.services; import com.mobtools.server.domains.Widget; import com.mobtools.server.repositories.WidgetRepository; +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; 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.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Service; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -15,40 +22,61 @@ public class WidgetServiceImpl extends BaseService implements WidgetService { private WidgetRepository widgetRepository; + private final MongoConverter mongoConverter; + + private final ReactiveMongoTemplate mongoTemplate; + @Autowired - public WidgetServiceImpl(Scheduler scheduler, WidgetRepository widgetRepository) { + public WidgetServiceImpl(Scheduler scheduler, WidgetRepository widgetRepository, MongoConverter mongoConverter, ReactiveMongoTemplate mongoTemplate) { super(scheduler); this.widgetRepository = widgetRepository; + this.mongoConverter = mongoConverter; + this.mongoTemplate = mongoTemplate; } @Override public Mono getByName(String name) { - return Mono.fromCallable(() -> widgetRepository.findByName(name)) - .subscribeOn(scheduler); + return widgetRepository.findByName(name); + } @Override public Flux get() { - return Mono.fromCallable(() -> widgetRepository.findAll()) - .flatMapMany(Flux::fromIterable) - .subscribeOn(scheduler); + return widgetRepository.findAll(); } @Override public Mono create(Widget widget) { - return Mono.fromCallable( - () -> widgetRepository.save(widget) - ).subscribeOn(this.scheduler); + + return widgetRepository.save(widget); + } @Override - public Mono update(Widget widget) throws Exception { - if(widget.getId() == null) { + public Mono update(String id, Widget widget) throws Exception { + if (id == null) { throw new Exception("Invalid id provided"); } - return Mono.fromCallable( - () -> widgetRepository.save(widget) - ).subscribeOn(this.scheduler); + Query query = new Query(); + query.addCriteria(Criteria.where("id").is(id)); + + Update updateObj = new Update(); + +// DBObject update = getDbObject(widget); +// Map updateMap = update.toMap(); +// updateMap.entrySet().stream().forEach(entry -> { +// updateObj.set(entry.getKey(), entry.getValue()); +// }); + updateObj.set("name", "testName"); + mongoTemplate.updateFirst(query,updateObj, Widget.class); + return widgetRepository.save(widget); + + } + + private DBObject getDbObject(Object o) { + BasicDBObject basicDBObject = new BasicDBObject(); + mongoConverter.write(o, basicDBObject); + return basicDBObject; } } diff --git a/app/server/server/src/main/resources/application.properties b/app/server/server/src/main/resources/application.properties index d3250adf5a..b50ca792ec 100644 --- a/app/server/server/src/main/resources/application.properties +++ b/app/server/server/src/main/resources/application.properties @@ -14,3 +14,10 @@ spring.jpa.show-sql=true # Jackson Properties spring.jackson.default-property-inclusion=non_null +#Mongo properties +spring.data.mongodb.database=mobtools +spring.data.mongodb.host=localhost +spring.data.mongodb.port=27017 +#spring.data.mongodb.username= +#spring.data.mongodb.password= +