{"id":51246920,"url":"https://github.com/biohazardyee/3proj-team2","last_synced_at":"2026-06-29T05:01:46.872Z","repository":{"id":367425620,"uuid":"1112157496","full_name":"Biohazardyee/3PROJ-Team2","owner":"Biohazardyee","description":"Melodia — réseau social musical full-stack (Express · Prisma · PostgreSQL · React · React Native/Expo) : critiques et notes d'albums, playlists, feed personnalisé, messagerie temps réel et intégration Last.fm.","archived":false,"fork":false,"pushed_at":"2026-06-25T23:19:40.000Z","size":75839,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-26T01:09:03.254Z","etag":null,"topics":["docker","expo","express","fullstack","i18n","jwt","lastfm-api","music","oauth2","postgresql","prisma","react","react-native","rest-api","social-network","socket-io","tailwindcss","typescript","vite"],"latest_commit_sha":null,"homepage":"https://www.melodia.cloud/","language":"TypeScript","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/Biohazardyee.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-08T08:26:45.000Z","updated_at":"2026-06-22T07:18:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Biohazardyee/3PROJ-Team2","commit_stats":null,"previous_names":["biohazardyee/3proj-team2"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/Biohazardyee/3PROJ-Team2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Biohazardyee%2F3PROJ-Team2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Biohazardyee%2F3PROJ-Team2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Biohazardyee%2F3PROJ-Team2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Biohazardyee%2F3PROJ-Team2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Biohazardyee","download_url":"https://codeload.github.com/Biohazardyee/3PROJ-Team2/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Biohazardyee%2F3PROJ-Team2/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34913586,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-29T02:00:05.398Z","response_time":58,"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":["docker","expo","express","fullstack","i18n","jwt","lastfm-api","music","oauth2","postgresql","prisma","react","react-native","rest-api","social-network","socket-io","tailwindcss","typescript","vite"],"created_at":"2026-06-29T05:01:42.388Z","updated_at":"2026-06-29T05:01:46.862Z","avatar_url":"https://github.com/Biohazardyee.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Melodia\n\n\u003e Plateforme sociale musicale — découvrez, critiquez et partagez de la musique avec votre communauté.\n\n---\n\n## Sommaire\n\n- [Melodia](#melodia)\n  - [Sommaire](#sommaire)\n  - [Présentation](#présentation)\n  - [Stack technique](#stack-technique)\n  - [Architecture](#architecture)\n    - [Services Docker](#services-docker)\n  - [Prérequis](#prérequis)\n  - [Installation](#installation)\n    - [1. Cloner le dépôt](#1-cloner-le-dépôt)\n    - [2. Installer les dépendances](#2-installer-les-dépendances)\n    - [3. Configurer Prisma](#3-configurer-prisma)\n  - [Variables d'environnement](#variables-denvironnement)\n    - [Backend (`backend/.env`)](#backend-backendenv)\n    - [Web (`clients/web/.env`)](#web-clientswebenv)\n    - [Mobile (`clients/mobile/.env`)](#mobile-clientsmobileenv)\n    - [Docker (racine `.env`)](#docker-racine-env)\n  - [Déploiement Docker](#déploiement-docker)\n  - [Application mobile (APK Android)](#application-mobile-apk-android)\n    - [Installation de l'APK](#installation-de-lapk)\n    - [(Re)générer l'APK via EAS](#regénérer-lapk-via-eas)\n  - [Fonctionnalités](#fonctionnalités)\n    - [Authentification](#authentification)\n    - [Musique](#musique)\n    - [Social](#social)\n    - [Playlists](#playlists)\n    - [Messagerie](#messagerie)\n    - [Administration](#administration)\n    - [Internationalisation](#internationalisation)\n  - [Structure du projet](#structure-du-projet)\n    - [Backend](#backend)\n    - [Web](#web)\n    - [Mobile](#mobile)\n  - [Documentation](#documentation)\n  - [Équipe](#équipe)\n\n---\n\n## Présentation\n\n**Melodia** est une application full-stack permettant aux utilisateurs de :\n\n- Rechercher des albums et artistes via des APIs musicales externes\n- Rédiger des avis et noter des albums (1-5 étoiles)\n- Commenter et liker les avis d'autres membres\n- Créer et gérer des playlists personnelles\n- Suivre d'autres utilisateurs et consulter un fil d'actualité\n- Échanger via une messagerie instantanée\n- Suivre ses statistiques musicales personnelles\n- Recevoir des notifications en temps réel\n\n---\n\n## Stack technique\n\n| Couche          | Technologies                                                 |\n| --------------- | ------------------------------------------------------------ |\n| **Backend**     | Node.js 20, Express 5, TypeScript, Prisma 7, PostgreSQL 18   |\n| **Web**         | React 19, Vite 7, TypeScript, Tailwind CSS 4, React Router 7 |\n| **Mobile**      | React Native 0.81, Expo 54, Expo Router 6, TypeScript        |\n| **Temps réel**  | Socket.io 4.8                                                |\n| **Auth**        | JWT, Passport.js (OAuth : Google, Discord)                   |\n| **i18n**        | i18next (5 langues : FR, EN, DE, IT, ES)                     |\n| **Déploiement** | Docker, Cloudflare Tunnel                                    |\n\n---\n\n## Architecture\n\n```\n3PROJ-Team2/\n├── backend/                  # API REST + WebSocket (Express / Prisma / PostgreSQL)\n├── clients/\n│   ├── web/                  # Application React (Vite + Tailwind)\n│   └── mobile/               # Application React Native (Expo)\n├── docs/                     # Documentation technique\n├── docker-compose.yml        # Orchestration des services\n└── README.md\n```\n\n### Services Docker\n\n| Service             | Description       | Port |\n| ------------------- | ----------------- | ---- |\n| `db`                | PostgreSQL 18.1   | 5432 |\n| `api`               | Backend Express   | 3000 |\n| `frontend`          | Web React (Nginx) | 80   |\n| `cloudflare-tunnel` | Reverse proxy     | —    |\n\n---\n\n## Prérequis\n\n- [Node.js](https://nodejs.org/) ≥ 20\n- [Docker](https://www.docker.com/) \u0026 Docker Compose\n- [Expo CLI](https://docs.expo.dev/get-started/installation/) (pour le mobile)\n- PostgreSQL (si lancement sans Docker)\n\n---\n\n## Installation\n\n### 1. Cloner le dépôt\n\n```bash\ngit clone https://github.com/Biohazardyee/3PROJ-Team2.git\ncd 3PROJ-Team2\n```\n\n### 2. Installer les dépendances\n\n```bash\n# Backend\ncd backend \u0026\u0026 npm install\n\n# Web\ncd ../clients/web \u0026\u0026 npm install\n\n# Mobile\ncd ../mobile \u0026\u0026 npm install\n```\n\n### 3. Configurer Prisma\n\n```bash\ncd backend\nnpx prisma generate\nnpx prisma migrate deploy\n```\n\n---\n\n## Variables d'environnement\n\n### Backend (`backend/.env`)\n\n```env\nDATABASE_URL=postgresql://USER:PASSWORD@localhost:5432/melodia\nPORT=3000\nJWT_SECRET=your_jwt_secret\n\n# API musicale (Last.fm) — requis\nAPI_ROOT_URL=https://ws.audioscrobbler.com/2.0/\nAPI_KEY=your_lastfm_api_key\n\n# OAuth Google (actif)\nGOOGLE_CLIENT_ID=\nGOOGLE_CLIENT_SECRET=\nGOOGLE_CALLBACK_URL=\n\n# OAuth Discord (actif)\nDISCORD_CLIENT_ID=\nDISCORD_CLIENT_SECRET=\nDISCORD_CALLBACK_URL=\n\n# OAuth Facebook / GitHub (préparés, non activés)\nFACEBOOK_CLIENT_ID=\nFACEBOOK_CLIENT_SECRET=\nGITHUB_CLIENT_ID=\nGITHUB_CLIENT_SECRET=\n\n# URLs clients\nWEB_CLIENT_URL=http://localhost:5173\nMOBILE_REDIRECT_URI=exp://localhost:8081\n```\n\n\u003e La clé `API_KEY` s'obtient sur [last.fm/api/account/create](https://www.last.fm/api/account/create). Seules les stratégies OAuth **Google** et **Discord** sont actives.\n\n### Web (`clients/web/.env`)\n\n```env\nVITE_API_URL=http://localhost:3000\n```\n\n### Mobile (`clients/mobile/.env`)\n\n```env\nEXPO_PUBLIC_API_URL=http://localhost:3000\n```\n\n### Docker (racine `.env`)\n\n```env\nPOSTGRES_DB=melodia\nPOSTGRES_USER=postgres\nPOSTGRES_PASSWORD=your_password\nCLOUDFLARE_TUNNEL_TOKEN=your_token\n```\n\n---\n\n## Déploiement Docker\n\n```bash\n# Construire et lancer tous les services\ndocker compose up --build -d\n\n# Vérifier les logs\ndocker compose logs -f\n```\n\nL'application est ensuite accessible via le tunnel Cloudflare configuré (domaine `melodia.cloud`).\n\n---\n\n## Application mobile (APK Android)\n\nUne version compilée de l'application mobile (APK Android) est disponible dans le dossier :\n\n```\nclients/mobile/release/\n```\n\n### Installation de l'APK\n\n1. Télécharger le fichier `.apk` depuis `clients/mobile/release/`.\n2. Sur l'appareil Android, autoriser l'installation depuis des sources inconnues (Paramètres → Sécurité).\n3. Ouvrir le fichier `.apk` pour lancer l'installation.\n\n### (Re)générer l'APK via EAS\n\n```bash\ncd clients/mobile\neas build --platform android --profile preview\n```\n\n\u003e L'APK pointe vers l'API de production (`EXPO_PUBLIC_API_URL`). Pour un usage local, recompiler en faisant pointer cette variable vers votre backend.\n\n---\n\n## Fonctionnalités\n\n### Authentification\n- Inscription / Connexion par email \u0026 mot de passe\n- OAuth : Google, Discord\n- Sessions JWT avec token sécurisé\n\n### Musique\n- Recherche d'albums et d'artistes (API externe Last.fm)\n- Page détail album : tracklist, biographie, albums similaires\n- Statut personnel : Écouté, À écouter, Favori, Pas aimé\n\n### Social\n- Rédaction d'avis avec note (1-5 étoiles)\n- Commentaires et likes sur les avis\n- Fil d'activité des personnes suivies\n- Système de signalement de contenus\n\n### Playlists\n- Création et gestion de playlists (publiques / privées)\n- Ajout / suppression d'albums depuis la page de détail\n\n### Messagerie\n- Conversations privées en temps réel (Socket.io)\n- Notifications push (Expo Notifications)\n\n### Administration\n- Tableau de bord admin\n- Gestion des signalements et des bans\n\n### Internationalisation\n- 5 langues disponibles : Français, English, Deutsch, Italiano, Español\n\n---\n\n## Structure du projet\n\n### Backend\n\n```\nbackend/\n├── bin/www.ts               # Point d'entrée, Socket.io\n├── app.ts                   # Configuration Express\n├── middlewares/             # Auth JWT, vérifications de rôle\n├── modules/\n│   ├── db/                  # Contrôleurs \u0026 services (users, reviews, playlists…)\n│   ├── external_api/        # Intégrations APIs musicales\n│   ├── oauth/               # Stratégies Passport.js\n│   └── web_socket/          # Serveur Socket.io\n├── routes/                  # Définitions des routes REST\n└── prisma/\n    └── schema.prisma        # Schéma base de données\n```\n\n### Web\n\n```\nclients/web/src/\n├── pages/                   # Pages React (Login, Home, AlbumDetails…)\n├── components/              # Composants réutilisables\n├── context/                 # État global (React Context)\n├── api/                     # Client Axios\n└── i18n.ts                  # Configuration i18next\n```\n\n### Mobile\n\n```\nclients/mobile/\n├── app/                     # Routes Expo Router (file-based)\n│   └── review/[id]/         # Routes imbriquées (commentaires)\n├── release/                 # APK Android compilé (build de release)\n├── assets/                  # Polices, images, icônes\n└── src/\n    ├── pages/               # Composants de page\n    ├── components/          # Composants réutilisables\n    ├── context/             # ThemeContext, etc.\n    ├── api/                 # Client Axios\n    ├── hook/                # Custom hooks\n    └── i18n.ts              # Configuration i18next\n```\n\n---\n\n## Documentation\n\nLa documentation technique complète (architecture, modèle de données, API, sécurité, déploiement, diagrammes UML) est disponible dans le dossier [`docs/`](docs/) :\n\n- `docs/Documentation_Technique.pdf` - documentation technique\n- `docs/Manuel_utilisateur_mobile.pdf` - Documentation utilisateur mobile\n- `docs/Manuel_utilisateur_web.pdf` - Documentation utilisateur web\n\n---\n\n## Équipe\n\n| Nom             | Photo                                                                         |\n| --------------- | ----------------------------------------------------------------------------- |\n| Marlier Thibaud | \u003cimg src=\"img/thibaud.jpg\" width=\"120\" height=\"120\" alt=\"Marlier Thibaud\" /\u003e  |\n| Guillard Noah   | \u003cimg src=\"img/noah.jpeg\" width=\"120\" height=\"120\" alt=\"Guillard Noah\" /\u003e      |\n| Aurelien Berlot | \u003cimg src=\"img/aurelien.png\" width=\"120\" height=\"120\" alt=\"Aurelien Berlot\" /\u003e |\n| Romain Metais   | \u003cimg src=\"img/romain.png\" width=\"120\" height=\"120\" alt=\"Romain Metais\" /\u003e     |","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbiohazardyee%2F3proj-team2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbiohazardyee%2F3proj-team2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbiohazardyee%2F3proj-team2/lists"}