Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
05e8df5
Add test endpoint.
lukaDjordjevic01 Jan 14, 2026
06615ea
feat: Add Dockerfile
lukaDjordjevic01 Jan 17, 2026
1f1d45e
feat: Add Logstash logging integration and enhance logging
janosevicsm Jan 17, 2026
48b2652
feat: Add zipkin tracing
rozicd Jan 17, 2026
881f06f
fix: Remove local environment variables from gitignore.
lukaDjordjevic01 Jan 31, 2026
d7611e4
feat: Add Prometheus Integration
lukaDjordjevic01 Feb 7, 2026
d3e79a3
feat: Add CI pipeline
rozicd Feb 9, 2026
089be86
feat: Add accommodation API, domain & persistence
janosevicsm Feb 11, 2026
3b00a1d
feat: Replace Amenity entity with enum array
janosevicsm Feb 15, 2026
9aec01c
feat: Add tests, Testcontainers and JaCoCo config
janosevicsm Feb 15, 2026
f76ace6
feat: Add photo storage logic.
lukaDjordjevic01 Feb 16, 2026
8c5da45
feat: Add endpoint for fetching all accommodations.
lukaDjordjevic01 Feb 17, 2026
1eb1165
feat: Add price and availability for accommodation
cuturic01 Feb 17, 2026
ff8ffe5
feat: Add gRPC server for reservation request validation.
lukaDjordjevic01 Feb 17, 2026
7a7b827
fix: Add accommodation name to proto contract.
lukaDjordjevic01 Feb 17, 2026
d76c820
fix: Changed Accommodation endpoint to accept multiple photos instead…
janosevicsm Feb 17, 2026
6383405
fix: Fixed related tests
janosevicsm Feb 17, 2026
8f030fe
feat: Add search
cuturic01 Feb 19, 2026
497b074
fix: Add search pagination
cuturic01 Feb 20, 2026
72503f4
feat: Delete accommodations of a host after the host gets deleted.
lukaDjordjevic01 Feb 20, 2026
e1b3664
feat: Add GetAccommodationSummary gRPC endpoint
janosevicsm Feb 21, 2026
a3e957e
fix: Removed duplicate tests from pipeline
janosevicsm Feb 23, 2026
79065ec
feat: Add Helm values.
lukaDjordjevic01 Feb 24, 2026
84c844f
feat: Build image with Kaniko
rozicd Feb 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
name: CI Pipeline

on:
push:
branches:
- develop
- main
tags:
- 'v*'


env:
DOCKERHUB_USERNAME: threeamigoscoding

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up JDK 25
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '25'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@0b6dd653ba04f4f93bf581ec31e66cbd7dcb644d

- name: Build with Gradle
run: ./gradlew clean build

