{"id":24522134,"url":"https://github.com/ismaildrs/learning-platform-template","last_synced_at":"2025-09-25T12:08:12.557Z","repository":{"id":272122322,"uuid":"913731579","full_name":"ismaildrs/learning-platform-template","owner":"ismaildrs","description":null,"archived":false,"fork":false,"pushed_at":"2025-04-20T19:10:49.000Z","size":511,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-20T20:22:29.441Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ismaildrs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-01-08T08:48:24.000Z","updated_at":"2025-01-21T20:37:55.000Z","dependencies_parsed_at":"2025-01-12T10:28:03.188Z","dependency_job_id":"ea56bdf8-aab3-43c3-ae96-eae6f3b57c63","html_url":"https://github.com/ismaildrs/learning-platform-template","commit_stats":null,"previous_names":["ismaildrs/learning-platform-template"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ismaildrs/learning-platform-template","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ismaildrs%2Flearning-platform-template","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ismaildrs%2Flearning-platform-template/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ismaildrs%2Flearning-platform-template/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ismaildrs%2Flearning-platform-template/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ismaildrs","download_url":"https://codeload.github.com/ismaildrs/learning-platform-template/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ismaildrs%2Flearning-platform-template/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276914089,"owners_count":25727275,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-25T02:00:09.612Z","response_time":80,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-01-22T03:18:19.517Z","updated_at":"2025-09-25T12:08:12.534Z","avatar_url":"https://github.com/ismaildrs.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Backend d'une Plateforme d'Apprentissage en Ligne\n\nCe projet est une API pour une plateforme d'apprentissage en ligne. Elle fournit des fonctionnalités CRUD pour gérer les étudiants et les cours. Le backend est construit avec Node.js et MongoDB et utilise Redis pour la mise en cache.\n\n---\n\n## Table des matières\n- [Installation et Lancement](#installation-et-lancement)\n- [Structure du Projet](#structure-du-projet)\n- [Choix Techniques](#choix-techniques)\n- [Réponses aux Questions](#r%C3%A9ponses-aux-questions)\n\n---\n\n## Installation et Lancement\n\n### Prérequis\n- Node.js\n- MongoDB\n- Redis\n- Docker (facultatif pour l'environnement de développement)\n\n### Étapes\n1. Clonez le projet :\n   ```bash\n   git clone https://github.com/ismaildrs/learning-platform-template.git\n   cd learning-platform-template\n   ```\n\n2. Installez les dépendances :\n   ```bash\n   npm install\n   ```\n\n3. Configurez l'environnement :\n   - Copiez le fichier `.env.example` en `.env` et remplissez les valeurs appropriées :\n     ```plaintext\n      REDIS_URI=redis://localhost:6379\n      NODE_ENV=development\n      PORT=3000\n      MONGODB_DB_NAME=learning_platform\n      MONGODB_URI=mongodb://localhost:27017\n      LOG_PATH=logs\n      LOG_LEVEL=info\n     ```\n4. Configurez Docker :\n   - Assurez-vous que Docker est installé sur votre machine.\n   - Positionnez-vous au même niveau que le fichier `docker-compose.yml` et exécutez la commande suivante pour démarrer les services requis :\n     ```bash\n     docker-compose up -d\n     ```\n     \n5. Lancez le projet :\n   ```bash\n   npm start\n   ```\n\n---\n\n## Structure du Projet\n\nVoici une vue d'ensemble de la structure des fichiers :\n\n```\nsrc/\n├── config/\n│   ├── db.js               # Configuration de MongoDB et Redis\n│   ├── env.js              # Chargement des variables d'environnement\n├── controllers/\n│   ├── courseController.js # Gestion des cours\n│   ├── studentController.js# Gestion des étudiants\n├── routes/\n│   ├── courseRoutes.js     # Routes pour les cours\n│   ├── studentRoutes.js    # Routes pour les étudiants\n├── services/\n│   ├── mongoService.js     # Intéractions avec MongoDB\n│   ├── redisService.js     # Services de cache Redis\n├── utils/\n│   ├── logger.js           # Logger basé sur Winston\n│   ├── swagger.js          # Documentation Swagger\n├── app.js                  # Point d'entrée principal de l'application\n```\n\n- **config/** : Contient les configurations pour la base de données et les variables d'environnement.\n- **controllers/** : Contient la logique métier pour les étudiants et les cours.\n- **routes/** : Définit les routes pour les différents endpoints de l'API.\n- **services/** : Fournit les abstractions pour MongoDB et Redis.\n- **utils/** : Contient des utilitaires comme le logger Winston et la configuration Swagger.\n\n---\n\n## Choix Techniques\n\n### 1. **Logging : Winston**\nWinston est utilisé pour une gestion efficace des logs structurés. Il permet de différencier les logs en fonction de leur niveau de gravité. Deux fichiers principaux sont générés :\n   - `combined.log` : Contient tous les logs, qu'ils soient informatifs ou d'erreur.\n   - `error.log` : Spécifiquement dédié aux erreurs.\n\n**Exemple de structure de log :**\n```json\n{\n  \"timestamp\": \"2025-01-14T10:15:30Z\",\n  \"level\": \"error\",\n  \"message\": \"Une erreur est survenue lors de la connexion à MongoDB\"\n}\n```\n\nVoici un aperçu du dossier de logs généré par Winston :\n\n![Logging avec Winston](./screenshots/logs.png)\n\n### 2. **Documentation : Swagger**\nSwagger est utilisé pour documenter et tester l'API de manière interactive. Grâce à l'interface Swagger UI, il est possible de visualiser et tester chaque endpoint disponible.\n\nPour accéder à la documentation Swagger, démarrez le projet et ouvrez votre navigateur à l’adresse suivante :\n```\nhttp://localhost:3000/api-docs\n```\n\n**Capture d'écran de Swagger UI :**  \n![Interface Swagger](./screenshots/image.png)\n\n### 3. **Docker**\nDocker est utilisé pour simplifier le déploiement et la gestion des dépendances. Un fichier `docker-compose.yml` est fourni pour lancer facilement les services nécessaires à l'application.\n\nPour démarrer les services :\n```bash\ndocker-compose up -d\n```\n\n---\n\n## Réponses aux Questions\n\n### 1. **Pourquoi utiliser Redis ?**\nRedis permet de stocker temporairement des données fréquemment consultées, ce qui réduit la charge sur la base de données MongoDB et améliore les temps de réponse.\n\n### 2. **Comment gérer les erreurs dans l'API ?**\nL'API utilise Winston pour logger les erreurs dans un fichier dédié (`error.log`). En cas d'erreur, un message approprié est renvoyé au client avec un code HTTP correct (par exemple, 400 pour une requête invalide, 500 pour une erreur serveur).\n\n### 3. **Mise en place de la gestion des logs**\nLe logger Winston est configuré dans le fichier `logger.js` sous le dossier `utils`. Il enregistre les logs dans des fichiers et, en mode développement, affiche également les logs dans la console avec des couleurs.\n\n### 4. **Pourquoi choisir MongoDB ?**\nMongoDB est idéal pour ce projet grâce à sa flexibilité dans le stockage des données non structurées et son support natif pour les objets JSON.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fismaildrs%2Flearning-platform-template","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fismaildrs%2Flearning-platform-template","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fismaildrs%2Flearning-platform-template/lists"}