diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..5fa0cf9
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,4 @@
+DBURL=postgres:5432
+DBNAME=library-app
+DBUSERNAME=library_app
+DBPASSWORD=replace-with-a-local-password
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..f89d566
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,59 @@
+name: CI
+
+on:
+ push:
+ branches: [main]
+ pull_request:
+
+permissions:
+ contents: read
+
+concurrency:
+ group: ci-${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ verify:
+ runs-on: ubuntu-24.04
+ timeout-minutes: 15
+
+ services:
+ postgres:
+ image: postgres:16-alpine
+ env:
+ POSTGRES_USER: library_app
+ POSTGRES_PASSWORD: local-ci-password
+ POSTGRES_DB: library-app
+ ports:
+ - 5432:5432
+ options: >-
+ --health-cmd "pg_isready -U library_app -d library-app"
+ --health-interval 5s
+ --health-timeout 5s
+ --health-retries 10
+
+ env:
+ DBURL: localhost:5432
+ DBNAME: library-app
+ DBUSERNAME: library_app
+ DBPASSWORD: local-ci-password
+
+ steps:
+ - name: Check out fork
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
+
+ - name: Set up Java 17
+ uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5
+ with:
+ distribution: temurin
+ java-version: "17"
+ cache: maven
+
+ - name: Test and package
+ run: ./mvnw --batch-mode --no-transfer-progress verify
+
+ - name: Validate Compose contract
+ run: docker compose --env-file .env.example config --quiet
+
+ - name: Build Java 17 container
+ run: docker build --tag library-app-spring-boot:ci .
diff --git a/.gitignore b/.gitignore
index 8b1360c..374b2c5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -32,4 +32,5 @@ build/
### VS Code ###
.vscode/
-.DS_Store
\ No newline at end of file
+.DS_Store
+.env
diff --git a/Dockerfile b/Dockerfile
index 647dccc..0470110 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,20 +1,18 @@
-# syntax=docker/dockerfile:1.2
-
-FROM maven AS build
+FROM maven:3.9-eclipse-temurin-17 AS build
WORKDIR /app
# Copy only the pom.xml and download dependencies
COPY ./pom.xml /app
-RUN --mount=type=cache,target=/root/.m2 mvn dependency:go-offline
+RUN mvn --batch-mode --no-transfer-progress dependency:go-offline
# Copy the rest of the project files
COPY ./src /app/src
# Build the project
-RUN --mount=type=cache,target=/root/.m2 mvn clean package -DskipTests
+RUN mvn --batch-mode --no-transfer-progress clean package -DskipTests
-FROM openjdk
+FROM eclipse-temurin:17-jre-jammy
WORKDIR /app
diff --git a/README.md b/README.md
index 981c9fa..af59cd0 100644
--- a/README.md
+++ b/README.md
@@ -2,6 +2,17 @@
Kütüphaneler tarafından kullanılabilecek kayıt yönetimlerini, kitap ödünç verme ve alma işlemlerini yapabilecekleri Rest API projesidir.
+> **Fork durumu:** Bu depo, [gorbadil/LibraryAppSpringBoot](https://github.com/gorbadil/LibraryAppSpringBoot) projesinin fork'udur; özgün projenin tamamı Okan'a aitmiş gibi sunulmaz. [Okan'ın upstream'den sonraki 10 commit'i](https://github.com/gorbadil/LibraryAppSpringBoot/compare/main...okturan:main) örnek veri yükleme, global hata yönetimi, repository/service düzeltmeleri, tek alanlı kategori ve yayınevi güncelleme hataları, silme hataları, Docker veri davranışı ve kurulum dokümantasyonu üzerinde çalışır.
+
+## Okan Tarafından Eklenen Farklar
+
+- Tekrarlanabilir örnek kütüphane verisi üreten `DataLoader`.
+- API hatalarını tutarlı yanıtlara dönüştüren global exception handler.
+- Yalnız adres/açıklama alanı değiştiğinde başarısız olan yayınevi ve kategori güncellemelerinin düzeltilmesi.
+- Silme hatalarının ve repository sorgularının iyileştirilmesi.
+- Java 17'ye sabitlenmiş container build/runtime aşamaları ve PostgreSQL servis sağlık kontrolü.
+- Kaynakta parola tutmayan Compose yapılandırması ve Java 17/PostgreSQL CI doğrulaması.
+
## Kullanılan Teknolojiler

@@ -72,19 +83,25 @@ Aşağıda, API'nin sunduğu temel endpoint'lerin bir listesi bulunmaktadır:
1. Projeyi klonlayın.
- `git clone https://github.com/okturan/LibraryAppSpringBoot.git`
2. Docker yüklü ise,
- 1. `docker-compose up`
- 2. `src/main/resources/application.properties` dosyasında veri tabanı konfigürasyonunu yapın.
-3. Projeyi ayağa kaldırmak için IDE'nizden start edin.
+ 1. `cp .env.example .env`
+ 2. `.env` içindeki yerel veritabanı kullanıcı adı ve parolasını değiştirin.
+ 3. `docker compose up --build`
+3. Docker olmadan çalıştırmak için aşağıdaki ortam değişkenlerini tanımlayıp `./mvnw spring-boot:run` komutunu kullanın.
4. Swagger üzerinden API kullanılabilir. Tarayıcınızdan [http://localhost:8080/swagger-ui/index.html#/](http://localhost:8080/swagger-ui/index.html#/)'e gidin.
5. End pointlere istek atabilirsiniz.
## Ortam Değişkenleri
-Bu projeyi çalıştırmak için aşağıdaki ortam değişkenlerini application.properties dosyasından değiştirmelisiniz.
+Bu projeyi çalıştırmak için aşağıdaki ortam değişkenlerini tanımlayın; gerçek kimlik bilgilerini `application.properties`, `.env.example` veya Git geçmişine yazmayın.
+
+- `DBURL` — ör. `localhost:5432`
+- `DBNAME` — ör. `library-app`
+- `DBUSERNAME`
+- `DBPASSWORD`
+
+## Doğrulama
-spring.datasource.url
-spring.datasource.username
-spring.datasource.password
+GitHub Actions, PostgreSQL servis konteyneri üzerinde Java 17 ile Maven testlerini ve paketlemeyi çalıştırır; ardından Compose yapılandırmasının örnek ortam dosyasıyla çözümlendiğini ve uygulama container'ının Java 17 tabanında üretildiğini doğrular. Bu bir fork olduğundan, doğrulama Okan'ın farkını kanıtlar; upstream kaynakların yazarlığını değiştirmez.
## Lisans
diff --git a/docker-compose.yaml b/docker-compose.yaml
index e97c96b..fe16aff 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -6,18 +6,23 @@ services:
depends_on:
- postgres
environment:
- DBURL: postgres:5432
- DBNAME: library-app
- DBUSERNAME: postgres
- DBPASSWORD: postgres
+ DBURL: ${DBURL:-postgres:5432}
+ DBNAME: ${DBNAME:-library-app}
+ DBUSERNAME: ${DBUSERNAME:?set DBUSERNAME in .env}
+ DBPASSWORD: ${DBPASSWORD:?set DBPASSWORD in .env}
postgres:
- image: postgres
+ image: postgres:16-alpine
ports:
- 5432:5432
environment:
- POSTGRES_USER: postgres
- POSTGRES_PASSWORD: postgres
- POSTGRES_DB: library-app
+ POSTGRES_USER: ${DBUSERNAME:?set DBUSERNAME in .env}
+ POSTGRES_PASSWORD: ${DBPASSWORD:?set DBPASSWORD in .env}
+ POSTGRES_DB: ${DBNAME:-library-app}
+ healthcheck:
+ test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
+ interval: 5s
+ timeout: 5s
+ retries: 10
volumes:
- - /var/lib/postgresql/data
\ No newline at end of file
+ - /var/lib/postgresql/data
diff --git a/mvnw b/mvnw
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
index fa8c152..51d274c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -36,7 +36,7 @@
org.postgresql
postgresql
- 42.7.3
+ 42.7.11