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:
dahoud
2026-03-15 02:12:17 +00:00
parent bbc409de9d
commit e8ad874015
635 changed files with 58160 additions and 20674 deletions

View File

@@ -3,15 +3,46 @@ library evenements_bloc;
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:dio/dio.dart';
import 'package:injectable/injectable.dart';
import 'evenements_event.dart';
import 'evenements_state.dart';
import '../data/repositories/evenement_repository_impl.dart';
import '../domain/usecases/get_events.dart';
import '../domain/usecases/get_event_by_id.dart';
import '../domain/usecases/create_event.dart' as uc;
import '../domain/usecases/update_event.dart' as uc;
import '../domain/usecases/delete_event.dart' as uc;
import '../domain/usecases/register_for_event.dart';
import '../domain/usecases/cancel_registration.dart';
import '../domain/usecases/get_my_registrations.dart';
import '../domain/usecases/get_event_participants.dart';
import '../domain/repositories/evenement_repository.dart';
/// BLoC pour la gestion des événements
/// BLoC pour la gestion des événements (Clean Architecture)
@injectable
class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
final EvenementRepository _repository;
final GetEvents _getEvents;
final GetEventById _getEventById;
final uc.CreateEvent _createEvent;
final uc.UpdateEvent _updateEvent;
final uc.DeleteEvent _deleteEvent;
final RegisterForEvent _registerForEvent;
final CancelRegistration _cancelRegistration;
final GetMyRegistrations _getMyRegistrations;
final GetEventParticipants _getEventParticipants;
final IEvenementRepository _repository; // Pour méthodes non-couvertes par use cases
EvenementsBloc(this._repository) : super(const EvenementsInitial()) {
EvenementsBloc(
this._getEvents,
this._getEventById,
this._createEvent,
this._updateEvent,
this._deleteEvent,
this._registerForEvent,
this._cancelRegistration,
this._getMyRegistrations,
this._getEventParticipants,
this._repository,
) : super(const EvenementsInitial()) {
on<LoadEvenements>(_onLoadEvenements);
on<LoadEvenementById>(_onLoadEvenementById);
on<CreateEvenement>(_onCreateEvenement);
@@ -39,7 +70,7 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
emit(const EvenementsLoading());
}
final result = await _repository.getEvenements(
final result = await _getEvents(
page: event.page,
size: event.size,
recherche: event.recherche,
@@ -74,7 +105,7 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
try {
emit(const EvenementsLoading());
final evenement = await _repository.getEvenementById(event.id);
final evenement = await _getEventById(event.id);
if (evenement != null) {
emit(EvenementDetailLoaded(evenement));
@@ -106,7 +137,7 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
try {
emit(const EvenementsLoading());
final evenement = await _repository.createEvenement(event.evenement);
final evenement = await _createEvent(event.evenement);
emit(EvenementCreated(evenement));
} on DioException catch (e) {
@@ -140,7 +171,7 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
try {
emit(const EvenementsLoading());
final evenement = await _repository.updateEvenement(event.id, event.evenement);
final evenement = await _updateEvent(event.id, event.evenement);
emit(EvenementUpdated(evenement));
} on DioException catch (e) {
@@ -174,7 +205,7 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
try {
emit(const EvenementsLoading());
await _repository.deleteEvenement(event.id);
await _deleteEvent(event.id);
emit(EvenementDeleted(event.id));
} on DioException catch (e) {
@@ -301,7 +332,7 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
try {
emit(const EvenementsLoading());
await _repository.inscrireEvenement(event.evenementId);
await _registerForEvent(event.evenementId);
emit(EvenementInscrit(event.evenementId));
} on DioException catch (e) {
@@ -326,7 +357,7 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
try {
emit(const EvenementsLoading());
await _repository.desinscrireEvenement(event.evenementId);
await _cancelRegistration(event.evenementId);
emit(EvenementDesinscrit(event.evenementId));
} on DioException catch (e) {
@@ -351,7 +382,7 @@ class EvenementsBloc extends Bloc<EvenementsEvent, EvenementsState> {
try {
emit(const EvenementsLoading());
final participants = await _repository.getParticipants(event.evenementId);
final participants = await _getEventParticipants(event.evenementId);
emit(ParticipantsLoaded(
evenementId: event.evenementId,