Aller au contenu principal

Career (stage-connect)

Application Next.js pour les étudiants et entreprises. Permet aux étudiants de rechercher des stages, postuler, et aux entreprises de publier des offres et gérer les candidatures.

Niveaux Académiques Couverts

L3, M1, M2 — Stage de fin d'études et stages longs.

Différences avec Discover

Career est destiné aux étudiants L3, M1 et M2 avec un workflow complet :

FonctionnalitéCareer (L3/M)Discover (L1/L2)
Thème de mémoire✅ Obligatoire❌ Non applicable
Superviseur académique✅ Obligatoire❌ Non applicable
Convention de stage✅ Détaillée❌ Simplifiée
TODOs hebdomadaires✅ Obligatoires❌ Optionnels
Soutenance✅ Obligatoire❌ Non applicable
Binômes✅ Gestion complète❌ Non applicable
Durée stage3-6 mois1-2 mois

Sources :

  • DATABASES/logique_metier_evolution.md
  • PLAN_EVOLUTION/EVOLUTION_STRATEGIE_L1_L2_M1.md

Stack Technique

Framework et langage :

  • Next.js 16.0.7 (App Router)
  • React 19.2.0
  • TypeScript 5.x

Librairies principales :

CatégorieLibrairies
UIRadix UI, Lucide React, Tailwind CSS
État@tanstack/react-query v5
Themingnext-themes, tailwind-merge, clsx
Animationsframer-motion
Datedayjs, flatpickr
Graphiquesapexcharts, react-apexcharts
Mediareact-media-recorder
Utilscmdk (command palette), react-hot-toast

Outils de build :

  • Tailwind CSS 3.4.18
  • PostCSS 8.5.6
  • ESLint 9 + eslint-config-next

Prérequis et Installation

Prérequis

  • Node.js 18+
  • npm ou pnpm

Installation

# Cloner le repo
git clone https://github.com/stageconnect/stage-connect.git
cd stage-connect

# Installer les dépendances
npm install

# Variables d'environnement
cp .env.local.example .env.local
# Modifier NEXT_PUBLIC_API_URL si nécessaire

# Lancer en développement
npm run dev

Build production

npm run build
npm start

Structure du Projet

stage-connect/
├── app/ # Pages Next.js (App Router)
│ ├── api/ # Routes API
│ ├── auth/ # Pages authentification
│ ├── company/ # Dashboard entreprise
│ ├── student/ # Dashboard étudiant
│ ├── university/ # Dashboard université
│ ├── mentor/ # Dashboard mentor
│ ├── layout.tsx
│ └── providers.tsx
├── components/
│ ├── ui/ # Composants UI base (button, input, card)
│ ├── auth/ # Composants auth
│ ├── company/ # Composants entreprise
│ ├── student/ # Composants étudiant
│ ├── Layouts/ # Composants layout
│ └── Forms/
├── contexts/
│ ├── AuthContext.tsx # Authentification
│ └── CompanyContext.tsx # Données entreprise
├── hooks/ # Custom hooks
│ ├── useAuth.ts
│ ├── useAuthActions.ts
│ ├── useFormValidation.ts
│ ├── useThemes.ts
│ └── ...
├── services/ # Services API
│ ├── api.config.ts
│ ├── token.service.ts
│ ├── auth.api.ts
│ └── student.*.services.ts
├── providers/
│ └── QueryProvider.tsx # React Query
├── lib/
├── utils/
├── types/
├── constants/
└── middleware.ts # Protection routes

Architecture et Principes SOLID

SRP (Single Responsibility Principle)

Bien respecté.

Exemples :

  • hooks/useFormValidation.ts — Ne fait que la validation de formulaire
  • services/token.service.ts — Ne gère que les tokens (stockage, vérification, expiration)

Violation potentielle :

  • Certains composants dans components/ui-elements/ semblent peu utilisés ou font trop de choses

OCP (Open/Closed Principle)

Bien respecté via class-variance-authority.

Exemple :

// components/ui/button.tsx
const buttonVariants = cva(...);
// Extensible via props variant et size sans modifier le composant

LSP (Liskov Substitution Principle)

Non applicable — Pas d'héritage complexe de classes dans ce projet.

ISP (Interface Segregation Principle)

Bien respecté.

Les props des composants sont bien segmentées. Exemple : StatsCard n'a que les props nécessaires (title, value, icon, trend, bgColor).

DIP (Dependency Inversion Principle)

Bien respecté.

Exemple :

// hooks/useAuth.ts
// Dépend d'abstractions (services) plutôt que d'implémentations directes
const { login, logout } = useAuth();

Les services (authApiService, tokenService) sont injectés via imports.

Patterns Utilisés

Custom Hooks

HookFichierRôle
useAuthhooks/useAuth.tsÉtat authentification
useAuthActionshooks/useAuthActions.tsActions login
useFormValidationhooks/useFormValidation.tsValidation formulaires
useThemeshooks/useThemes.tsGestion themes
useMultiStepFormhooks/useMultiStepForm.tsFormulaires multi-étapes
useRateLimitinghooks/useRateLimiting.tsRate limiting

Context Providers

ProviderFichierRôle
AuthProvidercontexts/AuthContext.tsxAuthentification
CompanyProvidercontexts/CompanyContext.tsxDonnées entreprise
QueryProviderproviders/QueryProvider.tsxReact Query

Compound Components

Non détectés dans ce projet.

HOC

Non détectés.

Gestion de l'État

Outils utilisés :

  • React Query (@tanstack/react-query v5) — Requêtes API et cache
  • React Context — AuthContext, CompanyContext
  • useState/useEffect — État local

Pas de Redux ou Zustand.

Appels API

Bibliothèque

Fetch API native (pas Axios).

Configuration

Fichier : services/api.config.ts

const API_BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8000/api/v1';

Token JWT

Fichier : services/token.service.ts

  • Stockage : localStorage
  • Clés : access_token, refresh_token
  • Refresh automatique : toutes les 60s avec buffer de 5 min
// Ajout automatique du token
const token = localStorage.getItem('access_token');
headers['Authorization'] = `Bearer ${token}`;

Erreurs

Chaque service gère ses propres erreurs. Pas de gestionnaire centralisé.

Variables d'Environnement

VariableDescriptionValeur par défaut
NEXT_PUBLIC_API_URLURL du backendhttp://localhost:8000/api/v1
NEXT_PUBLIC_FRONTEND_URLURL frontendhttp://localhost:3000
NEXT_PUBLIC_BACKEND_URLURL backend alternatifhttp://localhost:8000

Lacunes et Dette Technique

LacuneFichier concernéPrioritéSuggestion
Duplication config API18+ services redefinissent API_URLHauteUtiliser uniquement api.config.ts
Pas de types partagésChaque service définit ses typesMoyenneCréer un dossier types/ partagé
Gestion token分散localStorage lu dans chaque serviceMoyenneCréer un interceptor fetch
Pas de testsAucun dossier testsHauteAjouter Jest + React Testing Library
Middleware basiquemiddleware.ts vérifie juste présence tokenMoyenneVérifier validité + rôle utilisateur
Pas de gestion erreurs centraliséeChaque service gère ses erreursMoyenneCréer error-handler global
Composants non utiliséscomponents/ui-elements/FaibleNettoyer le code mort