Atlas ana API'si (main-api) ve alt mikroservislerin HTTP uç nokta referansı
Servisler & Adresler
| Servis | Container | Port |
|---|---|---|
| main-web (Nuxt panel) | atlas_main_web | 20000 |
| main-api | atlas_main_api | 20001 → 3000 |
| auth-api | atlas_auth_api | 20005 → 3000 |
| feedback-api | atlas_feedback_api | 20002 |
| errorlog-api | atlas_errorlog_api | 20003 |
| PostgreSQL (Timescale) | atlas_postgres | 20004 |
| Redis | atlas_redis | 20007 |
Ö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>FRONTEND_API_KEY, panelin tüm yönetim çağrıları/apikeys ile üretilir, bir uygulamaya bağlıdırEksik/geçersiz anahtar → 401. Hata formatı: { "error": "mesaj" }
Servis sağlık kontrolü. Monitoring için API anahtarı gerekmez.
/healthServisin ayakta olup olmadığını dönerServisin ayakta olup olmadığını döner
Yanıt
{ "status": "ok", "service": "atlas" }
// auth-api → { "status": "ok", "service": "atlas-auth" }cURL Örneği
curl http://localhost:20000/healthauth-api servisinde (authService/, port 20005). Panel proxy'si üzerinden /api/v1/auth/... ile de erişilir.
/api/v1/auth/verifyHibrit kimlik doğrulama: yerel DB → kullanıcı yoksa veya hash uyuşmazsa Bandırma ÜniAPIauth-apiHibrit kimlik doğrulama: yerel DB → kullanıcı yoksa veya hash uyuşmazsa Bandırma ÜniAPI
Parametreler
| Alan | Tip | Kural |
|---|---|---|
username | string | zorunlu, 2–100 |
password | string | zorunlu, 6–128 |
İstek Gövdesi
{
"username": "berkeergocun@ogr.bandirma.edu.tr",
"password": "••••••"
}Yanıt
{
"valid": true,
"authorized": true,
"user_id": "uuid",
"username": "…",
"email": "…"
}valid=false → kimlik hatalı (200 döner, gövdede valid:false)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"}'/api/v1/auth/loginKimlik doğrular ve merkezi oturum açar (dış uygulamalar için)auth-apiKimlik doğrular ve merkezi oturum açar (dış uygulamalar için)
İstek Gövdesi
{ "username": "10651974520", "password": "••••••" }Yanıt
{
"token": "64-hex-opaque-token",
"expires_at": "2026-07-24T10:00:00Z",
"authorized": false,
"user": { "id": "uuid", "username": "…", "email": "…" }
}{ "error": "Kullanıcı adı veya şifre hatalı" }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"}'/api/v1/auth/validateOpaque oturum token'ını doğrularauth-apiOpaque oturum token'ını doğrular
İstek Gövdesi
{ "token": "64-hex-opaque-token" }Yanıt
{
"valid": true,
"expires_at": "…",
"user": { "id": "uuid", "username": "…", "email": "…" },
"access": {
"application_id": "uuid",
"is_owner": false,
"roles": ["viewer"],
"permissions": ["report:read"]
}
}{ "valid": false }token alanında veya Authorization: Bearer başlığında gönderilebilir/api/v1/auth/logoutToken'a ait oturumu iptal ederauth-apiToken'a ait oturumu iptal eder
İstek Gövdesi
{ "token": "64-hex-opaque-token" }Yanıt
{ "message": "Oturum kapatıldı" }/api/v1/auth/sessions?user_id=<uuid>Bir kullanıcının oturumlarını listeler (yönetim/panel)auth-apiBir kullanıcının oturumlarını listeler (yönetim/panel)
Yanıt
{
"sessions": [
{
"id": "uuid", "user_id": "uuid", "application_id": "uuid",
"ip_address": "…", "user_agent": "…",
"created_at": "…", "last_seen_at": "…", "expires_at": "…", "revoked_at": null
}
]
}/api/v1/auth/sessions/:idBelirli bir oturumu iptal ederauth-apiBelirli bir oturumu iptal eder
Yanıt
No ContentKullanı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.
/api/v1/auth/sso/loginE-posta/parola ile giriş yapar ve GLOBAL oturum cookie’si yazarauth-apiE-posta/parola ile giriş yapar ve GLOBAL oturum cookie’si yazar
İstek Gövdesi
{ "email": "user@ogr.bandirma.edu.tr", "password": "…" }Yanıt
{
"authenticated": true,
"authorized": true,
"expires_at": "…",
"user": { "id": "uuid", "username": "…", "email": "…" }
}
+ Set-Cookie: atlas_sso=…;
Domain=.bandirma.edu.tr; HttpOnly; Secure; SameSite=Lax{ "error": "Kullanıcı adı veya şifre hatalı" }authorized kullanıcının panele erişim yetkisidir; SSO oturumu yine de açılırHttpOnly’dir — JavaScript okuyamaz (XSS koruması)/api/v1/auth/sso/passkey/discoverE-posta hesabında kayıtlı passkey olup olmadığını ve WebAuthn seçeneklerini döndürürauth-apiE-posta hesabında kayıtlı passkey olup olmadığını ve WebAuthn seçeneklerini döndürür
İstek Gövdesi
{ "email": "user@ogr.bandirma.edu.tr" }Yanıt
{
"passkey_available": true,
"challenge_id": "uuid",
"public_key": { "challenge": "base64url", "rpId": "atlas.bandirma.edu.tr", "allowCredentials": [] }
}{ "passkey_available": false }passkey_available:false cevabı döner/api/v1/auth/sso/passkey/loginWebAuthn assertion cevabını doğrular ve SSO cookie’si yazarauth-apiWebAuthn assertion cevabını doğrular ve SSO cookie’si yazar
İstek Gövdesi
{
"challenge_id": "uuid",
"credential": { "id": "…", "rawId": "base64url", "type": "public-key", "response": { "clientDataJSON": "…", "authenticatorData": "…", "signature": "…", "userHandle": "…" } }
}Yanıt
{ "authenticated": true, "authorized": true, "method": "passkey", "user": { "id": "uuid", "username": "…", "email": "…" } }{ "error": "Passkey doğrulaması başarısız" }/api/v1/auth/sso/passkey/register/optionsGeçerli SSO kullanıcısı için passkey kayıt seçeneklerini üretirauth-apiGeçerli SSO kullanıcısı için passkey kayıt seçeneklerini üretir
Yanıt
{ "challenge_id": "uuid", "public_key": { "challenge": "base64url", "rp": { "id": "atlas.bandirma.edu.tr", "name": "Atlas" }, "user": { "id": "base64url", "name": "…", "displayName": "…" } } }/api/v1/auth/sso/passkey/registerWebAuthn registration cevabını doğrular ve passkey’i hesaba kaydederauth-apiWebAuthn registration cevabını doğrular ve passkey’i hesaba kaydeder
İstek Gövdesi
{ "challenge_id": "uuid", "credential": { "id": "…", "rawId": "base64url", "type": "public-key", "response": { "clientDataJSON": "…", "attestationObject": "…" } } }Yanıt
{ "created": true }{ "error": "Passkey kaydı doğrulanamadı" }/api/v1/auth/sso/sessionCookie’den kimliği çözer — “bu tarayıcıda kim giriş yapmış?”auth-apiCookie’den kimliği çözer — “bu tarayıcıda kim giriş yapmış?”
Yanıt
{
"authenticated": true,
"authorized": true,
"expires_at": "…",
"user": { "id": "uuid", "username": "…", "email": "…" }
}{ "authenticated": false }X-SSO-Token başlığı → gövdedeki token alanından okunurcURL Ö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/api/v1/auth/sso/authorizeRedirect akışının giriş kapısı — tek kullanımlık kod üretirauth-apiRedirect akışının giriş kapısı — tek kullanımlık kod üretir
Parametreler
| Alan | Tip | Kural |
|---|---|---|
application_id | uuid | zorunlu (query) |
redirect_uri | string | zorunlu — uygulamada kayıtlı olmalı |
state | string | opsiyonel CSRF token’ı; aynen geri döner |
Yanıt
Location: redirect_uri?code=<tek-kullanımlık>&state=…Location: /login?next=<authorize-url>{ "error": "redirect_uri bu uygulama için kayıtlı değil" }redirect_uri beyaz listesi (birebir eşleşme, wildcard yok)/api/v1/auth/sso/tokenTek kullanımlık kodu uygulamanın KENDİ oturum token’ıyla değiştirirauth-apiTek kullanımlık kodu uygulamanın KENDİ oturum token’ıyla değiştirir
İstek Gövdesi
{ "code": "…", "redirect_uri": "…" }Yanıt
{
"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"]
}
}{ "error": "Yetkilendirme kodu geçersiz veya süresi dolmuş" }panel anahtarı ile çağrıldı — uygulama anahtarı şartSSO_CODE_TTL (varsayılan 60sn); uygulamaya ve redirect_uri’ye bağlıdırsessions tablosundadır — yalnızca çağıran uygulamanın anahtarıyla doğrulanabilir, izolasyon korunur/api/v1/auth/sso/logoutGlobal oturumu iptal eder — tüm uygulamalardan çıkışauth-apiGlobal oturumu iptal eder — tüm uygulamalardan çıkış
Yanıt
{ "message": "Oturum kapatıldı" }Uygulamanın redirect akışında kullanabileceği izinli adresler. Yalnızca uygulama sahibi yönetebilir.
/api/v1/applications/:id/redirect-urisİzinli dönüş adreslerini listelerİzinli dönüş adreslerini listeler
Yanıt
{ "redirect_uris": [ { "id": 1, "application_id": "uuid", "redirect_uri": "https://harita.bandirma.edu.tr/callback", "created_at": "…" } ], "count": 1 }/api/v1/applications/:id/redirect-urisİzinli dönüş adresi eklerİzinli dönüş adresi ekler
Parametreler
| Alan | Tip | Kural |
|---|---|---|
redirect_uri | string | zorunlu, 5–2048 |
İstek Gövdesi
{ "redirect_uri": "https://harita.bandirma.edu.tr/callback" }Yanıt
/api/v1/applications/:id/redirect-uris/:uriIdİzinli dönüş adresini silerİzinli dönüş adresini siler
Yanıt
{ "message": "Dönüş adresi silindi" }Birleşik logs tablosu; scope ile ayrılır: system | application | service (TimescaleDB hypertable).
/api/v1/logsPanelin kendi sistem logları (scope=system)Panelin kendi sistem logları (scope=system)
Parametreler
| Alan | Tip | Kural |
|---|---|---|
limit | int | varsayılan 100, maks 500 |
offset | int | varsayılan 0 |
level | string | debug/info/warn/error/fatal |
q | string | mesajda arama (ILIKE) |
from / to | RFC3339 | zaman aralığı |
Yanıt
{
"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
}/api/v1/logs/ingestDış uygulama/servis log gönderimiDış uygulama/servis log gönderimi
Parametreler
| Alan | Tip | Kural |
|---|---|---|
service | string | opsiyonel, kayıtlı servis slug'ı → scope=service; yoksa scope=application |
level | string | opsiyonel, bilinmeyen → info |
source | string | opsiyonel |
message | string | zorunlu, ≤10000 |
metadata | object | opsiyonel |
İ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
Accepted (gövdesiz)application_id anahtardan çıkarılır — panel anahtarı ile çağrılırsa 403cURL Ö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ı"}'/api/v1/applications/:id/logsBir uygulamanın uygulama + servis loglarıBir uygulamanın uygulama + servis logları
Parametreler
| Alan | Tip | Kural |
|---|---|---|
service_id | string | opsiyonel — yalnızca bu servisin logları |
/api/v1/applications/:id/services/:serviceId/logsTek bir servisin loglarıTek bir servisin logları
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.
/api/v1/applications/:id/servicesUygulamanın servislerini listelerUygulamanın servislerini listeler
Yanıt
{
"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/api/v1/applications/:id/servicesYeni servis oluştururYeni servis oluşturur
Parametreler
| Alan | Tip | Kural |
|---|---|---|
name | string | zorunlu, 1–200 |
slug | string | opsiyonel — boşsa name'den üretilir |
description | string | opsiyonel, ≤1000 |
İstek Gövdesi
{ "name": "Ödeme Servisi", "slug": "odeme-servisi", "description": "opsiyonel" }Yanıt
oluşturulan servisaynı slug zaten var/api/v1/applications/:id/services/:serviceIdname ve description günceller (slug değişmez)name ve description günceller (slug değişmez)
Yanıt
Atlas sistem servisi düzenlenemez/api/v1/applications/:id/services/:serviceIdServisi siler (logları FK ON DELETE CASCADE ile silinir)Servisi siler (logları FK ON DELETE CASCADE ile silinir)
Yanıt
Atlas sistem servisi silinemezOluşturma/güncelleme/silme için X-User-Id başlığı zorunludur (uygulama sahipliği).
/api/v1/applicationsİstek yapan kullanıcının (X-User-Id) uygulamalarıİstek yapan kullanıcının (X-User-Id) uygulamaları
Yanıt
{ "applications": [ { "id":"uuid","name":"…","description":"…","wallpaper_url":"…","owner_id":"uuid","created_at":"…","updated_at":"…" } ], "count": 1 }/api/v1/applicationsYeni uygulama oluştururYeni uygulama oluşturur
Parametreler
| Alan | Tip | Kural |
|---|---|---|
name | string | zorunlu, 2–200 |
İstek Gövdesi
{ "name": "Uygulama Adı", "description": "opsiyonel", "wallpaper_url": "opsiyonel" }Yanıt
/api/v1/applications/:idTek uygulamaTek uygulama
Yanıt
/api/v1/applications/:idUygulamayı güncellerUygulamayı günceller
/api/v1/applications/:idUygulamayı silerUygulamayı siler
Yanıt
{ "message": "Uygulama silindi" }Uygulamaya ek kullanıcı ve yetki atama. Yalnızca uygulama sahibi yapabilir.
/api/v1/applications/:id/usersUygulamaya atanmış kullanıcılarUygulamaya atanmış kullanıcılar
Yanıt
{ "users": [ { "application_id":"uuid","user_id":"uuid","permissions":["feedback:read"],"created_at":"…" } ], "count": 1 }/api/v1/applications/:id/usersKullanıcı ekler ve izin atarKullanıcı ekler ve izin atar
Parametreler
| Alan | Tip | Kural |
|---|---|---|
user_id | uuid | zorunlu |
İstek Gövdesi
{ "user_id": "uuid", "permissions": ["feedback:read", "error_log:read"] }Yanıt
/api/v1/applications/:id/users/:userIdKullanıcıyı uygulamadan çıkarırKullanıcıyı uygulamadan çıkarır
Yanıt
{ "message": "Kullanıcı çıkarıldı" }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.
/api/v1/apikeysAnahtarları listelerAnahtarları listeler
Yanıt
{ "keys": [ { "id":"uuid","application_id":"uuid","name":"…","key_prefix":"a1b2c3d4","created_at":"…","expires_at":null,"revoked_at":null } ], "count": 1 }/api/v1/apikeysYeni anahtar üretirYeni anahtar üretir
Parametreler
| Alan | Tip | Kural |
|---|---|---|
application_id | uuid | zorunlu |
name | string | zorunlu, 2–100 |
expires_at | RFC3339 | opsiyonel — boş → süresiz |
İstek Gövdesi
{ "application_id": "uuid", "name": "Servis Anahtarı", "expires_at": "2027-01-01T00:00:00Z" }Yanıt
{
"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."
}/api/v1/apikeys/:id/revokeAnahtarı iptal ederAnahtarı iptal eder
Yanıt
{ "message": "Anahtar iptal edildi" }/api/v1/apikeys/:idAnahtarı kalıcı silerAnahtarı kalıcı siler
Yanıt
{ "message": "Anahtar silindi" }Dinamik CORS whitelist — runtime'da eklenip silinebilir.
/api/v1/corsİzinli origin listesiİzinli origin listesi
Yanıt
{ "origins": [ { "id": 1, "origin": "http://localhost:20000", "created_at": "…" } ] }/api/v1/corsOrigin eklerOrigin ekler
İstek Gövdesi
{ "origin": "https://uygulama.example.com" }Yanıt
/api/v1/cors/:idOrigin silerOrigin siler
Yanıt
Panele giriş yapabilecek e-postalar. Tablo boşken herkes girebilir (bootstrap modu).
/api/v1/authorized-emailsYetkili e-posta listesiYetkili e-posta listesi
Yanıt
{ "emails": [ { "id": 1, "email": "admin@ogr.bandirma.edu.tr", "note": "Bilgi İşlem", "created_at": "…" } ] }/api/v1/authorized-emailsE-posta eklerE-posta ekler
İstek Gövdesi
{ "email": "kullanici@ogr.bandirma.edu.tr", "note": "opsiyonel" }Yanıt
zaten var/api/v1/authorized-emails/:idE-postayı silerE-postayı siler
Yanıt
Kök sayfada (/) gösterilen dış sistem kısayolları.
/api/v1/quick-linksBağlantı listesiBağlantı listesi
Yanıt
{ "quick_links": [ { "id":1,"title":"…","url":"https://…","icon_url":"…","sort_order":0,"created_at":"…","updated_at":"…" } ], "count": 1 }/api/v1/quick-linksYeni bağlantı eklerYeni bağlantı ekler
Parametreler
| Alan | Tip | Kural |
|---|---|---|
title | string | zorunlu, 1–100 |
url | string | zorunlu, 5–2048 |
icon_url | string | opsiyonel, ≤2048 |
sort_order | int | — |
İstek Gövdesi
{ "title": "OBS", "url": "https://obs.bandirma.edu.tr", "icon_url": "opsiyonel", "sort_order": 0 }Yanıt
/api/v1/quick-links/:idBağlantıyı güncellerBağlantıyı günceller
Yanıt
/api/v1/quick-links/:idBağlantıyı silerBağlantıyı siler
Yanıt
{ "message": "Bağlantı silindi" }Kullanıcı UUID’si elindeyken kullanılır. Full replace: gönderilmeyen alanlar boşalır.
/api/v1/profile/:user_idKullanıcı profilini getirirKullanıcı profilini getirir
Yanıt
{ "user_id":"uuid","first_name":"…","last_name":"…","phone":"…","faculty":"…","department":"…","identity_no":"…","created_at":"…","updated_at":"…" }/api/v1/profile/:user_idProfili oluşturur veya günceller (full replace)Profili oluşturur veya günceller (full replace)
İstek Gövdesi
{ "first_name":"Berke","last_name":"Ergöçün","phone":"…","faculty":"…","department":"…","identity_no":"…" }Yanıt
PATCH /users/profile kullanınMobil 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.
/api/v1/users/lookup?email=<e-posta>E-posta ile fakülte, bölüm ve kurum numarasını dönerE-posta ile fakülte, bölüm ve kurum numarasını döner
Parametreler
| Alan | Tip | Kural |
|---|---|---|
email | string | zorunlu (query) — büyük/küçük harf duyarsız |
Yanıt
{
"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"
}{ "error": "email parametresi zorunludur" }{ "error": "Kullanıcı bulunamadı" }user_type: student | staff | unknown — e-posta alan adından türetilir, DB'de saklanmaz. Alan adı ogr. ile başlıyorsa öğrenci, aksi halde personelidentity_no: öğrenci numarası veya personel sicil no. ÜniAPI bunu döndürmez — elle girilirprofile_complete: fakülte + bölüm + numara üçü de doluysa true. false ise çağıran servis eksik bilgiyi sorup PATCH ile geri yazmalıdırusers.uni_student_id) bu yanıta dahil edilmez — identity_no ondan tamamen ayrı bir alandırcURL Örneği
curl -H "X-API-Key: $ATLAS_API_KEY" \
"http://localhost:20001/api/v1/users/lookup?email=ogrenci@ogr.bandirma.edu.tr"/api/v1/users/profile?email=<e-posta>Fakülte/bölüm/numarayı Atlas’a geri yazar (kısmi güncelleme)Fakülte/bölüm/numarayı Atlas’a geri yazar (kısmi güncelleme)
Parametreler
| Alan | Tip | Kural |
|---|---|---|
email | string | zorunlu (query) |
first_name | string | opsiyonel, ≤100 |
last_name | string | opsiyonel, ≤100 |
phone | string | opsiyonel, ≤30 |
faculty | string | opsiyonel, ≤200 |
department | string | opsiyonel, ≤200 |
identity_no | string | opsiyonel, ≤50 |
İstek Gövdesi
{
"faculty": "Mühendislik Fakültesi",
"department": "Bilgisayar Mühendisliği"
}Yanıt
güncellenmiş dizin kaydı
(GET /users/lookup ile aynı format){ "error": "Güncellenecek en az bir alan gönderilmelidir" }{ "error": "Kullanıcı bulunamadı" }"" gönderin; korumak için gövdeye hiç koymayıncURL Ö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"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.
/api/v1/users/access?email=<e-posta>&application_id=<uuid>“Bu kullanıcı bu uygulamada ne yapabilir?” — entegrasyonun kalbi“Bu kullanıcı bu uygulamada ne yapabilir?” — entegrasyonun kalbi
Parametreler
| Alan | Tip | Kural |
|---|---|---|
email | string | zorunlu (query) |
application_id | uuid | zorunlu (query) |
Yanıt
{
"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"]
}{ "error": "Kullanıcı bulunamadı" }expires_at) ve geri alınmış atamalar hariç tutuluris_owner: true → uygulama sahibi, tüm rollerin izinlerine sahiptircURL Ö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>"/api/v1/applications/:id/rolesUygulamanın rol kataloğuUygulamanın rol kataloğu
Yanıt
{ "roles": [ { "id":"uuid","key":"staj-komisyonu","name":"Staj Komisyonu","description":"…","auto_grant":false,"permissions":["staj:basvuru-oku"] } ], "count": 1 }/api/v1/applications/:id/rolesYeni rol tanımlarYeni rol tanımlar
Parametreler
| Alan | Tip | Kural |
|---|---|---|
name | string | zorunlu, 2–200 |
key | string | opsiyonel — boşsa name’den üretilir; sonradan DEĞİŞMEZ |
description | string | opsiyonel, ≤1000 |
auto_grant | bool | true → talep anında onaylanır |
permissions | string[] | modül/sayfa adları |
İstek Gövdesi
{
"name": "Staj Komisyonu",
"auto_grant": false,
"permissions": ["staj:basvuru-oku", "staj:basvuru-onayla"]
}Yanıt
aynı key zaten varkey üretilirken Türkçe karakterler ASCII’ye indirgenir: “Staj Komisyonu” → staj-komisyonu/api/v1/applications/:id/roles/:roleIdRolün adını, açıklamasını ve otomatik atama ayarını güncellerRolün adını, açıklamasını ve otomatik atama ayarını günceller
Parametreler
| Alan | Tip | Kural |
|---|---|---|
name | string | opsiyonel, 2–200 |
description | string | opsiyonel, ≤1000 |
auto_grant | bool | opsiyonel |
İstek Gövdesi
{ "name": "Staj Komisyonu", "auto_grant": true }Yanıt
güncel rolkey güncellenmez; rolün sabit tanımlayıcısıdır/api/v1/applications/:id/roles/:roleIdRolü, atamalarını ve taleplerini silerRolü, atamalarını ve taleplerini siler
Yanıt
{ "message": "Rol silindi" }/api/v1/applications/:id/roles/:roleId/permissionsRolün izin listesini tümüyle değiştirirRolün izin listesini tümüyle değiştirir
İstek Gövdesi
{ "permissions": ["staj:basvuru-oku", "staj:basvuru-onayla"] }Yanıt
güncel rol/api/v1/access-requestsKullanıcı bir rol için yetki talebi açarKullanıcı bir rol için yetki talebi açar
İstek Gövdesi
{ "role_id": "uuid", "justification": "Bölüm staj komisyonu üyesiyim" }Yanıt
talep (status: "pending")
// auto_grant rol ise:
// status: "approved", rol anında atanır{ "error": "Bu rol için zaten bekleyen bir talebiniz var" }
{ "error": "Bu role zaten sahipsiniz" }/api/v1/access-requests/inboxOnayımı bekleyen talepler (sahibi olduğum uygulamalar için)Onayımı bekleyen talepler (sahibi olduğum uygulamalar için)
Parametreler
| Alan | Tip | Kural |
|---|---|---|
status | string | opsiyonel — varsayılan pending |
Yanıt
{
"requests": [ {
"id": "uuid", "status": "pending",
"justification": "…",
"role_key": "staj-komisyonu", "role_name": "Staj Komisyonu",
"application_name": "Staj Sistemi",
"user_email": "…", "created_at": "…"
} ],
"count": 1
}/api/v1/access-requestsKullanıcının kendi talepleriKullanıcının kendi talepleri
Parametreler
| Alan | Tip | Kural |
|---|---|---|
status | string | opsiyonel: pending|approved|rejected|cancelled |
/api/v1/access-requests/:id/approveTalebi onaylar VE rolü atarTalebi onaylar VE rolü atar
İstek Gövdesi
{ "note": "Bölüm başkanlığı teyit etti" }Yanıt
güncel talep (status: "approved")uygulama sahibi değilsiniztalep pending değil (zaten karara bağlanmış)/api/v1/access-requests/:id/rejectTalebi reddeder (rol atanmaz)Talebi reddeder (rol atanmaz)
Yanıt
/api/v1/access-requests/:idKullanıcı kendi bekleyen talebini geri çekerKullanıcı kendi bekleyen talebini geri çeker
Yanıt
{ "message": "Talep geri çekildi" }/api/v1/applications/:id/roles/:roleId/usersSahip, talep beklemeden doğrudan rol atarSahip, talep beklemeden doğrudan rol atar
İstek Gövdesi
{ "email": "kullanici@ogr.bandirma.edu.tr" }Yanıt
{ "message": "Rol atandı" }/api/v1/applications/:id/roles/:roleId/users/:emailKullanıcının rolünü geri alırKullanıcının rolünü geri alır
Yanıt
{ "message": "Rol geri alındı" }revoked_at işaretlenir — denetim izi korunurX-App-ID başlığı bekler. Yeni entegrasyonlar için POST /api/v1/logs/ingest tercih edilmelidir.
/api/v1/error-logsUygulama bazlı hata kaydı eklerUygulama bazlı hata kaydı ekler
İstek Gövdesi
{ "level": "error", "message": "…", "stack_trace": "…", "metadata": {} }Yanıt
X-App-ID: <uygulama-uuid>/api/v1/feedbackUygulama bazlı geribildirim eklerUygulama bazlı geribildirim ekler
İstek Gövdesi
{ "user_identifier": "opsiyonel", "message": "…", "rating": 5, "metadata": {} }Yanıt
X-App-ID: <uygulama-uuid>rating 1–5 aralığında/api/v1/applications/:appId/error-logs?limit=50Bir uygulamanın hata kayıtlarını listeler (panel)Bir uygulamanın hata kayıtlarını listeler (panel)
/api/v1/applications/:appId/feedbacks?limit=50&status=read|unreadBir uygulamanın geribildirimlerini, okuma durumuyla filtreleyerek listeler (panel)Bir uygulamanın geribildirimlerini, okuma durumuyla filtreleyerek listeler (panel)
Parametreler
| Alan | Tip | Kural |
|---|---|---|
status | string | opsiyonel: read | unread; yoksa tümü |
/api/v1/applications/:appId/feedbacks/:feedbackIdGeribildirimi okundu veya okunmadı olarak işaretlerGeribildirimi okundu veya okunmadı olarak işaretler
İstek Gövdesi
{ "read": true }Yanıt
güncel geribildirimSQL 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.
/api/v1/admin/database/dumpTüm Atlas veritabanını düz SQL dosyası olarak indirirTüm Atlas veritabanını düz SQL dosyası olarak indirir
Yanıt
Content-Type: application/sql; atlas-YYYYMMDD-HHMMSS.sqlauthorized_emails listesinde bulunan SSO kullanıcıları erişebilir/api/v1/admin/database/restoreDoğrulanmış SQL yedeğini veritabanına geri yüklerDoğrulanmış SQL yedeğini veritabanına geri yükler
Parametreler
| Alan | Tip | Kural |
|---|---|---|
file | file | zorunlu, .sql, en fazla 64 MB (multipart/form-data) |
Yanıt
{ "message": "SQL yedeği geri yüklendi" }/api/v1/admin/login-auditsEn son 200 başarılı giriş denetim kaydını döndürürEn son 200 başarılı giriş denetim kaydını döndürür
Yanıt
{ "logs": [{ "user_id":"uuid", "email":"…", "ip_address":"…", "created_at":"…" }], "count": 1 }Bağımsız Fiber servisleri, aynı PostgreSQL (atlas_db) üzerine yazar. app_id, panelde kayıtlı bir uygulamanın UUID'si olmalıdır.
/api/v1/errorBirleşik logs tablosuna yazar (scope=application, source=errorlog-service)errorlog-apiBirleşik logs tablosuna yazar (scope=application, source=errorlog-service)
İstek Gövdesi
{ "app_id": "uygulama-uuid", "level": "error", "message": "…", "stack_trace": "…" }Yanıt
/feedbacksAna atlas_db'deki feedbacks tablosuna yazarfeedback-apiAna atlas_db'deki feedbacks tablosuna yazar
İstek Gövdesi
{ "app_id": "uygulama-uuid", "user_identifier": "opsiyonel", "message": "…", "rating": 5 }Yanıt
| scope | Anlam | application_id | service_id |
|---|---|---|---|
system | Panelin kendi operasyonel logları | NULL | NULL |
application | Bir uygulamanın genel logları | dolu | NULL |
service | Bir uygulamanın belirli servisinin logları | dolu | dolu |
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.