mirror of
https://codeberg.org/likwid/likwid.git
synced 2026-02-09 21:13:09 +00:00
backend(migrations): demo seed fixes and deterministic IDs
This commit is contained in:
parent
1f355bd19f
commit
9fb576fc2c
5 changed files with 114 additions and 0 deletions
|
|
@ -0,0 +1,17 @@
|
||||||
|
-- Fix moderation ledger delete protection: missing allow_ledger_delete setting must default to false
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION ledger_prevent_delete()
|
||||||
|
RETURNS TRIGGER AS $$
|
||||||
|
BEGIN
|
||||||
|
-- Allow deletion only by superuser (for legal compliance like GDPR)
|
||||||
|
IF NOT COALESCE(current_setting('likwid.allow_ledger_delete', true), 'false')::boolean THEN
|
||||||
|
RAISE EXCEPTION 'Moderation ledger entries cannot be deleted. Set likwid.allow_ledger_delete = true for legal compliance deletions.';
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
-- Log the deletion attempt
|
||||||
|
INSERT INTO ledger_deletion_log (entry_id, deleted_by, reason)
|
||||||
|
VALUES (OLD.id, current_user, current_setting('likwid.deletion_reason', true));
|
||||||
|
|
||||||
|
RETURN OLD;
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql;
|
||||||
|
|
@ -0,0 +1,55 @@
|
||||||
|
-- Assign deterministic IDs to seeded moderation_log rows so demo reset can preserve baseline logs.
|
||||||
|
|
||||||
|
-- RFC-001 description edit
|
||||||
|
WITH seed_row AS (
|
||||||
|
SELECT id
|
||||||
|
FROM moderation_log
|
||||||
|
WHERE community_id = 'c0000001-0000-0000-0000-000000000001'::uuid
|
||||||
|
AND moderator_id = 'd0000001-0000-0000-0000-000000000002'::uuid
|
||||||
|
AND target_user_id IS NULL
|
||||||
|
AND action_type = 'content_edit'
|
||||||
|
AND reason = 'Updated RFC-001 description for clarity'
|
||||||
|
AND details = '{"proposal_id": "b0000001-0000-0000-0000-000000000001", "field": "description", "change_type": "formatting"}'::jsonb
|
||||||
|
ORDER BY created_at
|
||||||
|
LIMIT 1
|
||||||
|
)
|
||||||
|
UPDATE moderation_log
|
||||||
|
SET id = 'f0000001-0000-0000-0000-000000000001'::uuid
|
||||||
|
WHERE id IN (SELECT id FROM seed_row)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM moderation_log WHERE id = 'f0000001-0000-0000-0000-000000000001'::uuid);
|
||||||
|
|
||||||
|
-- Budget proposal thread warning
|
||||||
|
WITH seed_row AS (
|
||||||
|
SELECT id
|
||||||
|
FROM moderation_log
|
||||||
|
WHERE community_id = 'c0000001-0000-0000-0000-000000000002'::uuid
|
||||||
|
AND moderator_id = 'd0000001-0000-0000-0000-000000000002'::uuid
|
||||||
|
AND target_user_id = 'd0000002-0000-0000-0000-000000000009'::uuid
|
||||||
|
AND action_type = 'warning'
|
||||||
|
AND reason = 'Off-topic discussion in budget proposal thread'
|
||||||
|
AND details = '{"rule": "community_guidelines_3", "comment_id": "comment_example_001"}'::jsonb
|
||||||
|
ORDER BY created_at
|
||||||
|
LIMIT 1
|
||||||
|
)
|
||||||
|
UPDATE moderation_log
|
||||||
|
SET id = 'f0000001-0000-0000-0000-000000000002'::uuid
|
||||||
|
WHERE id IN (SELECT id FROM seed_row)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM moderation_log WHERE id = 'f0000001-0000-0000-0000-000000000002'::uuid);
|
||||||
|
|
||||||
|
-- Proposal deadline extension
|
||||||
|
WITH seed_row AS (
|
||||||
|
SELECT id
|
||||||
|
FROM moderation_log
|
||||||
|
WHERE community_id = 'c0000001-0000-0000-0000-000000000003'::uuid
|
||||||
|
AND moderator_id = 'd0000001-0000-0000-0000-000000000002'::uuid
|
||||||
|
AND target_user_id IS NULL
|
||||||
|
AND action_type = 'proposal_extended'
|
||||||
|
AND reason = 'Extended voting deadline by 48 hours due to technical issues'
|
||||||
|
AND details = '{"proposal_id": "b0000001-0000-0000-0000-000000000006", "original_end": "2026-01-10T00:00:00Z", "new_end": "2026-01-12T00:00:00Z"}'::jsonb
|
||||||
|
ORDER BY created_at
|
||||||
|
LIMIT 1
|
||||||
|
)
|
||||||
|
UPDATE moderation_log
|
||||||
|
SET id = 'f0000001-0000-0000-0000-000000000003'::uuid
|
||||||
|
WHERE id IN (SELECT id FROM seed_row)
|
||||||
|
AND NOT EXISTS (SELECT 1 FROM moderation_log WHERE id = 'f0000001-0000-0000-0000-000000000003'::uuid);
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
-- Ensure demo-seeded users have baseline platform roles for permission checks.
|
||||||
|
|
||||||
|
-- Give all demo-seeded users the base 'user' platform role
|
||||||
|
INSERT INTO user_roles (user_id, role_id, community_id, granted_by)
|
||||||
|
SELECT u.id, r.id, NULL, u.id
|
||||||
|
FROM users u
|
||||||
|
JOIN roles r ON r.name = 'user' AND r.community_id IS NULL
|
||||||
|
WHERE u.id::text LIKE 'd000%'
|
||||||
|
ON CONFLICT (user_id, role_id, community_id) DO NOTHING;
|
||||||
|
|
||||||
|
-- Make demo moderator a platform admin
|
||||||
|
INSERT INTO user_roles (user_id, role_id, community_id, granted_by)
|
||||||
|
SELECT 'd0000001-0000-0000-0000-000000000002'::uuid, r.id, NULL, 'd0000001-0000-0000-0000-000000000002'::uuid
|
||||||
|
FROM roles r
|
||||||
|
WHERE r.name = 'platform_admin' AND r.community_id IS NULL
|
||||||
|
ON CONFLICT (user_id, role_id, community_id) DO NOTHING;
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
UPDATE delegations d
|
||||||
|
SET
|
||||||
|
scope = 'community'::delegation_scope,
|
||||||
|
community_id = COALESCE(d.community_id, t.community_id),
|
||||||
|
topic_id = NULL
|
||||||
|
FROM topics t
|
||||||
|
WHERE d.scope = 'topic'::delegation_scope
|
||||||
|
AND d.topic_id = t.id;
|
||||||
|
|
||||||
|
UPDATE delegation_log l
|
||||||
|
SET
|
||||||
|
scope = 'community'::delegation_scope,
|
||||||
|
community_id = COALESCE(l.community_id, t.community_id),
|
||||||
|
topic_id = NULL
|
||||||
|
FROM topics t
|
||||||
|
WHERE l.scope = 'topic'::delegation_scope
|
||||||
|
AND l.topic_id = t.id;
|
||||||
|
|
||||||
|
UPDATE delegation_chains c
|
||||||
|
SET
|
||||||
|
scope = 'community'::delegation_scope,
|
||||||
|
community_id = COALESCE(c.community_id, t.community_id),
|
||||||
|
topic_id = NULL
|
||||||
|
FROM topics t
|
||||||
|
WHERE c.scope = 'topic'::delegation_scope
|
||||||
|
AND c.topic_id = t.id;
|
||||||
Loading…
Reference in a new issue