Initial commit
This commit is contained in:
@@ -0,0 +1,417 @@
|
||||
# Changelog - Backend Node.js
|
||||
|
||||
Tracciamento modifiche specifiche del backend.
|
||||
|
||||
---
|
||||
|
||||
## ✅ Completato
|
||||
|
||||
### Setup Iniziale
|
||||
- [x] Inizializzazione progetto Node.js con npm
|
||||
- [x] Installazione dipendenze: Express, Sequelize, Mongoose, CORS, pg
|
||||
- [x] Configurazione server Express (server.js)
|
||||
- [x] Setup doppia connessione database (PostgreSQL + MongoDB)
|
||||
|
||||
### Database PostgreSQL
|
||||
|
||||
#### Modelli Sequelize
|
||||
- [x] **User Model** (`models/user.model.js`)
|
||||
- Campi: id, name, email, avatarUrl, score
|
||||
- Validazioni email unique
|
||||
- Relazioni: belongsToMany Groups, hasMany FriendRequests
|
||||
|
||||
- [x] **Group Model** (`models/group.model.js`)
|
||||
- Campi: id, name
|
||||
- Relazioni: belongsToMany Users (many-to-many)
|
||||
|
||||
- [x] **Friendship Model** (`models/friendship.model.js`)
|
||||
- Campi: id, user1Id, user2Id
|
||||
- Vincolo: user1Id < user2Id (evita duplicati)
|
||||
- Hook beforeValidate per garantire ordine corretto
|
||||
|
||||
- [x] **FriendRequest Model** (`models/friendRequest.model.js`)
|
||||
- Campi: id, fromUserId, toUserId, status, createdAt, updatedAt
|
||||
- Stati: PENDING, ACCEPTED, REJECTED
|
||||
- Timestamps automatici
|
||||
|
||||
- [x] **Associations** (`models/associations.js`)
|
||||
- User ↔ Group (many-to-many via UserGroups)
|
||||
- User → FriendRequest (fromUser, toUser)
|
||||
- Friendship → User (user1, user2)
|
||||
|
||||
#### Schema SQL
|
||||
- [x] Script di inizializzazione (`init.sql`)
|
||||
- [x] Definizione tabelle con constraint e foreign keys
|
||||
- [x] Indici per performance su ricerche frequenti
|
||||
- [x] Check constraints per data integrity
|
||||
|
||||
### Database MongoDB
|
||||
|
||||
- [x] **Bet Model** (`models/bet.model.js`)
|
||||
- Schema: title, description, stake, participants[], status, startDate, endDate, isPublic, groupId, winner
|
||||
- Partecipanti con ruolo (PARTICIPANT/OBSERVER)
|
||||
- Stati: ACTIVE, AWAITING_VALIDATION, COMPLETED
|
||||
- Timestamp automatici (createdAt, updatedAt)
|
||||
|
||||
### API Routes
|
||||
|
||||
#### Initial Data Route (`routes/initial-data.routes.js`)
|
||||
- [x] `GET /api/initial-data` - Carica dati iniziali per l'app
|
||||
- Utente corrente (hardcoded userId=1 per ora)
|
||||
- Lista amici con info complete
|
||||
- Gruppi dell'utente con membri
|
||||
- Scommesse dell'utente (tutte, attive, passate)
|
||||
|
||||
#### Users Routes (`routes/users.routes.js`)
|
||||
- [x] `GET /api/users` - Lista tutti gli utenti
|
||||
- [x] `GET /api/users/:id` - Dettaglio utente singolo
|
||||
|
||||
#### Groups Routes (`routes/groups.routes.js`)
|
||||
- [x] `GET /api/groups` - Lista tutti i gruppi
|
||||
- [x] `GET /api/groups/:id` - Dettaglio gruppo con membri
|
||||
- [x] `POST /api/groups` - Crea nuovo gruppo
|
||||
- [x] `PUT /api/groups/:id` - Aggiorna gruppo
|
||||
- [x] `DELETE /api/groups/:id` - Elimina gruppo
|
||||
- [x] `POST /api/groups/:id/members` - Aggiungi membro al gruppo
|
||||
- [x] `DELETE /api/groups/:id/members/:userId` - Rimuovi membro
|
||||
|
||||
#### Bets Routes (`routes/bets.routes.js`)
|
||||
- [x] `GET /api/bets` - Lista tutte le scommesse
|
||||
- [x] `GET /api/bets/:id` - Dettaglio scommessa
|
||||
- [x] `POST /api/bets` - Crea nuova scommessa
|
||||
- [x] `PUT /api/bets/:id` - Aggiorna scommessa
|
||||
- [x] `DELETE /api/bets/:id` - Elimina scommessa
|
||||
- [x] `GET /api/bets/by-time` - Filtra scommesse per periodo (today, week, month)
|
||||
- [x] `GET /api/bets/by-group/:groupId` - Scommesse per gruppo specifico
|
||||
|
||||
#### Friends Routes (`routes/friends.routes.js`)
|
||||
- [x] `GET /api/friends/:userId` - Lista amici di un utente
|
||||
- [x] `GET /api/friends/requests/:userId` - Richieste di amicizia pending
|
||||
- [x] `POST /api/friends/requests` - Invia richiesta di amicizia
|
||||
- [x] `PATCH /api/friends/requests/:requestId` - Accetta/rifiuta richiesta
|
||||
|
||||
#### API Router (`routes/api.js`)
|
||||
- [x] Router factory che accetta istanza Sequelize
|
||||
- [x] Composizione di tutti i sub-router
|
||||
|
||||
### Utilities
|
||||
- [x] **Seed Script** (`seed.js`)
|
||||
- Popola PostgreSQL con 6 utenti di test
|
||||
- Crea 3 amicizie e 2 richieste pending
|
||||
- Crea 2 gruppi con membri
|
||||
- Popola MongoDB con 5 scommesse di esempio
|
||||
- Skip automatico se database già popolato
|
||||
|
||||
- [x] **Populate Bets** (`utils/populateBets.js`)
|
||||
- Utility per popolare scommesse (se necessario)
|
||||
|
||||
### Configurazione
|
||||
- [x] Sync automatico con `{ force: true }` in development
|
||||
- [x] Seed automatico al primo avvio
|
||||
- [x] CORS abilitato per frontend
|
||||
- [x] JSON body parser
|
||||
- [x] Gestione errori connessione database
|
||||
|
||||
---
|
||||
|
||||
## 📋 Da Fare
|
||||
|
||||
### Autenticazione & Autorizzazione
|
||||
- [ ] Implementare JWT authentication
|
||||
- [ ] Middleware di protezione route
|
||||
- [ ] Login/Register endpoints
|
||||
- [ ] Password hashing (bcrypt)
|
||||
- [ ] Refresh token mechanism
|
||||
- [ ] OAuth2 integration (Google, Facebook)
|
||||
- [ ] Gestione sessioni
|
||||
|
||||
### Validazione & Sicurezza
|
||||
- [ ] Validation middleware con Joi/express-validator
|
||||
- [ ] Sanitizzazione input utente
|
||||
- [ ] Rate limiting per API
|
||||
- [ ] CORS configuration più restrittiva per production
|
||||
- [ ] Helmet.js per security headers
|
||||
- [ ] SQL injection prevention (già parzialmente coperto da Sequelize)
|
||||
- [ ] XSS protection
|
||||
|
||||
### Funzionalità Scommesse
|
||||
- [ ] Endpoint per dichiarare vincitore
|
||||
- [ ] Sistema di votazione vincitori (per scommesse tra amici)
|
||||
- [ ] Logica di calcolo punteggi utenti
|
||||
- [ ] Notifiche per eventi scommessa
|
||||
- [ ] Endpoint statistiche utente
|
||||
- Win rate
|
||||
- Streak attuali
|
||||
- Scommesse vinte/perse
|
||||
- Classifica generale
|
||||
- [ ] Filtri avanzati per ricerca scommesse
|
||||
- [ ] Paginazione scommesse
|
||||
- [ ] Cronologia completa scommesse
|
||||
|
||||
### Funzionalità Sociali
|
||||
- [ ] Endpoint per chat/commenti nelle scommesse
|
||||
- [ ] WebSocket/SSE per notifiche real-time
|
||||
- [ ] Sistema di notifiche persistenti
|
||||
- [ ] Feed attività (chi ha creato cosa, chi ha vinto, ecc.)
|
||||
- [ ] Richieste di amicizia: suggerimenti basati su amici in comune
|
||||
- [ ] Blocco utenti
|
||||
- [ ] Report/segnalazioni
|
||||
|
||||
### Funzionalità Gruppi
|
||||
- [ ] Ruoli nei gruppi (admin, membro)
|
||||
- [ ] Inviti al gruppo
|
||||
- [ ] Statistiche gruppo
|
||||
- [ ] Impostazioni privacy gruppo
|
||||
|
||||
### File & Media
|
||||
- [ ] Upload avatar utente
|
||||
- [ ] Upload immagini nelle scommesse
|
||||
- [ ] Integrazione storage (S3, Cloudinary)
|
||||
- [ ] Resize/compression immagini
|
||||
|
||||
### Performance & Optimization
|
||||
- [ ] Caching con Redis
|
||||
- Cache lista amici
|
||||
- Cache gruppi utente
|
||||
- Cache scommesse popolari
|
||||
- [ ] Query optimization
|
||||
- [ ] Indici database aggiuntivi dove necessario
|
||||
- [ ] Paginazione su tutti gli endpoint liste
|
||||
- [ ] Response compression (gzip)
|
||||
- [ ] Database connection pooling optimization
|
||||
|
||||
### Testing
|
||||
- [ ] Unit test per modelli
|
||||
- [ ] Integration test per API endpoints
|
||||
- [ ] Test copertura almeno 80%
|
||||
- [ ] Mock database per test
|
||||
- [ ] Setup test runner (Jest/Mocha)
|
||||
|
||||
### DevOps
|
||||
- [ ] Logging strutturato (Winston/Pino)
|
||||
- [ ] Health check endpoint (`/health`)
|
||||
- [ ] Metrics endpoint (`/metrics`)
|
||||
- [ ] Error tracking (Sentry)
|
||||
- [ ] Environment variables validation
|
||||
- [ ] Graceful shutdown
|
||||
- [ ] Dockerfile per production
|
||||
- [ ] Docker multi-stage build
|
||||
|
||||
### Database
|
||||
- [ ] Migration system (invece di sync force)
|
||||
- [ ] Backup automatici
|
||||
- [ ] Soft delete per entità critiche
|
||||
- [ ] Audit log per modifiche importanti
|
||||
- [ ] Database indexing strategy review
|
||||
|
||||
### API Documentation
|
||||
- [ ] Swagger/OpenAPI specification
|
||||
- [ ] Endpoint documentation con esempi
|
||||
- [ ] Postman collection
|
||||
- [ ] API versioning strategy
|
||||
|
||||
### Monitoring
|
||||
- [ ] Application Performance Monitoring (APM)
|
||||
- [ ] Database query monitoring
|
||||
- [ ] Error rate alerts
|
||||
- [ ] Response time monitoring
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Bug Conosciuti
|
||||
- Nessuno al momento
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Miglioramenti Tecnici Completati (v1.1.0 - 2024)
|
||||
|
||||
### Refactoring Architetturale
|
||||
- [x] **Separazione logica business dai controller (service layer)**
|
||||
- Creati 5 services: users, groups, friends, bets, data-stitching
|
||||
- Business logic completamente spostata dai controller ai services
|
||||
- `services/` directory con pattern consistente
|
||||
|
||||
- [x] **Dependency Injection Container**
|
||||
- Implementato Awilix per DI
|
||||
- Container setup in `di/container.js`
|
||||
- Registrazione automatica di repositories, services, controllers
|
||||
- Lifetime management: singleton per database, scoped per services
|
||||
|
||||
- [x] **Request/Response DTOs**
|
||||
- Validation schemas con Joi
|
||||
- 4 schemas: group, bet, user, friendRequest
|
||||
- Middleware validation in `middleware/validation.js`
|
||||
- Input sanitization automatico
|
||||
|
||||
- [x] **Standardizzazione formato risposte API**
|
||||
- ResponseHandler class in `shared/response.handler.js`
|
||||
- Formato consistente per successo e errori
|
||||
- Timestamp automatico in ogni risposta
|
||||
- Metodi: success, created, error, badRequest, notFound, etc.
|
||||
|
||||
- [x] **Error handling centralizzato**
|
||||
- Custom errors: ValidationError, NotFoundError, ConflictError, etc.
|
||||
- Global error handler middleware
|
||||
- Gestione errori Sequelize e Mongoose
|
||||
- Stack trace solo in development
|
||||
|
||||
- [x] **Constants file per magic numbers/strings**
|
||||
- `config/constants.js`: HTTP_STATUS, BET_STATUS, FRIEND_REQUEST_STATUS, etc.
|
||||
- `config/database.js`: configurazione database centralizzata
|
||||
- `config/index.js`: export centralizzato
|
||||
|
||||
- [x] **Code linting (ESLint) e formatting (Prettier)**
|
||||
- ESLint configurato con airbnb-base
|
||||
- Prettier per code formatting
|
||||
- Scripts npm: lint, lint:fix, format
|
||||
- .eslintrc.json e .prettierrc
|
||||
|
||||
- [ ] **Type checking con TypeScript** - SKIPPED (troppo invasivo per questa fase)
|
||||
|
||||
### Nuova Struttura Architetturale
|
||||
|
||||
```
|
||||
Routes (thin) → Validation → Controllers → Services → Repositories → Database
|
||||
↓ ↓ ↓
|
||||
ResponseHandler Business Logic DB Access
|
||||
```
|
||||
|
||||
**Directory create:**
|
||||
- `config/` - Configurazione centralizzata (3 files)
|
||||
- `shared/errors/` - Custom errors (2 files)
|
||||
- `shared/validators/schemas/` - Joi schemas (4 files)
|
||||
- `shared/response.handler.js` - Standardized responses
|
||||
- `middleware/` - errorHandler, validation, auth.mock (3 files)
|
||||
- `di/` - Dependency injection container (1 file)
|
||||
- `repositories/postgres/` - PostgreSQL repositories (4 files)
|
||||
- `repositories/mongo/` - MongoDB repositories (1 file)
|
||||
- `services/` - Business logic services (5 files)
|
||||
- `controllers/` - Thin controllers (5 files)
|
||||
- `routes/v1/` - API v1 routes (6 files)
|
||||
- `routes/health.routes.js` - Health check endpoint
|
||||
|
||||
**File modificati:**
|
||||
- `server.js` - Refactored per integrare DI container e nuova architettura
|
||||
- `package.json` - Aggiunte dipendenze e scripts
|
||||
|
||||
### API Versioning
|
||||
|
||||
- **`/api/v1/*`** - Nuova API con architettura refactored
|
||||
- Formato risposte standardizzato
|
||||
- Validazione automatica input
|
||||
- Error handling consistente
|
||||
|
||||
- **`/api/legacy/*`** - API legacy (backward compatibility)
|
||||
- Routes originali spostate qui
|
||||
- Mantiene formato originale
|
||||
- Per garantire compatibilità durante migrazione
|
||||
|
||||
- **`/health`** - Health check endpoint
|
||||
- Verifica connessioni PostgreSQL e MongoDB
|
||||
- Status: healthy/unhealthy
|
||||
|
||||
### Endpoints API v1
|
||||
|
||||
#### Groups (`/api/v1/groups`)
|
||||
- `GET /` - Lista tutti i gruppi
|
||||
- `GET /:id` - Dettaglio gruppo con membri
|
||||
- `POST /` - Crea gruppo (validato con Joi)
|
||||
- `PUT /:id` - Aggiorna gruppo (validato)
|
||||
- `DELETE /:id` - Elimina gruppo
|
||||
- `PUT /:id/members` - Aggiungi membri (validato)
|
||||
- `DELETE /:id/members/:userId` - Rimuovi membro
|
||||
|
||||
#### Bets (`/api/v1/bets`)
|
||||
- `GET /` - Lista tutte le scommesse
|
||||
- `GET /:id` - Dettaglio scommessa
|
||||
- `POST /` - Crea scommessa (validato con Joi)
|
||||
- `PUT /:id` - Aggiorna scommessa (validato)
|
||||
- `DELETE /:id` - Elimina scommessa
|
||||
|
||||
#### Friend Requests (`/api/v1/friend-requests`)
|
||||
- `GET /` - Lista amici dell'utente corrente
|
||||
- `GET /pending` - Richieste pending
|
||||
- `POST /` - Invia richiesta (validato con Joi)
|
||||
- `POST /:id/accept` - Accetta richiesta
|
||||
- `DELETE /:id` - Rifiuta/cancella richiesta
|
||||
|
||||
#### Users (`/api/v1/users`)
|
||||
- `PUT /current` - Aggiorna profilo utente corrente (validato)
|
||||
|
||||
#### Initial Data (`/api/v1/initial-data`)
|
||||
- `GET /` - Carica dati iniziali (currentUser, users, friends, groups, bets)
|
||||
|
||||
#### Health Check (`/health`)
|
||||
- `GET /` - Status database (PostgreSQL, MongoDB)
|
||||
|
||||
### Formato Risposte Standardizzato
|
||||
|
||||
**Successo:**
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"message": "Operation successful",
|
||||
"data": { ... },
|
||||
"timestamp": "2024-01-01T00:00:00.000Z"
|
||||
}
|
||||
```
|
||||
|
||||
**Errore:**
|
||||
```json
|
||||
{
|
||||
"success": false,
|
||||
"message": "Error message",
|
||||
"errors": [{"field": "name", "message": "Required"}],
|
||||
"timestamp": "2024-01-01T00:00:00.000Z"
|
||||
}
|
||||
```
|
||||
|
||||
### Benefici dell'Architettura
|
||||
|
||||
- ✅ **Separation of Concerns**: Ogni layer ha responsabilità ben definite
|
||||
- ✅ **Testability**: Services e repositories facilmente testabili
|
||||
- ✅ **Maintainability**: Business logic centralizzata
|
||||
- ✅ **Consistency**: Formato risposte e errori standardizzati
|
||||
- ✅ **Scalability**: Facile aggiungere nuove feature
|
||||
- ✅ **Type Safety**: Validation layer previene dati inconsistenti
|
||||
- ✅ **Backward Compatibility**: Routes legacy funzionano ancora
|
||||
|
||||
---
|
||||
|
||||
## Note Tecniche
|
||||
|
||||
### Dipendenze Principali
|
||||
- **express**: ^4.19.2
|
||||
- **sequelize**: ^6.37.3 (PostgreSQL ORM)
|
||||
- **mongoose**: ^8.4.0 (MongoDB ODM)
|
||||
- **pg**: ^8.11.5 (PostgreSQL driver)
|
||||
- **cors**: ^2.8.5
|
||||
- **awilix**: ^10.0.2 (Dependency Injection)
|
||||
- **joi**: ^17.12.1 (Validation)
|
||||
|
||||
### Dev Dependencies
|
||||
- **eslint**: ^8.56.0
|
||||
- **prettier**: ^3.2.4
|
||||
- **eslint-config-airbnb-base**: ^15.0.0
|
||||
- **eslint-config-prettier**: ^9.1.0
|
||||
|
||||
### Variabili Ambiente Richieste
|
||||
```bash
|
||||
PORT=3000
|
||||
NODE_ENV=development
|
||||
MONGO_URI=mongodb://root:root@servovio@localhost:27017/amici-scommesse
|
||||
POSTGRES_URI=postgres://admin:admin@localhost:5432/amici_scommesse
|
||||
```
|
||||
|
||||
### Porte
|
||||
- Server: `3000`
|
||||
- PostgreSQL: `5432`
|
||||
- MongoDB: `27017`
|
||||
|
||||
### Scripts npm
|
||||
```bash
|
||||
npm start # Avvia server
|
||||
npm run lint # Check linting
|
||||
npm run lint:fix # Fix linting automaticamente
|
||||
npm run format # Format codice con Prettier
|
||||
```
|
||||
Reference in New Issue
Block a user