ministore-api

Crystal ile yazılmış küçük e-ticaret arka uç servisi: GitHub OAuth 2.0, ürün süzme/sayfalama, sepet ve sipariş uçları

ministore-api

Crystal dili ile yazılmış küçük bir e-ticaret arka uç (backend) servisi. Ürün listeleme/süzme, sepet ve sipariş uçlarının yanında GitHub üzerinden OAuth 2.0 ile giriş içerir.

Bu proje, 2026 yaz dönemi zorunlu staj çalışması kapsamında öğrendiğim konuları (katmanlı yapı, REST uçları, süzme ve sayfalama, oturum yönetimi, birim testleri) tek bir küçük örnekte toplamak için yazıldı.

Neden Crystal?

Ruby'ye çok yakın, okunması kolay bir sözdizimi sunarken statik tiplidir ve yerel makine koduna derlenir. Yazarken betik dili rahatlığı, çalışırken derlenmiş dil hızı veriyor. Tüm proje standart kütüphane ile yazıldı; hiçbir dış paket bağımlılığı yok, shards install çalıştırmaya gerek kalmıyor.

Özellikler

  • GitHub OAuth 2.0 yetkilendirme kodu akışı (CSRF'e karşı tek kullanımlık state değeri ile)
  • HMAC-SHA256 ile imzalanmış, süreli oturum belirteçleri
  • Ürün listeleme: kategori + fiyat aralığı süzme, sıralama, sayfalama
  • Sepet ve sipariş uçları; sipariş oluşturulurken stok kontrolü ve stok düşme tek kilit altında
  • Gelen verinin doğrulanması ve tutarlı hata gövdeleri ({"error": ..., "message": ...})
  • 13 birim testi

Kurulum

git clone https://github.com/mustafa3rsan/ministore-api.git
cd ministore-api
cp .env.example .env      # değerleri doldurun

crystal run src/ministore.cr          # geliştirme
crystal build src/ministore.cr -o bin/ministore-api --release   # üretim derlemesi
crystal spec                          # testler

Ortam değişkenleri

Değişken Açıklama
GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRET GitHub OAuth uygulama bilgileri
OAUTH_REDIRECT_URI Varsayılan: http://localhost:3000/auth/github/callback
APP_SECRET Oturum belirteçlerinin imzalanma anahtarı
ALLOW_DEV_LOGIN true ise GitHub olmadan deneme girişi açılır
PORT Varsayılan: 3000

OAuth akışı

  tarayıcı                ministore-api                 github.com
     |                          |                            |
     |  GET /auth/github        |                            |
     |------------------------->|  state üret + sakla        |
     |   302 -> github.com/login/oauth/authorize ----------->|
     |                          |                            |
     |<--- 302 /auth/github/callback?code=..&state=.. -------|
     |------------------------->|  state doğrula             |
     |                          |  POST /login/oauth/access_token
     |                          |--------------------------->|
     |                          |<------- access_token ------|
     |                          |  GET /user  --------------->|
     |                          |<------- kullanıcı ---------|
     |<-- {"token": "...", "user": {...}} ------------------ |

Uç noktalar

Metot Yol Açıklama
GET /health Sağlık denetimi
GET /auth/github GitHub'a yönlendirir
GET /auth/github/callback Kodu belirteçle takas eder, oturum açar
POST /auth/dev-login Geliştirme girişi (yalnızca ALLOW_DEV_LOGIN=true iken)
GET /api/me Oturumdaki kullanıcı
GET /api/products category, min_price, max_price, sort, direction, page, per_page
GET /api/products/:id Ürün ayrıntısı
GET /api/cart Sepeti getirir
POST /api/cart/items Sepete ürün ekler
DELETE /api/cart Sepeti boşaltır
GET /api/orders Siparişleri listeler
POST /api/orders Sepetten sipariş oluşturur

Yetki gerektiren uçlar Authorization: Bearer <token> başlığı bekler.

Örnek kullanım

# ürünleri süz ve sırala
curl "http://localhost:3000/api/products?category=kitap&sort=price&direction=desc"

# geliştirme girişi ile belirteç al
TOKEN=$(curl -s -X POST http://localhost:3000/auth/dev-login \
        -d '{"login":"mustafa"}' | jq -r .token)

# sepete ekle ve sipariş oluştur
curl -X POST http://localhost:3000/api/cart/items \
     -H "Authorization: Bearer $TOKEN" \
     -H 'Content-Type: application/json' \
     -d '{"product_id": 2, "quantity": 2}'

curl -X POST http://localhost:3000/api/orders -H "Authorization: Bearer $TOKEN"

Proje yapısı

src/
  ministore.cr   # giriş noktası, sunucu ve ara katmanlar
  router.cr      # yönlendirme, doğrulama, hata gövdeleri
  store.cr       # bellek içi veri deposu (veri tabanı katmanının yerini tutar)
  models.cr      # Product, User, CartItem, Order
  auth.cr        # oturum belirteci üretme/doğrulama
  oauth.cr       # GitHub OAuth 2.0 akışı
spec/            # birim testleri

Bilinen sınırlar

Veriler bellekte tutulur, servis yeniden başladığında sıfırlanır. Amaç akışı göstermek olduğu için veri tabanı, ödeme ve kargo entegrasyonları kapsam dışı bırakıldı.

Lisans

MIT

Repository

ministore-api

Owner
Statistic
  • 0
  • 0
  • 0
  • 0
  • 0
  • about 2 hours ago
  • September 17, 2026
License

MIT License

Links
Synced at

Thu, 17 Sep 2026 07:41:56 GMT

Languages