# API Documentation - Amici Scommesse ## πŸ“š Overview Documentazione completa dell'API Amici Scommesse v1.1.0. **Base URL**: `http://localhost:3000/api/v1` ## πŸ”— Specifica OpenAPI La specifica OpenAPI completa Γ¨ disponibile nel file `openapi.yaml`. ### Visualizzare la Specifica **Opzione 1: Swagger UI Online** 1. Vai su https://editor.swagger.io/ 2. File β†’ Import File β†’ Seleziona `openapi.yaml` 3. Visualizza la documentazione interattiva **Opzione 2: Swagger UI Locale** ```bash npx swagger-ui-watcher openapi.yaml ``` **Opzione 3: Redoc** ```bash npx @redocly/cli preview-docs openapi.yaml ``` ### Generare Client SDK **TypeScript/JavaScript:** ```bash npx @openapitools/openapi-generator-cli generate \ -i openapi.yaml \ -g typescript-axios \ -o ./frontend/src/api ``` **Python:** ```bash openapi-generator-cli generate \ -i openapi.yaml \ -g python \ -o ./python-client ``` ## 🌐 Endpoints API v1 ### 🎯 Groups | Metodo | Endpoint | Descrizione | |--------|----------|-------------| | GET | `/groups` | Lista tutti i gruppi | | GET | `/groups/:id` | Dettaglio gruppo | | POST | `/groups` | Crea gruppo | | PUT | `/groups/:id` | Aggiorna gruppo | | DELETE | `/groups/:id` | Elimina gruppo | | PUT | `/groups/:id/members` | Aggiungi membri | | DELETE | `/groups/:id/members/:userId` | Rimuovi membro | ### 🎲 Bets | Metodo | Endpoint | Descrizione | |--------|----------|-------------| | GET | `/bets` | Lista tutte le scommesse | | GET | `/bets/:id` | Dettaglio scommessa | | POST | `/bets` | Crea scommessa | | PUT | `/bets/:id` | Aggiorna scommessa | | DELETE | `/bets/:id` | Elimina scommessa | ### πŸ‘₯ Friend Requests | Metodo | Endpoint | Descrizione | |--------|----------|-------------| | GET | `/friend-requests` | Lista amici | | GET | `/friend-requests/pending` | Richieste pending | | POST | `/friend-requests` | Invia richiesta | | POST | `/friend-requests/:id/accept` | Accetta richiesta | | DELETE | `/friend-requests/:id` | Rifiuta richiesta | ### πŸ‘€ Users | Metodo | Endpoint | Descrizione | |--------|----------|-------------| | PUT | `/users/current` | Aggiorna profilo | ### πŸ“¦ Initial Data | Metodo | Endpoint | Descrizione | |--------|----------|-------------| | GET | `/initial-data` | Carica dati iniziali | ### ❀️ Health | Metodo | Endpoint | Descrizione | |--------|----------|-------------| | GET | `/health` | Health check database | ## πŸ“ Formato Risposte ### Successo (2xx) ```json { "success": true, "message": "Operation successful", "data": { ... }, "timestamp": "2024-01-01T00:00:00.000Z" } ``` ### Errore (4xx, 5xx) ```json { "success": false, "message": "Error message", "errors": [ { "field": "name", "message": "Name is required" } ], "timestamp": "2024-01-01T00:00:00.000Z" } ``` ## πŸ” Autenticazione **Attuale**: Mock authentication (Mario Rossi hardcoded) **Prossimo**: JWT authentication da implementare ## πŸ§ͺ Esempi di Chiamate ### Creare un Gruppo ```bash curl -X POST http://localhost:3000/api/v1/groups \ -H "Content-Type: application/json" \ -d '{ "name": "Gruppo Calcio", "members": [1, 2, 3] }' ``` Risposta: ```json { "success": true, "message": "Group created successfully", "data": { "id": 1, "name": "Gruppo Calcio", "members": [ { "id": 1, "name": "Mario Rossi", "email": "mario.rossi@example.com", "avatarUrl": null, "score": 0 } ] }, "timestamp": "2024-01-01T12:00:00.000Z" } ``` ### Creare una Scommessa ```bash curl -X POST http://localhost:3000/api/v1/bets \ -H "Content-Type: application/json" \ -d '{ "title": "Chi vince il campionato?", "description": "Scommessa sul vincitore del campionato 2024", "stake": "50 euro", "participants": [ { "user": 1, "role": "PARTICIPANT" }, { "user": 2, "role": "PARTICIPANT" } ], "isPublic": false, "groupId": "1" }' ``` ### Inviare Richiesta di Amicizia ```bash curl -X POST http://localhost:3000/api/v1/friend-requests \ -H "Content-Type: application/json" \ -d '{ "identifier": 2 }' ``` oppure con email: ```bash curl -X POST http://localhost:3000/api/v1/friend-requests \ -H "Content-Type: application/json" \ -d '{ "identifier": "luigi.verdi@example.com" }' ``` ### Aggiornare Profilo Utente ```bash curl -X PUT http://localhost:3000/api/v1/users/current \ -H "Content-Type: application/json" \ -d '{ "name": "Mario Rossi", "email": "mario.rossi.new@example.com", "avatarUrl": "https://example.com/avatar.jpg" }' ``` ### Caricare Dati Iniziali ```bash curl http://localhost:3000/api/v1/initial-data ``` ### Health Check ```bash curl http://localhost:3000/health ``` Risposta: ```json { "status": "healthy", "timestamp": "2024-01-01T12:00:00.000Z", "services": { "postgres": "connected", "mongodb": "connected" } } ``` ## πŸ”„ Migrazione da API Legacy ### API Legacy (Backward Compatibility) Le vecchie route sono ancora disponibili su `/api/legacy/*` per compatibilitΓ : ``` /api/legacy/groups β†’ legacy format /api/legacy/bets β†’ legacy format /api/legacy/friend-requests β†’ legacy format ``` ### Differenze tra v1 e Legacy | Aspetto | Legacy | v1 | |---------|--------|-----| | Formato risposta | Varia | Standardizzato | | Validazione | Inline | Joi schema | | Error handling | Inconsistente | Centralizzato | | Success status | Varia | Sempre con wrapper | | Timestamp | No | SΓ¬ | ### Piano di Migrazione Frontend 1. **Fase 1**: Testare endpoint v1 in sviluppo 2. **Fase 2**: Migrare chiamate API da `/api/*` a `/api/v1/*` 3. **Fase 3**: Aggiornare gestione risposte (nuovo formato) 4. **Fase 4**: Gestire nuovi errori standardizzati 5. **Fase 5**: Deprecare chiamate legacy ## πŸ“Š Codici di Stato HTTP | Codice | Significato | Quando | |--------|-------------|--------| | 200 | OK | Operazione riuscita | | 201 | Created | Risorsa creata | | 400 | Bad Request | Validation error | | 404 | Not Found | Risorsa non trovata | | 409 | Conflict | Conflitto (es: giΓ  amici) | | 500 | Internal Error | Errore server | | 503 | Service Unavailable | Database non disponibile | ## πŸ› οΈ Testing con Postman ### Importare Specifica OpenAPI 1. Apri Postman 2. Import β†’ Link β†’ Incolla URL o File 3. Seleziona `openapi.yaml` 4. Postman genera automaticamente la collection ### Environment Variables Crea un environment Postman con: ```json { "baseUrl": "http://localhost:3000/api/v1", "legacyUrl": "http://localhost:3000/api/legacy" } ``` ## πŸš€ Integrare con Frontend ### Axios Example (TypeScript) ```typescript import axios from 'axios'; const api = axios.create({ baseURL: 'http://localhost:3000/api/v1', headers: { 'Content-Type': 'application/json', }, }); // Response Interceptor per formato standardizzato api.interceptors.response.use( (response) => response.data, // Ritorna solo { success, message, data, timestamp } (error) => { if (error.response) { // Server ha risposto con errore return Promise.reject(error.response.data); } return Promise.reject(error); } ); // Esempio uso async function createGroup(name: string, members: number[]) { try { const response = await api.post('/groups', { name, members }); console.log('Success:', response.data); return response.data; } catch (error) { console.error('Error:', error.message, error.errors); throw error; } } ``` ### Fetch Example (JavaScript) ```javascript async function createGroup(name, members) { const response = await fetch('http://localhost:3000/api/v1/groups', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ name, members }), }); const result = await response.json(); if (!result.success) { throw new Error(result.message); } return result.data; } ``` ### React Hook Example ```typescript import { useState, useEffect } from 'react'; import api from './api'; function useGroups() { const [groups, setGroups] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); useEffect(() => { async function fetchGroups() { setLoading(true); try { const response = await api.get('/groups'); setGroups(response.data); } catch (err) { setError(err); } finally { setLoading(false); } } fetchGroups(); }, []); return { groups, loading, error }; } ``` ## πŸ› Troubleshooting ### Errore 404 su endpoint v1 Verifica che il server sia avviato e che stai usando `/api/v1/` e non `/api/`. ### Validation errors Controlla la specifica OpenAPI per i campi required e i formati accettati. ### CORS errors Il server ha CORS abilitato. Se riscontri problemi, verifica la configurazione del frontend. ### Health check fallisce Verifica che PostgreSQL e MongoDB siano in esecuzione e accessibili. ## πŸ“ž Supporto Per problemi o domande: - Consulta la specifica OpenAPI completa in `openapi.yaml` - Vedi esempi in `IMPLEMENTATION_GUIDE.md` - Controlla il CHANGELOG.md per ultime modifiche ## πŸ”— Link Utili - [Swagger Editor](https://editor.swagger.io/) - [OpenAPI Generator](https://openapi-generator.tech/) - [Postman](https://www.postman.com/) - [Redoc](https://redocly.com/redoc/)