659 lines
11 KiB
Markdown
659 lines
11 KiB
Markdown
# YTP API Dokümantasyonu
|
||
|
||
Yakıt Takip Sistemi REST API endpoints ve WebSocket olayları için kapsamlı dokümantasyon.
|
||
|
||
## 📋 İçerik
|
||
|
||
- [Genel Bakış](#genel-bakış)
|
||
- [Kimlik Doğrulama](#kimlik-doğrulama)
|
||
- [Admin API](#admin-api)
|
||
- [Yakıt Sorumlusu API](#yakıt-sorumlusu-api)
|
||
- [Mal Sorumlusu API](#mal-sorumlusu-api)
|
||
- [WebSocket Olayları](#websocket-olayları)
|
||
- [Hata Kodları](#hata-kodları)
|
||
|
||
## 🔧 Genel Bakış
|
||
|
||
### Base URL
|
||
```
|
||
http://localhost:5005/api
|
||
```
|
||
|
||
### İstek Formatı
|
||
- **Content-Type**: `application/json`
|
||
- **Authorization**: `X-Session-Token` header
|
||
|
||
### Yanıt Formatı
|
||
```json
|
||
{
|
||
"message": "Başarılı mesaj",
|
||
"data": { ... },
|
||
"error": "Hata mesajı (varsa)"
|
||
}
|
||
```
|
||
|
||
## 🔐 Kimlik Doğrulama
|
||
|
||
### POST /auth/login
|
||
Kullanıcı girişi için endpoint.
|
||
|
||
**İstek:**
|
||
```json
|
||
{
|
||
"username": "admin",
|
||
"password": "Admin!123"
|
||
}
|
||
```
|
||
|
||
**Başarılı Yanıt (200):**
|
||
```json
|
||
{
|
||
"token": "a1b2c3d4e5f6...",
|
||
"user": {
|
||
"id": 1,
|
||
"username": "admin",
|
||
"role": "admin",
|
||
"displayName": "Istasyon Admini"
|
||
}
|
||
}
|
||
```
|
||
|
||
**Hata Yanıtları:**
|
||
- `400` - Kullanıcı adı veya şifre eksik
|
||
- `401` - Kullanıcı adı veya şifre hatalı
|
||
- `500` - Sunucu hatası
|
||
|
||
### POST /auth/logout
|
||
Oturumu kapatma.
|
||
|
||
**Headers:**
|
||
```
|
||
X-Session-Token: <token>
|
||
```
|
||
|
||
**Yanıt (200):**
|
||
```json
|
||
{
|
||
"message": "Oturum kapatildi."
|
||
}
|
||
```
|
||
|
||
### GET /session
|
||
Mevcut oturum bilgilerini getirme.
|
||
|
||
**Headers:**
|
||
```
|
||
X-Session-Token: <token>
|
||
```
|
||
|
||
**Yanıt (200):**
|
||
```json
|
||
{
|
||
"user": {
|
||
"id": 1,
|
||
"username": "admin",
|
||
"role": "admin",
|
||
"displayName": "Istasyon Admini"
|
||
}
|
||
}
|
||
```
|
||
|
||
## 👑 Admin API
|
||
|
||
### Mal Sorumluları Yönetimi
|
||
|
||
#### GET /inventory-managers
|
||
Tüm mal sorumlularını listeler.
|
||
|
||
**Yetki:** Admin
|
||
|
||
**Yanıt (200):**
|
||
```json
|
||
{
|
||
"managers": [
|
||
{
|
||
"id": 3,
|
||
"username": "malsorum1",
|
||
"displayName": "Mal Sorumlusu 1",
|
||
"createdAt": "2024-01-01T10:00:00Z"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
#### POST /inventory-managers
|
||
Yeni mal sorumlusu oluşturur.
|
||
|
||
**Yetki:** Admin
|
||
|
||
**İstek:**
|
||
```json
|
||
{
|
||
"username": "malsorum2",
|
||
"password": "Mal@123",
|
||
"displayName": "Mal Sorumlusu 2"
|
||
}
|
||
```
|
||
|
||
**Yanıt (201):**
|
||
```json
|
||
{
|
||
"manager": {
|
||
"id": 4,
|
||
"username": "malsorum2",
|
||
"displayName": "Mal Sorumlusu 2",
|
||
"role": "inventory_manager"
|
||
}
|
||
}
|
||
```
|
||
|
||
#### PUT /inventory-managers/:id
|
||
Mal sorumlusunu günceller.
|
||
|
||
**Yetki:** Admin
|
||
|
||
**İstek:**
|
||
```json
|
||
{
|
||
"displayName": "Güncellenmiş İsim",
|
||
"password": "YeniŞifre123"
|
||
}
|
||
```
|
||
|
||
#### DELETE /inventory-managers/:id
|
||
Mal sorumlusunu siler.
|
||
|
||
**Yetki:** Admin
|
||
|
||
**Yanıt (204)** - No Content
|
||
|
||
### Araç Yönetimi
|
||
|
||
#### GET /vehicles
|
||
Tüm araçları listeler.
|
||
|
||
**Yetki:** Admin
|
||
|
||
**Yanıt (200):**
|
||
```json
|
||
{
|
||
"vehicles": [
|
||
{
|
||
"id": 1,
|
||
"brand": "Ford",
|
||
"model": "Transit",
|
||
"year": 2021,
|
||
"plate": "34 AYT 312",
|
||
"createdAt": "2024-01-01T10:00:00Z"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
#### POST /vehicles
|
||
Yeni araç oluşturur.
|
||
|
||
**Yetki:** Admin
|
||
|
||
**İstek:**
|
||
```json
|
||
{
|
||
"brand": "Ford",
|
||
"model": "Transit",
|
||
"year": 2021,
|
||
"plate": "34 AYT 312"
|
||
}
|
||
```
|
||
|
||
**Yanıt (201):**
|
||
```json
|
||
{
|
||
"vehicle": {
|
||
"id": 2,
|
||
"brand": "Ford",
|
||
"model": "Transit",
|
||
"year": 2021,
|
||
"plate": "34 AYT 312"
|
||
}
|
||
}
|
||
```
|
||
|
||
#### PUT /vehicles/:id
|
||
Araç bilgilerini günceller.
|
||
|
||
**Yetki:** Admin
|
||
|
||
#### DELETE /vehicles/:id
|
||
Araç kaydını siler.
|
||
|
||
**Yetki:** Admin
|
||
|
||
### Birlik Yönetimi
|
||
|
||
#### GET /units
|
||
Tüm birlikleri listeler.
|
||
|
||
**Yetki:** Admin
|
||
|
||
**Yanıt (200):**
|
||
```json
|
||
{
|
||
"units": [
|
||
{
|
||
"id": 1,
|
||
"name": "Merkez Birlik",
|
||
"address": "Cumhuriyet Mah. İstasyon Cad. No:12/1 İstanbul",
|
||
"stk": "STK-4589",
|
||
"btk": "BTK-9021",
|
||
"contactName": "Yzb. Murat Kaya",
|
||
"contactRank": "Yuzbasi",
|
||
"contactRegistry": "MK4587",
|
||
"contactIdentity": "25478963210",
|
||
"contactPhone": "+90 532 456 78 12",
|
||
"createdAt": "2024-01-01T10:00:00Z"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
#### POST /units
|
||
Yeni birlik oluşturur.
|
||
|
||
**Yetki:** Admin
|
||
|
||
**İstek:**
|
||
```json
|
||
{
|
||
"name": "Doğu Lojistik Birimi",
|
||
"address": "Sanayi Mah. Depo Sok. No:8 Erzurum",
|
||
"stk": "STK-7865",
|
||
"btk": "BTK-6674",
|
||
"contactName": "Uzm. Cav. Esra Yilmaz",
|
||
"contactRank": "Uzman Cavus",
|
||
"contactRegistry": "EY3345",
|
||
"contactIdentity": "19876543219",
|
||
"contactPhone": "+90 532 998 11 44"
|
||
}
|
||
```
|
||
|
||
#### PUT /units/:id
|
||
Birim bilgilerini günceller.
|
||
|
||
**Yetki:** Admin
|
||
|
||
#### DELETE /units/:id
|
||
Birim kaydını siler.
|
||
|
||
**Yetki:** Admin
|
||
|
||
### Personel Yönetimi
|
||
|
||
#### GET /fuel-personnel
|
||
Tüm yakıt personelini listeler.
|
||
|
||
**Yetki:** Admin
|
||
|
||
**Yanıt (200):**
|
||
```json
|
||
{
|
||
"personnel": [
|
||
{
|
||
"id": 1,
|
||
"fullName": "Astsb. Cahit Demir",
|
||
"rank": "Astsubay",
|
||
"registryNumber": "CD5561",
|
||
"identityNumber": "14523698741",
|
||
"phone": "+90 532 223 45 67",
|
||
"createdAt": "2024-01-01T10:00:00Z"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
#### POST /fuel-personnel
|
||
Yeni personel oluşturur.
|
||
|
||
**Yetki:** Admin
|
||
|
||
**İstek:**
|
||
```json
|
||
{
|
||
"fullName": "Sv. Uzm. Er Ali Korkmaz",
|
||
"rank": "Sozlesmeli Er",
|
||
"registryNumber": "AK7812",
|
||
"identityNumber": "32987456100",
|
||
"phone": "+90 555 893 22 10"
|
||
}
|
||
```
|
||
|
||
#### PUT /fuel-personnel/:id
|
||
Personel bilgilerini günceller.
|
||
|
||
**Yetki:** Admin
|
||
|
||
#### DELETE /fuel-personnel/:id
|
||
Personel kaydını siler.
|
||
|
||
**Yetki:** Admin
|
||
|
||
## ⚡ Yakıt Sorumlusu API
|
||
|
||
### GET /fuel/resources
|
||
Yakıt fişi oluşturmak için gerekli kaynakları getirir.
|
||
|
||
**Yetki:** Yakıt Sorumlusu
|
||
|
||
**Yanıt (200):**
|
||
```json
|
||
{
|
||
"forces": ["MSB", "K.K.K.", "Dz.K.K.", "Hv.K.K.", "SGK", "Gnkur. Bşk.", "Hrt.Gn.K."],
|
||
"vehicles": [
|
||
{
|
||
"id": 1,
|
||
"brand": "Ford",
|
||
"model": "Transit",
|
||
"year": 2021,
|
||
"plate": "34 AYT 312"
|
||
}
|
||
],
|
||
"units": [
|
||
{
|
||
"id": 1,
|
||
"name": "Merkez Birlik",
|
||
"address": "Cumhuriyet Mah. İstasyon Cad. No:12/1 İstanbul"
|
||
}
|
||
],
|
||
"personnel": [
|
||
{
|
||
"id": 1,
|
||
"fullName": "Astsb. Cahit Demir",
|
||
"rank": "Astsubay",
|
||
"registryNumber": "CD5561",
|
||
"phone": "+90 532 223 45 67"
|
||
}
|
||
],
|
||
"inventoryManagers": [
|
||
{
|
||
"id": 3,
|
||
"displayName": "Mal Sorumlusu 1"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### GET /fuel-slips
|
||
Tüm yakıt fişlerini listeler.
|
||
|
||
**Yetki:** Yakıt Sorumlusu
|
||
|
||
**Yanıt (200):**
|
||
```json
|
||
{
|
||
"slips": [
|
||
{
|
||
"id": 1,
|
||
"slipNumber": 1,
|
||
"createdAt": "2024-01-01T10:00:00Z",
|
||
"slipDate": "2024-01-01",
|
||
"force": "MSB",
|
||
"unitId": 1,
|
||
"unitName": "Merkez Birlik",
|
||
"vehicleId": 1,
|
||
"vehicleDescription": "Ford Transit",
|
||
"plate": "34 AYT 312",
|
||
"fuelAmountNumber": 50,
|
||
"fuelAmountText": "Elli",
|
||
"fuelType": "Benzin",
|
||
"receiverId": 1,
|
||
"receiverName": "Astsb. Cahit Demir",
|
||
"receiverRank": "Astsubay",
|
||
"receiverRegistry": "CD5561",
|
||
"receiverPhone": "+90 532 223 45 67",
|
||
"giverId": 2,
|
||
"giverName": "Sv. Uzm. Er Ali Korkmaz",
|
||
"giverRank": "Sozlesmeli Er",
|
||
"giverRegistry": "AK7812",
|
||
"giverPhone": "+90 555 893 22 10",
|
||
"notes": "Normal ikmal",
|
||
"inventoryManagerId": 3,
|
||
"inventoryManagerName": "Mal Sorumlusu 1",
|
||
"fuelManagerId": 2,
|
||
"status": "pending",
|
||
"rejectionReason": null
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### POST /fuel-slips
|
||
Yeni yakıt fişi oluşturur.
|
||
|
||
**Yetki:** Yakıt Sorumlusu
|
||
|
||
**İstek:**
|
||
```json
|
||
{
|
||
"date": "2024-01-01",
|
||
"force": "MSB",
|
||
"unitId": 1,
|
||
"vehicleId": 1,
|
||
"fuelAmountNumber": 50,
|
||
"fuelAmountText": "Elli",
|
||
"fuelType": "Benzin",
|
||
"receiverId": 1,
|
||
"giverId": 2,
|
||
"receiverPhone": "+90 532 223 45 67",
|
||
"giverPhone": "+90 555 893 22 10",
|
||
"notes": "Normal ikmal",
|
||
"inventoryManagerId": 3
|
||
}
|
||
```
|
||
|
||
**Yanıt (201):**
|
||
```json
|
||
{
|
||
"slip": {
|
||
"id": 2,
|
||
"slipNumber": 2,
|
||
// ... diğer fiş bilgileri
|
||
}
|
||
}
|
||
```
|
||
|
||
### GET /fuel-slips/:id/pdf
|
||
Yakıt fişini PDF formatında indirir.
|
||
|
||
**Yetki:** Yakıt Sorumlusu
|
||
|
||
**Yanıt (200)** - PDF dosyası
|
||
**Content-Type:** `application/pdf`
|
||
**Content-Disposition:** `inline; filename=akaryakit-senedi-0002.pdf`
|
||
|
||
## 📋 Mal Sorumlusu API
|
||
|
||
### GET /fuel-slips/assigned
|
||
Kullanıcıya atanan yakıt fişlerini listeler.
|
||
|
||
**Yetki:** Mal Sorumlusu
|
||
|
||
**Yanıt (200):**
|
||
```json
|
||
{
|
||
"slips": [
|
||
{
|
||
"id": 1,
|
||
"slipNumber": 1,
|
||
"status": "pending",
|
||
// ... diğer fiş bilgileri
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### PATCH /fuel-slips/:id/status
|
||
Yakıt fişini onaylar veya reddeder.
|
||
|
||
**Yetki:** Mal Sorumlusu
|
||
|
||
**İstek (Onay):**
|
||
```json
|
||
{
|
||
"status": "approved"
|
||
}
|
||
```
|
||
|
||
**İstek (Red):**
|
||
```json
|
||
{
|
||
"status": "rejected",
|
||
"reason": "Araç bakımda olduğu için ikmal yapılamaz"
|
||
}
|
||
```
|
||
|
||
**Yanıt (200):**
|
||
```json
|
||
{
|
||
"slip": {
|
||
"id": 1,
|
||
"status": "approved",
|
||
"rejectionReason": null
|
||
}
|
||
}
|
||
```
|
||
|
||
## 🔌 WebSocket Olayları
|
||
|
||
### Bağlantı
|
||
```javascript
|
||
const socket = io('http://localhost:5005', {
|
||
auth: {
|
||
token: '<session-token>'
|
||
}
|
||
});
|
||
```
|
||
|
||
### Mal Sorumlusu Olayları
|
||
|
||
#### fuelSlip:new
|
||
Yeni yakıt fişi atandığında tetiklenir.
|
||
|
||
```javascript
|
||
socket.on('fuelSlip:new', (slip) => {
|
||
console.log('Yeni fiş:', slip);
|
||
});
|
||
```
|
||
|
||
#### fuelSlip:status
|
||
Fiş durumu güncellendiğinde tetiklenir.
|
||
|
||
```javascript
|
||
socket.on('fuelSlip:status', (slip) => {
|
||
console.log('Fiş durumu güncellendi:', slip.status);
|
||
});
|
||
```
|
||
|
||
### Yakıt Sorumlusu Olayları
|
||
|
||
#### fuelSlip:status
|
||
Fiş durumu güncellendiğinde tetiklenir.
|
||
|
||
```javascript
|
||
socket.on('fuelSlip:status', (slip) => {
|
||
console.log('Fiş durumu:', slip.status, 'Sebep:', slip.rejectionReason);
|
||
});
|
||
```
|
||
|
||
## ⚠️ Hata Kodları
|
||
|
||
### HTTP Durum Kodları
|
||
- `200` - Başarılı
|
||
- `201` - Oluşturuldu
|
||
- `204` - İçerik Yok
|
||
- `400` - Geçersiz İstek
|
||
- `401` - Yetkisiz
|
||
- `403` - Yasak
|
||
- `404` - Bulunamadı
|
||
- `409` - Çakışma
|
||
- `500` - Sunucu Hatası
|
||
|
||
### Hata Mesajları
|
||
```json
|
||
{
|
||
"message": "Kullanici adi ve sifre zorunlu.",
|
||
"error": "Validation error"
|
||
}
|
||
```
|
||
|
||
### Yaygın Hata Senaryoları
|
||
- **Session expired**: Token geçersiz veya süresi dolmuş
|
||
- **Insufficient permissions**: İstek için yetki yok
|
||
- **Resource not found**: İstenen kaynak bulunamadı
|
||
- **Validation failed**: Gerekli alanlar eksik veya geçersiz
|
||
- **Database constraint**: Veritabanı kısıtlaması ihlali
|
||
|
||
## 📝 Örnek Kod
|
||
|
||
### JavaScript/Node.js
|
||
```javascript
|
||
const axios = require('axios');
|
||
|
||
class YTPClient {
|
||
constructor(baseURL) {
|
||
this.client = axios.create({
|
||
baseURL,
|
||
headers: {
|
||
'Content-Type': 'application/json'
|
||
}
|
||
});
|
||
}
|
||
|
||
async login(username, password) {
|
||
const response = await this.client.post('/auth/login', {
|
||
username,
|
||
password
|
||
});
|
||
|
||
this.token = response.data.token;
|
||
this.client.defaults.headers['X-Session-Token'] = this.token;
|
||
|
||
return response.data.user;
|
||
}
|
||
|
||
async createFuelSlip(slipData) {
|
||
const response = await this.client.post('/fuel-slips', slipData);
|
||
return response.data.slip;
|
||
}
|
||
|
||
async getFuelSlips() {
|
||
const response = await this.client.get('/fuel-slips');
|
||
return response.data.slips;
|
||
}
|
||
}
|
||
|
||
// Kullanım
|
||
const client = new YTPClient('http://localhost:5005/api');
|
||
await client.login('yakitsorum', 'Yakit@123');
|
||
const slips = await client.getFuelSlips();
|
||
```
|
||
|
||
### curl Örnekleri
|
||
```bash
|
||
# Giriş
|
||
curl -X POST http://localhost:5005/api/auth/login \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"username":"admin","password":"Admin!123"}'
|
||
|
||
# Yeni araç ekleme
|
||
curl -X POST http://localhost:5005/api/vehicles \
|
||
-H "Content-Type: application/json" \
|
||
-H "X-Session-Token: YOUR_TOKEN" \
|
||
-d '{"brand":"Ford","model":"Transit","year":2021,"plate":"34 AYT 312"}'
|
||
|
||
# Yakıt fişlerini listeleme
|
||
curl -X GET http://localhost:5005/api/fuel-slips \
|
||
-H "X-Session-Token: YOUR_TOKEN"
|
||
```
|
||
|
||
---
|
||
|
||
**Not**: Bu API dokümantasyonu geliştirme sürecinde güncellenebilir. Değişiklikler için release notlarını kontrol edin. |