42 lines
1.4 KiB
PL/PgSQL
42 lines
1.4 KiB
PL/PgSQL
-- Script pour appliquer la fonction replace_participant_votes
|
|
-- À exécuter dans votre base de données Supabase
|
|
|
|
-- Fonction pour remplacer tous les votes d'un participant de manière atomique
|
|
CREATE OR REPLACE FUNCTION replace_participant_votes(
|
|
p_campaign_id UUID,
|
|
p_participant_id UUID,
|
|
p_votes JSONB
|
|
)
|
|
RETURNS VOID AS $$
|
|
DECLARE
|
|
vote_record RECORD;
|
|
BEGIN
|
|
-- Commencer une transaction
|
|
BEGIN
|
|
-- Supprimer tous les votes existants pour ce participant dans cette campagne
|
|
DELETE FROM votes
|
|
WHERE campaign_id = p_campaign_id
|
|
AND participant_id = p_participant_id;
|
|
|
|
-- Insérer les nouveaux votes
|
|
FOR vote_record IN
|
|
SELECT * FROM jsonb_array_elements(p_votes)
|
|
LOOP
|
|
INSERT INTO votes (campaign_id, participant_id, proposition_id, amount)
|
|
VALUES (
|
|
p_campaign_id,
|
|
p_participant_id,
|
|
(vote_record.value->>'proposition_id')::UUID,
|
|
(vote_record.value->>'amount')::INTEGER
|
|
);
|
|
END LOOP;
|
|
|
|
-- La transaction sera automatiquement commitée si tout va bien
|
|
EXCEPTION
|
|
WHEN OTHERS THEN
|
|
-- En cas d'erreur, la transaction sera automatiquement rollbackée
|
|
RAISE EXCEPTION 'Erreur lors du remplacement des votes: %', SQLERRM;
|
|
END;
|
|
END;
|
|
$$ LANGUAGE plpgsql SECURITY DEFINER;
|