From e8e82cdf7415bf7be4027d27fb27d68cb5dbecfe Mon Sep 17 00:00:00 2001 From: chandresh pancholi Date: Tue, 5 Oct 2021 00:43:11 +0530 Subject: [PATCH] litmus core/db/mock packages Signed-off-by: chandresh pancholi --- .gitignore | 16 +++- litmus-cache/pom.xml | 23 ++++++ .../com/navi/medici/cache/RedisCache.java | 32 ++++++++ .../navi/medici/command/CacheCommands.java | 11 +++ .../medici/config/RedisConfiguration.java | 23 ++++++ .../navi/medici/container/RedisContainer.java | 34 +++++++++ .../test/java/com/navi/medici/AppTest.java | 20 +++++ litmus-client/pom.xml | 24 +++--- .../medici/client/HttpExperimentFetcher.java | 2 +- .../LitmusExperimentRepository.java | 2 +- .../strategy/FlexibleRolloutStrategy.java | 7 +- .../java/com/navi/medici/util/LitmusURLs.java | 2 +- litmus-core/pom.xml | 39 +++++++++- .../src/main/java/com/navi/medici/App.java | 11 --- .../main/java/com/navi/medici/LitmusApp.java | 12 +++ .../navi/medici/container/S3Container.java | 17 +++++ .../controller/v1/ExperimentController.java | 30 ++++++++ .../controller/v1/SegmentController.java | 23 ++++++ .../src/main/resources/application.properties | 18 +++++ .../src/main/resources/log4j2.properties | 11 +++ litmus-db/pom.xml | 36 +++++++++ .../src/main/java/com/navi/medici/App.java | 13 ++++ .../navi/medici/entity/ExperimentEntity.java | 75 +++++++++++++++++++ .../com/navi/medici/entity/SegmentEntity.java | 57 ++++++++++++++ .../test/java/com/navi/medici/AppTest.java | 20 +++++ litmus-liquibase/pom.xml | 25 +++++++ .../src/main/java/com/navi/medici/App.java | 13 ++++ .../test/java/com/navi/medici/AppTest.java | 20 +++++ litmus-mock/pom.xml | 53 +++++++++++++ .../src/main/java/com/navi/medici/App.java | 13 ++++ .../java/com/navi/medici/LitmusMockApp.java | 12 +++ .../navi/medici/container/MockContainer.java | 25 +++++++ .../medici/controller/MockController.java | 24 ++++++ .../src/main/resources/application.properties | 1 + .../test/java/com/navi/medici/AppTest.java | 20 +++++ .../src/main/java/com/navi/medici/App.java | 11 --- .../medici/request/v1/ExperimentRequest.java | 48 ++++++++++++ .../medici/request/v1/SegmentRequest.java | 26 +++++++ local.env | 3 + pom.xml | 38 +++++++--- 40 files changed, 842 insertions(+), 48 deletions(-) create mode 100644 litmus-cache/pom.xml create mode 100644 litmus-cache/src/main/java/com/navi/medici/cache/RedisCache.java create mode 100644 litmus-cache/src/main/java/com/navi/medici/command/CacheCommands.java create mode 100644 litmus-cache/src/main/java/com/navi/medici/config/RedisConfiguration.java create mode 100644 litmus-cache/src/main/java/com/navi/medici/container/RedisContainer.java create mode 100644 litmus-cache/src/test/java/com/navi/medici/AppTest.java delete mode 100644 litmus-core/src/main/java/com/navi/medici/App.java create mode 100644 litmus-core/src/main/java/com/navi/medici/LitmusApp.java create mode 100644 litmus-core/src/main/java/com/navi/medici/container/S3Container.java create mode 100644 litmus-core/src/main/java/com/navi/medici/controller/v1/ExperimentController.java create mode 100644 litmus-core/src/main/java/com/navi/medici/controller/v1/SegmentController.java create mode 100644 litmus-core/src/main/resources/application.properties create mode 100644 litmus-core/src/main/resources/log4j2.properties create mode 100644 litmus-db/pom.xml create mode 100644 litmus-db/src/main/java/com/navi/medici/App.java create mode 100644 litmus-db/src/main/java/com/navi/medici/entity/ExperimentEntity.java create mode 100644 litmus-db/src/main/java/com/navi/medici/entity/SegmentEntity.java create mode 100644 litmus-db/src/test/java/com/navi/medici/AppTest.java create mode 100644 litmus-liquibase/pom.xml create mode 100644 litmus-liquibase/src/main/java/com/navi/medici/App.java create mode 100644 litmus-liquibase/src/test/java/com/navi/medici/AppTest.java create mode 100644 litmus-mock/pom.xml create mode 100644 litmus-mock/src/main/java/com/navi/medici/App.java create mode 100644 litmus-mock/src/main/java/com/navi/medici/LitmusMockApp.java create mode 100644 litmus-mock/src/main/java/com/navi/medici/container/MockContainer.java create mode 100644 litmus-mock/src/main/java/com/navi/medici/controller/MockController.java create mode 100644 litmus-mock/src/main/resources/application.properties create mode 100644 litmus-mock/src/test/java/com/navi/medici/AppTest.java delete mode 100644 litmus-model/src/main/java/com/navi/medici/App.java create mode 100644 litmus-model/src/main/java/com/navi/medici/request/v1/ExperimentRequest.java create mode 100644 litmus-model/src/main/java/com/navi/medici/request/v1/SegmentRequest.java create mode 100644 local.env diff --git a/.gitignore b/.gitignore index e1118e5..cf13ec3 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,18 @@ litmus-model/litmus-model.iml litmus-model/target litmus-client/litmus-client.iml -litmus-client/target \ No newline at end of file +litmus-client/target + +litmus-db/litmus-db.iml +litmus-db/target + +litmus-mock/litmus-mock.iml +litmus-mock/target + +litmus-liquibase/litmus-liquibase.iml +litmus-liquibase/target + +litmus-cache/litmus-cache.iml +litmus-cache/target + +target \ No newline at end of file diff --git a/litmus-cache/pom.xml b/litmus-cache/pom.xml new file mode 100644 index 0000000..a8bf506 --- /dev/null +++ b/litmus-cache/pom.xml @@ -0,0 +1,23 @@ + + + 4.0.0 + + litmus + com.navi.medici + 1.0-SNAPSHOT + + + litmus-cache + 1.0-SNAPSHOT + + litmus-cache + + + + org.redisson + redisson + 3.16.3 + + + + diff --git a/litmus-cache/src/main/java/com/navi/medici/cache/RedisCache.java b/litmus-cache/src/main/java/com/navi/medici/cache/RedisCache.java new file mode 100644 index 0000000..f72c8f9 --- /dev/null +++ b/litmus-cache/src/main/java/com/navi/medici/cache/RedisCache.java @@ -0,0 +1,32 @@ +package com.navi.medici.cache; + +import com.navi.medici.command.CacheCommands; +import com.navi.medici.config.RedisConfiguration; +import lombok.RequiredArgsConstructor; +import org.redisson.api.RBloomFilter; +import org.redisson.api.RedissonClient; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class RedisCache implements CacheCommands { + + private final RedissonClient redissonClient; + private final RedisConfiguration redisConfiguration; + + @Override + public Boolean reserveBF(String name) { + RBloomFilter bloomFilter = redissonClient.getBloomFilter(name); + return bloomFilter.tryInit(redisConfiguration.getExpectedInsertions(), redisConfiguration.getFalseProbability()); + } + + @Override + public Boolean add(RBloomFilter bf, String key) { + return bf.add(key); + } + + @Override + public Boolean contains(RBloomFilter bf, String key) { + return bf.contains(key); + } +} diff --git a/litmus-cache/src/main/java/com/navi/medici/command/CacheCommands.java b/litmus-cache/src/main/java/com/navi/medici/command/CacheCommands.java new file mode 100644 index 0000000..31e3375 --- /dev/null +++ b/litmus-cache/src/main/java/com/navi/medici/command/CacheCommands.java @@ -0,0 +1,11 @@ +package com.navi.medici.command; + +import org.redisson.api.RBloomFilter; + +public interface CacheCommands { + Boolean reserveBF(String name); + + Boolean add(RBloomFilter bf, String key); + + Boolean contains(RBloomFilter bf, String key); +} diff --git a/litmus-cache/src/main/java/com/navi/medici/config/RedisConfiguration.java b/litmus-cache/src/main/java/com/navi/medici/config/RedisConfiguration.java new file mode 100644 index 0000000..7ad1d60 --- /dev/null +++ b/litmus-cache/src/main/java/com/navi/medici/config/RedisConfiguration.java @@ -0,0 +1,23 @@ +package com.navi.medici.config; + +import lombok.Data; +import org.redisson.config.Config; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@Data +public class RedisConfiguration { + @Value("${redis.host}") + String redisHost; + + @Value("${redis.port}") + Integer redisPort; + + @Value("${redis.expected.insertions}") + Long expectedInsertions; + + @Value("${redis.false.probability}") + Double falseProbability; +} diff --git a/litmus-cache/src/main/java/com/navi/medici/container/RedisContainer.java b/litmus-cache/src/main/java/com/navi/medici/container/RedisContainer.java new file mode 100644 index 0000000..45075a0 --- /dev/null +++ b/litmus-cache/src/main/java/com/navi/medici/container/RedisContainer.java @@ -0,0 +1,34 @@ +package com.navi.medici.container; + +import com.navi.medici.config.RedisConfiguration; +import lombok.RequiredArgsConstructor; +import org.redisson.Redisson; +import org.redisson.api.RBloomFilter; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class RedisContainer { + private final RedisConfiguration redisConfiguration; + + @Bean + public RedissonClient redissonClient(Config config) { + Config c = new Config(); + c.useSingleServer() + .setAddress(String.format("redis://%s:%s", redisConfiguration.getRedisHost(), redisConfiguration.getRedisPort())); + + return Redisson.create(config); + } + + + @Bean + public RBloomFilter bloomFilter(RedissonClient client) { + RBloomFilter bloomFilter = client.getBloomFilter("sample"); + bloomFilter.tryInit(55000000L, 0.03); + + return bloomFilter; + } +} diff --git a/litmus-cache/src/test/java/com/navi/medici/AppTest.java b/litmus-cache/src/test/java/com/navi/medici/AppTest.java new file mode 100644 index 0000000..35dc3e5 --- /dev/null +++ b/litmus-cache/src/test/java/com/navi/medici/AppTest.java @@ -0,0 +1,20 @@ +package com.navi.medici; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/litmus-client/pom.xml b/litmus-client/pom.xml index 54096ea..a5acb23 100644 --- a/litmus-client/pom.xml +++ b/litmus-client/pom.xml @@ -40,11 +40,11 @@ - - com.navi.medici.utils - event-bus-client - 0.1.3-SNAPSHOT - + + + + + com.navi.medici @@ -65,11 +65,17 @@ - junit - junit - 4.11 - test + org.apache.logging.log4j + log4j-core + 2.14.1 + + + com.google.code.gson + gson + 2.8.8 + + diff --git a/litmus-client/src/main/java/com/navi/medici/client/HttpExperimentFetcher.java b/litmus-client/src/main/java/com/navi/medici/client/HttpExperimentFetcher.java index 1400e63..ba302bf 100644 --- a/litmus-client/src/main/java/com/navi/medici/client/HttpExperimentFetcher.java +++ b/litmus-client/src/main/java/com/navi/medici/client/HttpExperimentFetcher.java @@ -31,7 +31,7 @@ public class HttpExperimentFetcher implements ExperimentFetcher { .build(); try (Response response = client.newCall(request).execute()) { - if (response.code() > 300) { + if (response.code() < 300) { var responseBody = response.body(); assert responseBody != null; diff --git a/litmus-client/src/main/java/com/navi/medici/repository/LitmusExperimentRepository.java b/litmus-client/src/main/java/com/navi/medici/repository/LitmusExperimentRepository.java index b968a58..40087b8 100644 --- a/litmus-client/src/main/java/com/navi/medici/repository/LitmusExperimentRepository.java +++ b/litmus-client/src/main/java/com/navi/medici/repository/LitmusExperimentRepository.java @@ -69,7 +69,7 @@ public class LitmusExperimentRepository implements ExperimentRepository { ready = true; } } catch (LitmusException e) { - log.error("litmus exception failed."); + log.error("litmus exception failed.", e); } }; } diff --git a/litmus-client/src/main/java/com/navi/medici/strategy/FlexibleRolloutStrategy.java b/litmus-client/src/main/java/com/navi/medici/strategy/FlexibleRolloutStrategy.java index 94d6c42..9c534b5 100644 --- a/litmus-client/src/main/java/com/navi/medici/strategy/FlexibleRolloutStrategy.java +++ b/litmus-client/src/main/java/com/navi/medici/strategy/FlexibleRolloutStrategy.java @@ -5,7 +5,11 @@ import com.navi.medici.util.StrategyUtils; import java.util.Map; import java.util.Optional; import java.util.function.Supplier; +import lombok.extern.log4j.Log4j2; +import org.springframework.stereotype.Component; +@Component +@Log4j2 public class FlexibleRolloutStrategy implements Strategy { protected static final String PERCENTAGE = "rollout"; @@ -17,9 +21,6 @@ public class FlexibleRolloutStrategy implements Strategy { this.randomGenerator = () -> Math.random() * 100 + ""; } - public FlexibleRolloutStrategy(Supplier randomGenerator) { - this.randomGenerator = randomGenerator; - } @Override public String getName() { diff --git a/litmus-client/src/main/java/com/navi/medici/util/LitmusURLs.java b/litmus-client/src/main/java/com/navi/medici/util/LitmusURLs.java index 6b76dec..b76609d 100644 --- a/litmus-client/src/main/java/com/navi/medici/util/LitmusURLs.java +++ b/litmus-client/src/main/java/com/navi/medici/util/LitmusURLs.java @@ -11,7 +11,7 @@ public class LitmusURLs { public LitmusURLs(URI litmusAPI) { try { String litmusAPIstr = litmusAPI.toString(); - fetchExperimentsURL = URI.create(litmusAPIstr + "/client/experiments").normalize().toURL(); + fetchExperimentsURL = URI.create(litmusAPIstr + "/experiments").normalize().toURL(); } catch (MalformedURLException ex) { throw new IllegalArgumentException("Litmus API is not a valid URL: " + litmusAPI); diff --git a/litmus-core/pom.xml b/litmus-core/pom.xml index cedde40..412c310 100644 --- a/litmus-core/pom.xml +++ b/litmus-core/pom.xml @@ -25,7 +25,44 @@ ${nexus.host}/repository/maven-snapshots + + + + com.navi.medici + litmus-model + 1.0-SNAPSHOT + + + + com.navi.medici + litmus-db + 1.0-SNAPSHOT + + + + com.navi.medici + litmus-cache + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-webflux + + + + javax.servlet + javax.servlet-api + 4.0.1 + + + + software.amazon.awssdk + s3 + 2.17.51 + + com.navi.medici.utils event-bus-client @@ -35,7 +72,7 @@ junit junit - 4.11 + 4.13.2 test diff --git a/litmus-core/src/main/java/com/navi/medici/App.java b/litmus-core/src/main/java/com/navi/medici/App.java deleted file mode 100644 index acb795d..0000000 --- a/litmus-core/src/main/java/com/navi/medici/App.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.navi.medici; - -/** - * Hello world! - */ -public class App { - - public static void main(String[] args) { - System.out.println("Hello World!"); - } -} diff --git a/litmus-core/src/main/java/com/navi/medici/LitmusApp.java b/litmus-core/src/main/java/com/navi/medici/LitmusApp.java new file mode 100644 index 0000000..a87497e --- /dev/null +++ b/litmus-core/src/main/java/com/navi/medici/LitmusApp.java @@ -0,0 +1,12 @@ +package com.navi.medici; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class LitmusApp { + public static void main(String[] args) { + SpringApplication.run(LitmusApp.class, args); + } + +} diff --git a/litmus-core/src/main/java/com/navi/medici/container/S3Container.java b/litmus-core/src/main/java/com/navi/medici/container/S3Container.java new file mode 100644 index 0000000..2eaeef9 --- /dev/null +++ b/litmus-core/src/main/java/com/navi/medici/container/S3Container.java @@ -0,0 +1,17 @@ +package com.navi.medici.container; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; +import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.s3.S3Client; + +@Component +public class S3Container { + @Bean + public S3Client amazonS3(@Value("${report.s3.region}") String region) { + return S3Client.builder() + .region(Region.AP_SOUTH_1) + .build(); + } +} diff --git a/litmus-core/src/main/java/com/navi/medici/controller/v1/ExperimentController.java b/litmus-core/src/main/java/com/navi/medici/controller/v1/ExperimentController.java new file mode 100644 index 0000000..70d33fe --- /dev/null +++ b/litmus-core/src/main/java/com/navi/medici/controller/v1/ExperimentController.java @@ -0,0 +1,30 @@ +package com.navi.medici.controller.v1; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/v1/experiments") +public class ExperimentController { + + @PostMapping(value = "/create", consumes = MediaType.APPLICATION_JSON_VALUE) + public void createExperiment() { + + } + + + @GetMapping + public String fetchExperiments() { + String result = "{\"features\":[{\"name\":\"test-offer\",\"enabled\":true,\"strategies\":[{\"name\":\"flexibleRollout\"," + + "\"parameters\":{\"rollout\":\"24\",\"stickiness\":\"random\",\"groupId\":\"test-offer\"},\"constraints\":[]}],\"variants\":[]},{\"name\":\"test-v1\",\"enabled\":true,\"strategies\":[{\"name\":\"default\",\"parameters\":{}}],\"variants\":[]}],\"version\":1}"; + + return result; + } + + +} diff --git a/litmus-core/src/main/java/com/navi/medici/controller/v1/SegmentController.java b/litmus-core/src/main/java/com/navi/medici/controller/v1/SegmentController.java new file mode 100644 index 0000000..cb6cd98 --- /dev/null +++ b/litmus-core/src/main/java/com/navi/medici/controller/v1/SegmentController.java @@ -0,0 +1,23 @@ +package com.navi.medici.controller.v1; + +import com.navi.medici.request.v1.SegmentRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/v1/bucket") +public class SegmentController { + + + @PostMapping(value = "/create") + public void createSegment(@RequestParam("file") MultipartFile file, + @RequestParam("segment") SegmentRequest segmentRequest) { + + } + +} diff --git a/litmus-core/src/main/resources/application.properties b/litmus-core/src/main/resources/application.properties new file mode 100644 index 0000000..9eeb1ff --- /dev/null +++ b/litmus-core/src/main/resources/application.properties @@ -0,0 +1,18 @@ +spring.datasource.hikari.maximum-pool-size=${DB_POOL_MAX_SIZE:2} +spring.datasource.hikari.minimum-idle=${DB_POOL_MIN_IDLE:1} +spring.datasource.hikari.idle-timeout=${DB_POOL_IDLE_TIMEOUT_IN_MS:30000} +spring.datasource.url=${DATASOURCE_URL:jdbc:postgresql://localhost:5432/santa}?stringtype=unspecified +spring.datasource.username=${DATASOURCE_USERNAME:postgres} +spring.datasource.password=${DATASOURCE_PASSWORD:admin} +spring.datasource.initialization-mode=${DATA_INITIALIZATION_MODE:never} +spring.jpa.hibernate.ddl-auto=none +#spring.jpa.properties.hibernate.generate_statistics]=true +#spring.jpa.properties.hibernate.show_sql=true +#spring.jpa.properties.hibernate.use_sql_comments=true +#spring.jpa.properties.hibernate.format_sql=true + + +kafka.servers=${KAFKA_SERVER:localhost:9092} +audit.kafka.servers=${AUDIT_KAFKA_SERVER:localhost:9092} +kafka.auditlog.topic=${AUDIT_LOG_TOPIC:audit-logs} +kms.base-url=${KMS_BASE_URL:http://google.com} \ No newline at end of file diff --git a/litmus-core/src/main/resources/log4j2.properties b/litmus-core/src/main/resources/log4j2.properties new file mode 100644 index 0000000..4697dad --- /dev/null +++ b/litmus-core/src/main/resources/log4j2.properties @@ -0,0 +1,11 @@ +appenders=console +appender.console.type=Console +appender.console.name=STDOUT +appender.console.layout.type=EcsLayout +appender.console.layout.serviceName=litmus +appender.console.layout.topLevelLabels=correlationId,customerId + +rootLogger.level=info +rootLogger.appenderRef.stdout.ref=STDOUT +logger.medici.name=com.navi.medici +logger.medici.level=info diff --git a/litmus-db/pom.xml b/litmus-db/pom.xml new file mode 100644 index 0000000..1084b09 --- /dev/null +++ b/litmus-db/pom.xml @@ -0,0 +1,36 @@ + + + 4.0.0 + + litmus + com.navi.medici + 1.0-SNAPSHOT + + + litmus-db + 1.0-SNAPSHOT + + litmus-db + + + + org.postgresql + postgresql + 42.2.20 + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + junit + junit + 4.11 + test + + + + + diff --git a/litmus-db/src/main/java/com/navi/medici/App.java b/litmus-db/src/main/java/com/navi/medici/App.java new file mode 100644 index 0000000..c0d56af --- /dev/null +++ b/litmus-db/src/main/java/com/navi/medici/App.java @@ -0,0 +1,13 @@ +package com.navi.medici; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + } +} diff --git a/litmus-db/src/main/java/com/navi/medici/entity/ExperimentEntity.java b/litmus-db/src/main/java/com/navi/medici/entity/ExperimentEntity.java new file mode 100644 index 0000000..ecdb5ca --- /dev/null +++ b/litmus-db/src/main/java/com/navi/medici/entity/ExperimentEntity.java @@ -0,0 +1,75 @@ +package com.navi.medici.entity; + +import java.time.LocalDateTime; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Version; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.FieldDefaults; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +@Entity +@Table(name = "experiments") +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE) +public class ExperimentEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + Long id; + + @Column(name = "experiment_id") + String experimentId; + + @Column(name = "name") + String name; + + @Column(name = "enabled") + Boolean enabled; + + @Column(name = "description") + String description; + + @Column(name = "archived") + Boolean archived; + + @Column(name = "strategies") + String strategies; + + @Column(name = "variants") + String variants; + + @Column(name = "type") + String type; + + @Column(name = "start_time") + LocalDateTime startTime; + + @Column(name = "end_time") + LocalDateTime endTime; + + @Version + private Integer version; + + @Column(name = "created_at") + @CreationTimestamp + LocalDateTime createdAt; + + @Column(name = "updated_at") + @UpdateTimestamp + LocalDateTime updatedAt; + +} diff --git a/litmus-db/src/main/java/com/navi/medici/entity/SegmentEntity.java b/litmus-db/src/main/java/com/navi/medici/entity/SegmentEntity.java new file mode 100644 index 0000000..a13afce --- /dev/null +++ b/litmus-db/src/main/java/com/navi/medici/entity/SegmentEntity.java @@ -0,0 +1,57 @@ +package com.navi.medici.entity; + +import java.time.LocalDateTime; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Version; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.FieldDefaults; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +@Entity +@Table(name = "segments") +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +@FieldDefaults(level = AccessLevel.PRIVATE) +public class SegmentEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "segment_id") + String segmentId; + + @Column(name = "name") + String segmentName; + + @Column(name = "description") + String segmentDescription; + + @Column(name = "bucket") + String destinationBucket; + + @Version + private Integer version; + + @Column(name = "created_at") + @CreationTimestamp + LocalDateTime createdAt; + + @Column(name = "updated_at") + @UpdateTimestamp + LocalDateTime updatedAt; +} diff --git a/litmus-db/src/test/java/com/navi/medici/AppTest.java b/litmus-db/src/test/java/com/navi/medici/AppTest.java new file mode 100644 index 0000000..35dc3e5 --- /dev/null +++ b/litmus-db/src/test/java/com/navi/medici/AppTest.java @@ -0,0 +1,20 @@ +package com.navi.medici; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/litmus-liquibase/pom.xml b/litmus-liquibase/pom.xml new file mode 100644 index 0000000..dd68dcb --- /dev/null +++ b/litmus-liquibase/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + + litmus + com.navi.medici + 1.0-SNAPSHOT + + + litmus-liquibase + 1.0-SNAPSHOT + + litmus-liquibase + + + + + junit + junit + 4.11 + test + + + + diff --git a/litmus-liquibase/src/main/java/com/navi/medici/App.java b/litmus-liquibase/src/main/java/com/navi/medici/App.java new file mode 100644 index 0000000..c0d56af --- /dev/null +++ b/litmus-liquibase/src/main/java/com/navi/medici/App.java @@ -0,0 +1,13 @@ +package com.navi.medici; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + } +} diff --git a/litmus-liquibase/src/test/java/com/navi/medici/AppTest.java b/litmus-liquibase/src/test/java/com/navi/medici/AppTest.java new file mode 100644 index 0000000..35dc3e5 --- /dev/null +++ b/litmus-liquibase/src/test/java/com/navi/medici/AppTest.java @@ -0,0 +1,20 @@ +package com.navi.medici; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/litmus-mock/pom.xml b/litmus-mock/pom.xml new file mode 100644 index 0000000..db0bb11 --- /dev/null +++ b/litmus-mock/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + litmus + com.navi.medici + 1.0-SNAPSHOT + + + litmus-mock + 1.0-SNAPSHOT + + litmus-mock + + + + com.navi.medici + litmus-model + 1.0-SNAPSHOT + + + + com.navi.medici + litmus-client + 1.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-webflux + + + org.springframework.boot + spring-boot-starter-logging + + + + + + javax.servlet + javax.servlet-api + 4.0.1 + + + + junit + junit + 4.11 + test + + + + diff --git a/litmus-mock/src/main/java/com/navi/medici/App.java b/litmus-mock/src/main/java/com/navi/medici/App.java new file mode 100644 index 0000000..c0d56af --- /dev/null +++ b/litmus-mock/src/main/java/com/navi/medici/App.java @@ -0,0 +1,13 @@ +package com.navi.medici; + +/** + * Hello world! + * + */ +public class App +{ + public static void main( String[] args ) + { + System.out.println( "Hello World!" ); + } +} diff --git a/litmus-mock/src/main/java/com/navi/medici/LitmusMockApp.java b/litmus-mock/src/main/java/com/navi/medici/LitmusMockApp.java new file mode 100644 index 0000000..2664aca --- /dev/null +++ b/litmus-mock/src/main/java/com/navi/medici/LitmusMockApp.java @@ -0,0 +1,12 @@ +package com.navi.medici; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class LitmusMockApp { + public static void main(String[] args) { + SpringApplication.run(LitmusMockApp.class, args); + } + +} diff --git a/litmus-mock/src/main/java/com/navi/medici/container/MockContainer.java b/litmus-mock/src/main/java/com/navi/medici/container/MockContainer.java new file mode 100644 index 0000000..eab925b --- /dev/null +++ b/litmus-mock/src/main/java/com/navi/medici/container/MockContainer.java @@ -0,0 +1,25 @@ +package com.navi.medici.container; + +import com.navi.medici.config.LitmusConfig; +import com.navi.medici.litmus.DefaultLitmus; +import com.navi.medici.litmus.Litmus; +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Component; + +@Component +public class MockContainer { + + @Bean + public Litmus litmus() { + var litmusConfig = LitmusConfig.builder() + .litmusAPI("http://localhost:8080/v1") + .appName("litmus-mock") + .instanceId("test-instance") + .build(); + + Litmus unleash = new DefaultLitmus(litmusConfig); + + return unleash; + } + +} diff --git a/litmus-mock/src/main/java/com/navi/medici/controller/MockController.java b/litmus-mock/src/main/java/com/navi/medici/controller/MockController.java new file mode 100644 index 0000000..5d7a7d7 --- /dev/null +++ b/litmus-mock/src/main/java/com/navi/medici/controller/MockController.java @@ -0,0 +1,24 @@ +package com.navi.medici.controller; + +import com.navi.medici.litmus.Litmus; +import lombok.RequiredArgsConstructor; +import lombok.extern.log4j.Log4j2; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/v1") +@RequiredArgsConstructor +@Log4j2 +public class MockController { + private final Litmus litmus; + + @GetMapping("/mock") + public String test() { + var result = litmus.isEnabled("test-offer"); + log.info("result ----> {}", result); + + return "result ==> " + result; + } +} diff --git a/litmus-mock/src/main/resources/application.properties b/litmus-mock/src/main/resources/application.properties new file mode 100644 index 0000000..e97e724 --- /dev/null +++ b/litmus-mock/src/main/resources/application.properties @@ -0,0 +1 @@ +server.port=11000 \ No newline at end of file diff --git a/litmus-mock/src/test/java/com/navi/medici/AppTest.java b/litmus-mock/src/test/java/com/navi/medici/AppTest.java new file mode 100644 index 0000000..35dc3e5 --- /dev/null +++ b/litmus-mock/src/test/java/com/navi/medici/AppTest.java @@ -0,0 +1,20 @@ +package com.navi.medici; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +/** + * Unit test for simple App. + */ +public class AppTest +{ + /** + * Rigorous Test :-) + */ + @Test + public void shouldAnswerWithTrue() + { + assertTrue( true ); + } +} diff --git a/litmus-model/src/main/java/com/navi/medici/App.java b/litmus-model/src/main/java/com/navi/medici/App.java deleted file mode 100644 index acb795d..0000000 --- a/litmus-model/src/main/java/com/navi/medici/App.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.navi.medici; - -/** - * Hello world! - */ -public class App { - - public static void main(String[] args) { - System.out.println("Hello World!"); - } -} diff --git a/litmus-model/src/main/java/com/navi/medici/request/v1/ExperimentRequest.java b/litmus-model/src/main/java/com/navi/medici/request/v1/ExperimentRequest.java new file mode 100644 index 0000000..1792c5e --- /dev/null +++ b/litmus-model/src/main/java/com/navi/medici/request/v1/ExperimentRequest.java @@ -0,0 +1,48 @@ +package com.navi.medici.request.v1; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonProperty; +import java.time.LocalDateTime; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.FieldDefaults; + +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Getter +@Setter +@JsonIgnoreProperties(ignoreUnknown = true) +@FieldDefaults(level = AccessLevel.PRIVATE) +public class ExperimentRequest { + @JsonProperty("name") + String name; + + @JsonProperty("enabled") + Boolean enabled; + + @JsonProperty("description") + String description; + + @JsonProperty("archived") + Boolean archived; + + @JsonProperty("strategies") + String strategies; + + @JsonProperty("variants") + String variants; + + @JsonProperty("type") + String type; + + @JsonProperty("start_time") + LocalDateTime startTime; + + @JsonProperty("end_time") + LocalDateTime endTime; +} diff --git a/litmus-model/src/main/java/com/navi/medici/request/v1/SegmentRequest.java b/litmus-model/src/main/java/com/navi/medici/request/v1/SegmentRequest.java new file mode 100644 index 0000000..f57ceec --- /dev/null +++ b/litmus-model/src/main/java/com/navi/medici/request/v1/SegmentRequest.java @@ -0,0 +1,26 @@ +package com.navi.medici.request.v1; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.FieldDefaults; + +@AllArgsConstructor +@NoArgsConstructor +@Builder +@Getter +@Setter +@JsonIgnoreProperties(ignoreUnknown = true) +@FieldDefaults(level = AccessLevel.PRIVATE) +public class SegmentRequest { + String name; + + String description; + + + +} diff --git a/local.env b/local.env new file mode 100644 index 0000000..e78f0cd --- /dev/null +++ b/local.env @@ -0,0 +1,3 @@ +DATASOURCE_URL=jdbc:postgresql://dev-db-service-db.np.navi-tech.in:5432/santa +DATASOURCE_USERNAME=service_user +DATASOURCE_PASSWORD=JRCFCMXUXBJHGZVTPBNTXHYCCFVMWN \ No newline at end of file diff --git a/pom.xml b/pom.xml index b767fc6..9f99210 100644 --- a/pom.xml +++ b/pom.xml @@ -1,26 +1,36 @@ - + 4.0.0 - com.navi.medici - litmus - 1.0-SNAPSHOT pom - litmus litmus-core litmus-model litmus-client + litmus-db + litmus-mock + litmus-liquibase + litmus-cache + + org.springframework.boot + spring-boot-starter-parent + 2.5.5 + + + + org.springframework.boot + spring-boot-autoconfigure + + org.projectlombok lombok @@ -31,7 +41,7 @@ co.elastic.logging log4j2-ecs-layout - 1.0.1 + 1.1.0 @@ -41,13 +51,13 @@ true - junit junit - 4.11 + 4.13.2 test + @@ -59,10 +69,20 @@ 11 11 + + + org.projectlombok + lombok + 1.18.20 + + + + +