83 lines
3.2 KiB
PL/PgSQL
83 lines
3.2 KiB
PL/PgSQL
-- Исправление триггера create_match_on_mutual_like
|
||
-- Дата: 2025-11-06
|
||
-- Проблемы:
|
||
-- 1. Использовались неправильные имена полей: target_id вместо target_user_id, action вместо type
|
||
-- 2. Использовались несуществующие колонки в notifications: content и reference_id вместо data
|
||
|
||
-- Удаляем старую функцию
|
||
DROP FUNCTION IF EXISTS create_match_on_mutual_like() CASCADE;
|
||
|
||
-- Создаем исправленную функцию
|
||
CREATE OR REPLACE FUNCTION create_match_on_mutual_like()
|
||
RETURNS TRIGGER AS $$
|
||
DECLARE
|
||
reverse_like_exists BOOLEAN;
|
||
match_id_var UUID;
|
||
BEGIN
|
||
-- Проверяем только лайки и суперлайки (игнорируем pass)
|
||
IF NEW.type != 'like' AND NEW.type != 'superlike' THEN
|
||
RETURN NEW;
|
||
END IF;
|
||
|
||
-- Проверяем есть ли обратный лайк (правильные имена полей: target_user_id, type)
|
||
SELECT EXISTS (
|
||
SELECT 1
|
||
FROM swipes
|
||
WHERE user_id = NEW.target_user_id
|
||
AND target_user_id = NEW.user_id
|
||
AND type IN ('like', 'superlike')
|
||
) INTO reverse_like_exists;
|
||
|
||
-- Если есть взаимный лайк, создаем матч
|
||
IF reverse_like_exists THEN
|
||
-- Создаем матч и получаем его ID
|
||
INSERT INTO matches (user_id_1, user_id_2, created_at, is_active)
|
||
VALUES (
|
||
LEAST(NEW.user_id, NEW.target_user_id),
|
||
GREATEST(NEW.user_id, NEW.target_user_id),
|
||
NOW(),
|
||
true
|
||
)
|
||
ON CONFLICT (user_id_1, user_id_2) DO UPDATE SET is_active = true
|
||
RETURNING id INTO match_id_var;
|
||
|
||
-- Создаем уведомления для обоих пользователей
|
||
-- Используем data (jsonb) вместо content и reference_id
|
||
INSERT INTO notifications (user_id, type, data, is_read, created_at)
|
||
VALUES (
|
||
NEW.user_id,
|
||
'new_match',
|
||
jsonb_build_object('message', 'У вас новый матч!', 'match_id', match_id_var),
|
||
false,
|
||
NOW()
|
||
);
|
||
|
||
INSERT INTO notifications (user_id, type, data, is_read, created_at)
|
||
VALUES (
|
||
NEW.target_user_id,
|
||
'new_match',
|
||
jsonb_build_object('message', 'У вас новый матч!', 'match_id', match_id_var),
|
||
false,
|
||
NOW()
|
||
);
|
||
END IF;
|
||
|
||
RETURN NEW;
|
||
END;
|
||
$$ LANGUAGE plpgsql;
|
||
|
||
-- Пересоздаем триггер
|
||
DROP TRIGGER IF EXISTS create_match_trigger ON swipes;
|
||
CREATE TRIGGER create_match_trigger
|
||
AFTER INSERT ON swipes
|
||
FOR EACH ROW
|
||
EXECUTE FUNCTION create_match_on_mutual_like();
|
||
|
||
-- Проверка
|
||
SELECT 'Триггер create_match_on_mutual_like успешно исправлен!' as status;
|
||
|
||
COMMENT ON FUNCTION create_match_on_mutual_like() IS
|
||
'Триггер автоматически создает матч при взаимном лайке.
|
||
Исправлено: использование правильных имен полей (target_user_id, type)
|
||
и правильной структуры notifications (data jsonb).';
|