ваше сообщение коммита

This commit is contained in:
2025-04-10 20:52:25 +03:00
parent 4d8ec5c914
commit 60c08db518
2 changed files with 32 additions and 21 deletions

View File

@@ -29,26 +29,31 @@ DROP FUNCTION IF EXISTS sync_identity_type() CASCADE;
DROP FUNCTION IF EXISTS update_user_role() CASCADE; DROP FUNCTION IF EXISTS update_user_role() CASCADE;
DROP FUNCTION IF EXISTS check_admin_role() CASCADE; DROP FUNCTION IF EXISTS check_admin_role() CASCADE;
-- Создаем функцию для проверки баланса токенов
CREATE OR REPLACE FUNCTION check_token_balance(wallet_address VARCHAR)
RETURNS BOOLEAN AS $$
BEGIN
-- Эта функция будет вызываться из auth-service.js
-- Здесь только заглушка, реальная проверка в JavaScript
RETURN FALSE;
END;
$$ LANGUAGE plpgsql;
-- Создаем функцию проверки роли -- Создаем функцию проверки роли
CREATE OR REPLACE FUNCTION check_admin_role() CREATE OR REPLACE FUNCTION check_admin_role()
RETURNS TRIGGER AS $$ RETURNS TRIGGER AS $$
DECLARE
v_wallet_address VARCHAR;
BEGIN BEGIN
SELECT provider_id INTO v_wallet_address -- Не меняем роль при обновлении других типов идентификаторов
FROM user_identities IF NEW.provider != 'wallet' THEN
WHERE user_id = NEW.user_id
AND provider = 'wallet'
LIMIT 1;
IF v_wallet_address IS NULL THEN
RETURN NEW; RETURN NEW;
END IF; END IF;
-- По умолчанию устанавливаем роль user
UPDATE users UPDATE users
SET role = 'admin'::user_role SET role = 'user'::user_role
WHERE id = NEW.user_id; WHERE id = NEW.user_id;
-- Роль админа будет назначаться через auth-service.js после проверки баланса токенов
RETURN NEW; RETURN NEW;
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
@@ -59,13 +64,19 @@ AFTER INSERT OR UPDATE ON user_identities
FOR EACH ROW FOR EACH ROW
EXECUTE FUNCTION check_admin_role(); EXECUTE FUNCTION check_admin_role();
-- Обновляем существующие записи -- Сбрасываем все роли на user
UPDATE users u UPDATE users SET role = 'user'::user_role;
SET role = CASE
WHEN EXISTS ( -- Создаем индекс для оптимизации поиска по роли
SELECT 1 FROM user_identities ui CREATE INDEX IF NOT EXISTS idx_users_role ON users(role);
WHERE ui.user_id = u.id
AND ui.provider = 'wallet' -- Создаем функцию для безопасного обновления роли
) THEN 'admin'::user_role CREATE OR REPLACE FUNCTION update_user_role(p_user_id INTEGER, p_role user_role)
ELSE 'user'::user_role RETURNS VOID AS $$
BEGIN
UPDATE users
SET role = p_role,
updated_at = NOW()
WHERE id = p_user_id;
END; END;
$$ LANGUAGE plpgsql;

View File

@@ -7,7 +7,7 @@ const verificationService = require('./verification-service'); // Использ
const ADMIN_CONTRACTS = [ const ADMIN_CONTRACTS = [
{ address: "0xd95a45fc46a7300e6022885afec3d618d7d3f27c", network: "eth" }, { address: "0xd95a45fc46a7300e6022885afec3d618d7d3f27c", network: "eth" },
{ address: "0x1d47f12ffA279BFE59Ab16d56fBb10d89AECdD5D", network: "bsc" }, { address: "0x4B294265720B09ca39BFBA18c7E368413c0f68eB", network: "bsc" },
{ address: "0xdce769b847a0a697239777d0b1c7dd33b6012ba0", network: "arbitrum" }, { address: "0xdce769b847a0a697239777d0b1c7dd33b6012ba0", network: "arbitrum" },
{ address: "0x351f59de4fedbdf7601f5592b93db3b9330c1c1d", network: "polygon" } { address: "0x351f59de4fedbdf7601f5592b93db3b9330c1c1d", network: "polygon" }
]; ];