feat: WebSocket temps réel + Finance Workflow + corrections
- Task #6: WebSocket /ws/dashboard + Kafka events (5 topics) * Backend: KafkaEventProducer, KafkaEventConsumer * Mobile: WebSocketService (reconnection, heartbeat, typed events) * DashboardBloc: Auto-refresh depuis WebSocket events - Finance Workflow: approbations + budgets (backend + mobile) * Backend: entities, services, resources, migrations Flyway V6 * Mobile: features finance_workflow complète avec BLoC - Corrections DI: interfaces IRepository partout * IProfileRepository, IOrganizationRepository, IMembreRepository * GetIt configuré avec @injectable - Spec-Kit: constitution + templates mis à jour * .specify/memory/constitution.md enrichie * Templates agent, plan, spec, tasks, checklist - Nettoyage: fichiers temporaires supprimés Signed-off-by: lions dev Team
This commit is contained in:
@@ -48,3 +48,27 @@ class ValidationException extends AppException {
|
||||
@override
|
||||
String toString() => 'ValidationException: $message${code != null ? ' (Code: $code)' : ''}';
|
||||
}
|
||||
|
||||
/// Exception non autorisé (401)
|
||||
class UnauthorizedException extends AppException {
|
||||
const UnauthorizedException([super.message = 'Non autorisé', super.code]);
|
||||
|
||||
@override
|
||||
String toString() => 'UnauthorizedException: $message${code != null ? ' (Code: $code)' : ''}';
|
||||
}
|
||||
|
||||
/// Exception non trouvé (404)
|
||||
class NotFoundException extends AppException {
|
||||
const NotFoundException([super.message = 'Ressource non trouvée', super.code]);
|
||||
|
||||
@override
|
||||
String toString() => 'NotFoundException: $message${code != null ? ' (Code: $code)' : ''}';
|
||||
}
|
||||
|
||||
/// Exception interdit (403)
|
||||
class ForbiddenException extends AppException {
|
||||
const ForbiddenException([super.message = 'Accès interdit', super.code]);
|
||||
|
||||
@override
|
||||
String toString() => 'ForbiddenException: $message${code != null ? ' (Code: $code)' : ''}';
|
||||
}
|
||||
|
||||
@@ -4,11 +4,21 @@ import 'package:equatable/equatable.dart';
|
||||
abstract class Failure extends Equatable {
|
||||
final String message;
|
||||
final String? code;
|
||||
final bool isRetryable;
|
||||
final String? userFriendlyMessage;
|
||||
|
||||
const Failure(this.message, [this.code]);
|
||||
const Failure(
|
||||
this.message, [
|
||||
this.code,
|
||||
this.isRetryable = false,
|
||||
this.userFriendlyMessage,
|
||||
]);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [message, code];
|
||||
List<Object?> get props => [message, code, isRetryable, userFriendlyMessage];
|
||||
|
||||
/// Get user-friendly message for display in UI
|
||||
String getUserMessage() => userFriendlyMessage ?? message;
|
||||
|
||||
@override
|
||||
String toString() => 'Failure: $message${code != null ? ' (Code: $code)' : ''}';
|
||||
@@ -16,7 +26,12 @@ abstract class Failure extends Equatable {
|
||||
|
||||
/// Échec serveur
|
||||
class ServerFailure extends Failure {
|
||||
const ServerFailure(super.message, [super.code]);
|
||||
const ServerFailure(
|
||||
super.message, [
|
||||
super.code,
|
||||
super.isRetryable = true, // Server errors are retryable
|
||||
super.userFriendlyMessage = 'Le serveur rencontre un problème. Veuillez réessayer.',
|
||||
]);
|
||||
|
||||
@override
|
||||
String toString() => 'ServerFailure: $message${code != null ? ' (Code: $code)' : ''}';
|
||||
@@ -32,7 +47,12 @@ class CacheFailure extends Failure {
|
||||
|
||||
/// Échec de réseau
|
||||
class NetworkFailure extends Failure {
|
||||
const NetworkFailure(super.message, [super.code]);
|
||||
const NetworkFailure(
|
||||
super.message, [
|
||||
super.code,
|
||||
super.isRetryable = true, // Network errors are retryable
|
||||
super.userFriendlyMessage = 'Pas de connexion Internet. Vérifiez votre réseau.',
|
||||
]);
|
||||
|
||||
@override
|
||||
String toString() => 'NetworkFailure: $message${code != null ? ' (Code: $code)' : ''}';
|
||||
@@ -48,7 +68,12 @@ class AuthFailure extends Failure {
|
||||
|
||||
/// Échec de validation
|
||||
class ValidationFailure extends Failure {
|
||||
const ValidationFailure(super.message, [super.code]);
|
||||
const ValidationFailure(
|
||||
super.message, [
|
||||
super.code,
|
||||
super.isRetryable = false, // Validation errors are not retryable
|
||||
super.userFriendlyMessage,
|
||||
]);
|
||||
|
||||
@override
|
||||
String toString() => 'ValidationFailure: $message${code != null ? ' (Code: $code)' : ''}';
|
||||
@@ -64,8 +89,55 @@ class PermissionFailure extends Failure {
|
||||
|
||||
/// Échec de données non trouvées
|
||||
class NotFoundFailure extends Failure {
|
||||
const NotFoundFailure(super.message, [super.code]);
|
||||
const NotFoundFailure(
|
||||
super.message, [
|
||||
super.code,
|
||||
super.isRetryable = false, // Not found errors are not retryable
|
||||
super.userFriendlyMessage,
|
||||
]);
|
||||
|
||||
@override
|
||||
String toString() => 'NotFoundFailure: $message${code != null ? ' (Code: $code)' : ''}';
|
||||
}
|
||||
|
||||
/// Échec non autorisé (401)
|
||||
class UnauthorizedFailure extends Failure {
|
||||
const UnauthorizedFailure(
|
||||
super.message, [
|
||||
super.code,
|
||||
super.isRetryable = false, // Auth errors are not retryable
|
||||
super.userFriendlyMessage = 'Votre session a expiré. Veuillez vous reconnecter.',
|
||||
]);
|
||||
|
||||
@override
|
||||
String toString() => 'UnauthorizedFailure: $message${code != null ? ' (Code: $code)' : ''}';
|
||||
}
|
||||
|
||||
/// Échec interdit (403)
|
||||
class ForbiddenFailure extends Failure {
|
||||
const ForbiddenFailure(
|
||||
super.message, [
|
||||
super.code,
|
||||
super.isRetryable = false, // Forbidden errors are not retryable
|
||||
super.userFriendlyMessage = 'Vous n\'avez pas les permissions nécessaires.',
|
||||
]);
|
||||
|
||||
@override
|
||||
String toString() => 'ForbiddenFailure: $message${code != null ? ' (Code: $code)' : ''}';
|
||||
}
|
||||
|
||||
/// Échec inattendu
|
||||
class UnexpectedFailure extends Failure {
|
||||
const UnexpectedFailure(super.message, [super.code]);
|
||||
|
||||
@override
|
||||
String toString() => 'UnexpectedFailure: $message${code != null ? ' (Code: $code)' : ''}';
|
||||
}
|
||||
|
||||
/// Fonctionnalité non implémentée
|
||||
class NotImplementedFailure extends Failure {
|
||||
const NotImplementedFailure(super.message, [super.code]);
|
||||
|
||||
@override
|
||||
String toString() => 'NotImplementedFailure: $message${code != null ? ' (Code: $code)' : ''}';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user