initial commit
This commit is contained in:
82
migrations/00017_add_moderation_trigger.sql
Normal file
82
migrations/00017_add_moderation_trigger.sql
Normal file
@@ -0,0 +1,82 @@
|
||||
-- +goose Up
|
||||
-- +goose StatementBegin
|
||||
|
||||
-- =========================================
|
||||
-- ФУНКЦИЯ: Автоматический аудит действий модератора
|
||||
-- =========================================
|
||||
CREATE OR REPLACE FUNCTION audit_moderation_action()
|
||||
RETURNS TRIGGER AS $$
|
||||
BEGIN
|
||||
-- Проверяем, изменились ли поля модерации
|
||||
IF (OLD.moderated_by IS DISTINCT FROM NEW.moderated_by) OR
|
||||
(OLD.moderated_at IS DISTINCT FROM NEW.moderated_at) THEN
|
||||
|
||||
-- Определяем тип действия на основе статуса
|
||||
IF NEW.status = 'approved' AND OLD.status = 'pending_moderation' THEN
|
||||
INSERT INTO moderator_actions (
|
||||
moderator_id,
|
||||
action_type,
|
||||
target_request_id,
|
||||
comment,
|
||||
metadata
|
||||
) VALUES (
|
||||
NEW.moderated_by,
|
||||
'approve_request',
|
||||
NEW.id,
|
||||
NEW.moderation_comment,
|
||||
jsonb_build_object(
|
||||
'previous_status', OLD.status::text,
|
||||
'new_status', NEW.status::text,
|
||||
'request_title', NEW.title,
|
||||
'requester_id', NEW.requester_id
|
||||
)
|
||||
);
|
||||
ELSIF NEW.status = 'rejected' AND OLD.status = 'pending_moderation' THEN
|
||||
INSERT INTO moderator_actions (
|
||||
moderator_id,
|
||||
action_type,
|
||||
target_request_id,
|
||||
comment,
|
||||
metadata
|
||||
) VALUES (
|
||||
NEW.moderated_by,
|
||||
'reject_request',
|
||||
NEW.id,
|
||||
NEW.moderation_comment,
|
||||
jsonb_build_object(
|
||||
'previous_status', OLD.status::text,
|
||||
'new_status', NEW.status::text,
|
||||
'request_title', NEW.title,
|
||||
'requester_id', NEW.requester_id,
|
||||
'rejection_reason', NEW.moderation_comment
|
||||
)
|
||||
);
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
RETURN NEW;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
COMMENT ON FUNCTION audit_moderation_action() IS 'Автоматически создает записи в moderator_actions при модерации заявок';
|
||||
|
||||
-- =========================================
|
||||
-- ТРИГГЕР: Аудит модерации заявок
|
||||
-- =========================================
|
||||
CREATE TRIGGER trigger_audit_request_moderation
|
||||
AFTER UPDATE ON requests
|
||||
FOR EACH ROW
|
||||
WHEN (OLD.moderated_by IS DISTINCT FROM NEW.moderated_by OR
|
||||
OLD.moderated_at IS DISTINCT FROM NEW.moderated_at)
|
||||
EXECUTE FUNCTION audit_moderation_action();
|
||||
|
||||
COMMENT ON TRIGGER trigger_audit_request_moderation ON requests IS
|
||||
'Автоматически логирует действия модератора в таблицу moderator_actions';
|
||||
|
||||
-- +goose StatementEnd
|
||||
|
||||
-- +goose Down
|
||||
-- +goose StatementBegin
|
||||
DROP TRIGGER IF EXISTS trigger_audit_request_moderation ON requests;
|
||||
DROP FUNCTION IF EXISTS audit_moderation_action();
|
||||
-- +goose StatementEnd
|
||||
Reference in New Issue
Block a user