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