Initial commit: unionflow-mobile-apps

Application Flutter complète (sans build artifacts).

Signed-off-by: lions dev Team
This commit is contained in:
dahoud
2026-03-15 16:30:08 +00:00
commit d094d6db9c
1790 changed files with 507435 additions and 0 deletions

View File

@@ -0,0 +1,61 @@
/// Interface du repository des organisations (Clean Architecture - Domain Layer)
library organization_repository;
import '../../data/models/organization_model.dart';
/// Interface du repository pour la gestion des organisations
/// Contrat défini dans la couche Domain, implémenté dans la couche Data
abstract class IOrganizationRepository {
/// Récupère la liste des organisations avec pagination
Future<List<OrganizationModel>> getOrganizations({
int page = 0,
int size = 20,
String? recherche,
});
/// Récupère les organisations du membre connecté (pour OrgAdmin)
Future<List<OrganizationModel>> getMesOrganisations();
/// Récupère une organisation par son ID
Future<OrganizationModel?> getOrganizationById(String id);
/// Crée une nouvelle organisation (SuperAdmin)
Future<OrganizationModel> createOrganization(OrganizationModel organization);
/// Met à jour une organisation (OrgAdmin)
Future<OrganizationModel> updateOrganization(String id, OrganizationModel organization);
/// Supprime une organisation (SuperAdmin)
Future<void> deleteOrganization(String id);
/// Active une organisation
Future<OrganizationModel> activateOrganization(String id);
/// Suspend une organisation
Future<OrganizationModel> suspendOrganization(String id);
/// Recherche avancée d'organisations
Future<List<OrganizationModel>> searchOrganizations({
String? nom,
TypeOrganization? type,
StatutOrganization? statut,
String? ville,
String? region,
String? pays,
int page = 0,
int size = 20,
});
/// Récupère les membres d'une organisation (GET /api/organisations/{id}/membres)
Future<List<Map<String, dynamic>>> getOrganizationMembers(String organizationId);
/// Met à jour la configuration d'une organisation (PUT /api/organisations/{id}/configuration)
/// Configuration: logo, couleurs, préférences, modules activés, etc.
Future<OrganizationModel> updateOrganizationConfig(
String id,
Map<String, dynamic> config,
);
/// Récupère les statistiques des organisations
Future<Map<String, dynamic>> getOrganizationsStats();
}

View File

@@ -0,0 +1,22 @@
/// Use Case: Créer une nouvelle organisation
library create_organization;
import 'package:injectable/injectable.dart';
import '../../data/models/organization_model.dart';
import '../repositories/organization_repository.dart';
/// Crée une nouvelle organisation (SuperAdmin uniquement)
@injectable
class CreateOrganization {
final IOrganizationRepository _repository;
CreateOrganization(this._repository);
/// Exécute le use case
/// [organization] : Modèle de l'organisation à créer
/// Retourne l'organisation créée avec son ID
/// Lève une exception en cas d'erreur (données invalides, conflit)
Future<OrganizationModel> call(OrganizationModel organization) async {
return _repository.createOrganization(organization);
}
}

View File

@@ -0,0 +1,21 @@
/// Use Case: Supprimer une organisation
library delete_organization;
import 'package:injectable/injectable.dart';
import '../repositories/organization_repository.dart';
/// Supprime une organisation (SuperAdmin uniquement)
@injectable
class DeleteOrganization {
final IOrganizationRepository _repository;
DeleteOrganization(this._repository);
/// Exécute le use case
/// [id] : Identifiant de l'organisation à supprimer
/// Lève une exception si organisation non trouvée ou suppression impossible
/// Note: Peut être un soft delete selon l'implémentation backend
Future<void> call(String id) async {
return _repository.deleteOrganization(id);
}
}

View File

