commit
8928ea5dba
20 changed files with 3514 additions and 0 deletions
@ -0,0 +1,143 @@ |
|||
# FreeTube - Checklist de développement Backend |
|||
|
|||
## **AUTHENTIFICATION** (15 points) |
|||
|
|||
### Connexion utilisateur standard (5 points) ✅ |
|||
- [x] Route de connexion avec nom d'utilisateur/mot de passe |
|||
- [x] Validation des credentials |
|||
- [x] Génération de token JWT |
|||
|
|||
### Connexion OAuth2 (10 points) |
|||
- [ ] Intégration avec au moins un service OAuth2 (Google, Microsoft, GitHub) |
|||
- [ ] Routes pour gérer les callbacks OAuth2 |
|||
- [ ] Middleware de gestion des tokens OAuth2 |
|||
|
|||
## **GESTION UTILISATEUR** (10 points) ✅ |
|||
- [x] Modification adresse email (unique) |
|||
- [x] Modification nom d'utilisateur (unique) |
|||
- [x] Modification mot de passe sécurisé |
|||
- [x] Modification photo de profil |
|||
- [x] Création/modification nom d'affichage chaîne |
|||
- [x] Création/modification description chaîne |
|||
|
|||
## **ADMINISTRATION CHAÎNE FREETUBE** (55 points) |
|||
|
|||
### Mettre en ligne une vidéo (30 points) |
|||
- [x] Upload média vidéo (10 points) |
|||
- [x] Upload miniature vidéo (2 points) |
|||
- [x] Titre (2 points) |
|||
- [x] Description (2 points) |
|||
- [x] Date de mise en ligne automatique (2 points) |
|||
- [ ] Mots-clefs/hashtags jusqu'à 10 (2 points) |
|||
- [ ] Visibilité publique/privée (5 points) |
|||
- [ ] Génération lien partageable (5 points) |
|||
|
|||
### Gestion vidéos existantes |
|||
- [ ] Éditer une vidéo existante (5 points) |
|||
- [ ] Changer la visibilité (5 points) |
|||
- [x] Supprimer une vidéo (5 points) |
|||
|
|||
### Statistiques |
|||
- [ ] Statistiques par vidéo (vues, likes, commentaires) (5 points) |
|||
- [ ] Statistiques globales de la chaîne (5 points) |
|||
|
|||
## **PAGE ACCUEIL** (30 points) |
|||
|
|||
### Utilisateur authentifié (15 points) |
|||
- [ ] Section Recommendations (contenu similaire non vu) (5 points) |
|||
- [ ] Section "À consulter plus tard" (5 points) |
|||
- [ ] Section Tendances (contenu avec plus d'interactions récentes) (5 points) |
|||
|
|||
### Utilisateur non-authentifié (15 points) |
|||
- [ ] Section Recommendations (3 mots-clefs les plus utilisés) (5 points) |
|||
- [ ] Section Tendances (5 points) |
|||
- [ ] Section Top créateurs (plus d'abonnés) (5 points) |
|||
|
|||
## **PAGE ABONNEMENTS** (10 points) |
|||
- [ ] Fil d'actualité des abonnements (8 points) |
|||
- [ ] Redirection pour non-authentifiés (2 points) |
|||
|
|||
## **PAGE UTILISATEUR** (15 points) |
|||
- [ ] Historique des vidéos regardées (10 points) |
|||
- [ ] Gestion et liste des playlists (5 points) |
|||
|
|||
## **PAGE PLAYLIST** (10 points) |
|||
- [ ] Affichage nom playlist et vidéos |
|||
- [ ] Tri par date d'ajout |
|||
- [ ] Navigation depuis page utilisateur |
|||
|
|||
## **PAGE VIDÉO** (50 points) |
|||
|
|||
### Lecteur vidéo (20 points) |
|||
- [x] Média visualisable (10 points) |
|||
- [ ] Bouton Pause (2 points) |
|||
- [ ] Bouton Play (2 points) |
|||
- [ ] Saut XX secondes en avant (3 points) |
|||
- [ ] Saut XX secondes en arrière (3 points) |
|||
|
|||
### Informations vidéo (20 points) |
|||
- [x] Titre de la vidéo (2 points) |
|||
- [x] Description (2 points) |
|||
- [x] Nom de la chaîne (2 points) |
|||
- [ ] Compteur abonnés (2 points) |
|||
- [ ] Compteur "J'aime" (2 points) |
|||
- [ ] Bouton "J'aime" (5 points) |
|||
- [ ] Bouton "S'abonner" (5 points) |
|||
|
|||
### Commentaires (10 points) ✅ |
|||
- [x] Créer un commentaire (5 points) |
|||
- [x] Voir les commentaires (5 points) |
|||
|
|||
### Recommendations (5 points) |
|||
- [ ] Section recommendations/tendances selon authentification |
|||
|
|||
## **FONCTIONNALITÉS SYSTÈME** |
|||
|
|||
### Système d'abonnements (18 points estimés) |
|||
- [ ] Routes s'abonner/désabonner à une chaîne |
|||
- [ ] Modèle de données abonnements |
|||
- [ ] Compteur d'abonnés par chaîne |
|||
|
|||
### Système "J'aime" (10 points estimés) |
|||
- [ ] Routes aimer/ne plus aimer vidéo |
|||
- [ ] Modèle de données likes |
|||
- [ ] Mise à jour compteur likes |
|||
|
|||
### Gestion playlists (25 points estimés) |
|||
- [ ] Routes créer/supprimer playlists |
|||
- [ ] Ajout/suppression vidéos dans playlists |
|||
- [ ] Playlist "À consulter plus tard" par défaut |
|||
- [ ] Affichage contenu playlist |
|||
|
|||
### Historique utilisateur (10 points estimés) |
|||
- [ ] Enregistrement automatique vidéos regardées |
|||
- [ ] Routes consultation historique |
|||
|
|||
### Système recommandations (15 points estimés) |
|||
- [ ] Algorithme pour utilisateurs authentifiés |
|||
- [ ] Recommendations mots-clés pour non-authentifiés |
|||
- [ ] Calcul tendances (interactions récentes) |
|||
|
|||
### Compteurs et statistiques |
|||
- [ ] Compteur de vues par vidéo |
|||
- [ ] Mise à jour automatique lors du visionnage |
|||
- [ ] Statistiques complètes par vidéo et chaîne |
|||
|
|||
## **POINTS CRITIQUES POUR ÉVITER L'AJOURNEMENT** |
|||
- **Fonctionnalités : 120/200 points minimum** |
|||
- **Qualité code : 60/100 points minimum** |
|||
- **Documentation : 30/50 points minimum** |
|||
- **Déploiement : 30/50 points minimum** |
|||
|
|||
## **AMÉLIORATIONS TECHNIQUES** |
|||
- [ ] Validation robuste données d'entrée |
|||
- [ ] Gestion d'erreurs appropriée |
|||
- [ ] Middleware de sécurité complet |
|||
- [ ] Tests unitaires (fichiers présents à compléter) |
|||
- [ ] Architecture REST propre |
|||
- [ ] Optimisation performances base de données |
|||
|
|||
--- |
|||
|
|||
**Status actuel estimé : ~102/200 points fonctionnalités** |
|||
**Objectif prioritaire : Atteindre 120 points minimum** |
|||
@ -0,0 +1,43 @@ |
|||
services: |
|||
|
|||
backend: |
|||
build: |
|||
context: ./backend |
|||
dockerfile: Dockerfile |
|||
ports: |
|||
- "8000:8000" |
|||
environment: |
|||
DB_USER: astria |
|||
DB_NAME: freetube |
|||
DB_HOST: db |
|||
DB_PASSWORD: 9Zv1Y1MAfWKKmtP7JlSQPX7ZmHkS1J6iTlOFQb6OFZEzWjQGeJIKictaGvKyOBIz |
|||
JWT_SECRET: Aed4GPa8BtriElyuwy65bf598D8MgxWCiE6Xzc4riV0J7AiLpxeu2DexjQPx4cBO |
|||
LOG_FILE: /var/log/freetube/access.log |
|||
PORT: 8000 |
|||
volumes: |
|||
- ./backend/logs:/var/log/freetube |
|||
depends_on: |
|||
- db |
|||
|
|||
db: |
|||
image: postgres:latest |
|||
ports: |
|||
- "5432:5432" |
|||
environment: |
|||
POSTGRES_USER: astria |
|||
POSTGRES_PASSWORD: 9Zv1Y1MAfWKKmtP7JlSQPX7ZmHkS1J6iTlOFQb6OFZEzWjQGeJIKictaGvKyOBIz |
|||
POSTGRES_DB: freetube |
|||
volumes: |
|||
- db_data:/var/lib/postgresql/data |
|||
|
|||
frontend: |
|||
image: nginx:latest |
|||
ports: |
|||
- "80:80" |
|||
volumes: |
|||
- ./frontend/dist:/var/www/html |
|||
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf |
|||
|
|||
volumes: |
|||
db_data: |
|||
driver: local |
|||
@ -0,0 +1,24 @@ |
|||
# Logs |
|||
logs |
|||
*.log |
|||
npm-debug.log* |
|||
yarn-debug.log* |
|||
yarn-error.log* |
|||
pnpm-debug.log* |
|||
lerna-debug.log* |
|||
|
|||
node_modules |
|||
dist |
|||
dist-ssr |
|||
*.local |
|||
|
|||
# Editor directories and files |
|||
.vscode/* |
|||
!.vscode/extensions.json |
|||
.idea |
|||
.DS_Store |
|||
*.suo |
|||
*.ntvs* |
|||
*.njsproj |
|||
*.sln |
|||
*.sw? |
|||
@ -0,0 +1,12 @@ |
|||
# React + Vite |
|||
|
|||
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. |
|||
|
|||
Currently, two official plugins are available: |
|||
|
|||
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh |
|||
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh |
|||
|
|||
## Expanding the ESLint configuration |
|||
|
|||
If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project. |
|||
@ -0,0 +1,29 @@ |
|||
import js from '@eslint/js' |
|||
import globals from 'globals' |
|||
import reactHooks from 'eslint-plugin-react-hooks' |
|||
import reactRefresh from 'eslint-plugin-react-refresh' |
|||
import { defineConfig, globalIgnores } from 'eslint/config' |
|||
|
|||
export default defineConfig([ |
|||
globalIgnores(['dist']), |
|||
{ |
|||
files: ['**/*.{js,jsx}'], |
|||
extends: [ |
|||
js.configs.recommended, |
|||
reactHooks.configs['recommended-latest'], |
|||
reactRefresh.configs.vite, |
|||
], |
|||
languageOptions: { |
|||
ecmaVersion: 2020, |
|||
globals: globals.browser, |
|||
parserOptions: { |
|||
ecmaVersion: 'latest', |
|||
ecmaFeatures: { jsx: true }, |
|||
sourceType: 'module', |
|||
}, |
|||
}, |
|||
rules: { |
|||
'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], |
|||
}, |
|||
}, |
|||
]) |
|||
@ -0,0 +1,13 @@ |
|||
<!doctype html> |
|||
<html lang="en"> |
|||
<head> |
|||
<meta charset="UTF-8" /> |
|||
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> |
|||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
|||
<title>Vite + React</title> |
|||
</head> |
|||
<body> |
|||
<div id="root"></div> |
|||
<script type="module" src="/src/main.jsx"></script> |
|||
</body> |
|||
</html> |
|||
File diff suppressed because it is too large
@ -0,0 +1,28 @@ |
|||
{ |
|||
"name": "frontend", |
|||
"private": true, |
|||
"version": "0.0.0", |
|||
"type": "module", |
|||
"scripts": { |
|||
"dev": "vite", |
|||
"build": "vite build", |
|||
"lint": "eslint .", |
|||
"preview": "vite preview" |
|||
}, |
|||
"dependencies": { |
|||
"react": "^19.1.0", |
|||
"react-dom": "^19.1.0", |
|||
"react-router-dom": "^7.6.3" |
|||
}, |
|||
"devDependencies": { |
|||
"@eslint/js": "^9.30.1", |
|||
"@types/react": "^19.1.8", |
|||
"@types/react-dom": "^19.1.6", |
|||
"@vitejs/plugin-react": "^4.6.0", |
|||
"eslint": "^9.30.1", |
|||
"eslint-plugin-react-hooks": "^5.2.0", |
|||
"eslint-plugin-react-refresh": "^0.4.20", |
|||
"globals": "^16.3.0", |
|||
"vite": "^7.0.4" |
|||
} |
|||
} |
|||
|
After Width: | Height: | Size: 1.5 KiB |
@ -0,0 +1,16 @@ |
|||
import {useRoutes} from "react-router-dom"; |
|||
import routes from "./routes/routes"; |
|||
import Navbar from "./components/Navbar.jsx"; |
|||
|
|||
function App() { |
|||
const routing = useRoutes(routes) |
|||
return ( |
|||
<div> |
|||
<Navbar/> |
|||
{routing} |
|||
</div> |
|||
) |
|||
|
|||
} |
|||
|
|||
export default App |
|||
@ -0,0 +1,13 @@ |
|||
|
|||
|
|||
export default function Navbar(isSearchPage) { |
|||
return ( |
|||
<nav> |
|||
<ul> |
|||
<li><a href="/">Home</a></li> |
|||
<li><a href="/about">About</a></li> |
|||
<li><a href="/contact">Contact</a></li> |
|||
</ul> |
|||
</nav> |
|||
) |
|||
} |
|||
@ -0,0 +1,68 @@ |
|||
:root { |
|||
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; |
|||
line-height: 1.5; |
|||
font-weight: 400; |
|||
|
|||
color-scheme: light dark; |
|||
color: rgba(255, 255, 255, 0.87); |
|||
background-color: #242424; |
|||
|
|||
font-synthesis: none; |
|||
text-rendering: optimizeLegibility; |
|||
-webkit-font-smoothing: antialiased; |
|||
-moz-osx-font-smoothing: grayscale; |
|||
} |
|||
|
|||
a { |
|||
font-weight: 500; |
|||
color: #646cff; |
|||
text-decoration: inherit; |
|||
} |
|||
a:hover { |
|||
color: #535bf2; |
|||
} |
|||
|
|||
body { |
|||
margin: 0; |
|||
display: flex; |
|||
place-items: center; |
|||
min-width: 320px; |
|||
min-height: 100vh; |
|||
} |
|||
|
|||
h1 { |
|||
font-size: 3.2em; |
|||
line-height: 1.1; |
|||
} |
|||
|
|||
button { |
|||
border-radius: 8px; |
|||
border: 1px solid transparent; |
|||
padding: 0.6em 1.2em; |
|||
font-size: 1em; |
|||
font-weight: 500; |
|||
font-family: inherit; |
|||
background-color: #1a1a1a; |
|||
cursor: pointer; |
|||
transition: border-color 0.25s; |
|||
} |
|||
button:hover { |
|||
border-color: #646cff; |
|||
} |
|||
button:focus, |
|||
button:focus-visible { |
|||
outline: 4px auto -webkit-focus-ring-color; |
|||
} |
|||
|
|||
@media (prefers-color-scheme: light) { |
|||
:root { |
|||
color: #213547; |
|||
background-color: #ffffff; |
|||
} |
|||
a:hover { |
|||
color: #747bff; |
|||
} |
|||
button { |
|||
background-color: #f9f9f9; |
|||
} |
|||
} |
|||
@ -0,0 +1,13 @@ |
|||
import { StrictMode } from 'react' |
|||
import { createRoot } from 'react-dom/client' |
|||
import './index.css' |
|||
import App from './App.jsx' |
|||
import {BrowserRouter} from "react-router-dom"; |
|||
|
|||
createRoot(document.getElementById('root')).render( |
|||
<StrictMode> |
|||
<BrowserRouter> |
|||
<App /> |
|||
</BrowserRouter> |
|||
</StrictMode>, |
|||
) |
|||
@ -0,0 +1,12 @@ |
|||
|
|||
|
|||
export default function Home() { |
|||
|
|||
return ( |
|||
<div> |
|||
<h1>Welcome to the Home Page</h1> |
|||
<p>This is the home page of our application.</p> |
|||
</div> |
|||
) |
|||
|
|||
} |
|||
@ -0,0 +1,7 @@ |
|||
import Home from '../pages/Home'; |
|||
|
|||
const routes = [ |
|||
{ path: '/', element: <Home/> }, |
|||
] |
|||
|
|||
export default routes; |
|||
@ -0,0 +1,7 @@ |
|||
import { defineConfig } from 'vite' |
|||
import react from '@vitejs/plugin-react' |
|||
|
|||
// https://vite.dev/config/
|
|||
export default defineConfig({ |
|||
plugins: [react()], |
|||
}) |
|||
@ -0,0 +1,7 @@ |
|||
server { |
|||
server_name localhost; |
|||
listen 80; |
|||
|
|||
root /var/www/html; |
|||
index index.html index.htm; |
|||
} |
|||
@ -0,0 +1,227 @@ |
|||
1 - Contexte du projet |
|||
|
|||
L’entreprise “Framinfo” souhaite construire FreeTube, une alternative française à Youtube, leader mondial de l’hébergement de vidéos. |
|||
|
|||
En anticipation d’une levée de fond, “Framinfo” vous a choisi en tant que prestataire pour la réaliser un MVP (Minimum Viable Product). |
|||
|
|||
Le projet est individuel. Tout plagiat ou utilisation d’intelligence artificielle est strictement interdit. Le code que vous allez rendre doit être votre propre création et non des éléments copiés/collés. Si du plagiat est constaté, votre note sera d’office de 0/20. |
|||
2 - Description du projet |
|||
|
|||
2.1 - Généralités |
|||
|
|||
Freetube est une application d’hébergement et de partage de vidéos destinée à deux profils d’utilisateurs : |
|||
|
|||
Les créateurs de contenus, qui mettent en ligne leurs productions afin de s’adresser à leur audience (Divertissement, professionnels, publicités, etc.), |
|||
Les “consommateurs”, qui regardent le contenu postés par les créateurs de contenus. |
|||
|
|||
Afin de concurrencer les plateformes existantes, il est important que l’expérience utilisateur soit parfaitement adaptée à chaque utilisateur en fonction de son profil : Un soin tout particulier doit donc être accordé à l’interface et l’expérience utilisateur. |
|||
|
|||
2.2 - Fonctionnalités de l’application à implémenter |
|||
|
|||
2.2.1 - Connexion |
|||
|
|||
Un utilisateur pourra se connecter à l'application via un compte créé spécifiquement ou en utilisant au moins un service d’Oauth2 (Google, Microsoft, Github, etc.). |
|||
|
|||
2.2.2 - Gestion utilisateur |
|||
|
|||
Chaque utilisateur doit pouvoir administrer son compte, à savoir : |
|||
|
|||
Modifier son adresse email et nom d’utilisateur (qui doivent être uniques), |
|||
Modifier son mot de passe (doit être suffisamment sécurisé), |
|||
Modifier sa photo de profil, |
|||
Créer/Modifier un nom d’affichage pour sa chaîne Freetube, |
|||
Créer/Modifier une description pour sa chaîne Freetube, |
|||
|
|||
2.2.3 - Administration d’une chaine Freetube |
|||
|
|||
Les créateurs de contenus doivent évidemment pouvoir administrer leur chaine Freetube, publier des vidéos mais aussi suivre toutes leurs statistiques sur un panneau d’administration leur étant dédié. |
|||
|
|||
Un utilisateur peut : |
|||
|
|||
Mettre en ligne une vidéo qui générera un lien partageable et qui comprend : |
|||
Un média vidéo, tout type de fichier vidéo est accepté (MP4, AVI, WEBM, etc.) |
|||
Une miniature de vidéo, tout type de format image est accepté (JPG, PNG, WEBP, etc.) |
|||
Un titre, |
|||
Une description, |
|||
La date de mise en ligne, définie automatiquement lorsque la vidéo est rendue disponible, |
|||
La possibilité de mettre la vidéo en publique (accessible à tous les utilisateurs de Freetube via les fonctionnalités de recherche et de mise en avant) ou de la mettre en privée (accessible uniquement par les utilisateur possédant le lien pour accéder à cette dernière). |
|||
Jusqu’à 10 mots-clefs prenant la forme de hashtags afin de permettre aux créateurs de contenus de mieux se référencer sur les fonctionnalités de recherches. |
|||
Éditer n’importe quel élément une vidéo précédemment créée (tous les points précédemment décrits) |
|||
Changer la visibilité d’une vidéo (privée/publique) |
|||
Supprimer une vidéo |
|||
Consulter les statistiques de chaque vidéo individuellement (Nombre de “J’aime” et commentaire) |
|||
Consulter les statistiques globales de sa chaine Freetube dans une page dédiée (Cumul des statistiques de l’ensemble des vidéos) |
|||
|
|||
2.2.4 - Utilisation de Freetube |
|||
|
|||
N’importe quel utilisateur de Freetube, authentifié ou non, peut accéder à la plateforme gratuitement et librement. |
|||
|
|||
Page d’accueil : |
|||
|
|||
Bien que la disposition de la page d’accueil de l’application soit similaire pour tous les utilisateurs, qu’ils soient authentifiés ou non, les sections et recommendations diffèrent : |
|||
|
|||
Pour un utilisateur authentifié : |
|||
Une section “Recommendations”, mettant en avant du contenu que l’utilisateur n’a pas encore jamais vu et similaire au contenu qu’il regardé et avec lequel il a pu interagir (“J’aime”, commentaire, ajout à une playlist), |
|||
Une section “À consulter plus tard” comprenant les vidéos qu’un utilisateur a ajouté à la playlist du même nom, |
|||
Une section “Tendances” avec le contenu de la plateforme ayant généré le plus d’interaction récemment. |
|||
Pour une utilisateur non-authentifié : |
|||
Une section “Recommendations”, mettant en avant les 3 mots-clefs les plus utilisés de la plateforme (par exemple “Informations”, “Jeu vidéo”, etc.) |
|||
Une section “Tendances” avec le contenu de la plateforme ayant généré le plus d’interaction récemment, |
|||
Une section “Top Créateurs” affichant sous forme de cartes, la photo de profil, le nom et la description de la chaine, des créateurs ayant le plus d’abonnés de la plateforme. |
|||
|
|||
Page “Abonnements” : |
|||
|
|||
Pour les utilisateurs non-authentifiés, la page redirige vers la page de connexion/création de compte. |
|||
|
|||
Affiche le fil d’actualités et les dernières vidéos publiées par les créateurs de contenu auquel l’utilisateur est abonné. |
|||
|
|||
Page “Utilisateur” : |
|||
|
|||
Pour les utilisateurs non-authentifiés, la page redirige vers la page de connexion/création de compte. |
|||
|
|||
Cette page met en avant deux sections : |
|||
|
|||
Historique des vidéos regardées par l’utilisateur, |
|||
Playlists de l’utilisateur : |
|||
Liste des playlists de l’utilisateur (dont celle “À consulter plus tard” créée par défaut) |
|||
Création/Suppression de playlists |
|||
|
|||
Page “Playlist” : |
|||
|
|||
Un utilisateur accède à cette page depuis la liste de ses playlists dans la page “Utilisateur”. |
|||
|
|||
Cette page comprend uniquement le nom de la playlist et les vidéos (miniature, titre et chaine Freetube) contenus dans cette dernière, trié par date d’ajout dans cette dernière. |
|||
|
|||
Page pour les vidéos : |
|||
|
|||
Lorsque un utilisateur clique sur la miniature d’une vidéo ou utilise le lien de partage d’une vidéo, il arrive sur cette page qui affiche : |
|||
|
|||
Un lecteur vidéo qui comprend : |
|||
La vidéo publiée, |
|||
Les fonctionnalités de base d’un lecteur vidéo : |
|||
Play, |
|||
Pause, |
|||
Avance de XX secondes dans la vidéo, |
|||
Recul de XX secondes dans la vidéo, |
|||
Les informations du créateur de contenu : |
|||
Image de profil |
|||
Nom de la chaine |
|||
Nombre de “J’aime(s)” de la vidéo, |
|||
Nombre d’abonnés du créateur |
|||
Un bouton pour s’abonner à la chaine Freetube du créateur de la vidéo, |
|||
Un bouton pour aimer la vidéo, |
|||
Un bouton pour ajouter à une playlist (soit la playlist créée par défaut “À consulter plus tard”, soit une playlist personnalisée) |
|||
La description de la vidéo, |
|||
Un espace commentaire : |
|||
Possibilité de laisser un commentaire, |
|||
Feed de commentaires, affichés par date de publication (les commentaires les plus récents en premier) |
|||
Une section “Recommendations” pour un utilisateur authentifié ou une section “Tendance” pour un utilisateur non-authentifié, |
|||
|
|||
2.3 - Architecture et déploiement : |
|||
|
|||
2.3.1 - Architecture |
|||
|
|||
Votre application doit comporter trois briques distinctes : |
|||
|
|||
un serveur, devant être une API REST ou GraphQL et devant implémenter l'ensemble des fonctionnalités précédemment énoncées, |
|||
un client web devant uniquement interagir avec le serveur., |
|||
une base de données (choix libre). |
|||
|
|||
Aucune logique ne doit avoir lieu sur le client qui ne sert que d'interface et redirige les différentes requêtes vers le serveur. |
|||
|
|||
2.3.2 - Containérisation |
|||
|
|||
Le projet doit comporter un fichier docker-compose.yml à la racine du projet permettant de déployer au moins 3 services Docker distincts, respectivement pour le serveur, le client web et la base de données. |
|||
|
|||
L'application doit pouvoir être lancée intégralement via docker compose et être fonctionnelle. |
|||
3 - Rendu |
|||
|
|||
Il se fera sous la forme d'une archive au format "zip" contenant le code source, les fichiers annexes (sons, images, etc.), la documentations technique et le manuel utilisateur. |
|||
|
|||
La documentation technique est à destination de professionnels du domaine et contiendra au moins les éléments suivants : |
|||
|
|||
Informations et éléments à renseigner nécessaires au fonctionnement de l'application, |
|||
Guide de déploiement de l'application, |
|||
Justification du choix des langages et des librairies, |
|||
Diagrammes UML, |
|||
Schéma de la base de données, |
|||
|
|||
Le manuel utilisateur explique lui comment se servir de la solution et présente les différentes fonctionnalités. |
|||
|
|||
Aucun secret (clef d'API, mot de passe, etc.) ne doit être présent dans le rendu. Un secret présent en clair entrainera un malus de points sur la notation en fonction de la criticité de ce dernier. |
|||
|
|||
Tout rendu effectué en retard ne pourra pas être pris en compte. |
|||
|
|||
Ce projet est noté sur 500 points avec possibilité d'obtenir 50 points en bonus : |
|||
|
|||
Documentations : 50 points (une note inférieure à 30 points sur cette partie entraînera un ajournement à ce projet) |
|||
Documentation technique : 30 points |
|||
Manuel utilisateur : 20 points |
|||
Déploiement : 50 points (une note inférieure à 30 points sur cette partie entraînera un ajournement à ce projet) |
|||
Architecture et abstraction : 20 points |
|||
Containérisation : 30 points |
|||
Interface utilisateur : 50 points |
|||
Expérience utilisateur : 50 points |
|||
Fonctionnalités : 200 points (une note inférieure à 120 points sur cette partie entraînera un ajournement à ce projet) : |
|||
Inscription et connexion : 15 points |
|||
Connexion utilisateur standard (nom d’utilisateur et mot de passe) : 5 points |
|||
Connexion via OAuth2 (Facebook, Google, etc.) : 10 points |
|||
Gestion d’utilisateur : 10 points |
|||
Administration d’une chaine Freetube : 55 points |
|||
Mettre en ligne une vidéo : 30 points |
|||
Un média vidéo : 10 points |
|||
Une miniature de vidéo : 2 points |
|||
Un titre : 2 points |
|||
Une description : 2 points |
|||
La date de mise en ligne : 2 points |
|||
Mots-clefs : 2 points |
|||
Visibilité : 5 points |
|||
Lien partageable : 5 points |
|||
Éditer une vidéo existante : 5 points |
|||
Changer la visibilité : 5 points |
|||
Supprimer une vidéo : 5 points |
|||
Statistiques d’une vidéo : 5 points |
|||
Statistiques globales : 5 poins |
|||
Page Accueil : 30 points |
|||
Authentifié : 15 points |
|||
Recommendations : 5 points |
|||
À consulter plus tard : 5 points |
|||
Tendances : 5 points |
|||
Non-authentifié : 15 points |
|||
Recommendations : 5 points |
|||
Tendances : 5 points |
|||
Top créateurs : 5 points |
|||
Page Abonnements : 10 points |
|||
Fil d’actualité : 8 points |
|||
Redirection non-authentifié : 2 points |
|||
Page Utilisateur : 15 points : |
|||
Historique des vidéos : 10 points |
|||
Gestion et liste des playlists : 5 points |
|||
Page Playlist : 10 points |
|||
Page Vidéo : 50 points |
|||
Lecteur vidéo : 20 points : |
|||
Média visualisable : 10 points |
|||
Pause : 2 points |
|||
Play : 2 points |
|||
Saut XX secondes en avant : 3 points |
|||
Saut XX secondes en arrière : 3 points |
|||
Informations de la vidéo : 20 points |
|||
Titre de la vidéo : 2 points |
|||
Description : 2 points |
|||
Nom de la chaine : 2 points |
|||
Compteur abonnés : 2 points |
|||
Compteur “J’aime(s)” : 2 points |
|||
Bouton “J’aime” : 5 points |
|||
Bouton “S’abonner” : 5 points |
|||
Commentaires : 10 points |
|||
Créer un commentaire : 5 points |
|||
Voir les commentaires : 5 points |
|||
Recommendations : 5 points |
|||
Qualité du code : 100 points (une note inférieure à 60 points sur cette partie entraînera un ajournement à ce projet) : |
|||
Le barème item par item est identique à celui des fonctionnalités. Pour un item non réalisé ou complètement dysfonctionnel, la note de qualité de code correspondante sera automatiquement égale à zéro. |
|||
Les critères appréciés ici sont essentiellement : |
|||
Structures de données adaptées. |
|||
Absence de duplication inutile de code. |
|||
Lisibilité du code (cela inclut la cohérence et le sens du nommage des variables et sous-programmes). |
|||
Facilité de maintenance. |
|||
Abstraction du code |
|||
Loading…
Reference in new issue