69 lines
1.7 KiB
Markdown
69 lines
1.7 KiB
Markdown
# 7. External APIs
|
|
|
|
## DofusDB API Integration
|
|
|
|
**Base URL**: `https://api.dofusdb.fr`
|
|
|
|
### Endpoints Used
|
|
|
|
| Endpoint | Purpose |
|
|
|----------|---------|
|
|
| `GET /classes` | Liste des classes de personnages |
|
|
| `GET /servers` | Liste des serveurs |
|
|
| `GET /quests` | Liste des quêtes |
|
|
| `GET /dungeons` | Liste des donjons |
|
|
| `GET /achievements` | Liste des succès |
|
|
|
|
### Integration Service
|
|
|
|
```typescript
|
|
// src/lib/server/dofusdb.ts
|
|
import NodeCache from 'node-cache';
|
|
|
|
const cache = new NodeCache({ stdTTL: 3600 }); // 1 hour cache
|
|
const BASE_URL = 'https://api.dofusdb.fr';
|
|
|
|
interface DofusDbOptions {
|
|
lang?: 'fr' | 'en';
|
|
limit?: number;
|
|
}
|
|
|
|
export async function fetchFromDofusDb<T>(
|
|
endpoint: string,
|
|
options: DofusDbOptions = {}
|
|
): Promise<T> {
|
|
const { lang = 'fr', limit = 100 } = options;
|
|
const cacheKey = `dofusdb:${endpoint}:${lang}:${limit}`;
|
|
|
|
// Check cache
|
|
const cached = cache.get<T>(cacheKey);
|
|
if (cached) return cached;
|
|
|
|
// Fetch from API
|
|
const url = new URL(endpoint, BASE_URL);
|
|
url.searchParams.set('$lang', lang);
|
|
url.searchParams.set('$limit', limit.toString());
|
|
|
|
const response = await fetch(url.toString(), {
|
|
headers: { 'Accept': 'application/json' },
|
|
});
|
|
|
|
if (!response.ok) {
|
|
throw new Error(`DofusDB API error: ${response.status}`);
|
|
}
|
|
|
|
const data = await response.json();
|
|
cache.set(cacheKey, data);
|
|
|
|
return data as T;
|
|
}
|
|
|
|
// Specific fetchers
|
|
export const getClasses = () => fetchFromDofusDb<DofusClass[]>('/classes');
|
|
export const getServers = () => fetchFromDofusDb<DofusServer[]>('/servers');
|
|
export const getQuests = () => fetchFromDofusDb<DofusQuest[]>('/quests');
|
|
export const getDungeons = () => fetchFromDofusDb<DofusDungeon[]>('/dungeons');
|
|
```
|
|
|
|
---
|