fix problème possible de "logique delete + create pouvait créer des conditions de concurrence"
This commit is contained in:
@@ -312,3 +312,42 @@ BEGIN
|
||||
(SELECT COALESCE(SUM(amount), 0) FROM votes WHERE campaign_id = campaign_uuid) as total_budget_voted;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql SECURITY DEFINER;
|
||||
|
||||
-- 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;
|
||||
|
||||
Reference in New Issue
Block a user