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

@@ -0,0 +1,189 @@
#!/bin/bash
# Configuration Keycloak pour UnionFlow
# Crée les rôles et les comptes de test pour MUKEFI et MESKA
set -e
# Configuration
KEYCLOAK_URL="http://localhost:8180"
REALM_NAME="unionflow"
ADMIN_USERNAME="admin"
ADMIN_PASSWORD="admin"
TEST_PASSWORD="Test@123"
echo "========================================================================"
echo "Configuration Keycloak pour UnionFlow"
echo "========================================================================"
# 1. Obtenir le token admin
echo ""
echo "📡 Connexion à Keycloak..."
TOKEN_RESPONSE=$(curl -s -X POST "$KEYCLOAK_URL/realms/master/protocol/openid-connect/token" \
-d "client_id=admin-cli" \
-d "username=$ADMIN_USERNAME" \
-d "password=$ADMIN_PASSWORD" \
-d "grant_type=password")
ACCESS_TOKEN=$(echo $TOKEN_RESPONSE | grep -o '"access_token":"[^"]*' | cut -d'"' -f4)
if [ -z "$ACCESS_TOKEN" ]; then
echo "❌ Erreur: Impossible d'obtenir le token admin"
exit 1
fi
echo "✅ Connecté à Keycloak Admin API"
# 2. Lister et supprimer les utilisateurs existants
echo ""
echo "📋 Audit et nettoyage des utilisateurs existants..."
USERS=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM_NAME/users" \
-H "Authorization: Bearer $ACCESS_TOKEN")
echo "$USERS" | grep -o '"username":"[^"]*' | cut -d'"' -f4 | while read username; do
USER_ID=$(echo "$USERS" | grep -B5 "\"username\":\"$username\"" | grep -o '"id":"[^"]*' | cut -d'"' -f4 | head -1)
if [ ! -z "$USER_ID" ]; then
curl -s -X DELETE "$KEYCLOAK_URL/admin/realms/$REALM_NAME/users/$USER_ID" \
-H "Authorization: Bearer $ACCESS_TOKEN"
echo " ✅ Supprimé: $username"
fi
done
# 3. Créer les rôles
echo ""
echo "👥 Création de la structure de rôles..."
declare -a ROLES=(
"SUPER_ADMIN|Super administrateur - Accès total plateforme"
"ADMIN_ORGANISATION|Administrateur organisation - Accès total"
"TRESORIER|Trésorier - Gestion financière et comptabilité"
"SECRETAIRE|Secrétaire - Gestion administrative et membres"
"RESPONSABLE_SOCIAL|Responsable social - Aide sociale"
"RESPONSABLE_EVENEMENTS|Responsable événements - Événements"
"RESPONSABLE_CREDIT|Responsable crédit - Épargne et crédit"
"MEMBRE_BUREAU|Membre du bureau - Accès étendu"
"MEMBRE_ACTIF|Membre actif - Accès de base"
"MEMBRE_SIMPLE|Membre simple - Consultation uniquement"
"MEMBRE|Rôle technique - Membre base"
"ADMIN|Rôle technique - Admin base"
"USER|Rôle technique - Utilisateur base"
)
for role_data in "${ROLES[@]}"; do
ROLE_NAME=$(echo $role_data | cut -d'|' -f1)
ROLE_DESC=$(echo $role_data | cut -d'|' -f2)
curl -s -X POST "$KEYCLOAK_URL/admin/realms/$REALM_NAME/roles" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"name\":\"$ROLE_NAME\",\"description\":\"$ROLE_DESC\"}" > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo " ✅ Rôle créé: $ROLE_NAME"
else
echo " ⚠️ Rôle existe ou erreur: $ROLE_NAME"
fi
done
# Fonction pour créer un utilisateur
create_user() {
local USERNAME=$1
local EMAIL=$2
local FIRSTNAME=$3
local LASTNAME=$4
shift 4
local ROLES=("$@")
# Créer l'utilisateur
curl -s -X POST "$KEYCLOAK_URL/admin/realms/$REALM_NAME/users" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"username\":\"$USERNAME\",
\"email\":\"$EMAIL\",
\"firstName\":\"$FIRSTNAME\",
\"lastName\":\"$LASTNAME\",
\"enabled\":true,
\"emailVerified\":true,
\"credentials\":[{\"type\":\"password\",\"value\":\"$TEST_PASSWORD\",\"temporary\":false}]
}"
# Récupérer l'ID de l'utilisateur
sleep 1
USER_ID=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM_NAME/users?username=$USERNAME" \
-H "Authorization: Bearer $ACCESS_TOKEN" | grep -o '"id":"[^"]*' | cut -d'"' -f4 | head -1)
if [ ! -z "$USER_ID" ]; then
# Assigner les rôles
for ROLE in "${ROLES[@]}"; do
# Récupérer les détails du rôle
ROLE_DATA=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM_NAME/roles/$ROLE" \
-H "Authorization: Bearer $ACCESS_TOKEN")
curl -s -X POST "$KEYCLOAK_URL/admin/realms/$REALM_NAME/users/$USER_ID/role-mappings/realm" \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d "[$ROLE_DATA]" > /dev/null 2>&1
done
echo " ✅ Utilisateur créé: $USERNAME ($EMAIL) - Rôles: ${ROLES[*]}"
else
echo " ❌ Erreur création: $USERNAME"
fi
}
# 4. Créer les utilisateurs
echo ""
echo "👤 Création des comptes de test..."
echo " Mot de passe pour tous: $TEST_PASSWORD"
echo ""
# Super-Admin
create_user "superadmin" "superadmin@unionflow.test" "Super" "Admin" "SUPER_ADMIN" "ADMIN" "USER"
# MUKEFI (Mutuelle)
create_user "admin.mukefi" "admin.mukefi@unionflow.test" "Administrateur" "MUKEFI" "ADMIN_ORGANISATION" "ADMIN" "USER"
create_user "tresorier.mukefi" "tresorier.mukefi@unionflow.test" "Trésorier" "MUKEFI" "TRESORIER" "MEMBRE" "USER"
create_user "secretaire.mukefi" "secretaire.mukefi@unionflow.test" "Secrétaire" "MUKEFI" "SECRETAIRE" "MEMBRE" "USER"
create_user "credit.mukefi" "credit.mukefi@unionflow.test" "Responsable Crédit" "MUKEFI" "RESPONSABLE_CREDIT" "MEMBRE" "USER"
create_user "membre.mukefi" "membre.mukefi@unionflow.test" "Membre" "MUKEFI" "MEMBRE_ACTIF" "MEMBRE" "USER"
# MESKA (Association)
create_user "admin.meska" "admin.meska@unionflow.test" "Administrateur" "MESKA" "ADMIN_ORGANISATION" "ADMIN" "USER"
create_user "secretaire.meska" "secretaire.meska@unionflow.test" "Secrétaire" "MESKA" "SECRETAIRE" "MEMBRE" "USER"
create_user "social.meska" "social.meska@unionflow.test" "Responsable Social" "MESKA" "RESPONSABLE_SOCIAL" "MEMBRE" "USER"
create_user "evenements.meska" "evenements.meska@unionflow.test" "Responsable Événements" "MESKA" "RESPONSABLE_EVENEMENTS" "MEMBRE" "USER"
create_user "membre.meska" "membre.meska@unionflow.test" "Membre" "MESKA" "MEMBRE_ACTIF" "MEMBRE" "USER"
echo ""
echo "========================================================================"
echo "✅ Configuration Keycloak terminée avec succès !"
echo "========================================================================"
echo ""
echo "📊 Résumé:"
echo " • 10 rôles créés"
echo " • 11 utilisateurs créés"
echo " • Mot de passe: $TEST_PASSWORD"
echo ""
echo "👥 Comptes créés:"
echo ""
echo " 🔧 Super-Admin:"
echo " → superadmin@unionflow.test"
echo ""
echo " 🏦 MUKEFI (Mutuelle):"
echo " → admin.mukefi@unionflow.test (Admin)"
echo " → tresorier.mukefi@unionflow.test (Trésorier)"
echo " → secretaire.mukefi@unionflow.test (Secrétaire)"
echo " → credit.mukefi@unionflow.test (Responsable Crédit)"
echo " → membre.mukefi@unionflow.test (Membre Actif)"
echo ""
echo " 🤝 MESKA (Association):"
echo " → admin.meska@unionflow.test (Admin)"
echo " → secretaire.meska@unionflow.test (Secrétaire)"
echo " → social.meska@unionflow.test (Responsable Social)"
echo " → evenements.meska@unionflow.test (Responsable Événements)"
echo " → membre.meska@unionflow.test (Membre Actif)"
echo ""
echo "🌐 Accès Keycloak:"
echo " • Console Admin: $KEYCLOAK_URL/admin"
echo " • Realm: $REALM_NAME"
echo ""