- name: Upload build artifact
uses: actions/upload-artifact@v4
with:
name: build-artifact
path: build/libs/*.jar
retention-days: 1

publish:
needs: build
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Download build artifact
uses: actions/download-artifact@v4
with:
name: build-artifact
path: build/libs

- name: Generate version tag
id: version
run: |
if [[ $GITHUB_REF == refs/tags/* ]]; then
VERSION_TAG=${GITHUB_REF#refs/tags/v}
elif [[ $GITHUB_REF == refs/heads/main ]]; then
SHORT_SHA=$(git rev-parse --short HEAD)
VERSION_TAG="main-${SHORT_SHA}"
else
SHORT_SHA=$(git rev-parse --short HEAD)
VERSION_TAG="develop-${SHORT_SHA}"
fi
echo "tag=$VERSION_TAG" >> $GITHUB_OUTPUT
echo "Generated version tag: $VERSION_TAG"

- name: Build and push Docker image with Kaniko
env:
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
run: |
mkdir -p /tmp/kaniko/.docker
echo "{\"auths\":{\"https://index.docker.io/v1/\":{\"auth\":\"$(echo -n ${{ env.DOCKERHUB_USERNAME }}:${DOCKERHUB_TOKEN} | base64)\"}}}" > /tmp/kaniko/.docker/config.json
docker run \
-v ${{ github.workspace }}:/workspace \
-v /tmp/kaniko/.docker:/kaniko/.docker \
gcr.io/kaniko-project/executor:latest \
--context=/workspace \
--dockerfile=/workspace/Dockerfile \
--destination=${{ env.DOCKERHUB_USERNAME }}/devoops-accommodation-service:${{ steps.version.outputs.tag }} \
--destination=${{ env.DOCKERHUB_USERNAME }}/devoops-accommodation-service:latest \
--cache=true \
--cache-repo=${{ env.DOCKERHUB_USERNAME }}/devoops-accommodation-service-cache
27 changes: 27 additions & 0 deletions .github/workflows/pr-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
name: PR Check

on:
pull_request:
branches:
- develop
- main

jobs:
build-and-test:
runs-on: ubuntu-latest

steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up JDK 25
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '25'

- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4

- name: Build with Gradle
run: ./gradlew clean build
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,4 @@ out/
.vscode/

### Mac ###
.DS_Store
.DS_Store
12 changes: 12 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
FROM eclipse-temurin:25-jre-alpine

WORKDIR /app

COPY build/libs/*SNAPSHOT.jar app.jar

RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring

EXPOSE 8080

ENTRYPOINT ["java", "-jar", "app.jar"]
86 changes: 82 additions & 4 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import com.google.protobuf.gradle.*

plugins {
java
jacoco
id("org.springframework.boot") version "4.0.1"
id("io.spring.dependency-management") version "1.1.7"
id("com.google.protobuf") version "0.9.4"
}

group = "com.devoops"
Expand All @@ -18,18 +22,92 @@ repositories {
mavenCentral()
}

val grpcVersion = "1.68.0"

dependencies {
implementation("org.springframework.boot:spring-boot-starter-flyway")
implementation("org.springframework.boot:spring-boot-starter-security")
// Web and Core
implementation("org.springframework.boot:spring-boot-starter-webmvc")
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("org.springframework.boot:spring-boot-starter-validation")


// Prometheus
implementation("io.micrometer:micrometer-registry-prometheus")

// Database
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-flyway")
implementation("org.flywaydb:flyway-database-postgresql")
runtimeOnly("org.postgresql:postgresql")
testImplementation("org.springframework.boot:spring-boot-starter-flyway-test")
testImplementation("org.springframework.boot:spring-boot-starter-security-test")

// Lombok
compileOnly("org.projectlombok:lombok")
annotationProcessor("org.projectlombok:lombok")

// MapStruct
implementation("org.mapstruct:mapstruct:1.6.3")
annotationProcessor("org.mapstruct:mapstruct-processor:1.6.3")
annotationProcessor("org.projectlombok:lombok-mapstruct-binding:0.2.0")

// MinIO S3-compatible object storage
implementation("io.minio:minio:8.5.7")

// gRPC Client and Server
implementation("net.devh:grpc-client-spring-boot-starter:3.1.0.RELEASE")
implementation("net.devh:grpc-server-spring-boot-starter:3.1.0.RELEASE")
implementation("io.grpc:grpc-protobuf:$grpcVersion")
implementation("io.grpc:grpc-stub:$grpcVersion")
implementation("io.grpc:grpc-netty-shaded:$grpcVersion")
compileOnly("javax.annotation:javax.annotation-api:1.3.2")

// Tracing (Zipkin)
implementation("org.springframework.boot:spring-boot-micrometer-tracing-brave")
implementation("org.springframework.boot:spring-boot-starter-zipkin")
implementation("io.micrometer:micrometer-tracing-bridge-brave")
implementation("io.zipkin.reporter2:zipkin-reporter-brave")

// Logging
implementation("net.logstash.logback:logstash-logback-encoder:8.0")

// Test
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test")
testImplementation("org.testcontainers:junit-jupiter:1.20.4")
testImplementation("org.testcontainers:postgresql:1.20.4")
testImplementation("org.testcontainers:minio:1.20.4")
testImplementation("io.rest-assured:rest-assured:5.5.0")

testCompileOnly("org.projectlombok:lombok")
testAnnotationProcessor("org.projectlombok:lombok")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}

protobuf {
protoc {
artifact = "com.google.protobuf:protoc:3.25.5"
}
plugins {
id("grpc") {
artifact = "io.grpc:protoc-gen-grpc-java:$grpcVersion"
}
}
generateProtoTasks {
all().forEach { task ->
task.plugins {
id("grpc")
}
}
}
}

tasks.withType<Test> {
useJUnitPlatform()
finalizedBy(tasks.jacocoTestReport)
}

tasks.jacocoTestReport {
dependsOn(tasks.test)
reports {
xml.required = true
}
}
21 changes: 21 additions & 0 deletions environment/.local.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
SERVER_PORT=8080
LOGSTASH_HOST=logstash:5000
ZIPKIN_HOST=zipkin
ZIPKIN_PORT=9411
POSTGRES_HOST=devoops-postgres
POSGTES_PORT=5432
DB_USERNAME=accommodation-service
DB_PASSWORD=accommodation-service-pass

# MinIO configuration
MINIO_ENDPOINT=http://devoops-minio:9000
MINIO_ACCESS_KEY=devoops
MINIO_SECRET_KEY=devoops123
MINIO_BUCKET=accommodation-photos

# gRPC Server
GRPC_PORT=9090

# gRPC Client
RESERVATION_GRPC_HOST=devoops-reservation-service
RESERVATION_GRPC_PORT=9090
54 changes: 54 additions & 0 deletions environment/helm/values.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
fullnameOverride: devoops-accommodation-service
replicaCount: 1

image:
registry: docker.io
repository: threeamigoscoding/devoops-accommodation-service
tag: "latest"
pullPolicy: IfNotPresent

service:
type: ClusterIP
httpPort: 8080
grpc:
enabled: true
port: 9090

ingress:
enabled: false

resources:
requests:
memory: 256Mi
cpu: 250m
limits:
memory: 512Mi

health:
path: /actuator/health
periodSeconds: 10
failureThreshold: 3
startup:
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 60

configData:
JAVA_TOOL_OPTIONS: "-XX:+UseSerialGC -Xms128m -Xmx384m -XX:ActiveProcessorCount=1"
SERVER_PORT: "8080"
LOGSTASH_HOST: "devoops-logstash:5000"
ZIPKIN_HOST: "devoops-jaeger"
ZIPKIN_PORT: "9411"
POSTGRES_HOST: "devoops-postgres"
POSGTES_PORT: "5432"
MINIO_ENDPOINT: "http://devoops-minio:9000"
MINIO_BUCKET: "accommodation-photos"
GRPC_PORT: "9090"
RESERVATION_GRPC_HOST: "devoops-reservation-service"
RESERVATION_GRPC_PORT: "9090"

secretData:
DB_USERNAME: "accommodation-service"
DB_PASSWORD: "accommodation-service-pass"
MINIO_ACCESS_KEY: "devoops"
MINIO_SECRET_KEY: "devoops123"
Empty file modified gradlew
100644 → 100755
Empty file.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
@SpringBootApplication
public class AccommodationApplication {

public static void main(String[] args) {
static void main(String[] args) {
SpringApplication.run(AccommodationApplication.class, args);
}

Expand Down
27 changes: 27 additions & 0 deletions src/main/java/com/devoops/accommodation/config/MinioConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.devoops.accommodation.config;

import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MinioConfig {

@Value("${minio.endpoint}")
private String endpoint;

@Value("${minio.access-key}")
private String accessKey;

@Value("${minio.secret-key}")
private String secretKey;

@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, secretKey)
.build();
}
}
12 changes: 12 additions & 0 deletions src/main/java/com/devoops/accommodation/config/RequireRole.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.devoops.accommodation.config;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequireRole {
String[] value();
}
Loading