ваше сообщение коммита
This commit is contained in:
@@ -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 $$
|
||||||
END;
|
BEGIN
|
||||||
|
UPDATE users
|
||||||
|
SET role = p_role,
|
||||||
|
updated_at = NOW()
|
||||||
|
WHERE id = p_user_id;
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql;
|
||||||
@@ -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" }
|
||||||
];
|
];
|
||||||
|
|||||||
Reference in New Issue
Block a user