POS Entegrasyonu

Java Spring Boot Örneği

Spring Boot 3.4 ile Java 17 kullanan POS servisi referans uygulaması.

Bu, Saha POS Arayüzü (SPI) ile entegre olan bir POS servisinin referans uygulamasıdır. Spring Boot 3.4 ile Java 17 kullanarak gerekli uç noktaların nasıl uygulanacağını göstermektedir.

Kaynak Kod

Tam kaynak kodu GitHub'da görüntüleyin.

Gereksinimler

  • Java 17 veya üstü
  • Maven 3.9+ (veya dahil edilen Maven wrapper'ı kullanın)

Servisi Çalıştırma

Örnek dizinine gidin

cd examples/java-springboot

Maven kullanarak servisi çalıştırın

./mvnw spring-boot:run

Windows'ta:

mvnw.cmd spring-boot:run

Servis 5000 portunda başlayacaktır.

Servisi Test Etme

Uç noktaları curl veya sağlanan Postman koleksiyonu kullanarak test edebilirsiniz.

Kimlik Doğrulama

Servis bir Authorization başlığı bekler. Örnek, eksikse bir uyarı loglar ancak gösterim amaçlı herhangi bir değeri kabul eder.

Örnek İstekler

Ürünleri Al

curl -H "Authorization: Bearer secret" http://localhost:5000/products

Sayfalama ile Ürünleri Al

curl -H "Authorization: Bearer secret" "http://localhost:5000/products?cursor=10"

Sipariş Oluştur

curl -X POST http://localhost:5000/orders \
  -H "Authorization: Bearer secret" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {
        "product_id": "prod-1",
        "quantity": 1,
        "note": "No onions",
        "options": [
          {"name": "opt-doneness", "values": ["medium"]},
          {"name": "opt-extras", "values": ["extra-cheese"]}
        ]
      }
    ],
    "location": "loc-table-1",
    "note": "Allergy: Peanuts",
    "number_of_people": 2
  }'

Sipariş Durumunu Al

{order_id} yerine sipariş oluşturma yanıtından dönen ID'yi yazın.

curl -H "Authorization: Bearer secret" http://localhost:5000/orders/{order_id}

Siparişi İptal Et

curl -X POST http://localhost:5000/orders/{order_id}/cancel \
  -H "Authorization: Bearer secret" \
  -H "Content-Type: application/json" \
  -d '{"reason": "Customer changed mind"}'

Konumları Al

curl -H "Authorization: Bearer secret" http://localhost:5000/locations

Uygulama Detayları

ÖzellikAçıklama
Spring Boot 3.4Java 17+ ile en son Spring Boot'u kullanır
Java RecordsTüm DTO'lar için modern değişmez veri sınıfları
snake_case JSONJackson yapılandırması ile otomatik dönüşüm
In-Memory StoreThread-safe sipariş depolama için ConcurrentHashMap kullanır
ValidationNet hata mesajlarıyla istek doğrulama
LoggingSLF4J ile yapılandırılmış loglama

Proje Yapısı

src/main/java/com/saha/spi/
├── SpiExampleApplication.java     # Ana Spring Boot uygulaması
├── config/
│   └── AppConfig.java             # Uygulama yapılandırması
├── controller/
│   └── SpiController.java         # REST API uç noktaları
├── model/
│   ├── Category.java              # Ürün kategorisi
│   ├── CancelOrderRequest.java    # Sipariş iptal isteği DTO
│   ├── CreateOrderRequest.java    # Sipariş oluşturma isteği DTO
│   ├── CreateOrderResponse.java   # Sipariş oluşturma yanıtı DTO
│   ├── ErrorResponse.java         # Hata yanıtı DTO
│   ├── Location.java              # Konum/masa
│   ├── OrderItem.java             # Sipariş satır öğesi
│   ├── OrderItemOption.java       # Sipariş öğesi seçenek seçimi
│   ├── OrderStatus.java           # Sipariş durumu enum
│   ├── OrderStatusResponse.java   # Sipariş durumu yanıtı DTO
│   ├── Product.java               # Ürün entity
│   ├── ProductOption.java         # Ürün seçeneği/modifier
│   ├── ProductOptionValue.java    # Fiyatlı seçenek değeri
│   ├── ProductsResponse.java      # Ürün listesi yanıtı
│   └── StoredOrder.java           # Dahili sipariş depolama
└── service/
    └── DataService.java           # Veri erişimi ve depolama

Temel Özellikler

Modern Java 17+ Özellikleri

  • Record Classes: Otomatik equals/hashCode/toString ile değişmez DTO'lar
  • Pattern Matching: Geliştirilmiş switch ifadeleri ve instanceof

Sipariş Durumu Simülasyonu

Siparişler otomatik olarak durumlar arasında ilerler:

  • acceptedin_progress (5 saniye sonra)
  • in_progressready (toplam 15 saniye sonra)

Çoklu Dil Desteği

Çevrilebilir alanlar için her iki yaklaşımı da gösterir:

  • Basit stringler: "name": "Cola"
  • Dil map'leri: "name": {"en": "Classic Burger", "tr": "Klasik Burger"}

Yapılandırma

Uygulama application.properties veya ortam değişkenleri ile yapılandırılabilir:

ÖzellikVarsayılanAçıklama
server.port5000HTTP sunucu portu
spring.jackson.property-naming-strategySNAKE_CASEJSON alan adlandırması