geo detection

This commit is contained in:
2025-11-06 15:09:15 +09:00
parent 88d9ccd75d
commit 0bbeb0767b
47 changed files with 1355 additions and 93 deletions

82
sql/fix_match_trigger.sql Normal file
View File

@@ -0,0 +1,82 @@
-- Исправление триггера 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).';

View File

@@ -0,0 +1,49 @@
-- Исправление триггера notify_new_message для использования правильной схемы notifications
-- Проблема: триггер использует content и reference_id вместо data (jsonb)
-- Удаляем старый триггер и функцию
DROP TRIGGER IF EXISTS notify_new_message_trigger ON messages;
DROP FUNCTION IF EXISTS notify_new_message();
-- Создаём новую функцию с правильной схемой
CREATE OR REPLACE FUNCTION notify_new_message()
RETURNS TRIGGER AS $$
DECLARE
recipient_id UUID;
BEGIN
-- Определяем получателя сообщения (второго участника матча)
SELECT CASE
WHEN m.user_id_1 = NEW.sender_id THEN m.user_id_2
ELSE m.user_id_1
END INTO recipient_id
FROM matches m
WHERE m.id = NEW.match_id;
-- Создаём уведомление с правильной структурой (data jsonb)
IF recipient_id IS NOT NULL THEN
INSERT INTO notifications (user_id, type, data, created_at)
VALUES (
recipient_id,
'new_message',
jsonb_build_object(
'message_id', NEW.id,
'match_id', NEW.match_id,
'sender_id', NEW.sender_id,
'content_preview', LEFT(NEW.content, 50)
),
NOW()
);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Создаём триггер заново
CREATE TRIGGER notify_new_message_trigger
AFTER INSERT ON messages
FOR EACH ROW
EXECUTE FUNCTION notify_new_message();
-- Проверка
SELECT 'Trigger notify_new_message fixed successfully' AS status;

View File

@@ -0,0 +1,46 @@
-- Исправление триггера update_last_active для работы с messages и swipes
-- Проблема: в messages есть sender_id, а в swipes есть user_id
-- Удаляем старые триггеры
DROP TRIGGER IF EXISTS update_last_active_on_message ON messages;
DROP TRIGGER IF EXISTS update_last_active_on_swipe ON swipes;
DROP FUNCTION IF EXISTS update_last_active();
-- Создаём функцию для обновления last_active для отправителя сообщения
CREATE OR REPLACE FUNCTION update_last_active_on_message()
RETURNS TRIGGER AS $$
BEGIN
UPDATE profiles
SET last_active = CURRENT_TIMESTAMP
WHERE user_id = NEW.sender_id;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Создаём функцию для обновления last_active при свайпе
CREATE OR REPLACE FUNCTION update_last_active_on_swipe()
RETURNS TRIGGER AS $$
BEGIN
UPDATE profiles
SET last_active = CURRENT_TIMESTAMP
WHERE user_id = NEW.user_id;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Создаём триггер для messages
CREATE TRIGGER update_last_active_on_message
AFTER INSERT ON messages
FOR EACH ROW
EXECUTE FUNCTION update_last_active_on_message();
-- Создаём триггер для swipes
CREATE TRIGGER update_last_active_on_swipe
AFTER INSERT ON swipes
FOR EACH ROW
EXECUTE FUNCTION update_last_active_on_swipe();
-- Проверка
SELECT 'Triggers update_last_active fixed successfully' AS status;