docs: add migration documentation, finalization scripts, and update Swagger paths
This commit is contained in:
@@ -0,0 +1,111 @@
|
|||||||
|
|
||||||
|
╔════════════════════════════════════════════════════════════════════════════╗
|
||||||
|
║ MIGRATION SUCCESSFULLY COMPLETED ║
|
||||||
|
╚════════════════════════════════════════════════════════════════════════════╝
|
||||||
|
|
||||||
|
NEW API STRUCTURE:
|
||||||
|
├── /api/skydive/* ← Skydiving features (jumps, aeronefs, dropzones, etc.)
|
||||||
|
├── /api/cms/* ← Content management (articles, tags, comments, etc.)
|
||||||
|
└── /api/herowars/* ← Game features (clans, members, raids, etc.)
|
||||||
|
|
||||||
|
WHAT WAS CHANGED:
|
||||||
|
✓ Routes directory: v1/v2/v3 → domain-based structure
|
||||||
|
✓ Route definitions: Updated all index.js files
|
||||||
|
✓ Swagger YAML: Updated path prefixes to new domains
|
||||||
|
✓ Postman collection: Updated endpoint URLs
|
||||||
|
|
||||||
|
FILES MIGRATED:
|
||||||
|
✓ Skydive domain (8 route files):
|
||||||
|
- aeronefs.js, applications.js, canopies.js, dropzones.js
|
||||||
|
- jumps.js, pages.js, profiles.js, qcm.js
|
||||||
|
|
||||||
|
✓ CMS domain (8 route files):
|
||||||
|
- articles.routes.js, comments.routes.js, product.routes.js
|
||||||
|
- products.routes.js, profiles.routes.js, tags.routes.js, user.routes.js
|
||||||
|
|
||||||
|
✓ Hero Wars domain (3 route files):
|
||||||
|
- clans.routes.js, members.routes.js, herowars.routes.js
|
||||||
|
|
||||||
|
TESTING INSTRUCTIONS:
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
1. Start the API server:
|
||||||
|
npm run local
|
||||||
|
|
||||||
|
2. In another terminal, verify Swagger is updated:
|
||||||
|
curl http://localhost:3200/api-docs
|
||||||
|
|
||||||
|
3. Test a sample endpoint:
|
||||||
|
curl http://localhost:3200/api/skydive/jumps
|
||||||
|
curl http://localhost:3200/api/cms/articles
|
||||||
|
curl http://localhost:3200/api/herowars/clans
|
||||||
|
|
||||||
|
FRONTEND UPDATES REQUIRED:
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
In your Angular frontend (adastra_app):
|
||||||
|
|
||||||
|
1. Update environment files:
|
||||||
|
src/environments/environment.ts
|
||||||
|
src/environments/environment.development.ts
|
||||||
|
src/environments/environment.local.ts
|
||||||
|
|
||||||
|
Replace:
|
||||||
|
- apiUrl: '/api/v1' → apiUrl: '/api/skydive'
|
||||||
|
- cmUrl: '/api/v2' → cmUrl: '/api/cms'
|
||||||
|
- hwUrl: '/api/v3' → hwUrl: '/api/herowars'
|
||||||
|
|
||||||
|
2. Update API service calls:
|
||||||
|
// Before:
|
||||||
|
http.get('/api/v1/jumps')
|
||||||
|
http.get('/api/v2/articles')
|
||||||
|
http.get('/api/v3/clans')
|
||||||
|
|
||||||
|
// After:
|
||||||
|
http.get('/api/skydive/jumps')
|
||||||
|
http.get('/api/cms/articles')
|
||||||
|
http.get('/api/herowars/clans')
|
||||||
|
|
||||||
|
3. Search & replace in your services:
|
||||||
|
sed -i 's|/api/v1/|/api/skydive/|g' src/**/*.ts
|
||||||
|
sed -i 's|/api/v2/|/api/cms/|g' src/**/*.ts
|
||||||
|
sed -i 's|/api/v3/|/api/herowars/|g' src/**/*.ts
|
||||||
|
|
||||||
|
GIT OPERATIONS:
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
View migration commits:
|
||||||
|
git log --oneline -5
|
||||||
|
|
||||||
|
If needed, view detailed changes:
|
||||||
|
git show HEAD
|
||||||
|
|
||||||
|
Push to remote:
|
||||||
|
git push origin develop
|
||||||
|
|
||||||
|
ROLLBACK (if issues):
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
If you need to rollback:
|
||||||
|
git reset --hard HEAD~2
|
||||||
|
|
||||||
|
(Adjust the number of commits based on history)
|
||||||
|
|
||||||
|
ADDITIONAL RESOURCES:
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
Documentation files created:
|
||||||
|
- MIGRATION_REPORT.md: Detailed migration information
|
||||||
|
- MIGRATION_SWAGGER_TODO.md: Swagger update notes
|
||||||
|
- POST_MIGRATION_CHECKLIST.md: Verification checklist
|
||||||
|
|
||||||
|
Scripts created:
|
||||||
|
- scripts/migrate-to-domain-structure.js: Main migration script
|
||||||
|
- scripts/update-references-post-migration.js: Post-migration updates
|
||||||
|
- scripts/finalize-migration.js: Cleanup and testing
|
||||||
|
|
||||||
|
═════════════════════════════════════════════════════════════════════════════
|
||||||
|
|
||||||
|
✓ Migration is complete! Follow the testing instructions above.
|
||||||
|
|
||||||
|
═════════════════════════════════════════════════════════════════════════════
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
|
||||||
|
═══════════════════════════════════════════════════════════════════════════════
|
||||||
|
API STRUCTURE MIGRATION REPORT
|
||||||
|
═══════════════════════════════════════════════════════════════════════════════
|
||||||
|
|
||||||
|
MIGRATION: v1/v2/v3 → Domain-Based (skydive/cms/herowars)
|
||||||
|
|
||||||
|
OLD STRUCTURE:
|
||||||
|
└── routes/api/
|
||||||
|
├── v1/ (Skydive routes)
|
||||||
|
├── v2/ (CMS + misc routes)
|
||||||
|
└── v3/ (Hero Wars routes)
|
||||||
|
|
||||||
|
NEW STRUCTURE:
|
||||||
|
└── routes/api/
|
||||||
|
├── skydive/
|
||||||
|
├── cms/
|
||||||
|
└── herowars/
|
||||||
|
|
||||||
|
ROUTE MAPPINGS:
|
||||||
|
✓ /api/v1/* → /api/skydive/*
|
||||||
|
- applications, aeronefs, canopies, dropzones, jumps, pages, profiles, qcm
|
||||||
|
|
||||||
|
✓ /api/v2/* → /api/cms/*
|
||||||
|
- user, articles, comments, product, products, profiles, tags
|
||||||
|
|
||||||
|
✓ /api/v3/* → /api/herowars/*
|
||||||
|
- clans, members, herowars (moved from v2)
|
||||||
|
|
||||||
|
FILES CREATED/UPDATED:
|
||||||
|
✓ src/routes/api/skydive/index.js
|
||||||
|
✓ src/routes/api/cms/index.js
|
||||||
|
✓ src/routes/api/herowars/index.js
|
||||||
|
✓ src/routes/api/index.js
|
||||||
|
✓ All route files copied to appropriate domains
|
||||||
|
|
||||||
|
MANUAL STEPS REQUIRED:
|
||||||
|
|
||||||
|
1. Update Swagger/OpenAPI documentation:
|
||||||
|
- Review MIGRATION_SWAGGER_TODO.md
|
||||||
|
- Update path prefixes in src/swagger/*.yaml files
|
||||||
|
- Update paths in src/config/swagger.js if needed
|
||||||
|
|
||||||
|
2. Update app.js (if direct version references exist):
|
||||||
|
- Search for 'v1', 'v2', 'v3' strings
|
||||||
|
- Replace with domain names where appropriate
|
||||||
|
|
||||||
|
3. Update tests and client calls:
|
||||||
|
- Replace /api/v1/ with /api/skydive/
|
||||||
|
- Replace /api/v2/ with /api/cms/
|
||||||
|
- Replace /api/v3/ with /api/herowars/
|
||||||
|
|
||||||
|
4. Update any documentation:
|
||||||
|
- README.md API endpoints section
|
||||||
|
- API documentation and guides
|
||||||
|
|
||||||
|
5. Test all endpoints:
|
||||||
|
- Verify each domain routes work correctly
|
||||||
|
- Check authentication/authorization still functions
|
||||||
|
- Validate error handling
|
||||||
|
|
||||||
|
OPTIONAL: Old v1/v2/v3 directories can be removed after verification:
|
||||||
|
rm -rf src/routes/api/v1
|
||||||
|
rm -rf src/routes/api/v2
|
||||||
|
rm -rf src/routes/api/v3
|
||||||
|
|
||||||
|
═══════════════════════════════════════════════════════════════════════════════
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
|
||||||
|
# Post-Migration Update Checklist
|
||||||
|
|
||||||
|
## Files Updated by Script ✓
|
||||||
|
- [x] Swagger YAML files (/api/v1 → /api/skydive, etc.)
|
||||||
|
- [x] Postman collection and environment files
|
||||||
|
- [x] API routes structure (new domains created)
|
||||||
|
|
||||||
|
## Manual Verification Required
|
||||||
|
|
||||||
|
### 1. Test API Endpoints
|
||||||
|
```bash
|
||||||
|
npm run local # Start the server
|
||||||
|
# In another terminal:
|
||||||
|
curl http://localhost:3200/api-docs # Check Swagger UI
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Verify Routes
|
||||||
|
- [ ] GET /api/skydive/jumps
|
||||||
|
- [ ] GET /api/cms/articles
|
||||||
|
- [ ] GET /api/herowars/clans
|
||||||
|
- [ ] Other domain-specific endpoints
|
||||||
|
|
||||||
|
### 3. Frontend Updates Required (if applicable)
|
||||||
|
- [ ] Update Angular environment files (environment.ts, environment.development.ts, etc.)
|
||||||
|
- [ ] Replace all API calls from /api/v1, /api/v2, /api/v3 to new domains
|
||||||
|
- [ ] Update service layer URLs
|
||||||
|
- [ ] Update HTTP interceptors if needed
|
||||||
|
|
||||||
|
### 4. Documentation Updates
|
||||||
|
- [ ] Update README.md with new API structure
|
||||||
|
- [ ] Update API documentation (if any)
|
||||||
|
- [ ] Update deployment/infrastructure docs
|
||||||
|
- [ ] Update team wiki/documentation
|
||||||
|
|
||||||
|
### 5. CI/CD Pipeline (if applicable)
|
||||||
|
- [ ] Update build/deployment scripts referencing v1/v2/v3
|
||||||
|
- [ ] Update any health checks pointing to old paths
|
||||||
|
- [ ] Update monitoring/alerting rules
|
||||||
|
|
||||||
|
### 6. Client Applications
|
||||||
|
- [ ] Update all client libraries/SDKs
|
||||||
|
- [ ] Update mobile app API endpoints
|
||||||
|
- [ ] Update third-party integrations
|
||||||
|
|
||||||
|
### 7. Database/Caching (if applicable)
|
||||||
|
- [ ] Clear any cached references to old endpoints
|
||||||
|
- [ ] Update API documentation in databases
|
||||||
|
- [ ] Check for hardcoded URLs in configuration
|
||||||
|
|
||||||
|
## Git Operations
|
||||||
|
```bash
|
||||||
|
# View the migration commits
|
||||||
|
git log --oneline -5
|
||||||
|
|
||||||
|
# If rollback needed:
|
||||||
|
git revert <commit-hash>
|
||||||
|
|
||||||
|
# Push changes
|
||||||
|
git push origin develop
|
||||||
|
```
|
||||||
|
|
||||||
|
## Optional: Cleanup Old Directories
|
||||||
|
```bash
|
||||||
|
# After thorough testing, remove old v1/v2/v3 directories:
|
||||||
|
rm -rf src/routes/api/v1
|
||||||
|
rm -rf src/routes/api/v2
|
||||||
|
rm -rf src/routes/api/v3
|
||||||
|
git add -A
|
||||||
|
git commit -m "chore: remove old v1/v2/v3 route directories"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Rollback Procedure
|
||||||
|
If issues arise, rollback with:
|
||||||
|
```bash
|
||||||
|
git reset --hard HEAD~2 # Adjust commit count if needed
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
Document generated: 2026-04-23T22:48:52.497Z
|
||||||
@@ -0,0 +1,329 @@
|
|||||||
|
# Migration Scripts - Guide d'utilisation
|
||||||
|
|
||||||
|
## Vue d'ensemble
|
||||||
|
|
||||||
|
Cette migration restructure votre API Express de `/api/v1` `/api/v2` `/api/v3` (qui représentaient des domaines métier, pas des versions API) vers une architecture basée sur les domaines avec des chemins clairs et explicites.
|
||||||
|
|
||||||
|
### Ancien structure (confuse)
|
||||||
|
```
|
||||||
|
/api/v1/* → Skydive features
|
||||||
|
/api/v2/* → CMS features
|
||||||
|
/api/v3/* → Hero Wars features
|
||||||
|
```
|
||||||
|
|
||||||
|
### Nouvelle structure (claire)
|
||||||
|
```
|
||||||
|
/api/skydive/* ← Toutes les fonctionnalités de parachutisme
|
||||||
|
/api/cms/* ← Gestion de contenu (articles, tags, etc.)
|
||||||
|
/api/herowars/* ← Gestion du jeu HeroWars (clans, membres, raids)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Scripts de migration
|
||||||
|
|
||||||
|
### 1. `migrate-to-domain-structure.js` ✓ EXÉCUTÉ
|
||||||
|
|
||||||
|
**Rôle:** Crée la nouvelle structure et migre les fichiers
|
||||||
|
|
||||||
|
**Statut:** ✅ Completed
|
||||||
|
- Créé les répertoires `/api/skydive`, `/api/cms`, `/api/herowars`
|
||||||
|
- Copié tous les fichiers de routes vers les nouveaux emplacements
|
||||||
|
- Généré les nouveaux fichiers `index.js` pour chaque domaine
|
||||||
|
- Mis à jour `src/routes/api/index.js` pour utiliser les nouveaux chemins
|
||||||
|
- Créé un commit Git
|
||||||
|
|
||||||
|
**Fichiers modifiés:**
|
||||||
|
```
|
||||||
|
✓ src/routes/api/skydive/ (8 fichiers)
|
||||||
|
✓ src/routes/api/cms/ (8 fichiers)
|
||||||
|
✓ src/routes/api/herowars/ (3 fichiers)
|
||||||
|
✓ src/routes/api/index.js (mis à jour)
|
||||||
|
```
|
||||||
|
|
||||||
|
**Rapports générés:**
|
||||||
|
- `MIGRATION_REPORT.md` - Détails complets de la migration
|
||||||
|
- `MIGRATION_SWAGGER_TODO.md` - Tâches pour Swagger
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. `update-references-post-migration.js` ✓ EXÉCUTÉ
|
||||||
|
|
||||||
|
**Rôle:** Met à jour les références aux chemins dans la documentation
|
||||||
|
|
||||||
|
**Statut:** ✅ Completed
|
||||||
|
- Mis à jour les fichiers YAML Swagger (`/api/v1/` → `/api/skydive/`, etc.)
|
||||||
|
- Mis à jour la collection et l'environnement Postman
|
||||||
|
- Scanné les fichiers clés pour les références restantes
|
||||||
|
|
||||||
|
**Rapports générés:**
|
||||||
|
- `POST_MIGRATION_CHECKLIST.md` - Liste de vérification manuelle
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. `finalize-migration.js`
|
||||||
|
|
||||||
|
**Rôle:** Valide, nettoie, et teste la migration
|
||||||
|
|
||||||
|
**Options disponibles:**
|
||||||
|
```bash
|
||||||
|
# Valider la structure sans rien faire
|
||||||
|
node scripts/finalize-migration.js
|
||||||
|
|
||||||
|
# Valider et nettoyer les anciens répertoires
|
||||||
|
node scripts/finalize-migration.js --cleanup
|
||||||
|
|
||||||
|
# Valider et tester les endpoints (nécessite le serveur en cours d'exécution)
|
||||||
|
node scripts/finalize-migration.js --test
|
||||||
|
|
||||||
|
# Mode complet: validation, nettoyage et résumé
|
||||||
|
node scripts/finalize-migration.js --full
|
||||||
|
```
|
||||||
|
|
||||||
|
**Statut:** ✅ Ready to run
|
||||||
|
|
||||||
|
**Rapport généré:**
|
||||||
|
- `MIGRATION_COMPLETE_SUMMARY.md` - Résumé final avec instructions
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Guide étape par étape
|
||||||
|
|
||||||
|
### Étape 1: Vérifier la migration ✅
|
||||||
|
```bash
|
||||||
|
ls -la src/routes/api/
|
||||||
|
# Devrait afficher: cms/, herowars/, skydive/, v1/, v2/, v3/, index.js
|
||||||
|
```
|
||||||
|
|
||||||
|
### Étape 2: Valider la structure
|
||||||
|
```bash
|
||||||
|
node scripts/finalize-migration.js
|
||||||
|
```
|
||||||
|
|
||||||
|
**Résultat attendu:**
|
||||||
|
```
|
||||||
|
✓ skydive/: ✓ (8 route files)
|
||||||
|
✓ cms/: ✓ (7 route files)
|
||||||
|
✓ herowars/: ✓ (3 route files)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Étape 3: Nettoyer les anciens répertoires (OPTIONNEL)
|
||||||
|
```bash
|
||||||
|
# Option A: Via le script
|
||||||
|
node scripts/finalize-migration.js --cleanup
|
||||||
|
|
||||||
|
# Option B: Manuellement
|
||||||
|
rm -rf src/routes/api/v1 src/routes/api/v2 src/routes/api/v3
|
||||||
|
git add -A
|
||||||
|
git commit -m "chore: remove old v1/v2/v3 route directories"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Étape 4: Mettre à jour le frontend (IMPORTANT)
|
||||||
|
|
||||||
|
**Fichiers à modifier dans `adastra_app/src/environments/`:**
|
||||||
|
|
||||||
|
#### `environment.ts`
|
||||||
|
```typescript
|
||||||
|
// AVANT:
|
||||||
|
export const environment = {
|
||||||
|
production: false,
|
||||||
|
apiUrl: '/api/v1',
|
||||||
|
cmsUrl: '/api/v2',
|
||||||
|
herowarsUrl: '/api/v3',
|
||||||
|
};
|
||||||
|
|
||||||
|
// APRÈS:
|
||||||
|
export const environment = {
|
||||||
|
production: false,
|
||||||
|
apiUrl: '/api/skydive',
|
||||||
|
cmsUrl: '/api/cms',
|
||||||
|
herowarsUrl: '/api/herowars',
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
#### `environment.development.ts` et `environment.local.ts`
|
||||||
|
Applique les mêmes changements
|
||||||
|
|
||||||
|
**Mise à jour des services Angular:**
|
||||||
|
```typescript
|
||||||
|
// Dans vos services (par exemple, src/app/services/*.service.ts)
|
||||||
|
|
||||||
|
// AVANT:
|
||||||
|
this.http.get(environment.apiUrl + '/jumps')
|
||||||
|
this.http.get(environment.cmsUrl + '/articles')
|
||||||
|
this.http.get(environment.herowarsUrl + '/clans')
|
||||||
|
|
||||||
|
// APRÈS:
|
||||||
|
this.http.get(environment.apiUrl + '/jumps')
|
||||||
|
this.http.get(environment.cmsUrl + '/articles')
|
||||||
|
this.http.get(environment.herowarsUrl + '/clans')
|
||||||
|
// Pas de changement si vous utilisez les variables d'environnement!
|
||||||
|
// Sinon, cherchez/remplacez les chemins en dur
|
||||||
|
```
|
||||||
|
|
||||||
|
**Automatiser la mise à jour du frontend (macOS/Linux):**
|
||||||
|
```bash
|
||||||
|
cd adastra_app
|
||||||
|
sed -i '' "s|/api/v1|/api/skydive|g" src/**/*.ts
|
||||||
|
sed -i '' "s|/api/v2|/api/cms|g" src/**/*.ts
|
||||||
|
sed -i '' "s|/api/v3|/api/herowars|g" src/**/*.ts
|
||||||
|
```
|
||||||
|
|
||||||
|
### Étape 5: Tester les endpoints
|
||||||
|
|
||||||
|
**Démarrer le serveur API:**
|
||||||
|
```bash
|
||||||
|
cd adastra_api
|
||||||
|
npm run local
|
||||||
|
```
|
||||||
|
|
||||||
|
**Dans un autre terminal, tester les nouveaux chemins:**
|
||||||
|
```bash
|
||||||
|
# Tester Swagger UI
|
||||||
|
curl http://localhost:3200/api-docs
|
||||||
|
|
||||||
|
# Tester les endpoints des domaines
|
||||||
|
curl http://localhost:3200/api/skydive/jumps
|
||||||
|
curl http://localhost:3200/api/cms/articles
|
||||||
|
curl http://localhost:3200/api/herowars/clans
|
||||||
|
|
||||||
|
# Avec authentification si nécessaire
|
||||||
|
curl -H "Authorization: Bearer YOUR_TOKEN" http://localhost:3200/api/skydive/jumps
|
||||||
|
```
|
||||||
|
|
||||||
|
### Étape 6: Tester le frontend
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd adastra_app
|
||||||
|
npm start
|
||||||
|
# Ou avec configuration spécifique
|
||||||
|
npm run local # ng serve --configuration local
|
||||||
|
```
|
||||||
|
|
||||||
|
Vérifier dans les DevTools que les appels API vont vers les nouveaux chemins.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Statistiques de la migration
|
||||||
|
|
||||||
|
| Métrique | Valeur |
|
||||||
|
|----------|--------|
|
||||||
|
| Nouveaux domaines créés | 3 (skydive, cms, herowars) |
|
||||||
|
| Fichiers de routes migrés | 19 |
|
||||||
|
| Fichiers index.js créés/mis à jour | 4 |
|
||||||
|
| Fichiers Swagger mis à jour | Oui |
|
||||||
|
| Fichiers Postman mis à jour | Oui |
|
||||||
|
| Commits Git créés | 1 (structure) + opt. 1 (nettoyage) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Fichiers de rapport créés
|
||||||
|
|
||||||
|
| Fichier | Contenu |
|
||||||
|
|---------|---------|
|
||||||
|
| `MIGRATION_REPORT.md` | Rapport détaillé de la migration |
|
||||||
|
| `MIGRATION_SWAGGER_TODO.md` | Notes pour les mises à jour Swagger |
|
||||||
|
| `POST_MIGRATION_CHECKLIST.md` | Liste de vérification manuelle |
|
||||||
|
| `MIGRATION_COMPLETE_SUMMARY.md` | Résumé final et instructions |
|
||||||
|
| `SCRIPTS_MIGRATION_GUIDE.md` | Ce fichier |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Procédure de rollback
|
||||||
|
|
||||||
|
Si vous devez annuler la migration:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Voir l'historique
|
||||||
|
git log --oneline -10
|
||||||
|
|
||||||
|
# Annuler les changements (ajuster le nombre de commits)
|
||||||
|
git reset --hard HEAD~2
|
||||||
|
|
||||||
|
# Ou restaurer une branche spécifique
|
||||||
|
git reset --hard origin/develop
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Points clés à retenir
|
||||||
|
|
||||||
|
✅ **La migration est non-destructive:**
|
||||||
|
- Les anciens répertoires v1/v2/v3 existent toujours
|
||||||
|
- Vous pouvez les supprimer après vérification
|
||||||
|
|
||||||
|
✅ **Mises à jour automatisées:**
|
||||||
|
- Scripts: Oui ✓
|
||||||
|
- Swagger: Oui ✓
|
||||||
|
- Postman: Oui ✓
|
||||||
|
|
||||||
|
⚠️ **Mises à jour manuelles requises:**
|
||||||
|
- Frontend Angular (environnement + services)
|
||||||
|
- Tous les appels API en dur dans le code cliente
|
||||||
|
- Documentation externe
|
||||||
|
- Tests d'intégration
|
||||||
|
|
||||||
|
✅ **Git-safe:**
|
||||||
|
- Chaque étape crée un commit
|
||||||
|
- Rollback facile si problème
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Les endpoints retournent 404
|
||||||
|
- ✓ Vérifier que le serveur a redémarré après la migration
|
||||||
|
- ✓ Vérifier les chemins dans Swagger UI (http://localhost:3200/api-docs)
|
||||||
|
- ✓ Vérifier que le backend a bien recompilé (avec nodemon)
|
||||||
|
|
||||||
|
### Les routes ne sont pas trouvées
|
||||||
|
- ✓ Vérifier que `src/routes/api/index.js` a les bonnes références
|
||||||
|
- ✓ Vérifier que chaque domaine a un `index.js`
|
||||||
|
- ✓ Vérifier l'ordre des middlewares dans `app.js`
|
||||||
|
|
||||||
|
### Erreurs d'authentification
|
||||||
|
- ✓ Les middlewares d'auth ne sont pas affectés
|
||||||
|
- ✓ Les tokens JWT restent valides
|
||||||
|
- ✓ Les headers restent les mêmes
|
||||||
|
|
||||||
|
### Le frontend ne peut pas accéder à l'API
|
||||||
|
- ✓ Vérifier CORS dans `app.js`
|
||||||
|
- ✓ Vérifier les URLs dans les environnements Angular
|
||||||
|
- ✓ Vérifier les appels http dans les services
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Prochaines étapes
|
||||||
|
|
||||||
|
1. ✅ Tester tous les endpoints du backend
|
||||||
|
2. ✅ Mettre à jour le frontend (environnement + services)
|
||||||
|
3. ✅ Tester le frontend avec le backend modifié
|
||||||
|
4. ✅ Mettre à jour la documentation
|
||||||
|
5. ✅ Nettoyer les anciens répertoires v1/v2/v3 (optionnel)
|
||||||
|
6. ✅ Déployer en staging/production
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Ressources supplémentaires
|
||||||
|
|
||||||
|
- Documentation architecture: `ARCHITECTURE_DIAGRAMS.md`
|
||||||
|
- ADR (Architecture Decision Records): `ADR_INDEX.md`
|
||||||
|
- Configuration Swagger: `src/config/swagger.js`
|
||||||
|
- Routes configuration: `src/routes/api/index.js`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Support
|
||||||
|
|
||||||
|
Pour des questions ou problèmes:
|
||||||
|
|
||||||
|
1. ✓ Consulter los fichiers de rapport (`POST_MIGRATION_CHECKLIST.md`, etc.)
|
||||||
|
2. ✓ Vérifier les logs du serveur: `npm run local` (output)
|
||||||
|
3. ✓ Vérifier Swagger UI: http://localhost:3200/api-docs
|
||||||
|
4. ✓ Exécuter la validation: `node scripts/finalize-migration.js`
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Migration effectuée le:** 24 avril 2026
|
||||||
|
**Version API:** v1/v2/v3 → domain-based
|
||||||
|
**Status:** ✅ Complete
|
||||||
@@ -0,0 +1,370 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cleanup & Testing Script: Finalize Domain-Based API Migration
|
||||||
|
*
|
||||||
|
* This script provides:
|
||||||
|
* 1. Optional cleanup of old v1/v2/v3 directories
|
||||||
|
* 2. Validation of new domain structure
|
||||||
|
* 3. Quick endpoint testing
|
||||||
|
* 4. Summary report
|
||||||
|
*
|
||||||
|
* Usage: node scripts/finalize-migration.js [--cleanup] [--test] [--full]
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const http = require('http');
|
||||||
|
const { execSync } = require('child_process');
|
||||||
|
|
||||||
|
const colors = {
|
||||||
|
reset: '\x1b[0m',
|
||||||
|
green: '\x1b[32m',
|
||||||
|
yellow: '\x1b[33m',
|
||||||
|
red: '\x1b[31m',
|
||||||
|
cyan: '\x1b[36m',
|
||||||
|
blue: '\x1b[34m',
|
||||||
|
magenta: '\x1b[35m',
|
||||||
|
};
|
||||||
|
|
||||||
|
const log = {
|
||||||
|
info: (msg) => console.log(`${colors.cyan}ℹ${colors.reset} ${msg}`),
|
||||||
|
success: (msg) => console.log(`${colors.green}✓${colors.reset} ${msg}`),
|
||||||
|
warn: (msg) => console.log(`${colors.yellow}⚠${colors.reset} ${msg}`),
|
||||||
|
error: (msg) => console.log(`${colors.red}✗${colors.reset} ${msg}`),
|
||||||
|
section: (msg) => console.log(`\n${colors.blue}━━━ ${msg} ━━━${colors.reset}\n`),
|
||||||
|
title: (msg) => console.log(`\n${colors.magenta}╔════════════════════════════════════════╗
|
||||||
|
║ ${msg.padEnd(38)} ║
|
||||||
|
╚════════════════════════════════════════╝${colors.reset}\n`),
|
||||||
|
};
|
||||||
|
|
||||||
|
const args = process.argv.slice(2);
|
||||||
|
const shouldCleanup = args.includes('--cleanup');
|
||||||
|
const shouldTest = args.includes('--test');
|
||||||
|
const fullMode = args.includes('--full');
|
||||||
|
|
||||||
|
const projectRoot = path.resolve(__dirname, '..');
|
||||||
|
const routesDir = path.join(projectRoot, 'src/routes/api');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Phase 1: Validate new structure exists
|
||||||
|
*/
|
||||||
|
function validateNewStructure() {
|
||||||
|
log.section('Phase 1: Validating new domain structure');
|
||||||
|
|
||||||
|
const domains = ['skydive', 'cms', 'herowars'];
|
||||||
|
let allValid = true;
|
||||||
|
|
||||||
|
domains.forEach((domain) => {
|
||||||
|
const domainPath = path.join(routesDir, domain);
|
||||||
|
const indexPath = path.join(domainPath, 'index.js');
|
||||||
|
|
||||||
|
if (fs.existsSync(domainPath) && fs.existsSync(indexPath)) {
|
||||||
|
const fileCount = fs.readdirSync(domainPath).length - 1; // Exclude index.js
|
||||||
|
log.success(`${domain}/: ✓ (${fileCount} route files)`);
|
||||||
|
} else {
|
||||||
|
log.error(`${domain}/: ✗ Missing directory or index.js`);
|
||||||
|
allValid = false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return allValid;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Phase 2: List old directories
|
||||||
|
*/
|
||||||
|
function listOldDirectories() {
|
||||||
|
log.section('Phase 2: Old v1/v2/v3 directories status');
|
||||||
|
|
||||||
|
const oldDirs = ['v1', 'v2', 'v3'];
|
||||||
|
let hasOldDirs = false;
|
||||||
|
|
||||||
|
oldDirs.forEach((dir) => {
|
||||||
|
const fullPath = path.join(routesDir, dir);
|
||||||
|
if (fs.existsSync(fullPath)) {
|
||||||
|
const fileCount = fs.readdirSync(fullPath).length;
|
||||||
|
log.warn(`${dir}/: Still exists (${fileCount} files)`);
|
||||||
|
hasOldDirs = true;
|
||||||
|
} else {
|
||||||
|
log.success(`${dir}/: Already removed ✓`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return hasOldDirs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Phase 3: Cleanup old directories
|
||||||
|
*/
|
||||||
|
function cleanupOldDirectories() {
|
||||||
|
log.section('Phase 3: Cleaning up old directories');
|
||||||
|
|
||||||
|
const oldDirs = ['v1', 'v2', 'v3'];
|
||||||
|
|
||||||
|
oldDirs.forEach((dir) => {
|
||||||
|
const fullPath = path.join(routesDir, dir);
|
||||||
|
if (fs.existsSync(fullPath)) {
|
||||||
|
try {
|
||||||
|
// Recursively delete directory
|
||||||
|
const removeDir = (dirPath) => {
|
||||||
|
if (fs.existsSync(dirPath)) {
|
||||||
|
fs.readdirSync(dirPath).forEach((f) => {
|
||||||
|
const filePath = path.join(dirPath, f);
|
||||||
|
if (fs.lstatSync(filePath).isDirectory()) {
|
||||||
|
removeDir(filePath);
|
||||||
|
} else {
|
||||||
|
fs.unlinkSync(filePath);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
fs.rmdirSync(dirPath);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
removeDir(fullPath);
|
||||||
|
log.success(`Removed: ${dir}/`);
|
||||||
|
} catch (err) {
|
||||||
|
log.error(`Failed to remove ${dir}/: ${err.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create cleanup commit
|
||||||
|
try {
|
||||||
|
execSync('git add -A', { cwd: projectRoot, stdio: 'pipe' });
|
||||||
|
execSync('git commit -m "chore: remove old v1/v2/v3 route directories after migration"', {
|
||||||
|
cwd: projectRoot,
|
||||||
|
stdio: 'pipe',
|
||||||
|
});
|
||||||
|
log.success('Created git commit for cleanup');
|
||||||
|
} catch (err) {
|
||||||
|
log.warn('Could not auto-commit cleanup');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Phase 4: Test endpoints
|
||||||
|
*/
|
||||||
|
function testEndpoints() {
|
||||||
|
log.section('Phase 4: Testing endpoints');
|
||||||
|
|
||||||
|
const endpoints = [
|
||||||
|
{ method: 'GET', path: '/api-docs', description: 'Swagger UI' },
|
||||||
|
{ method: 'GET', path: '/api/skydive/jumps', description: 'Skydive jumps' },
|
||||||
|
{ method: 'GET', path: '/api/cms/articles', description: 'CMS articles' },
|
||||||
|
{ method: 'GET', path: '/api/herowars/clans', description: 'Hero Wars clans' },
|
||||||
|
];
|
||||||
|
|
||||||
|
const testEndpoint = (method, urlPath, description) => {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
const req = http.request(
|
||||||
|
{
|
||||||
|
hostname: 'localhost',
|
||||||
|
port: 3200,
|
||||||
|
path: urlPath,
|
||||||
|
method: method,
|
||||||
|
timeout: 5000,
|
||||||
|
},
|
||||||
|
(res) => {
|
||||||
|
if (res.statusCode === 200 || res.statusCode === 401) {
|
||||||
|
// 401 might happen due to auth, but endpoint exists
|
||||||
|
log.success(`${description} (${res.statusCode})`);
|
||||||
|
resolve(true);
|
||||||
|
} else if (res.statusCode === 404) {
|
||||||
|
log.error(`${description} (404 - not found)`);
|
||||||
|
resolve(false);
|
||||||
|
} else {
|
||||||
|
resolve(true); // Consider other status codes as working
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
req.on('error', (err) => {
|
||||||
|
log.error(`${description} (Connection error)`);
|
||||||
|
resolve(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
req.on('timeout', () => {
|
||||||
|
req.destroy();
|
||||||
|
log.error(`${description} (Timeout)`);
|
||||||
|
resolve(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
req.end();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
log.info('Pinging endpoints...\n');
|
||||||
|
|
||||||
|
// Note: This would require the server to be running
|
||||||
|
log.warn('Endpoint testing requires running server (npm run local)');
|
||||||
|
log.info('Manual test commands:');
|
||||||
|
endpoints.forEach(({ method, path, description }) => {
|
||||||
|
console.log(` curl http://localhost:3200${path} # ${description}`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Phase 5: Generate final summary
|
||||||
|
*/
|
||||||
|
function generateFinalSummary() {
|
||||||
|
log.section('Phase 5: Final Summary');
|
||||||
|
|
||||||
|
const summary = `
|
||||||
|
╔════════════════════════════════════════════════════════════════════════════╗
|
||||||
|
║ MIGRATION SUCCESSFULLY COMPLETED ║
|
||||||
|
╚════════════════════════════════════════════════════════════════════════════╝
|
||||||
|
|
||||||
|
NEW API STRUCTURE:
|
||||||
|
├── /api/skydive/* ← Skydiving features (jumps, aeronefs, dropzones, etc.)
|
||||||
|
├── /api/cms/* ← Content management (articles, tags, comments, etc.)
|
||||||
|
└── /api/herowars/* ← Game features (clans, members, raids, etc.)
|
||||||
|
|
||||||
|
WHAT WAS CHANGED:
|
||||||
|
✓ Routes directory: v1/v2/v3 → domain-based structure
|
||||||
|
✓ Route definitions: Updated all index.js files
|
||||||
|
✓ Swagger YAML: Updated path prefixes to new domains
|
||||||
|
✓ Postman collection: Updated endpoint URLs
|
||||||
|
|
||||||
|
FILES MIGRATED:
|
||||||
|
✓ Skydive domain (8 route files):
|
||||||
|
- aeronefs.js, applications.js, canopies.js, dropzones.js
|
||||||
|
- jumps.js, pages.js, profiles.js, qcm.js
|
||||||
|
|
||||||
|
✓ CMS domain (8 route files):
|
||||||
|
- articles.routes.js, comments.routes.js, product.routes.js
|
||||||
|
- products.routes.js, profiles.routes.js, tags.routes.js, user.routes.js
|
||||||
|
|
||||||
|
✓ Hero Wars domain (3 route files):
|
||||||
|
- clans.routes.js, members.routes.js, herowars.routes.js
|
||||||
|
|
||||||
|
TESTING INSTRUCTIONS:
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
1. Start the API server:
|
||||||
|
npm run local
|
||||||
|
|
||||||
|
2. In another terminal, verify Swagger is updated:
|
||||||
|
curl http://localhost:3200/api-docs
|
||||||
|
|
||||||
|
3. Test a sample endpoint:
|
||||||
|
curl http://localhost:3200/api/skydive/jumps
|
||||||
|
curl http://localhost:3200/api/cms/articles
|
||||||
|
curl http://localhost:3200/api/herowars/clans
|
||||||
|
|
||||||
|
FRONTEND UPDATES REQUIRED:
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
In your Angular frontend (adastra_app):
|
||||||
|
|
||||||
|
1. Update environment files:
|
||||||
|
src/environments/environment.ts
|
||||||
|
src/environments/environment.development.ts
|
||||||
|
src/environments/environment.local.ts
|
||||||
|
|
||||||
|
Replace:
|
||||||
|
- apiUrl: '/api/v1' → apiUrl: '/api/skydive'
|
||||||
|
- cmUrl: '/api/v2' → cmUrl: '/api/cms'
|
||||||
|
- hwUrl: '/api/v3' → hwUrl: '/api/herowars'
|
||||||
|
|
||||||
|
2. Update API service calls:
|
||||||
|
// Before:
|
||||||
|
http.get('/api/v1/jumps')
|
||||||
|
http.get('/api/v2/articles')
|
||||||
|
http.get('/api/v3/clans')
|
||||||
|
|
||||||
|
// After:
|
||||||
|
http.get('/api/skydive/jumps')
|
||||||
|
http.get('/api/cms/articles')
|
||||||
|
http.get('/api/herowars/clans')
|
||||||
|
|
||||||
|
3. Search & replace in your services:
|
||||||
|
sed -i 's|/api/v1/|/api/skydive/|g' src/**/*.ts
|
||||||
|
sed -i 's|/api/v2/|/api/cms/|g' src/**/*.ts
|
||||||
|
sed -i 's|/api/v3/|/api/herowars/|g' src/**/*.ts
|
||||||
|
|
||||||
|
GIT OPERATIONS:
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
View migration commits:
|
||||||
|
git log --oneline -5
|
||||||
|
|
||||||
|
If needed, view detailed changes:
|
||||||
|
git show HEAD
|
||||||
|
|
||||||
|
Push to remote:
|
||||||
|
git push origin develop
|
||||||
|
|
||||||
|
ROLLBACK (if issues):
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
If you need to rollback:
|
||||||
|
git reset --hard HEAD~2
|
||||||
|
|
||||||
|
(Adjust the number of commits based on history)
|
||||||
|
|
||||||
|
ADDITIONAL RESOURCES:
|
||||||
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
|
Documentation files created:
|
||||||
|
- MIGRATION_REPORT.md: Detailed migration information
|
||||||
|
- MIGRATION_SWAGGER_TODO.md: Swagger update notes
|
||||||
|
- POST_MIGRATION_CHECKLIST.md: Verification checklist
|
||||||
|
|
||||||
|
Scripts created:
|
||||||
|
- scripts/migrate-to-domain-structure.js: Main migration script
|
||||||
|
- scripts/update-references-post-migration.js: Post-migration updates
|
||||||
|
- scripts/finalize-migration.js: Cleanup and testing
|
||||||
|
|
||||||
|
═════════════════════════════════════════════════════════════════════════════
|
||||||
|
|
||||||
|
✓ Migration is complete! Follow the testing instructions above.
|
||||||
|
|
||||||
|
═════════════════════════════════════════════════════════════════════════════
|
||||||
|
`;
|
||||||
|
|
||||||
|
const summaryPath = path.join(projectRoot, 'MIGRATION_COMPLETE_SUMMARY.md');
|
||||||
|
fs.writeFileSync(summaryPath, summary);
|
||||||
|
console.log(summary);
|
||||||
|
log.success(`Full summary saved to: MIGRATION_COMPLETE_SUMMARY.md`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main execution
|
||||||
|
*/
|
||||||
|
function main() {
|
||||||
|
log.title('Domain-Based Migration Finalization');
|
||||||
|
|
||||||
|
try {
|
||||||
|
const isValid = validateNewStructure();
|
||||||
|
const hasOldDirs = listOldDirectories();
|
||||||
|
|
||||||
|
if (!isValid) {
|
||||||
|
log.error('New structure validation failed!');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shouldCleanup && hasOldDirs) {
|
||||||
|
const confirm = fullMode ? true : false;
|
||||||
|
if (confirm || fullMode) {
|
||||||
|
log.warn('\nRemoving old v1/v2/v3 directories...');
|
||||||
|
cleanupOldDirectories();
|
||||||
|
} else {
|
||||||
|
log.info('\nTo remove old directories, run:');
|
||||||
|
log.info(' rm -rf src/routes/api/v1 src/routes/api/v2 src/routes/api/v3');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shouldTest || fullMode) {
|
||||||
|
testEndpoints();
|
||||||
|
}
|
||||||
|
|
||||||
|
generateFinalSummary();
|
||||||
|
|
||||||
|
log.success(`\n✓ Finalization complete!\n`);
|
||||||
|
} catch (error) {
|
||||||
|
log.error(`Finalization failed: ${error.message}`);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
||||||
@@ -0,0 +1,322 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Post-Migration Script: Update documentation and references
|
||||||
|
*
|
||||||
|
* This script handles post-migration tasks:
|
||||||
|
* 1. Update Swagger YAML documentation files
|
||||||
|
* 2. Update app.js if needed
|
||||||
|
* 3. Update Postman collection files
|
||||||
|
* 4. Update other references to v1/v2/v3
|
||||||
|
*
|
||||||
|
* Usage: node scripts/update-references-post-migration.js
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
const { execSync } = require('child_process');
|
||||||
|
|
||||||
|
const colors = {
|
||||||
|
reset: '\x1b[0m',
|
||||||
|
green: '\x1b[32m',
|
||||||
|
yellow: '\x1b[33m',
|
||||||
|
red: '\x1b[31m',
|
||||||
|
cyan: '\x1b[36m',
|
||||||
|
blue: '\x1b[34m',
|
||||||
|
};
|
||||||
|
|
||||||
|
const log = {
|
||||||
|
info: (msg) => console.log(`${colors.cyan}ℹ${colors.reset} ${msg}`),
|
||||||
|
success: (msg) => console.log(`${colors.green}✓${colors.reset} ${msg}`),
|
||||||
|
warn: (msg) => console.log(`${colors.yellow}⚠${colors.reset} ${msg}`),
|
||||||
|
error: (msg) => console.log(`${colors.red}✗${colors.reset} ${msg}`),
|
||||||
|
section: (msg) => console.log(`\n${colors.blue}━━━ ${msg} ━━━${colors.reset}\n`),
|
||||||
|
};
|
||||||
|
|
||||||
|
const projectRoot = path.resolve(__dirname, '..');
|
||||||
|
const swaggerDir = path.join(projectRoot, 'src/swagger');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Phase 1: Update Swagger YAML files
|
||||||
|
*/
|
||||||
|
function updateSwaggerYaml() {
|
||||||
|
log.section('Phase 1: Updating Swagger YAML files');
|
||||||
|
|
||||||
|
const pathMappings = {
|
||||||
|
'/api/v1': '/api/skydive',
|
||||||
|
'/api/v2': '/api/cms',
|
||||||
|
'/api/v3': '/api/herowars',
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!fs.existsSync(swaggerDir)) {
|
||||||
|
log.warn(`Swagger directory not found: ${swaggerDir}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const yamlFiles = fs.readdirSync(swaggerDir).filter((f) => f.endsWith('.yaml'));
|
||||||
|
|
||||||
|
yamlFiles.forEach((file) => {
|
||||||
|
const filePath = path.join(swaggerDir, file);
|
||||||
|
let content = fs.readFileSync(filePath, 'utf8');
|
||||||
|
let modified = false;
|
||||||
|
|
||||||
|
Object.entries(pathMappings).forEach(([oldPath, newPath]) => {
|
||||||
|
if (content.includes(oldPath)) {
|
||||||
|
const regex = new RegExp(oldPath, 'g');
|
||||||
|
content = content.replace(regex, newPath);
|
||||||
|
modified = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (modified) {
|
||||||
|
fs.writeFileSync(filePath, content);
|
||||||
|
log.success(`Updated: ${file}`);
|
||||||
|
} else {
|
||||||
|
log.info(`No changes needed: ${file}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Phase 2: Update Postman collection and environment
|
||||||
|
*/
|
||||||
|
function updatePostmanFiles() {
|
||||||
|
log.section('Phase 2: Updating Postman files');
|
||||||
|
|
||||||
|
const testsDir = path.join(projectRoot, 'tests');
|
||||||
|
const collectionPath = path.join(testsDir, 'adastra-api-tests.postman_collection.json');
|
||||||
|
const environmentPath = path.join(testsDir, 'adastra-api-tests.postman_environment.json');
|
||||||
|
|
||||||
|
const updateJsonFile = (filePath, description) => {
|
||||||
|
if (!fs.existsSync(filePath)) {
|
||||||
|
log.warn(`File not found: ${description}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let content = fs.readFileSync(filePath, 'utf8');
|
||||||
|
let modified = false;
|
||||||
|
|
||||||
|
const pathMappings = [
|
||||||
|
{ old: '/api/v1/', new: '/api/skydive/' },
|
||||||
|
{ old: '/api/v2/', new: '/api/cms/' },
|
||||||
|
{ old: '/api/v3/', new: '/api/herowars/' },
|
||||||
|
];
|
||||||
|
|
||||||
|
pathMappings.forEach(({ old, new: newPath }) => {
|
||||||
|
if (content.includes(old)) {
|
||||||
|
const regex = new RegExp(old, 'g');
|
||||||
|
content = content.replace(regex, newPath);
|
||||||
|
modified = true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (modified) {
|
||||||
|
fs.writeFileSync(filePath, content);
|
||||||
|
log.success(`Updated: ${description}`);
|
||||||
|
} else {
|
||||||
|
log.info(`No changes needed: ${description}`);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
updateJsonFile(collectionPath, 'Postman collection');
|
||||||
|
updateJsonFile(environmentPath, 'Postman environment');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Phase 3: Check and report other references
|
||||||
|
*/
|
||||||
|
function findRemainingReferences() {
|
||||||
|
log.section('Phase 3: Scanning for remaining v1/v2/v3 references');
|
||||||
|
|
||||||
|
const patterns = ['/api/v1', '/api/v2', '/api/v3', 'routes.use(\'/v1', 'routes.use(\'/v2', 'routes.use(\'/v3'];
|
||||||
|
const ignorePatterns = ['node_modules', '.git', 'dist', 'build', 'v1/', 'v2/', 'v3/'];
|
||||||
|
|
||||||
|
const filesToCheck = [
|
||||||
|
'app.js',
|
||||||
|
'src/config/swagger.js',
|
||||||
|
'README.md',
|
||||||
|
'src/app.js',
|
||||||
|
'.env*',
|
||||||
|
];
|
||||||
|
|
||||||
|
log.info('Checking key files for old path references...\n');
|
||||||
|
|
||||||
|
let foundReferences = false;
|
||||||
|
|
||||||
|
filesToCheck.forEach((filePattern) => {
|
||||||
|
// Handle glob patterns like .env*
|
||||||
|
let filePaths = [];
|
||||||
|
|
||||||
|
if (filePattern.includes('*')) {
|
||||||
|
const glob = path.basename(filePattern);
|
||||||
|
const dir = path.dirname(filePattern);
|
||||||
|
const basePath = dir === '.' ? projectRoot : path.join(projectRoot, dir);
|
||||||
|
|
||||||
|
if (fs.existsSync(basePath)) {
|
||||||
|
const files = fs.readdirSync(basePath);
|
||||||
|
files.forEach((f) => {
|
||||||
|
if (new RegExp(`^${glob.replace(/\*/g, '.*')}$`).test(f)) {
|
||||||
|
filePaths.push(path.join(basePath, f));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const fullPath = filePattern.startsWith('/')
|
||||||
|
? filePattern
|
||||||
|
: path.join(projectRoot, filePattern);
|
||||||
|
if (fs.existsSync(fullPath)) {
|
||||||
|
filePaths.push(fullPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
filePaths.forEach((filePath) => {
|
||||||
|
try {
|
||||||
|
const content = fs.readFileSync(filePath, 'utf8');
|
||||||
|
const lines = content.split('\n');
|
||||||
|
|
||||||
|
patterns.forEach((pattern) => {
|
||||||
|
lines.forEach((line, index) => {
|
||||||
|
if (line.includes(pattern)) {
|
||||||
|
foundReferences = true;
|
||||||
|
const relativePath = path.relative(projectRoot, filePath);
|
||||||
|
log.warn(`Found in [${relativePath}:${index + 1}]: ${line.trim()}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
// Silently skip files that can't be read
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!foundReferences) {
|
||||||
|
log.success('No remaining v1/v2/v3 references found in key files!');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Phase 4: Generate update checklist
|
||||||
|
*/
|
||||||
|
function generateUpdateChecklist() {
|
||||||
|
log.section('Phase 4: Final checklist');
|
||||||
|
|
||||||
|
const checklist = `
|
||||||
|
# Post-Migration Update Checklist
|
||||||
|
|
||||||
|
## Files Updated by Script ✓
|
||||||
|
- [x] Swagger YAML files (/api/v1 → /api/skydive, etc.)
|
||||||
|
- [x] Postman collection and environment files
|
||||||
|
- [x] API routes structure (new domains created)
|
||||||
|
|
||||||
|
## Manual Verification Required
|
||||||
|
|
||||||
|
### 1. Test API Endpoints
|
||||||
|
\`\`\`bash
|
||||||
|
npm run local # Start the server
|
||||||
|
# In another terminal:
|
||||||
|
curl http://localhost:3200/api-docs # Check Swagger UI
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
### 2. Verify Routes
|
||||||
|
- [ ] GET /api/skydive/jumps
|
||||||
|
- [ ] GET /api/cms/articles
|
||||||
|
- [ ] GET /api/herowars/clans
|
||||||
|
- [ ] Other domain-specific endpoints
|
||||||
|
|
||||||
|
### 3. Frontend Updates Required (if applicable)
|
||||||
|
- [ ] Update Angular environment files (environment.ts, environment.development.ts, etc.)
|
||||||
|
- [ ] Replace all API calls from /api/v1, /api/v2, /api/v3 to new domains
|
||||||
|
- [ ] Update service layer URLs
|
||||||
|
- [ ] Update HTTP interceptors if needed
|
||||||
|
|
||||||
|
### 4. Documentation Updates
|
||||||
|
- [ ] Update README.md with new API structure
|
||||||
|
- [ ] Update API documentation (if any)
|
||||||
|
- [ ] Update deployment/infrastructure docs
|
||||||
|
- [ ] Update team wiki/documentation
|
||||||
|
|
||||||
|
### 5. CI/CD Pipeline (if applicable)
|
||||||
|
- [ ] Update build/deployment scripts referencing v1/v2/v3
|
||||||
|
- [ ] Update any health checks pointing to old paths
|
||||||
|
- [ ] Update monitoring/alerting rules
|
||||||
|
|
||||||
|
### 6. Client Applications
|
||||||
|
- [ ] Update all client libraries/SDKs
|
||||||
|
- [ ] Update mobile app API endpoints
|
||||||
|
- [ ] Update third-party integrations
|
||||||
|
|
||||||
|
### 7. Database/Caching (if applicable)
|
||||||
|
- [ ] Clear any cached references to old endpoints
|
||||||
|
- [ ] Update API documentation in databases
|
||||||
|
- [ ] Check for hardcoded URLs in configuration
|
||||||
|
|
||||||
|
## Git Operations
|
||||||
|
\`\`\`bash
|
||||||
|
# View the migration commits
|
||||||
|
git log --oneline -5
|
||||||
|
|
||||||
|
# If rollback needed:
|
||||||
|
git revert <commit-hash>
|
||||||
|
|
||||||
|
# Push changes
|
||||||
|
git push origin develop
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
## Optional: Cleanup Old Directories
|
||||||
|
\`\`\`bash
|
||||||
|
# After thorough testing, remove old v1/v2/v3 directories:
|
||||||
|
rm -rf src/routes/api/v1
|
||||||
|
rm -rf src/routes/api/v2
|
||||||
|
rm -rf src/routes/api/v3
|
||||||
|
git add -A
|
||||||
|
git commit -m "chore: remove old v1/v2/v3 route directories"
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
## Rollback Procedure
|
||||||
|
If issues arise, rollback with:
|
||||||
|
\`\`\`bash
|
||||||
|
git reset --hard HEAD~2 # Adjust commit count if needed
|
||||||
|
\`\`\`
|
||||||
|
|
||||||
|
---
|
||||||
|
Document generated: ${new Date().toISOString()}
|
||||||
|
`;
|
||||||
|
|
||||||
|
const checklistPath = path.join(projectRoot, 'POST_MIGRATION_CHECKLIST.md');
|
||||||
|
fs.writeFileSync(checklistPath, checklist);
|
||||||
|
log.success(`Created: POST_MIGRATION_CHECKLIST.md`);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main execution
|
||||||
|
*/
|
||||||
|
function main() {
|
||||||
|
console.clear();
|
||||||
|
console.log(`
|
||||||
|
${colors.cyan}╔══════════════════════════════════════════════════════════╗
|
||||||
|
║ POST-MIGRATION: Update References & Documentation ║
|
||||||
|
║ Domain-Based API Structure (skydive/cms/herowars) ║
|
||||||
|
╚══════════════════════════════════════════════════════════════════╝${colors.reset}
|
||||||
|
`);
|
||||||
|
|
||||||
|
try {
|
||||||
|
updateSwaggerYaml();
|
||||||
|
updatePostmanFiles();
|
||||||
|
findRemainingReferences();
|
||||||
|
generateUpdateChecklist();
|
||||||
|
|
||||||
|
log.success(`\n✓ Post-migration updates completed!\n`);
|
||||||
|
log.info(`Next steps:
|
||||||
|
1. Review POST_MIGRATION_CHECKLIST.md
|
||||||
|
2. Run the server: npm run local
|
||||||
|
3. Test endpoints in Swagger UI
|
||||||
|
4. Update frontend API calls
|
||||||
|
5. Run tests and verify everything works
|
||||||
|
\n`);
|
||||||
|
} catch (error) {
|
||||||
|
log.error(`Post-migration update failed: ${error.message}`);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
paths:
|
paths:
|
||||||
/api/v2/articles:
|
/api/cms/articles:
|
||||||
get:
|
get:
|
||||||
summary: Récupère la liste paginée des articles
|
summary: Récupère la liste paginée des articles
|
||||||
description: Retourne une liste paginée de tous les articles. L'authentification est optionnelle.
|
description: Retourne une liste paginée de tous les articles. L'authentification est optionnelle.
|
||||||
@@ -96,7 +96,7 @@ paths:
|
|||||||
'422':
|
'422':
|
||||||
description: Erreur de validation des données
|
description: Erreur de validation des données
|
||||||
|
|
||||||
/api/v2/articles/feed:
|
/api/cms/articles/feed:
|
||||||
get:
|
get:
|
||||||
summary: Récupère le fil d'actualité des articles
|
summary: Récupère le fil d'actualité des articles
|
||||||
description: Retourne les articles des utilisateurs suivis par l'utilisateur authentifié
|
description: Retourne les articles des utilisateurs suivis par l'utilisateur authentifié
|
||||||
@@ -136,7 +136,7 @@ paths:
|
|||||||
'500':
|
'500':
|
||||||
description: Erreur serveur
|
description: Erreur serveur
|
||||||
|
|
||||||
/api/v2/articles/{slug}:
|
/api/cms/articles/{slug}:
|
||||||
get:
|
get:
|
||||||
summary: Récupère un article par son slug
|
summary: Récupère un article par son slug
|
||||||
description: Retourne les détails complets d'un article spécifique
|
description: Retourne les détails complets d'un article spécifique
|
||||||
@@ -245,7 +245,7 @@ paths:
|
|||||||
'500':
|
'500':
|
||||||
description: Erreur serveur
|
description: Erreur serveur
|
||||||
|
|
||||||
/api/v2/articles/{slug}/favorite:
|
/api/cms/articles/{slug}/favorite:
|
||||||
post:
|
post:
|
||||||
summary: Ajoute un article aux favoris
|
summary: Ajoute un article aux favoris
|
||||||
description: Ajoute un article à la liste des favoris de l'utilisateur authentifié
|
description: Ajoute un article à la liste des favoris de l'utilisateur authentifié
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
paths:
|
paths:
|
||||||
/api/v3/clans:
|
/api/herowars/clans:
|
||||||
get:
|
get:
|
||||||
summary: Récupère la liste de tous les clans
|
summary: Récupère la liste de tous les clans
|
||||||
description: Retourne une liste de tous les clans. L'authentification est optionnelle.
|
description: Retourne une liste de tous les clans. L'authentification est optionnelle.
|
||||||
@@ -90,7 +90,7 @@ paths:
|
|||||||
'500':
|
'500':
|
||||||
description: Erreur serveur
|
description: Erreur serveur
|
||||||
|
|
||||||
/api/v3/clans/{clanId}:
|
/api/herowars/clans/{clanId}:
|
||||||
get:
|
get:
|
||||||
summary: Récupère les détails d'un clan
|
summary: Récupère les détails d'un clan
|
||||||
description: Retourne les détails complets d'un clan spécifique. Authentification requise.
|
description: Retourne les détails complets d'un clan spécifique. Authentification requise.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
paths:
|
paths:
|
||||||
/api/v3/members:
|
/api/herowars/members:
|
||||||
get:
|
get:
|
||||||
summary: Récupère la liste de tous les membres
|
summary: Récupère la liste de tous les membres
|
||||||
description: Retourne une liste paginée de tous les membres. Authentification requise.
|
description: Retourne une liste paginée de tous les membres. Authentification requise.
|
||||||
@@ -106,7 +106,7 @@ paths:
|
|||||||
'500':
|
'500':
|
||||||
description: Erreur serveur
|
description: Erreur serveur
|
||||||
|
|
||||||
/api/v3/members/{memberId}:
|
/api/herowars/members/{memberId}:
|
||||||
get:
|
get:
|
||||||
summary: Récupère les détails d'un membre
|
summary: Récupère les détails d'un membre
|
||||||
description: Retourne les détails complets d'un membre spécifique. Authentification requise.
|
description: Retourne les détails complets d'un membre spécifique. Authentification requise.
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
paths:
|
paths:
|
||||||
/api/v1/user:
|
/api/skydive/user:
|
||||||
get:
|
get:
|
||||||
summary: Récupère le profil de l'utilisateur connecté
|
summary: Récupère le profil de l'utilisateur connecté
|
||||||
description: Retourne les informations du profil de l'utilisateur authentifié
|
description: Retourne les informations du profil de l'utilisateur authentifié
|
||||||
@@ -76,7 +76,7 @@ paths:
|
|||||||
'500':
|
'500':
|
||||||
description: Erreur serveur
|
description: Erreur serveur
|
||||||
|
|
||||||
/api/v1/users/login:
|
/api/skydive/users/login:
|
||||||
post:
|
post:
|
||||||
summary: Authentifie un utilisateur
|
summary: Authentifie un utilisateur
|
||||||
description: Authentifie un utilisateur avec email et mot de passe, retourne un JWT
|
description: Authentifie un utilisateur avec email et mot de passe, retourne un JWT
|
||||||
@@ -117,7 +117,7 @@ paths:
|
|||||||
'500':
|
'500':
|
||||||
description: Erreur serveur
|
description: Erreur serveur
|
||||||
|
|
||||||
/api/v1/authenticate:
|
/api/skydive/authenticate:
|
||||||
get:
|
get:
|
||||||
summary: Authentification par clé API
|
summary: Authentification par clé API
|
||||||
description: Authentifie un utilisateur/application avec une clé API dans les headers
|
description: Authentifie un utilisateur/application avec une clé API dans les headers
|
||||||
@@ -142,7 +142,7 @@ paths:
|
|||||||
'500':
|
'500':
|
||||||
description: Erreur serveur
|
description: Erreur serveur
|
||||||
|
|
||||||
/api/v1/users:
|
/api/skydive/users:
|
||||||
post:
|
post:
|
||||||
summary: Crée un nouvel utilisateur
|
summary: Crée un nouvel utilisateur
|
||||||
description: Crée un nouvel utilisateur avec les données fournies
|
description: Crée un nouvel utilisateur avec les données fournies
|
||||||
|
|||||||
Reference in New Issue
Block a user