219 lines
9.5 KiB
SQL
219 lines
9.5 KiB
SQL
-- ============================================
|
|
-- Seed : 20 collaborateurs fictifs + compétences
|
|
-- À exécuter dans Supabase Studio → SQL Editor
|
|
-- ============================================
|
|
|
|
-- Fonction utilitaire pour générer un hash bcrypt (mot de passe: password123)
|
|
-- Le hash est pré-généré pour éviter d'avoir besoin de pgcrypto
|
|
|
|
-- 1. Créer les skills manquants
|
|
DO $$
|
|
DECLARE
|
|
cat_rec RECORD;
|
|
skill_id_var uuid;
|
|
BEGIN
|
|
-- Réseau
|
|
FOR cat_rec IN SELECT id FROM categories WHERE name = 'Réseau' LOOP
|
|
INSERT INTO skills (name, category_id) VALUES ('Routage & Switching', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('Firewall', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('VPN', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('Wireshark / Analyse', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
END LOOP;
|
|
-- Système
|
|
FOR cat_rec IN SELECT id FROM categories WHERE name = 'Système' LOOP
|
|
INSERT INTO skills (name, category_id) VALUES ('Linux', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('Windows Server', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('Virtualisation (Proxmox)', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('Ansible', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
END LOOP;
|
|
-- Cloud
|
|
FOR cat_rec IN SELECT id FROM categories WHERE name = 'Cloud' LOOP
|
|
INSERT INTO skills (name, category_id) VALUES ('AWS', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('Azure', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('GCP', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('Terraform', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
END LOOP;
|
|
-- Sécurité
|
|
FOR cat_rec IN SELECT id FROM categories WHERE name = 'Sécurité' LOOP
|
|
INSERT INTO skills (name, category_id) VALUES ('Pentest', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('SOC / SIEM', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('PKI', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('ISO 27001', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
END LOOP;
|
|
-- Base de données
|
|
FOR cat_rec IN SELECT id FROM categories WHERE name = 'Base de données' LOOP
|
|
INSERT INTO skills (name, category_id) VALUES ('PostgreSQL', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('MySQL', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('MongoDB', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('Admin BDD', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
END LOOP;
|
|
-- Monitoring
|
|
FOR cat_rec IN SELECT id FROM categories WHERE name = 'Monitoring' LOOP
|
|
INSERT INTO skills (name, category_id) VALUES ('Prometheus', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('Grafana', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('ELK Stack', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('Zabbix', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
END LOOP;
|
|
-- Stockage
|
|
FOR cat_rec IN SELECT id FROM categories WHERE name = 'Stockage' LOOP
|
|
INSERT INTO skills (name, category_id) VALUES ('SAN / NAS', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('Backup (Veeam)', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('Ceph', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
INSERT INTO skills (name, category_id) VALUES ('Minio', cat_rec.id) ON CONFLICT (name, category_id) DO NOTHING;
|
|
END LOOP;
|
|
END $$;
|
|
|
|
-- 2. Créer les utilisateurs dans auth.users et members
|
|
|
|
-- Extension pgcrypto pour le hash des mots de passe
|
|
CREATE EXTENSION IF NOT EXISTS pgcrypto;
|
|
|
|
-- Insérer les utilisateurs
|
|
DO $$
|
|
DECLARE
|
|
users_data text[][] := ARRAY[
|
|
['alice.martin@example.com', 'Alice Martin'],
|
|
['bob.bernard@example.com', 'Bob Bernard'],
|
|
['chloe.dubois@example.com', 'Chloé Dubois'],
|
|
['david.petit@example.com', 'David Petit'],
|
|
['emma.leroy@example.com', 'Emma Leroy'],
|
|
['francois.moreau@example.com', 'François Moreau'],
|
|
['gaelle.lambert@example.com', 'Gaëlle Lambert'],
|
|
['hugo.girard@example.com', 'Hugo Girard'],
|
|
['ines.roux@example.com', 'Inès Roux'],
|
|
['jules.vincent@example.com', 'Jules Vincent'],
|
|
['karine.fournier@example.com', 'Karine Fournier'],
|
|
['lucas.morel@example.com', 'Lucas Morel'],
|
|
['manon.lefebvre@example.com', 'Manon Lefebvre'],
|
|
['nathan.mercier@example.com', 'Nathan Mercier'],
|
|
['oceane.caron@example.com', 'Océane Caron'],
|
|
['pierre.gauthier@example.com', 'Pierre Gauthier'],
|
|
['quitterie.perrin@example.com', 'Quitterie Perrin'],
|
|
['romain.boucher@example.com', 'Romain Boucher'],
|
|
['sarah.dumont@example.com', 'Sarah Dumont'],
|
|
['thomas.giraud@example.com', 'Thomas Giraud']
|
|
];
|
|
i int;
|
|
user_email text;
|
|
user_name text;
|
|
new_user_id uuid;
|
|
existing_id uuid;
|
|
BEGIN
|
|
FOR i IN 1..array_length(users_data, 1) LOOP
|
|
user_email := users_data[i][1];
|
|
user_name := users_data[i][2];
|
|
|
|
-- Vérifier si le membre existe déjà
|
|
SELECT id INTO existing_id FROM members WHERE email = user_email;
|
|
IF existing_id IS NOT NULL THEN
|
|
RAISE NOTICE '⏩ % existe déjà (id: %)', user_name, existing_id;
|
|
CONTINUE;
|
|
END IF;
|
|
|
|
-- Vérifier si l'utilisateur auth existe déjà
|
|
SELECT id INTO existing_id FROM auth.users WHERE email = user_email;
|
|
IF existing_id IS NOT NULL THEN
|
|
RAISE NOTICE '⏩ % existe dans auth.users, création du member manquant...', user_name;
|
|
INSERT INTO members (id, email, full_name, role)
|
|
VALUES (existing_id, user_email, user_name, 'member')
|
|
ON CONFLICT (id) DO NOTHING;
|
|
CONTINUE;
|
|
END IF;
|
|
|
|
-- Créer l'utilisateur auth
|
|
new_user_id := gen_random_uuid();
|
|
INSERT INTO auth.users (
|
|
id, instance_id, aud, role, email,
|
|
encrypted_password, email_confirmed_at,
|
|
raw_user_meta_data, created_at, updated_at,
|
|
confirmation_token, email_change, email_change_token_new, recovery_token, is_super_admin
|
|
) VALUES (
|
|
new_user_id,
|
|
'00000000-0000-0000-0000-000000000000',
|
|
'authenticated',
|
|
'authenticated',
|
|
user_email,
|
|
crypt('password123', gen_salt('bf')),
|
|
now(),
|
|
jsonb_build_object('full_name', user_name),
|
|
now(),
|
|
now(),
|
|
'', '', '', '',
|
|
false
|
|
);
|
|
|
|
-- Créer la ligne dans members manuellement
|
|
INSERT INTO members (id, email, full_name, role)
|
|
VALUES (new_user_id, user_email, user_name, 'member');
|
|
|
|
RAISE NOTICE '✓ % créé (id: %)', user_name, new_user_id;
|
|
END LOOP;
|
|
END $$;
|
|
|
|
-- 3. Assigner des niveaux de compétence aléatoires
|
|
DO $$
|
|
DECLARE
|
|
member_rec RECORD;
|
|
skill_rec RECORD;
|
|
level_val int;
|
|
BEGIN
|
|
FOR member_rec IN SELECT id FROM members WHERE role = 'member' LOOP
|
|
FOR skill_rec IN SELECT id FROM skills LOOP
|
|
level_val := floor(random() * 4) + 1;
|
|
INSERT INTO skill_levels (member_id, skill_id, level)
|
|
VALUES (member_rec.id, skill_rec.id, level_val)
|
|
ON CONFLICT (member_id, skill_id) DO UPDATE SET level = level_val;
|
|
END LOOP;
|
|
END LOOP;
|
|
RAISE NOTICE 'Niveaux assignés à tous les membres';
|
|
END $$;
|
|
|
|
-- 4. Créer un historique pour les 10 premiers membres
|
|
DO $$
|
|
DECLARE
|
|
member_rec RECORD;
|
|
skill_rec RECORD;
|
|
admin_id uuid;
|
|
skill_ids uuid[];
|
|
old_lvl int;
|
|
new_lvl int;
|
|
num_changes int;
|
|
days_ago int;
|
|
BEGIN
|
|
-- Récupérer l'ID de l'admin
|
|
SELECT id INTO admin_id FROM members WHERE role = 'admin' LIMIT 1;
|
|
IF admin_id IS NULL THEN
|
|
RAISE NOTICE '⚠ Aucun admin trouvé, historique ignoré';
|
|
RETURN;
|
|
END IF;
|
|
|
|
-- Récupérer tous les skill IDs
|
|
SELECT array_agg(id) INTO skill_ids FROM skills;
|
|
|
|
FOR member_rec IN SELECT id FROM members WHERE role = 'member' ORDER BY created_at LIMIT 10 LOOP
|
|
num_changes := floor(random() * 5) + 2;
|
|
FOR i IN 1..num_changes LOOP
|
|
skill_rec := (SELECT s FROM unnest(skill_ids) AS s ORDER BY random() LIMIT 1);
|
|
old_lvl := floor(random() * 3) + 1;
|
|
new_lvl := old_lvl + floor(random() * (4 - old_lvl)) + 1;
|
|
days_ago := floor(random() * 30) + 1;
|
|
|
|
INSERT INTO skill_history (member_id, skill_id, old_level, new_level, changed_by, created_at)
|
|
VALUES (member_rec.id, skill_rec, old_lvl, new_lvl, admin_id, now() - (days_ago || ' days')::interval);
|
|
END LOOP;
|
|
END LOOP;
|
|
RAISE NOTICE 'Historique créé';
|
|
END $$;
|
|
|
|
-- 5. Afficher le résumé
|
|
SELECT 'RÉSULTAT DU SEED' AS "";
|
|
SELECT 'Catégories' AS "Table", count(*) AS "Total" FROM categories
|
|
UNION ALL
|
|
SELECT 'Skills', count(*) FROM skills
|
|
UNION ALL
|
|
SELECT 'Membres', count(*) FROM members
|
|
UNION ALL
|
|
SELECT 'Niveaux', count(*) FROM skill_levels
|
|
UNION ALL
|
|
SELECT 'Historique', count(*) FROM skill_history;
|