@@ -0,0 +1,21 @@
/// Use Case: Récupérer une organisation par ID
library get_organization_by_id;
import 'package:injectable/injectable.dart';
import '../../data/models/organization_model.dart';
import '../repositories/organization_repository.dart';
/// Récupère le détail d'une organisation par son identifiant
@injectable
class GetOrganizationById {
final IOrganizationRepository _repository;
GetOrganizationById(this._repository);
/// Exécute le use case
/// [id] : Identifiant de l'organisation
/// Retourne l'organisation ou null si non trouvée
Future<OrganizationModel?> call(String id) async {
return _repository.getOrganizationById(id);
}
}

View File

@@ -0,0 +1,21 @@
/// Use Case: Récupérer les membres d'une organisation
library get_organization_members;
import 'package:injectable/injectable.dart';
import '../repositories/organization_repository.dart';
/// Récupère la liste des membres d'une organisation
@injectable
class GetOrganizationMembers {
final IOrganizationRepository _repository;
GetOrganizationMembers(this._repository);
/// Exécute le use case
/// [organizationId] : Identifiant de l'organisation
/// Retourne une liste de membres (Map avec id, nom, prenom, role, etc.)
/// Endpoint: GET /api/organisations/{id}/membres
Future<List<Map<String, dynamic>>> call(String organizationId) async {
return _repository.getOrganizationMembers(organizationId);
}
}

View File

@@ -0,0 +1,31 @@
/// Use Case: Récupérer la liste des organisations
library get_organizations;
import 'package:injectable/injectable.dart';
import '../../data/models/organization_model.dart';
import '../repositories/organization_repository.dart';
/// Récupère la liste paginée des organisations
@injectable
class GetOrganizations {
final IOrganizationRepository _repository;
GetOrganizations(this._repository);
/// Exécute le use case
/// [page] : Numéro de page (défaut: 0)
/// [size] : Taille de la page (défaut: 20)
/// [recherche] : Terme de recherche optionnel
/// Retourne une liste d'organisations
Future<List<OrganizationModel>> call({
int page = 0,
int size = 20,
String? recherche,
}) async {
return _repository.getOrganizations(
page: page,
size: size,
recherche: recherche,
);
}
}

View File

@@ -0,0 +1,23 @@
/// Use Case: Mettre à jour une organisation
library update_organization;
import 'package:injectable/injectable.dart';
import '../../data/models/organization_model.dart';
import '../repositories/organization_repository.dart';
/// Met à jour une organisation existante (OrgAdmin ou SuperAdmin)
@injectable
class UpdateOrganization {
final IOrganizationRepository _repository;
UpdateOrganization(this._repository);
/// Exécute le use case
/// [id] : Identifiant de l'organisation
/// [organization] : Modèle avec les données mises à jour
/// Retourne l'organisation mise à jour
/// Lève une exception si organisation non trouvée ou données invalides
Future<OrganizationModel> call(String id, OrganizationModel organization) async {
return _repository.updateOrganization(id, organization);
}
}

View File

@@ -0,0 +1,25 @@
/// Use Case: Mettre à jour la configuration d'une organisation
library update_organization_config;
import 'package:injectable/injectable.dart';
import '../../data/models/organization_model.dart';
import '../repositories/organization_repository.dart';
/// Met à jour la configuration spécifique d'une organisation
/// (logo, couleurs, modules activés, préférences, etc.)
@injectable
class UpdateOrganizationConfig {
final IOrganizationRepository _repository;
UpdateOrganizationConfig(this._repository);
/// Exécute le use case
/// [id] : Identifiant de l'organisation
/// [config] : Configuration à mettre à jour
/// Exemple: { "logo": "url", "couleurPrimaire": "#FF5733", "modulesActifs": ["finance", "events"] }
/// Retourne l'organisation avec la configuration mise à jour
/// Endpoint: PUT /api/organisations/{id}/configuration
Future<OrganizationModel> call(String id, Map<String, dynamic> config) async {
return _repository.updateOrganizationConfig(id, config);
}
}