API Dokümantasyonu

Atlas ana API'si (main-api) ve alt mikroservislerin HTTP uç nokta referansı

Servisler & Adresler

ServisContainerPort
main-web (Nuxt panel)atlas_main_web20000
main-apiatlas_main_api20001 → 3000
auth-apiatlas_auth_api20005 → 3000
feedback-apiatlas_feedback_api20002
errorlog-apiatlas_errorlog_api20003
PostgreSQL (Timescale)atlas_postgres20004
Redisatlas_redis20007

Önerilen erişim: panel proxy'si üzerinden http://localhost:20000/api/v1/.../api/v1/auth/** auth-api'ye, diğer /api/** main-api'ye yönlenir.

Kimlik Doğrulama

/health dışındaki tüm /api/v1/** uçları bir API anahtarı ister:

X-API-Key: <anahtar>
// veya
Authorization: Bearer <anahtar>
  • Panel anahtarıFRONTEND_API_KEY, panelin tüm yönetim çağrıları
  • Uygulama anahtarı/apikeys ile üretilir, bir uygulamaya bağlıdır
  • X-User-Id — sahiplik gerektiren uçlarda kullanıcı kimliği için ek başlık

Eksik/geçersiz anahtar → 401. Hata formatı: { "error": "mesaj" }

Health

Servis sağlık kontrolü. Monitoring için API anahtarı gerekmez.

GET/health

Servisin ayakta olup olmadığını döner

Yok (public)

Yanıt

200
{ "status": "ok", "service": "atlas" }
// auth-api → { "status": "ok", "service": "atlas-auth" }

cURL Örneği

curl http://localhost:20000/health

Auth

auth-api servisinde (authService/, port 20005). Panel proxy'si üzerinden /api/v1/auth/... ile de erişilir.

POST/api/v1/auth/verify

Hibrit kimlik doğrulama: yerel DB → kullanıcı yoksa veya hash uyuşmazsa Bandırma ÜniAPI

Panel anahtarı

Parametreler

AlanTipKural
usernamestringzorunlu, 2–100
passwordstringzorunlu, 6–128

İstek Gövdesi

{
  "username": "berkeergocun@ogr.bandirma.edu.tr",
  "password": "••••••"
}

Yanıt

200
{
  "valid": true,
  "authorized": true,
  "user_id": "uuid",
  "username": "…",
  "email": "…"
}
  • valid=false → kimlik hatalı (200 döner, gövdede valid:false)
  • Yerel parola hash’i uyuşmazsa Atlas ÜniAPI’ye fallback yapar; doğrulama başarılıysa yerel hash otomatik yenilenir
  • authorized=false → kimlik doğru ama panele yetkisi yok (tablo boşsa herkes yetkili — bootstrap modu)

cURL Örneği

curl -X POST http://localhost:20005/api/v1/auth/verify \
  -H "X-API-Key: $FRONTEND_API_KEY" -H "Content-Type: application/json" \
  -d '{"username":"user@ogr.bandirma.edu.tr","password":"secret"}'
POST/api/v1/auth/login

Kimlik doğrular ve merkezi oturum açar (dış uygulamalar için)

Uygulama anahtarı

İstek Gövdesi

{ "username": "10651974520", "password": "••••••" }

Yanıt

201
{
  "token": "64-hex-opaque-token",
  "expires_at": "2026-07-24T10:00:00Z",
  "authorized": false,
  "user": { "id": "uuid", "username": "…", "email": "…" }
}
401
{ "error": "Kullanıcı adı veya şifre hatalı" }
  • Oturum, çağıran uygulama anahtarına bağlanır — token yalnızca o anahtarla doğrulanabilir
  • authorized: kullanıcının panele erişim yetkisi (bilgi amaçlı, oturumu etkilemez)

cURL Örneği

curl -X POST http://localhost:20005/api/v1/auth/login \
  -H "X-API-Key: <uygulama-anahtarı>" -H "Content-Type: application/json" \
  -d '{"username":"user@ogr.bandirma.edu.tr","password":"secret"}'
POST/api/v1/auth/validate

Opaque oturum token'ını doğrular

Uygulama anahtarı

İstek Gövdesi

{ "token": "64-hex-opaque-token" }

Yanıt

200 — geçerli
{
  "valid": true,
  "expires_at": "…",
  "user": { "id": "uuid", "username": "…", "email": "…" },
  "access": {
    "application_id": "uuid",
    "is_owner": false,
    "roles": ["viewer"],
    "permissions": ["report:read"]
  }
}
401 — geçersiz/süresi dolmuş
{ "valid": false }
  • Token gövdede token alanında veya Authorization: Bearer başlığında gönderilebilir
POST/api/v1/auth/logout

Token'a ait oturumu iptal eder

Uygulama anahtarı

İstek Gövdesi

{ "token": "64-hex-opaque-token" }

Yanıt

200
{ "message": "Oturum kapatıldı" }
GET/api/v1/auth/sessions?user_id=<uuid>

Bir kullanıcının oturumlarını listeler (yönetim/panel)

Panel anahtarı

Yanıt

200
{
  "sessions": [
    {
      "id": "uuid", "user_id": "uuid", "application_id": "uuid",
      "ip_address": "…", "user_agent": "…",
      "created_at": "…", "last_seen_at": "…", "expires_at": "…", "revoked_at": null
    }
  ]
}
DELETE/api/v1/auth/sessions/:id

Belirli bir oturumu iptal eder

Panel anahtarı

Yanıt

204
No Content
404

Merkezi Oturum Açma (SSO)

Kullanıcı bir kez giriş yapar, tüm Atlas uygulamalarında oturumu geçerli olur. staj.bandirma.edu.tr’de giriş yapan kullanıcı harita’ya geçtiğinde giriş ekranını hiç görmez.

POST/api/v1/auth/sso/login

E-posta/parola ile giriş yapar ve GLOBAL oturum cookie’si yazar

Panel anahtarı

İstek Gövdesi

{ "email": "user@ogr.bandirma.edu.tr", "password": "…" }

Yanıt

201
{
  "authenticated": true,
  "authorized": true,
  "expires_at": "…",
  "user": { "id": "uuid", "username": "…", "email": "…" }
}

+ Set-Cookie: atlas_sso=…;
  Domain=.bandirma.edu.tr; HttpOnly; Secure; SameSite=Lax
401
{ "error": "Kullanıcı adı veya şifre hatalı" }
  • authorized kullanıcının panele erişim yetkisidir; SSO oturumu yine de açılır
  • Cookie HttpOnly’dir — JavaScript okuyamaz (XSS koruması)
POST/api/v1/auth/sso/passkey/discover

E-posta hesabında kayıtlı passkey olup olmadığını ve WebAuthn seçeneklerini döndürür

Panel anahtarı

İstek Gövdesi

{ "email": "user@ogr.bandirma.edu.tr" }

Yanıt

200 — passkey var
{
  "passkey_available": true,
  "challenge_id": "uuid",
  "public_key": { "challenge": "base64url", "rpId": "atlas.bandirma.edu.tr", "allowCredentials": [] }
}
200 — passkey yok
{ "passkey_available": false }
  • Challenge sunucuda tek kullanımlık ve kısa ömürlü saklanır; istemci yalnızca public key seçeneklerini alır
  • Kullanıcı bulunamadığında da genel passkey_available:false cevabı döner
POST/api/v1/auth/sso/passkey/login

WebAuthn assertion cevabını doğrular ve SSO cookie’si yazar

Panel anahtarı

İstek Gövdesi

{
  "challenge_id": "uuid",
  "credential": { "id": "…", "rawId": "base64url", "type": "public-key", "response": { "clientDataJSON": "…", "authenticatorData": "…", "signature": "…", "userHandle": "…" } }
}

Yanıt

201
{ "authenticated": true, "authorized": true, "method": "passkey", "user": { "id": "uuid", "username": "…", "email": "…" } }
401
{ "error": "Passkey doğrulaması başarısız" }
POST/api/v1/auth/sso/passkey/register/options

Geçerli SSO kullanıcısı için passkey kayıt seçeneklerini üretir

Panel veya uygulama anahtarı

Yanıt

200
{ "challenge_id": "uuid", "public_key": { "challenge": "base64url", "rp": { "id": "atlas.bandirma.edu.tr", "name": "Atlas" }, "user": { "id": "base64url", "name": "…", "displayName": "…" } } }
  • Yalnızca mevcut HttpOnly SSO cookie’si olan kullanıcı kendi hesabına passkey ekleyebilir
POST/api/v1/auth/sso/passkey/register

WebAuthn registration cevabını doğrular ve passkey’i hesaba kaydeder

Panel veya uygulama anahtarı

İstek Gövdesi

{ "challenge_id": "uuid", "credential": { "id": "…", "rawId": "base64url", "type": "public-key", "response": { "clientDataJSON": "…", "attestationObject": "…" } } }

Yanıt

201
{ "created": true }
401
{ "error": "Passkey kaydı doğrulanamadı" }
POST/api/v1/auth/sso/session

Cookie’den kimliği çözer — “bu tarayıcıda kim giriş yapmış?”

Panel veya uygulama anahtarı

Yanıt

200
{
  "authenticated": true,
  "authorized": true,
  "expires_at": "…",
  "user": { "id": "uuid", "username": "…", "email": "…" }
}
401
{ "authenticated": false }
  • Token sırayla cookieX-SSO-Token başlığı → gövdedeki token alanından okunur
  • Alt alan adındaki uygulamanın backend’i bunu çağırır (yol a)
  • ⚠️ Bu yolda uygulama ham SSO token’ını görür ve onunla diğer uygulamalarda kullanıcıyı taklit edebilir — yalnızca güvenilen birinci-taraf uygulamalar için. Üçüncü taraf için redirect akışını kullanın

cURL Örneği

curl -X POST -H "X-API-Key: $ATLAS_API_KEY" \
  -H "X-SSO-Token: $cookie_degeri" \
  http://localhost:20005/api/v1/auth/sso/session
GET/api/v1/auth/sso/authorize

Redirect akışının giriş kapısı — tek kullanımlık kod üretir

Yok (public)

Parametreler

AlanTipKural
application_iduuidzorunlu (query)
redirect_uristringzorunlu — uygulamada kayıtlı olmalı
statestringopsiyonel CSRF token’ı; aynen geri döner

Yanıt

302 — oturum var
Location: redirect_uri?code=<tek-kullanımlık>&state=…
302 — oturum yok
Location: /login?next=<authorize-url>
400
{ "error": "redirect_uri bu uygulama için kayıtlı değil" }
  • API anahtarı gerektirmez — tarayıcı buraya doğrudan gezinir ve gezinme isteğine başlık eklenemez
  • Güvenlik: HttpOnly cookie + uygulamaya kayıtlı redirect_uri beyaz listesi (birebir eşleşme, wildcard yok)
  • Kayıtsız adres için yönlendirme yapılmaz, 400 döner — open-redirect koruması
POST/api/v1/auth/sso/token

Tek kullanımlık kodu uygulamanın KENDİ oturum token’ıyla değiştirir

Uygulama anahtarı

İstek Gövdesi

{ "code": "…", "redirect_uri": "…" }

Yanıt

201
{
  "token": "uygulamanın kendi oturum token’ı",
  "expires_at": "…",
  "authorized": true,
  "user": { "id": "uuid", "username": "…", "email": "…" },
  "access": {
    "application_id": "uuid",
    "is_owner": false,
    "roles": ["viewer"],
    "permissions": ["report:read"]
  }
}
401
{ "error": "Yetkilendirme kodu geçersiz veya süresi dolmuş" }
403
panel anahtarı ile çağrıldı — uygulama anahtarı şart
  • Kod tek kullanımlıktır ve atomik tüketilir; ikinci deneme 401 döner
  • Ömrü SSO_CODE_TTL (varsayılan 60sn); uygulamaya ve redirect_uri’ye bağlıdır
  • Dönen token mevcut sessions tablosundadır — yalnızca çağıran uygulamanın anahtarıyla doğrulanabilir, izolasyon korunur
  • Rol ve izinler çağıran uygulamaya özeldir; /auth/validate her çağrıda güncel RBAC durumunu döndürür
POST/api/v1/auth/sso/logout

Global oturumu iptal eder — tüm uygulamalardan çıkış

Panel veya uygulama anahtarı

Yanıt

200
{ "message": "Oturum kapatıldı" }

SSO Dönüş Adresleri

Uygulamanın redirect akışında kullanabileceği izinli adresler. Yalnızca uygulama sahibi yönetebilir.

GET/api/v1/applications/:id/redirect-uris

İzinli dönüş adreslerini listeler

Panel anahtarı+ X-User-Id (sahiplik)

Yanıt

200
{ "redirect_uris": [ { "id": 1, "application_id": "uuid", "redirect_uri": "https://harita.bandirma.edu.tr/callback", "created_at": "…" } ], "count": 1 }
POST/api/v1/applications/:id/redirect-uris

İzinli dönüş adresi ekler

Panel anahtarı+ X-User-Id (sahiplik)

Parametreler

AlanTipKural
redirect_uristringzorunlu, 5–2048

İstek Gövdesi

{ "redirect_uri": "https://harita.bandirma.edu.tr/callback" }

Yanıt

201
  • Aynı adres zaten varsa mevcut kayıt döner (idempotent)
DELETE/api/v1/applications/:id/redirect-uris/:uriId

İzinli dönüş adresini siler

Panel anahtarı+ X-User-Id (sahiplik)

Yanıt

200
{ "message": "Dönüş adresi silindi" }
404

Loglar

Birleşik logs tablosu; scope ile ayrılır: system | application | service (TimescaleDB hypertable).

GET/api/v1/logs

Panelin kendi sistem logları (scope=system)

Panel anahtarı

Parametreler

AlanTipKural
limitintvarsayılan 100, maks 500
offsetintvarsayılan 0
levelstringdebug/info/warn/error/fatal
qstringmesajda arama (ILIKE)
from / toRFC3339zaman aralığı

Yanıt

200
{
  "logs": [
    {
      "id": "uuid", "ts": "2026-07-23T10:00:00Z", "scope": "system",
      "application_id": null, "service_id": null, "level": "info",
      "source": "http", "message": "POST /api/v1/apikeys → 201",
      "metadata": { "method": "POST", "path": "/api/v1/apikeys", "status": 201, "ip": "…" }
    }
  ],
  "total": 1240, "limit": 100, "offset": 0
}
POST/api/v1/logs/ingest

Dış uygulama/servis log gönderimi

Uygulama anahtarı

Parametreler

AlanTipKural
servicestringopsiyonel, kayıtlı servis slug'ı → scope=service; yoksa scope=application
levelstringopsiyonel, bilinmeyen → info
sourcestringopsiyonel
messagestringzorunlu, ≤10000
metadataobjectopsiyonel

İstek Gövdesi

{
  "service": "odeme-servisi",
  "level": "error",
  "source": "payment.go",
  "message": "Ödeme sağlayıcısına bağlanılamadı",
  "metadata": { "order_id": "1234" }
}

Yanıt

202
Accepted (gövdesiz)
  • application_id anahtardan çıkarılır — panel anahtarı ile çağrılırsa 403

cURL Örneği

curl -X POST http://localhost:20001/api/v1/logs/ingest \
  -H "X-API-Key: <uygulama-anahtarı>" -H "Content-Type: application/json" \
  -d '{"service":"odeme-servisi","level":"error","message":"Bağlantı hatası"}'
GET/api/v1/applications/:id/logs

Bir uygulamanın uygulama + servis logları

Panel anahtarı

Parametreler

AlanTipKural
service_idstringopsiyonel — yalnızca bu servisin logları
  • Ortak log query parametrelerini de kabul eder (limit, offset, level, q, from, to)
GET/api/v1/applications/:id/services/:serviceId/logs

Tek bir servisin logları

Panel anahtarı

Servisler (uygulama içi)

Bir uygulamanın içindeki kayıtlı servisler. Atlas her uygulamaya auth (Kimlik Doğrulama) ve roles (Rol ve Yetki Yönetimi) sistem servislerini otomatik ekler; başarılı giriş ve rol değişikliği kayıtları burada tutulur.

GET/api/v1/applications/:id/services

Uygulamanın servislerini listeler

Panel anahtarı

Yanıt

200
{
  "services": [
    { "id": "uuid", "application_id": "uuid", "name": "Kimlik Doğrulama",
      "slug": "auth", "description": "", "is_system": true, "created_at": "…", "updated_at": "…" }
  ]
}
  • is_system: true olan auth ve roles servisleri Atlas tarafından korunur; düzenlenemez veya silinemez
  • Giriş kayıtlarında parola, token ve TC kimlik bilgisi tutulmaz
POST/api/v1/applications/:id/services

Yeni servis oluşturur

Panel anahtarı

Parametreler

AlanTipKural
namestringzorunlu, 1–200
slugstringopsiyonel — boşsa name'den üretilir
descriptionstringopsiyonel, ≤1000

İstek Gövdesi

{ "name": "Ödeme Servisi", "slug": "odeme-servisi", "description": "opsiyonel" }

Yanıt

201
oluşturulan servis
409
aynı slug zaten var
PUT/api/v1/applications/:id/services/:serviceId

name ve description günceller (slug değişmez)

Panel anahtarı

Yanıt

200
403
Atlas sistem servisi düzenlenemez
404
DELETE/api/v1/applications/:id/services/:serviceId

Servisi siler (logları FK ON DELETE CASCADE ile silinir)

Panel anahtarı

Yanıt

204
403
Atlas sistem servisi silinemez
404

Uygulamalar

Oluşturma/güncelleme/silme için X-User-Id başlığı zorunludur (uygulama sahipliği).

GET/api/v1/applications

İstek yapan kullanıcının (X-User-Id) uygulamaları

Panel anahtarı

Yanıt

200
{ "applications": [ { "id":"uuid","name":"…","description":"…","wallpaper_url":"…","owner_id":"uuid","created_at":"…","updated_at":"…" } ], "count": 1 }
POST/api/v1/applications

Yeni uygulama oluşturur

Panel anahtarı+ X-User-Id (sahiplik)

Parametreler

AlanTipKural
namestringzorunlu, 2–200

İstek Gövdesi

{ "name": "Uygulama Adı", "description": "opsiyonel", "wallpaper_url": "opsiyonel" }

Yanıt

201
  • X-User-Id yoksa 401
GET/api/v1/applications/:id

Tek uygulama

Panel anahtarı

Yanıt

200
404
PUT/api/v1/applications/:id

Uygulamayı günceller

Panel anahtarı+ X-User-Id (sahiplik)
  • Sahibi değilse 403
DELETE/api/v1/applications/:id

Uygulamayı siler

Panel anahtarı+ X-User-Id (sahiplik)

Yanıt

200
{ "message": "Uygulama silindi" }
  • Sahibi değilse 403

Uygulama Kullanıcıları

Uygulamaya ek kullanıcı ve yetki atama. Yalnızca uygulama sahibi yapabilir.

GET/api/v1/applications/:id/users

Uygulamaya atanmış kullanıcılar

Panel anahtarı+ X-User-Id (sahiplik)

Yanıt

200
{ "users": [ { "application_id":"uuid","user_id":"uuid","permissions":["feedback:read"],"created_at":"…" } ], "count": 1 }
POST/api/v1/applications/:id/users

Kullanıcı ekler ve izin atar

Panel anahtarı+ X-User-Id (sahiplik)

Parametreler

AlanTipKural
user_iduuidzorunlu

İstek Gövdesi

{ "user_id": "uuid", "permissions": ["feedback:read", "error_log:read"] }

Yanıt

201
  • Sahibi değilse 403
DELETE/api/v1/applications/:id/users/:userId

Kullanıcıyı uygulamadan çıkarır

Panel anahtarı+ X-User-Id (sahiplik)

Yanıt

200
{ "message": "Kullanıcı çıkarıldı" }
  • Sahibi değilse 403

API Anahtarları

Servisler-arası uzun ömürlü anahtarlar. Ham anahtar yalnızca oluşturmada bir kez döner; DB'de sadece SHA-256 hash'i saklanır.

GET/api/v1/apikeys

Anahtarları listeler

Panel anahtarı

Yanıt

200
{ "keys": [ { "id":"uuid","application_id":"uuid","name":"…","key_prefix":"a1b2c3d4","created_at":"…","expires_at":null,"revoked_at":null } ], "count": 1 }
POST/api/v1/apikeys

Yeni anahtar üretir

Panel anahtarı

Parametreler

AlanTipKural
application_iduuidzorunlu
namestringzorunlu, 2–100
expires_atRFC3339opsiyonel — boş → süresiz

İstek Gövdesi

{ "application_id": "uuid", "name": "Servis Anahtarı", "expires_at": "2027-01-01T00:00:00Z" }

Yanıt

201
{
  "key": { "id":"uuid","name":"…","key_prefix":"a1b2c3d4" },
  "plain_key": "TAM-ANAHTAR-BUNU-SAKLAYIN",
  "message": "Anahtarı güvenli bir yerde saklayın. Bir daha gösterilmeyecek."
}
POST/api/v1/apikeys/:id/revoke

Anahtarı iptal eder

Panel anahtarı

Yanıt

200
{ "message": "Anahtar iptal edildi" }
404
DELETE/api/v1/apikeys/:id

Anahtarı kalıcı siler

Panel anahtarı

Yanıt

200
{ "message": "Anahtar silindi" }
404

CORS Yönetimi

Dinamik CORS whitelist — runtime'da eklenip silinebilir.

GET/api/v1/cors

İzinli origin listesi

Panel anahtarı

Yanıt

200
{ "origins": [ { "id": 1, "origin": "http://localhost:20000", "created_at": "…" } ] }
POST/api/v1/cors

Origin ekler

Panel anahtarı

İstek Gövdesi

{ "origin": "https://uygulama.example.com" }

Yanıt

201
DELETE/api/v1/cors/:id

Origin siler

Panel anahtarı

Yanıt

200

Yetkili E-postalar

Panele giriş yapabilecek e-postalar. Tablo boşken herkes girebilir (bootstrap modu).

GET/api/v1/authorized-emails

Yetkili e-posta listesi

Panel anahtarı

Yanıt

200
{ "emails": [ { "id": 1, "email": "admin@ogr.bandirma.edu.tr", "note": "Bilgi İşlem", "created_at": "…" } ] }
POST/api/v1/authorized-emails

E-posta ekler

Panel anahtarı

İstek Gövdesi

{ "email": "kullanici@ogr.bandirma.edu.tr", "note": "opsiyonel" }

Yanıt

201
409
zaten var
DELETE/api/v1/authorized-emails/:id

E-postayı siler

Panel anahtarı

Yanıt

200

Hızlı Erişim Bağlantıları

Kök sayfada (/) gösterilen dış sistem kısayolları.

GET/api/v1/quick-links

Bağlantı listesi

Panel anahtarı

Yanıt

200
{ "quick_links": [ { "id":1,"title":"…","url":"https://…","icon_url":"…","sort_order":0,"created_at":"…","updated_at":"…" } ], "count": 1 }
POST/api/v1/quick-links

Yeni bağlantı ekler

Panel anahtarı

Parametreler

AlanTipKural
titlestringzorunlu, 1–100
urlstringzorunlu, 5–2048
icon_urlstringopsiyonel, ≤2048
sort_orderint

İstek Gövdesi

{ "title": "OBS", "url": "https://obs.bandirma.edu.tr", "icon_url": "opsiyonel", "sort_order": 0 }

Yanıt

201
PUT/api/v1/quick-links/:id

Bağlantıyı günceller

Panel anahtarı

Yanıt

200
404
DELETE/api/v1/quick-links/:id

Bağlantıyı siler

Panel anahtarı

Yanıt

200
{ "message": "Bağlantı silindi" }

Profil (panel — UUID tabanlı)

Kullanıcı UUID’si elindeyken kullanılır. Full replace: gönderilmeyen alanlar boşalır.

GET/api/v1/profile/:user_id

Kullanıcı profilini getirir

Panel anahtarı

Yanıt

200
{ "user_id":"uuid","first_name":"…","last_name":"…","phone":"…","faculty":"…","department":"…","identity_no":"…","created_at":"…","updated_at":"…" }
404
PUT/api/v1/profile/:user_id

Profili oluşturur veya günceller (full replace)

Panel anahtarı

İstek Gövdesi

{ "first_name":"Berke","last_name":"Ergöçün","phone":"…","faculty":"…","department":"…","identity_no":"…" }

Yanıt

200
  • Tüm alanlar opsiyonel (uzunluk sınırları var)
  • Full replace — gönderilmeyen alanlar boşalır. Kısmi güncelleme için PATCH /users/profile kullanın

Kullanıcı Dizini (dış servisler)

Mobil uygulama vb. dış projeler kullanıcının fakülte/bölüm/kurum numarasını e-posta ile buradan okur ve geri yazar. Atlas bu bilginin tek kaynağıdır.

GET/api/v1/users/lookup?email=<e-posta>

E-posta ile fakülte, bölüm ve kurum numarasını döner

Panel veya uygulama anahtarı

Parametreler

AlanTipKural
emailstringzorunlu (query) — büyük/küçük harf duyarsız

Yanıt

200
{
  "user_id": "uuid",
  "username": "…",
  "email": "berke@ogr.bandirma.edu.tr",
  "user_type": "student",
  "first_name": "Berke",
  "last_name": "Ergöçün",
  "full_name": "Berke Ergöçün",
  "phone": "05001112233",
  "faculty": "Mühendislik Fakültesi",
  "department": "Bilgisayar Mühendisliği",
  "identity_no": "202112345",
  "profile_complete": true,
  "updated_at": "2026-07-26T09:12:00Z"
}
400
{ "error": "email parametresi zorunludur" }
404
{ "error": "Kullanıcı bulunamadı" }
  • user_type: student | staff | unknowne-posta alan adından türetilir, DB'de saklanmaz. Alan adı ogr. ile başlıyorsa öğrenci, aksi halde personel
  • identity_no: öğrenci numarası veya personel sicil no. ÜniAPI bunu döndürmez — elle girilir
  • profile_complete: fakülte + bölüm + numara üçü de doluysa true. false ise çağıran servis eksik bilgiyi sorup PATCH ile geri yazmalıdır
  • Profil henüz yoksa yine 200 döner; alanlar boş string olur
  • KVKK: TC kimlik (users.uni_student_id) bu yanıta dahil edilmezidentity_no ondan tamamen ayrı bir alandır

cURL Örneği

curl -H "X-API-Key: $ATLAS_API_KEY" \
  "http://localhost:20001/api/v1/users/lookup?email=ogrenci@ogr.bandirma.edu.tr"
PATCH/api/v1/users/profile?email=<e-posta>

Fakülte/bölüm/numarayı Atlas’a geri yazar (kısmi güncelleme)

Panel veya uygulama anahtarı

Parametreler

AlanTipKural
emailstringzorunlu (query)
first_namestringopsiyonel, ≤100
last_namestringopsiyonel, ≤100
phonestringopsiyonel, ≤30
facultystringopsiyonel, ≤200
departmentstringopsiyonel, ≤200
identity_nostringopsiyonel, ≤50

İstek Gövdesi

{
  "faculty": "Mühendislik Fakültesi",
  "department": "Bilgisayar Mühendisliği"
}

Yanıt

200
güncellenmiş dizin kaydı
(GET /users/lookup ile aynı format)
400
{ "error": "Güncellenecek en az bir alan gönderilmelidir" }
404
{ "error": "Kullanıcı bulunamadı" }
  • Merge semantiği — yalnızca gönderilen alanlar yazılır. Sadece fakülte/bölüm yazan bir servis, başka bir servisin doldurduğu ad/telefon bilgisini ezmez
  • Bir alanı boşaltmak için "" gönderin; korumak için gövdeye hiç koymayın
  • Uç kullanıcı oluşturmaz — kullanıcının önce Atlas üzerinden giriş yapmış olması gerekir

cURL Örneği

curl -X PATCH -H "X-API-Key: $ATLAS_API_KEY" -H "Content-Type: application/json" \
  -d '{"faculty":"Mühendislik Fakültesi","department":"Bilgisayar Mühendisliği","identity_no":"202112345"}' \
  "http://localhost:20001/api/v1/users/profile?email=ogrenci@ogr.bandirma.edu.tr"

Rol / Yetki Yönetimi

OneIdM modeli: kullanıcı rol talep eder, uygulama sahibi onaylar, rol atanır. Roller uygulama bazlıdır — her uygulama kendi rollerini ve modül izinlerini tanımlar.

GET/api/v1/users/access?email=<e-posta>&application_id=<uuid>

“Bu kullanıcı bu uygulamada ne yapabilir?” — entegrasyonun kalbi

Panel veya uygulama anahtarı

Parametreler

AlanTipKural
emailstringzorunlu (query)
application_iduuidzorunlu (query)

Yanıt

200
{
  "user_id": "uuid",
  "email": "ogrenci@ogr.bandirma.edu.tr",
  "application_id": "uuid",
  "is_owner": false,
  "roles": ["staj-komisyonu"],
  "permissions": ["staj:basvuru-oku", "staj:basvuru-onayla"]
}
404
{ "error": "Kullanıcı bulunamadı" }
  • Birden çok rolün izinleri birleştirilir (tekilleştirilmiş, sıralı)
  • Süresi dolmuş (expires_at) ve geri alınmış atamalar hariç tutulur
  • is_owner: true → uygulama sahibi, tüm rollerin izinlerine sahiptir
  • Yetkisi yoksa boş dizilerle 200 döner (404 değil)

cURL Örneği

curl -H "X-API-Key: $ATLAS_API_KEY" \
  "http://localhost:20001/api/v1/users/access?email=ogrenci@ogr.bandirma.edu.tr&application_id=<uuid>"
GET/api/v1/applications/:id/roles

Uygulamanın rol kataloğu

Panel anahtarı

Yanıt

200
{ "roles": [ { "id":"uuid","key":"staj-komisyonu","name":"Staj Komisyonu","description":"…","auto_grant":false,"permissions":["staj:basvuru-oku"] } ], "count": 1 }
  • Listeleme herkese açıktır — kullanıcı ne talep edebileceğini görsün diye
POST/api/v1/applications/:id/roles

Yeni rol tanımlar

Panel anahtarı+ X-User-Id (sahiplik)

Parametreler

AlanTipKural
namestringzorunlu, 2–200
keystringopsiyonel — boşsa name’den üretilir; sonradan DEĞİŞMEZ
descriptionstringopsiyonel, ≤1000
auto_grantbooltrue → talep anında onaylanır
permissionsstring[]modül/sayfa adları

İstek Gövdesi

{
  "name": "Staj Komisyonu",
  "auto_grant": false,
  "permissions": ["staj:basvuru-oku", "staj:basvuru-onayla"]
}

Yanıt

201
409
aynı key zaten var
  • key üretilirken Türkçe karakterler ASCII’ye indirgenir: “Staj Komisyonu” → staj-komisyonu
PUT/api/v1/applications/:id/roles/:roleId

Rolün adını, açıklamasını ve otomatik atama ayarını günceller

Panel anahtarı+ X-User-Id (sahiplik)

Parametreler

AlanTipKural
namestringopsiyonel, 2–200
descriptionstringopsiyonel, ≤1000
auto_grantboolopsiyonel

İstek Gövdesi

{ "name": "Staj Komisyonu", "auto_grant": true }

Yanıt

200
güncel rol
  • key güncellenmez; rolün sabit tanımlayıcısıdır
DELETE/api/v1/applications/:id/roles/:roleId

Rolü, atamalarını ve taleplerini siler

Panel anahtarı+ X-User-Id (sahiplik)

Yanıt

200
{ "message": "Rol silindi" }
  • Rol atamaları ve talepleri FK cascade ile silinir
PUT/api/v1/applications/:id/roles/:roleId/permissions

Rolün izin listesini tümüyle değiştirir

Panel anahtarı+ X-User-Id (sahiplik)

İstek Gövdesi

{ "permissions": ["staj:basvuru-oku", "staj:basvuru-onayla"] }

Yanıt

200
güncel rol
  • Tek transaction — kısmi güncelleme olmaz
POST/api/v1/access-requests

Kullanıcı bir rol için yetki talebi açar

Panel anahtarı+ X-User-Id (talep eden)

İstek Gövdesi

{ "role_id": "uuid", "justification": "Bölüm staj komisyonu üyesiyim" }

Yanıt

201
talep (status: "pending")

// auto_grant rol ise:
// status: "approved", rol anında atanır
409
{ "error": "Bu rol için zaten bekleyen bir talebiniz var" }
{ "error": "Bu role zaten sahipsiniz" }
GET/api/v1/access-requests/inbox

Onayımı bekleyen talepler (sahibi olduğum uygulamalar için)

Panel anahtarı+ X-User-Id (sahiplik)

Parametreler

AlanTipKural
statusstringopsiyonel — varsayılan pending

Yanıt

200
{
  "requests": [ {
    "id": "uuid", "status": "pending",
    "justification": "…",
    "role_key": "staj-komisyonu", "role_name": "Staj Komisyonu",
    "application_name": "Staj Sistemi",
    "user_email": "…", "created_at": "…"
  } ],
  "count": 1
}
GET/api/v1/access-requests

Kullanıcının kendi talepleri

Panel anahtarı+ X-User-Id

Parametreler

AlanTipKural
statusstringopsiyonel: pending|approved|rejected|cancelled
POST/api/v1/access-requests/:id/approve

Talebi onaylar VE rolü atar

Panel anahtarı+ X-User-Id (sahiplik)

İstek Gövdesi

{ "note": "Bölüm başkanlığı teyit etti" }

Yanıt

200
güncel talep (status: "approved")
403
uygulama sahibi değilsiniz
404
talep pending değil (zaten karara bağlanmış)
  • Karar atomiktir — iki onaylayıcı aynı anda karar veremez, ikinci deneme 404 döner
POST/api/v1/access-requests/:id/reject

Talebi reddeder (rol atanmaz)

Panel anahtarı+ X-User-Id (sahiplik)

Yanıt

200
DELETE/api/v1/access-requests/:id

Kullanıcı kendi bekleyen talebini geri çeker

Panel anahtarı+ X-User-Id

Yanıt

200
{ "message": "Talep geri çekildi" }
POST/api/v1/applications/:id/roles/:roleId/users

Sahip, talep beklemeden doğrudan rol atar

Panel anahtarı+ X-User-Id (sahiplik)

İstek Gövdesi

{ "email": "kullanici@ogr.bandirma.edu.tr" }

Yanıt

201
{ "message": "Rol atandı" }
DELETE/api/v1/applications/:id/roles/:roleId/users/:email

Kullanıcının rolünü geri alır

Panel anahtarı+ X-User-Id (sahiplik)

Yanıt

200
{ "message": "Rol geri alındı" }
  • Kayıt silinmez, revoked_at işaretlenir — denetim izi korunur

Alt Servis Veri Girişi (legacy)

X-App-ID başlığı bekler. Yeni entegrasyonlar için POST /api/v1/logs/ingest tercih edilmelidir.

POST/api/v1/error-logs

Uygulama bazlı hata kaydı ekler

Uygulama anahtarı

İstek Gövdesi

{ "level": "error", "message": "…", "stack_trace": "…", "metadata": {} }

Yanıt

201
  • Başlık: X-App-ID: <uygulama-uuid>
POST/api/v1/feedback

Uygulama bazlı geribildirim ekler

Uygulama anahtarı

İstek Gövdesi

{ "user_identifier": "opsiyonel", "message": "…", "rating": 5, "metadata": {} }

Yanıt

201
  • Başlık: X-App-ID: <uygulama-uuid>
  • rating 1–5 aralığında
GET/api/v1/applications/:appId/error-logs?limit=50

Bir uygulamanın hata kayıtlarını listeler (panel)

Panel anahtarı
GET/api/v1/applications/:appId/feedbacks?limit=50&status=read|unread

Bir uygulamanın geribildirimlerini, okuma durumuyla filtreleyerek listeler (panel)

Panel anahtarı

Parametreler

AlanTipKural
statusstringopsiyonel: read | unread; yoksa tümü
PATCH/api/v1/applications/:appId/feedbacks/:feedbackId

Geribildirimi okundu veya okunmadı olarak işaretler

Panel anahtarı+ X-User-Id

İstek Gövdesi

{ "read": true }

Yanıt

200
güncel geribildirim

Yönetici Veritabanı İşlemleri

SQL yedekleme ve geri yükleme. Uygulama rollerinden bağımsızdır: geçerli SSO oturumu, authorized_emails açık listesi ve X-Atlas-Admin-Request: 1 başlığı gerekir.

GET/api/v1/admin/database/dump

Tüm Atlas veritabanını düz SQL dosyası olarak indirir

Panel anahtarı+ geçerli SSO + X-Atlas-Admin-Request: 1

Yanıt

200
Content-Type: application/sql; atlas-YYYYMMDD-HHMMSS.sql
  • Yalnızca authorized_emails listesinde bulunan SSO kullanıcıları erişebilir
  • Dump, mevcut veritabanına geri yüklenebilmesi için clean/if-exists SQL üretir
POST/api/v1/admin/database/restore

Doğrulanmış SQL yedeğini veritabanına geri yükler

Panel anahtarı+ geçerli SSO + X-Atlas-Admin-Request: 1

Parametreler

AlanTipKural
filefilezorunlu, .sql, en fazla 64 MB (multipart/form-data)

Yanıt

200
{ "message": "SQL yedeği geri yüklendi" }
  • Yıkıcı işlemdir: başarılı geri yükleme mevcut veriyi değiştirir; önce dump alın
  • SQL hatasında tek transaction geri alınır
GET/api/v1/admin/login-audits

En son 200 başarılı giriş denetim kaydını döndürür

Panel anahtarı+ geçerli SSO + X-Atlas-Admin-Request: 1

Yanıt

200
{ "logs": [{ "user_id":"uuid", "email":"…", "ip_address":"…", "created_at":"…" }], "count": 1 }

Mikroservisler

Bağımsız Fiber servisleri, aynı PostgreSQL (atlas_db) üzerine yazar. app_id, panelde kayıtlı bir uygulamanın UUID'si olmalıdır.

POST/api/v1/error

Birleşik logs tablosuna yazar (scope=application, source=errorlog-service)

Panel veya uygulama anahtarı

İstek Gövdesi

{ "app_id": "uygulama-uuid", "level": "error", "message": "…", "stack_trace": "…" }

Yanıt

201
  • app_id ve message zorunlu
  • stack_trace, metadata.stack_trace içine konur
POST/feedbacks

Ana atlas_db'deki feedbacks tablosuna yazar

Panel veya uygulama anahtarı

İstek Gövdesi

{ "app_id": "uygulama-uuid", "user_identifier": "opsiyonel", "message": "…", "rating": 5 }

Yanıt

201
  • app_id ve message zorunlu

Referans: Log Scope & Level

scopeAnlamapplication_idservice_id
systemPanelin kendi operasyonel loglarıNULLNULL
applicationBir uygulamanın genel loglarıdoluNULL
serviceBir uygulamanın belirli servisinin loglarıdoludolu

level:debug · info · warn · error · fatal (bilinmeyen değer → info)

Saklama (TimescaleDB varsa): logs hypertable; 7 günden eski chunk'lar sıkıştırılır, 90 günden eskiler otomatik silinir. TimescaleDB yoksa düz tablo olarak sınırsız tutulur.