Aplikacja do zarządzania cytatami w PostgreSQL, z dwoma interfejsami:
- REST API (odczyt cytatów),
- CLI (dodawanie, edycja, usuwanie, import).
core- model domenowy, repozytorium JPA, serwis biznesowy.api- Spring Boot REST API.cli- aplikacja Spring Shell uruchamiana z JAR.
- Java 21
- Maven 3.9+
- PostgreSQL
- Skopiuj plik środowiskowy:
cp .env.example .env- Uzupełnij dane bazy w
.env:
SPRING_DATASOURCE_URLSPRING_DATASOURCE_USERNAMESPRING_DATASOURCE_PASSWORD
Przykład (local):
SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/quote_db
SPRING_DATASOURCE_USERNAME=quote
SPRING_DATASOURCE_PASSWORD=quote
SPRING_JPA_HIBERNATE_DDL_AUTO=updateUwaga: create-drop usuwa tabele przy zamykaniu aplikacji. Używaj go tylko do testów.
Z katalogu głównego projektu:
mvn clean packagePo buildzie CLI JAR znajduje się tutaj:
cli/target/cli-1.0.0.jar
mvn -pl api -am spring-boot:runDomyślnie API działa pod adresem:
http://localhost:8080
GET /api/quotes- lista cytatów (paginowana)GET /api/quotes/{id}- cytat po IDGET /api/quotes/random- losowy cytatGET /api/quotes/daily?date=<YYYY-MM-DD>- cytat dnia (ISO-8601 date)
Parametry query:
page- numer strony (od0), domyślnie0size- rozmiar strony, domyślnie20, maksymalnie100(większe wartości zwrócą400)sort- sortowanie, np.sort=id,ascalbo wielokrotniesort=author,asc&sort=id,desc
Przykłady:
curl "http://localhost:8080/api/quotes?page=0&size=20"curl "http://localhost:8080/api/quotes?page=1&size=50&sort=id,asc"Przykład:
curl "http://localhost:8080/api/quotes/daily?date=2026-02-18"Jednorazowo:
java --enable-native-access=ALL-UNNAMED -jar cli/target/cli-1.0.0.jarPATH przechowuje katalogi, nie pliki JAR, więc dodajemy katalog z launcherem uruchamiającym ten JAR.
- Utwórz katalog na własne komendy:
mkdir -p "$HOME/.local/bin"- W katalogu projektu ustaw zmienną z rootem repo:
PROJECT_ROOT="$(pwd)"- Dodaj launcher
quote-cli:
cat > "$HOME/.local/bin/quote-cli" <<SH
#!/usr/bin/env bash
set -euo pipefail
PROJECT_ROOT="$PROJECT_ROOT"
export QUOTE_API_ENV_FILE="\$PROJECT_ROOT/.env"
exec java --enable-native-access=ALL-UNNAMED -jar "\$PROJECT_ROOT/cli/target/cli-1.0.0.jar" "\$@"
SH
chmod +x "$HOME/.local/bin/quote-cli"- Dodaj katalog do
PATH(zsh):
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrcOd tego momentu uruchamiasz CLI globalnie:
quote-cliW produkcji ustawiaj konfigurację przez manager procesu (systemd, Docker, Kubernetes), zamiast lokalnego .env w repo.
Aplikacja obsługuje wskazanie pliku env przez QUOTE_API_ENV_FILE.
Przykład jednorazowo (CLI):
QUOTE_API_ENV_FILE=/etc/quote-api/quote-api.env quote-cli helpPrzykład jednorazowo (API):
QUOTE_API_ENV_FILE=/etc/quote-api/quote-api.env java -jar api/target/api-1.0.0.jarlist- lista cytatówadd "<autor>" <pl|en> "<cytat>"insert <sciezka-do-json>update <id> -a "<autor>" -l <pl|en> -q "<cytat>"delete <id>
Przykłady:
quote-cli add "Seneca" en "Luck is what happens when preparation meets opportunity"
quote-cli list
quote-cli update 1 -a "Marcus Aurelius"
quote-cli delete 1Plik powinien zawierać tablicę obiektów:
[
{
"author": "Seneca",
"language": "en",
"quote": "Luck is what happens when preparation meets opportunity"
},
{
"author": "Marek Aureliusz",
"language": "pl",
"quote": "Masz władzę nad swoim umysłem, nie nad zdarzeniami zewnętrznymi."
}
]- Dozwolone języki w modelu domenowym:
pl,en. - API odpowiada tylko za odczyt, operacje zapisu realizuje CLI.
- Domyślnie
size=20, więcGET /api/quotesnie spróbuje już ściągnąć całej tabeli. - Każde
size > 100dostanie400 Bad Requestz czytelnym komunikatem. - To samo dla
page < 0lubsize < 1.