Le projet
JeBalance est une plateforme de signalement de fraude fiscale, réalisée dans le cadre du cours d’architecture N-tiers. Un citoyen y dépose une dénonciation ; l’administration fiscale la traite via des endpoints protégés par rôle.
Fonctionnalités
- Dépôt d’une dénonciation — identité du suspect, adresse complète, nature de l’infraction (évasion fiscale ou dissimulation de revenus) et pays concerné.
- Consultation — récupération d’une dénonciation par son identifiant.
- Suivi administratif — liste des dénonciations sans réponse, réservée aux comptes
disposant du rôle
adminFiscale. - Gestion des personnes protégées — passage d’un individu au statut VIP et retour au statut standard, sous contrôle d’un jeton administrateur.
Architecture
L’application suit une architecture Domain Driven Design sur le framework ABP, structurée en trois couches.
Couche Web — HttpApi. Point d’entrée des requêtes, et donc l’endroit où l’authentification est configurée. La validation des jetons JWT y est déclarée :
context.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.IssuerSigningKey)),
ValidateIssuer = true,
ValidIssuer = jwtSettings.Issuer,
ValidateAudience = true,
ValidAudience = jwtSettings.Audience,
ValidateLifetime = true,
};
});
Couche Application — logique métier. Les interfaces d’AppService, les DTO et les
modèles sont déclarés côté Application Contract, les implémentations côté Application.
Particularité intéressante d’ABP : en héritant d’ApplicationService, les contrôleurs REST
sont générés automatiquement à partir des noms de méthodes, sans écrire un seul contrôleur.
public class DenonciationAppService : ApplicationService, IDenonciationAppService, ITransientDependency
La protection d’un endpoint tient alors en un attribut :
[Authorize(Roles = "adminFiscale")]
Le mapping entité ↔ DTO est délégué à AutoMapper, qui n’a besoin d’aucune configuration tant que les propriétés portent le même nom.
Couche Domaine et infrastructure. Les entités héritent d’Entity<Guid>, ce qui confie
à ABP l’indexation et les clés uniques. Le DbContext, les repositories et les migrations
Entity Framework Core vivent dans le projet EntityFrameworkCore :
public interface IEfCoreDenonciationRepository : IRepository<Entities.Denonciation, Guid>
{
Task<Guid> RegisterDenonciationAsync(Entities.Denonciation denonciation);
Task<Entities.Denonciation> GetDenonciationAsync(Guid id);
Task<List<Entities.Denonciation>> ListDenonciationNonTraiteAsync();
}
Hériter d’IRepository<Entity, Guid> fournit les opérations CRUD sans les réécrire.
Bilan
Tous les endpoints sont fonctionnels et testés. En revanche, faute de temps, l’interface Blazor n’a pas pu être reliée à l’ensemble des endpoints : la création de dénonciation, la réponse administrative et le changement de statut VIP se pilotent via l’API, pas encore depuis l’écran.