Backend complet pour une application de gestion de projets et de tâches similaire à Jira, développé avec .NET 8.
- .NET 8 (ASP.NET Core Web API)
- Entity Framework Core 8 avec PostgreSQL (Npgsql)
- JWT Authentication + Refresh Tokens
- ASP.NET Core Identity pour les utilisateurs et rôles
- SignalR pour les notifications en temps réel
- Architecture Clean / DDD-light (API, Application, Domain, Infrastructure)
- AutoMapper, FluentValidation, MediatR (CQRS)
- Swagger avec authentification JWT
- CORS configuré pour Angular (http://localhost:4200)
- Serilog pour le logging (console + fichier)
- Health Checks
src/
├─ FlowTasks.API # Web API + Controllers + Program.cs
├─ FlowTasks.Application # Services, DTOs, Interfaces
├─ FlowTasks.Domain # Entities, Value Objects, Enums
└─ FlowTasks.Infrastructure # DbContext, Repositories, SignalR Hub, Identity config
git clone <repository-url>
cd FlowTasksAssurez-vous que PostgreSQL est installé et en cours d'exécution. Créez une base de données :
CREATE DATABASE FlowTasksDB;Modifiez src/FlowTasks.API/appsettings.json avec vos paramètres PostgreSQL :
{
"ConnectionStrings": {
"DefaultConnection": "Host=localhost;Port=5432;Database=FlowTasksDB;Username=postgres;Password=votre_mot_de_passe"
}
}dotnet restore
dotnet ef migrations add FirstMigration --project FlowTasks.Infrastructure --startup-project FlowTasks.API --context ApplicationDbContextdotnet ef database update --project FlowTasks.Infrastructure --startup-project FlowTasks.API --context ApplicationDbContextdotnet runL'API sera accessible sur :
- HTTP:
http://localhost:5000 - HTTPS:
https://localhost:5001 - Swagger:
http://localhost:5000/swaggerouhttps://localhost:5001/swagger
Après le seed initial, vous pouvez vous connecter avec :
Admin:
- Email:
admin@flowtasks.com - Password:
Admin123!
Utilisateurs de test:
- Email:
john@flowtasks.com/ Password:Test123! - Email:
jane@flowtasks.com/ Password:Test123! - Email:
bob@flowtasks.com/ Password:Test123!
POST /api/auth/register- InscriptionPOST /api/auth/login- ConnexionPOST /api/auth/refresh- Rafraîchir le tokenPOST /api/auth/logout- DéconnexionPOST /api/auth/change-password- Changer le mot de passe
GET /api/users/me- Profil utilisateurPUT /api/users/me- Mettre à jour le profilGET /api/users- Liste des utilisateursGET /api/users/project/{projectId}- Membres d'un projet
POST /api/projects- Créer un projetGET /api/projects- Liste des projets de l'utilisateurGET /api/projects/{id}- Détails d'un projetPUT /api/projects/{id}- Mettre à jour un projetDELETE /api/projects/{id}- Supprimer un projet
POST /api/projects/{projectId}/projectmembers- Ajouter un membreGET /api/projects/{projectId}/projectmembers- Liste des membresDELETE /api/projects/{projectId}/projectmembers/{memberId}- Retirer un membre
POST /api/projects/{projectId}/tasks- Créer une tâcheGET /api/projects/{projectId}/tasks- Liste des tâches (avec filtres, pagination, tri)GET /api/projects/{projectId}/tasks/{id}- Détails d'une tâchePUT /api/projects/{projectId}/tasks/{id}- Mettre à jour une tâcheDELETE /api/projects/{projectId}/tasks/{id}- Supprimer une tâcheGET /api/projects/{projectId}/tasks/board- Board Kanban (groupé par statut)
POST /api/tasks/{taskId}/taskcomments- Ajouter un commentaireGET /api/tasks/{taskId}/taskcomments- Liste des commentairesPUT /api/tasks/{taskId}/taskcomments/{commentId}- Modifier un commentaireDELETE /api/tasks/{taskId}/taskcomments/{commentId}- Supprimer un commentaire
GET /api/tasks/{taskId}/taskhistory- Historique d'une tâche
POST /api/projects/{projectId}/sprints- Créer un sprintGET /api/projects/{projectId}/sprints- Liste des sprintsGET /api/projects/{projectId}/sprints/{id}- Détails d'un sprintPUT /api/projects/{projectId}/sprints/{id}- Mettre à jour un sprintDELETE /api/projects/{projectId}/sprints/{id}- Supprimer un sprint
GET /health- Vérification de l'état de l'API
Le hub SignalR est disponible sur /hubs/task et envoie les événements suivants :
TaskCreated- Nouvelle tâche crééeTaskUpdated- Tâche mise à jourTaskMoved- Tâche déplacée (changement de statut)TaskDeleted- Tâche suppriméeCommentAdded- Nouveau commentaire ajoutéUserAssigned- Utilisateur assigné à une tâche
const connection = new signalR.HubConnectionBuilder()
.withUrl("https://localhost:5001/hubs/task")
.build();
connection.on("TaskCreated", (taskKey) => {
console.log("Task created:", taskKey);
});
connection.start().then(() => {
// Rejoindre un groupe de projet
connection.invoke("JoinProjectGroup", projectId);
});Tous les endpoints (sauf /api/auth/*) nécessitent un token JWT dans le header :
Authorization: Bearer <your-jwt-token>
Dans Swagger, cliquez sur le bouton "Authorize" et entrez Bearer <token>.
Les endpoints de liste de tâches supportent :
- Pagination:
pageNumber,pageSize - Recherche:
search(dans summary, description, key) - Filtres:
status,type,priority,assigneeId,sprintId - Tri:
sortBy(summary, priority, status, dueDate, createdAt),sortDescending
Exemple :
GET /api/projects/{projectId}/tasks?pageNumber=1&pageSize=20&status=InProgress&sortBy=priority&sortDescending=true
Pour tester l'API :
- Inscrivez-vous ou connectez-vous via
/api/auth/login - Copiez le
tokende la réponse - Dans Swagger, cliquez sur "Authorize" et entrez
Bearer <token> - Testez les endpoints protégés
Le seed initial crée :
- 1 utilisateur admin
- 3 utilisateurs de test
- 2 projets d'exemple
- Plusieurs tâches d'exemple
Pour utiliser PostgreSQL avec Docker :
docker run --name flowtasks-postgres -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=FlowTasksDB -p 5432:5432 -d postgres:15