From 41ea67287fb179185fc9e7e9b7fcbebffbc0c1e7 Mon Sep 17 00:00:00 2001 From: dksifoua Date: Tue, 10 Sep 2024 23:10:08 -0400 Subject: [PATCH] Setup product catalog service --- .github/workflows/catalog.yaml | 31 +++++++++++++ .gitignore | 41 ++++++++++++++++- .gradle/8.5/checksums/checksums.lock | Bin 17 -> 17 bytes .../8.5/executionHistory/executionHistory.bin | Bin 19667 -> 161229 bytes .../executionHistory/executionHistory.lock | Bin 17 -> 17 bytes .gradle/8.5/fileHashes/fileHashes.bin | Bin 18697 -> 20047 bytes .gradle/8.5/fileHashes/fileHashes.lock | Bin 17 -> 17 bytes .../buildOutputCleanup.lock | Bin 17 -> 17 bytes .gradle/buildOutputCleanup/outputFiles.bin | Bin 18713 -> 19253 bytes .gradle/file-system.probe | Bin 8 -> 8 bytes README.md | 3 ++ Taskfile.yaml | 19 ++++++++ catalog-service/build.gradle | 43 ++++++++++++++++++ catalog-service/compose.yaml | 10 ++++ catalog-service/settings.gradle | 1 + .../catalog/CatalogServiceApplication.java | 13 ++++++ .../eshop/catalog/DefaultHandler.java | 13 ++++++ .../configuration/RouterConfiguration.java | 19 ++++++++ .../src/main/resources/application.yaml | 3 ++ .../CatalogServiceApplicationTests.java | 15 ++++++ .../TestCatalogServiceApplication.java | 11 +++++ .../catalog/TestcontainersConfiguration.java | 18 ++++++++ settings.gradle | 2 + 23 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/catalog.yaml create mode 100644 Taskfile.yaml create mode 100644 catalog-service/build.gradle create mode 100644 catalog-service/compose.yaml create mode 100644 catalog-service/settings.gradle create mode 100644 catalog-service/src/main/java/io/dksifoua/eshop/catalog/CatalogServiceApplication.java create mode 100644 catalog-service/src/main/java/io/dksifoua/eshop/catalog/DefaultHandler.java create mode 100644 catalog-service/src/main/java/io/dksifoua/eshop/catalog/configuration/RouterConfiguration.java create mode 100644 catalog-service/src/main/resources/application.yaml create mode 100644 catalog-service/src/test/java/io/dksifoua/eshop/catalog/CatalogServiceApplicationTests.java create mode 100644 catalog-service/src/test/java/io/dksifoua/eshop/catalog/TestCatalogServiceApplication.java create mode 100644 catalog-service/src/test/java/io/dksifoua/eshop/catalog/TestcontainersConfiguration.java diff --git a/.github/workflows/catalog.yaml b/.github/workflows/catalog.yaml new file mode 100644 index 0000000..1ad834e --- /dev/null +++ b/.github/workflows/catalog.yaml @@ -0,0 +1,31 @@ +name: CI/CD pipeline for product catalog service + +on: + push: + branches: + - main + - develop + - feature/** + pull_request: + branches: + - main + - develop + - feature/** + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: oracle + java-version: 21 + - name: Setup Task + uses: arduino/setup-task@v2 + with: + version: 3.x + repo-token: ${{ secrets.GH_TOKEN }} + - name: Test product catalog service + run: task catalog:test \ No newline at end of file diff --git a/.gitignore b/.gitignore index 62c8935..cc5909d 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,40 @@ -.idea/ \ No newline at end of file +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ + +### Gradle ### +.gradle/ \ No newline at end of file diff --git a/.gradle/8.5/checksums/checksums.lock b/.gradle/8.5/checksums/checksums.lock index 5c1c7663e6bce644fd767dae1046758008061544..1e855b3b2c9e68d1b2d972d10e05efef6c0ea0c6 100644 GIT binary patch literal 17 TcmZS9(Pr_k6sx|%00Dde9DV|p literal 17 ScmZS9(Pr_k6sx|%00jUXZ~}+` diff --git a/.gradle/8.5/executionHistory/executionHistory.bin b/.gradle/8.5/executionHistory/executionHistory.bin index 9d34fd9bd4dc5fe34eb5b60192e770850e73a8d8..f150f7bdd2c6fed37ea0bada9ae286d6032f4f7d 100644 GIT binary patch literal 161229 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 delta 60 zcmX^6n)C8Z#t9;<3_u{d(eQ=%L*GB)ie!CQya?W=D@n FEC8vj7m)w} diff --git a/.gradle/8.5/executionHistory/executionHistory.lock b/.gradle/8.5/executionHistory/executionHistory.lock index dc879bd045f732053d0c32f08bde156c4f4074e9..62025946423b25bcb59f78949f81d2fd11bef378 100644 GIT binary patch literal 17 UcmZRM_cgk+|5wl?1_+P_05rk`b^rhX literal 17 UcmZRM_cgk+|5wl?1_)pV05qxuUH||9 diff --git a/.gradle/8.5/fileHashes/fileHashes.bin b/.gradle/8.5/fileHashes/fileHashes.bin index b1d4c35e5593e23fc521a206f3404d69eea937db..7f91ff18d467af413653f84c6c6eb9f63018504f 100644 GIT binary patch literal 20047 zcmeI3e^8TU9Khdg{FEt}5aKVCfk|qj;16_yiV}l?CZQDm2+9c>m~MsVA#!B=5E+Uh zh=VCP7e7>%h=_D}V1QyBgk+h};`BmD2|*bktoP-4o;>#2UH{g7-@CE*K6^fU_I%!L z|FCB@MNPEQ(3@FKIVhC&t1av z8e`v2t~EAC+&_`AP|QKmT^Z3wZLJOykK-h>I%;FA2+= z_O-)9Q^ZA$gx@MoeUT?GK8MFU6JFmiB|~VcPDR{5i16lAYJz{D$u`7&d4#tf_C6s{ zba`PuM7XxKM7vt~9FO-4CA{sfN^)3KUxUU6OeMT`-MVEtyL6$5iy{dh&J7%>J7l3l z+-D`>7HcJr>np7f;PFbrtxC@F3)DN$;PEQL?e2J-ZF=;(26HLlGhV+I9pEo`fVkf= z!socpR&pKOPa^JnlJF&F*(q-epEM&b4k6rQZ;g1s3ieE|2)F| zmfU$`TipSCy+q3h->gk2i1R-WA0Cz9l^BM)i1e*M+r+`z|E>6W)=4NelH)@c2H$$vs7J z`_W_Y7YaZDC;$bZ02F`%Pyh-*0Vn_kpa2wr0#E=7KmjNK1)u;FfC5ke3P1rU00p1` z6o3Ly017|>C;$bZ02F`%Pyh-*0Vwd_Ex`OJ+nK)2U~X13cSpJ0)Xp+lEjLFVq*d_@|oYz8yJPz6}k4mmaliD z^!Lmgo91BSHDpi&Y{MfWO%Y+UwA88f^f$tu{xWO?AY(=^+qhZZ<5o2L&;*AKCtYo- zKK*{gD9_oB3=U%&ysDthOY`Sx-CX(4#XTAFC-l|{dgWd6SY+_VvJKl0t0!kw#odzH z*S{0_G%*evDagp&$TkFDO3RuojGt%4>#E#KrqaKAr{}2fDMbb~|6dwi^0a?8a_eg2 zZn?D=tte4(j^CI|@7bW|Xb(=p26OQYRxZgaYz~)O4)WZ7>EA8dpcpZJs=JL0?p?MK ze!lx=_qjG{jL4@sBv?xChhXO5A3+93$~L?oX&x5U7G^sR?zm#x!WWJhUGn|NFv?^b z9yY<@R`IG}>vvbwT~_Jo?JOhLV=prJTDEZ~Ot#0V%1im#<#fyRanI=YDs5=h4ang7 zvJK7E7@f|=DQn$uOwsfUf6)6kXrnwwf(*_ow$Wi^*OMPmqSp61uk09J^fNZd`%1tz zJ};;?&fNES{f0BvrxSKR_zkb)1)76f%{DkYTst&_p7!Ab1NXOFugOLRx#T9y?h1n| zD4pA9yym^FLs?<>D#OP$=i@o(PcL&AF?)Utj41;}DoeiU%u=zPZ&Iu$y<(- zu#0U(N2rb(^`xhJ=@)hCB3u=H+`5NqW>7Y zD%+#l@yh6S!RCUP@C93pKfuOCW<0%PirF@0VEhBO1qywZO)O5rHy# zMXQhZ$5te^-;1?aY-ek>+#zbTG1rVeN7^M#p_5Q0PyT|tV5(B#HTqRqA7mT+@x6P# zle%xcVI+9;XYo$-Iqy>7m76hN=?3eNoyiD{zdh9V(WP@6Zy(c=UF==2p% diff --git a/.gradle/8.5/fileHashes/fileHashes.lock b/.gradle/8.5/fileHashes/fileHashes.lock index 15c401cb5c7da5723d826fea059db55e5d9e77e1..11f76f70295b8aac575c059b4a9cced916a480c0 100644 GIT binary patch literal 17 UcmZSHdTq9ot98*u1_+1)05#$SjQ{`u literal 17 UcmZSHdTq9ot98*u1_)pS05ysPH2?qr diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock index 5f856b870ed957351a0f2f75fbb81b2e64af4df3..0bfebe1befc5d8bd36e8127e68ac663289a3b831 100644 GIT binary patch literal 17 UcmZR+9P?6cY7qNG1_05J>$$N&HU diff --git a/.gradle/buildOutputCleanup/outputFiles.bin b/.gradle/buildOutputCleanup/outputFiles.bin index 0d70faa5d335719feac9d890b80e98fa78c628eb..8b981ebb1ad432616e1178c390c6a6adf34c47ac 100644 GIT binary patch literal 19253 zcmeI&Ye-XZ7{~FWsg)D8Qt$#%7?^9s&~k~XWomPp8uJ2Ll$MGv5}RZfD~0ZA5(-I~ zP?~l@QIg6OTSCkwHq`7zLTXB0vcS?9p)J?>KT7P)5Gjh^VB6t)p7U(y^L7j3I465O zdvNm)$N57XK>z{}fB*y_009U<00Izz00bZa0SG_<0uX=z1R(Ig2*k|Zh&6vRP9k%| zfn7GoiEU;Ngco(HDHlnxls_H1lzu-bI2?cVqsRFizRTRH7YRM%1-4InS$Cvf8eJ>? z{G~aK?_n#bSETLUvtHir&Ua}t_3E9L*&W)UX1<3yQ*Sz?S`*SWbcF5Cpx&&B%gVI# zQL}j^_2(rP10_xZA?tqBTT5Ib4!kSMVtYPOe^EQWw(LR02fj-$&GoNi{_pcu3byAO zb#cRd~Y=1BHf#KCD>)xp1*q%u0BTA7rSQ+cddI$B%s3_l?8M;Ka zX9;zkgI8|e!CrsXDeHff%fGi>7U=jc-A*U0mtEJ7lvZzH`zHRKz^>XoHeFJs- zhDw|J)rwne&lGisfE0U6ZI=_@WqH({U;9^fj}F(f`DfJqBJMUsT6DCrdCgq!Uum^f z8F_;5p?%c1RaVIr0h4ZQPd4=+Q9U5Alr#FT^H0dfWg2r4}NO diff --git a/.gradle/file-system.probe b/.gradle/file-system.probe index deceb7b5685c6793461b18859b37ca4c635714db..1a50550ae3b5ec363ef7a8454142cebe6e4b74f5 100644 GIT binary patch literal 8 PcmZQzV4Qew-@K&&3U&i> literal 8 PcmZQzV4QfbKROWr2_FKy diff --git a/README.md b/README.md index c80ab85..d3d8d92 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,5 @@ # eshop + Event driven microservice-based c2c ecommerce platform + +[![Catalog Pipeline](https://github.com/dksifoua/eshop/actions/workflows/catalog.yaml/badge.svg)](https://github.com/dksifoua/eshop/actions/workflows/catalog.yaml) diff --git a/Taskfile.yaml b/Taskfile.yaml new file mode 100644 index 0000000..e8b7501 --- /dev/null +++ b/Taskfile.yaml @@ -0,0 +1,19 @@ +version: 3 + +tasks: + catalog:clean: + desc: Clean product catalog service build + cmd: ./gradlew catalog:clean + silent: true + + catalog:run: + desc: Run product catalog service + cmd: ./gradlew catalog:bootRun + silent: true + + catalog:test: + desc: Test product catalog service + cmds: + - task: catalog:clean + - ./gradlew catalog:test + silent: true \ No newline at end of file diff --git a/catalog-service/build.gradle b/catalog-service/build.gradle new file mode 100644 index 0000000..7899001 --- /dev/null +++ b/catalog-service/build.gradle @@ -0,0 +1,43 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '3.3.3' + id 'io.spring.dependency-management' version '1.1.6' +} + +group = 'io.dksifoua.eshop' +version = '0.0.1-SNAPSHOT' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' + implementation 'org.springframework.boot:spring-boot-starter-webflux' + compileOnly 'org.projectlombok:lombok' + developmentOnly 'org.springframework.boot:spring-boot-devtools' + developmentOnly 'org.springframework.boot:spring-boot-docker-compose' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'org.springframework.boot:spring-boot-testcontainers' + testImplementation 'io.projectreactor:reactor-test' + testImplementation 'org.testcontainers:junit-jupiter' + testImplementation 'org.testcontainers:mongodb' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/catalog-service/compose.yaml b/catalog-service/compose.yaml new file mode 100644 index 0000000..18dadeb --- /dev/null +++ b/catalog-service/compose.yaml @@ -0,0 +1,10 @@ +version: "3.8" +services: + mongodb: + image: mongo:latest + environment: + - MONGO_INITDB_DATABASE=catalog + - MONGO_INITDB_ROOT_PASSWORD=secret + - MONGO_INITDB_ROOT_USERNAME=root + ports: + - "27017:27017" diff --git a/catalog-service/settings.gradle b/catalog-service/settings.gradle new file mode 100644 index 0000000..3c9978a --- /dev/null +++ b/catalog-service/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'catalog' diff --git a/catalog-service/src/main/java/io/dksifoua/eshop/catalog/CatalogServiceApplication.java b/catalog-service/src/main/java/io/dksifoua/eshop/catalog/CatalogServiceApplication.java new file mode 100644 index 0000000..9a034d9 --- /dev/null +++ b/catalog-service/src/main/java/io/dksifoua/eshop/catalog/CatalogServiceApplication.java @@ -0,0 +1,13 @@ +package io.dksifoua.eshop.catalog; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class CatalogServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(CatalogServiceApplication.class, args); + } + +} diff --git a/catalog-service/src/main/java/io/dksifoua/eshop/catalog/DefaultHandler.java b/catalog-service/src/main/java/io/dksifoua/eshop/catalog/DefaultHandler.java new file mode 100644 index 0000000..0a20e45 --- /dev/null +++ b/catalog-service/src/main/java/io/dksifoua/eshop/catalog/DefaultHandler.java @@ -0,0 +1,13 @@ +package io.dksifoua.eshop.catalog; + +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.server.ServerResponse; +import reactor.core.publisher.Mono; + +@Component +public class DefaultHandler { + + public Mono handle() { + return ServerResponse.ok().body(Mono.just("Hello world!!!"), String.class); + } +} diff --git a/catalog-service/src/main/java/io/dksifoua/eshop/catalog/configuration/RouterConfiguration.java b/catalog-service/src/main/java/io/dksifoua/eshop/catalog/configuration/RouterConfiguration.java new file mode 100644 index 0000000..1f46a26 --- /dev/null +++ b/catalog-service/src/main/java/io/dksifoua/eshop/catalog/configuration/RouterConfiguration.java @@ -0,0 +1,19 @@ +package io.dksifoua.eshop.catalog.configuration; + +import io.dksifoua.eshop.catalog.DefaultHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.RouterFunctions; +import org.springframework.web.reactive.function.server.ServerResponse; + +@Configuration +public class RouterConfiguration { + + @Bean + public RouterFunction handler(DefaultHandler handler) { + return RouterFunctions.route() + .path("/default", builder -> builder.GET(request -> handler.handle())) + .build(); + } +} diff --git a/catalog-service/src/main/resources/application.yaml b/catalog-service/src/main/resources/application.yaml new file mode 100644 index 0000000..7bd42b1 --- /dev/null +++ b/catalog-service/src/main/resources/application.yaml @@ -0,0 +1,3 @@ +spring: + application: + name: catalog-service diff --git a/catalog-service/src/test/java/io/dksifoua/eshop/catalog/CatalogServiceApplicationTests.java b/catalog-service/src/test/java/io/dksifoua/eshop/catalog/CatalogServiceApplicationTests.java new file mode 100644 index 0000000..0268ad2 --- /dev/null +++ b/catalog-service/src/test/java/io/dksifoua/eshop/catalog/CatalogServiceApplicationTests.java @@ -0,0 +1,15 @@ +package io.dksifoua.eshop.catalog; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Import; + +@Import(TestcontainersConfiguration.class) +@SpringBootTest +class CatalogServiceApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/catalog-service/src/test/java/io/dksifoua/eshop/catalog/TestCatalogServiceApplication.java b/catalog-service/src/test/java/io/dksifoua/eshop/catalog/TestCatalogServiceApplication.java new file mode 100644 index 0000000..d7fcbfc --- /dev/null +++ b/catalog-service/src/test/java/io/dksifoua/eshop/catalog/TestCatalogServiceApplication.java @@ -0,0 +1,11 @@ +package io.dksifoua.eshop.catalog; + +import org.springframework.boot.SpringApplication; + +public class TestCatalogServiceApplication { + + public static void main(String[] args) { + SpringApplication.from(CatalogServiceApplication::main).with(TestcontainersConfiguration.class).run(args); + } + +} diff --git a/catalog-service/src/test/java/io/dksifoua/eshop/catalog/TestcontainersConfiguration.java b/catalog-service/src/test/java/io/dksifoua/eshop/catalog/TestcontainersConfiguration.java new file mode 100644 index 0000000..8eaaae2 --- /dev/null +++ b/catalog-service/src/test/java/io/dksifoua/eshop/catalog/TestcontainersConfiguration.java @@ -0,0 +1,18 @@ +package io.dksifoua.eshop.catalog; + +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.boot.testcontainers.service.connection.ServiceConnection; +import org.springframework.context.annotation.Bean; +import org.testcontainers.containers.MongoDBContainer; +import org.testcontainers.utility.DockerImageName; + +@TestConfiguration(proxyBeanMethods = false) +class TestcontainersConfiguration { + + @Bean + @ServiceConnection + MongoDBContainer mongoDbContainer() { + return new MongoDBContainer(DockerImageName.parse("mongo:latest")); + } + +} diff --git a/settings.gradle b/settings.gradle index 6fac9fe..d85c541 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,3 @@ rootProject.name = 'eshop' + +include('catalog-service') \ No newline at end of file