# @tatil/server-api

Tatilsepeti server-side API package. Next.js server components, route handlers ve middleware için token yönetimli API çağrıları sağlar.

## Kurulum

```bash
yarn add @tatil/server-api
```

## Kullanım

### Tatilsepeti API

#### GET İsteği

```javascript
import { Tatilsepeti } from '@tatil/server-api';

const data = await Tatilsepeti.get('/tour/list', {
  page: 1,
  pageSize: 20,
});
```

#### POST İsteği

```javascript
import { Tatilsepeti } from '@tatil/server-api';

const result = await Tatilsepeti.post('/hotel/list', {
  checkinDate: '2026-01-17',
  checkoutDate: '2026-01-21',
  pageNumber: 1,
  pageSize: 20,
});
```

#### Multi-Base URL Desteği

Farklı endpoint'leri farklı API URL'lerine yönlendirebilirsiniz:

```javascript
import { Tatilsepeti } from '@tatil/server-api';

// Endpoint'leri özel root URL'lere map'leyin
Tatilsepeti.mapEndpoint('tour', 'https://tour-api.example.com');
Tatilsepeti.mapEndpoint('hotel', 'https://hotel-api.example.com');
Tatilsepeti.mapEndpoint('flight/search', 'https://flight-api.example.com');

// Artık bu endpoint'ler belirtilen URL'lere yönlendirilecek
const tours = await Tatilsepeti.get('/tour/list'); // -> tour-api.example.com
const hotels = await Tatilsepeti.get('/hotel/list'); // -> hotel-api.example.com
const flights = await Tatilsepeti.get('/flight/search'); // -> flight-api.example.com

// Veya array formatında
const flights = await Tatilsepeti.get(['flight', 'search']);
```

### TokenManager

Token expire kontrolü ve refresh işlemleri için:

```javascript
import { TokenManager } from '@tatil/server-api';

// Token expire kontrolü
const isExpired = TokenManager.isTokenExpired(tokenValue, tokenExpireValue);

// Token yenileme (gerekirse)
const { token, tokenExpire, refreshed } = await TokenManager.refreshTokenIfNeeded(
  tokenValue,
  tokenExpireValue
);
```

### Response Helper

Server response oluşturma:

```javascript
import { Tatilsepeti, createResponse, createErrorResponse } from '@tatil/server-api';

// Başarılı response
return createResponse('success', data, 200);

// Hata response
return createErrorResponse('Bir hata oluştu', 400);
```

Veya Tatilsepeti instance üzerinden:

```javascript
import { Tatilsepeti } from '@tatil/server-api';

// Başarılı response
return Tatilsepeti.createResponse(data, 200);

// Hata response
return Tatilsepeti.createErrorResponse('Bir hata oluştu', 500);
```

## Environment Variables

Bu paket aşağıdaki environment değişkenlerini gerektirir:

```env
API_URL=https://api.example.com
API_USERNAME=your_username
API_PASSWORD=your_password
NODE_ENV=production
```

## Özellikler

- Otomatik token yönetimi ve refresh
- Hata yönetimi ve HTTP 400+ durum kontrolü
- `/api/v1` prefix otomatik eklenir
- Cookie-based token storage
- Next.js server components ile tam uyumlu
- **Multi-base URL desteği** - Farklı endpoint'leri farklı API sunucularına yönlendirebilme

## Örnek Kullanım (Next.js)

### Server Component

```javascript
import { Tatilsepeti } from '@tatil/server-api';

export default async function Page() {
  const tours = await Tatilsepeti.get('/tour/list', { page: 1 });

  return <div>{/* ... */}</div>;
}
```

### Route Handler

```javascript
import { Tatilsepeti } from '@tatil/server-api';

export async function GET(request) {
  const data = await Tatilsepeti.get('/tour/list');

  if (!data) {
    return Tatilsepeti.createErrorResponse('Failed to fetch', 500);
  }

  return Tatilsepeti.createResponse(data);
}
```

### Middleware

```javascript
import { TokenManager } from '@tatil/server-api';
import { NextResponse } from 'next/server';

export async function middleware(request) {
  const token = request.cookies.get('token');
  const tokenExpire = request.cookies.get('token_expire');

  const isExpired = TokenManager.isTokenExpired(
    token?.value,
    tokenExpire?.value
  );

  if (isExpired) {
    const { token: newToken } = await TokenManager.refreshTokenIfNeeded(
      token?.value,
      tokenExpire?.value
    );

    const response = NextResponse.next();
    response.cookies.set('token', newToken);
    return response;
  }

  return NextResponse.next();
}
```

## API Metotları

| Metot | Parametreler | Açıklama |
|-------|--------------|----------|
| `get(endpoint, params)` | endpoint: string/array, params: object | GET isteği |
| `post(endpoint, body)` | endpoint: string/array, body: object | POST isteği |
| `mapEndpoint(endpoint, rootURL)` | endpoint: string, rootURL: string | Endpoint'i özel root URL'e map'ler |
| `createResponse(data, status)` | data: any, status: number | Response objesi oluşturur |
| `createErrorResponse(message, status)` | message: string, status: number | Hata response'u oluşturur |

## TokenManager Metotları

| Metot | Parametreler | Açıklama |
|-------|--------------|----------|
| `isTokenExpired(token, tokenExpire)` | token: string, tokenExpire: string | Token expire kontrolü |
| `refreshTokenIfNeeded(token, tokenExpire)` | token: string, tokenExpire: string | Token yeniler (gerekirse) |

## Lisans

MIT
