admin的数据库文件补全,修复uvue中的数据库接入bug
This commit is contained in:
55
docs/sql/30_rpc/auth/fn_check_admin_permission_v1.sql
Normal file
55
docs/sql/30_rpc/auth/fn_check_admin_permission_v1.sql
Normal file
@@ -0,0 +1,55 @@
|
||||
-- =====================================================================================
|
||||
-- 函数: check_admin_permission
|
||||
-- 描述: 通用的 RBAC 权限校验函数
|
||||
-- 参数: p_permission_code - 权限编码 (如 'role:delete', 'user:view')
|
||||
-- 返回: BOOLEAN
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.check_admin_permission(
|
||||
p_permission_code TEXT DEFAULT NULL
|
||||
)
|
||||
RETURNS BOOLEAN
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
v_user_id UUID;
|
||||
v_role TEXT;
|
||||
BEGIN
|
||||
-- 1. 获取当前登录用户的 Profile ID 和角色
|
||||
SELECT id, role INTO v_user_id, v_role
|
||||
FROM public.ak_users
|
||||
WHERE auth_id = auth.uid();
|
||||
|
||||
-- 2. 未登录或未找到 Profile
|
||||
IF v_user_id IS NULL THEN
|
||||
RETURN FALSE;
|
||||
END IF;
|
||||
|
||||
-- 3. 超级管理员拥有所有权限 (保持向下兼容)
|
||||
IF v_role = 'admin' THEN
|
||||
RETURN TRUE;
|
||||
END IF;
|
||||
|
||||
-- 4. 如果指定了权限编码,则检查 ak_permissions 体系
|
||||
IF p_permission_code IS NOT NULL THEN
|
||||
RETURN EXISTS (
|
||||
SELECT 1
|
||||
FROM public.ak_admin_roles ar
|
||||
JOIN public.ak_role_permissions rp ON ar.role_id = rp.role_id
|
||||
JOIN public.ak_permissions p ON rp.permission_id = p.id
|
||||
WHERE ar.admin_id = v_user_id
|
||||
AND p.code = p_permission_code
|
||||
AND p.deleted_at IS NULL
|
||||
AND ar.deleted_at IS NULL
|
||||
);
|
||||
END IF;
|
||||
|
||||
RETURN FALSE;
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- 授权
|
||||
REVOKE ALL ON FUNCTION public.check_admin_permission(TEXT) FROM PUBLIC;
|
||||
GRANT EXECUTE ON FUNCTION public.check_admin_permission(TEXT) TO authenticated;
|
||||
@@ -1,5 +1,5 @@
|
||||
-- RPC: rpc_admin_delete_permission
|
||||
-- 管理端删除功能权限/菜单
|
||||
-- 管理端删除功能权限/菜单(支持级联软删除关联的角色权限映射)
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_delete_permission(
|
||||
p_id UUID
|
||||
@@ -11,17 +11,29 @@ SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok BOOLEAN;
|
||||
v_user_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查 (仅管理员)
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role = 'admin'
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
-- 1. 权限检查 (使用通用权限校验函数,权限编码: permission:delete)
|
||||
IF NOT public.check_admin_permission('permission:delete') THEN
|
||||
RAISE EXCEPTION 'Permission denied: permission:delete';
|
||||
END IF;
|
||||
|
||||
-- 2. 执行级联删除 (外键已配置 ON DELETE CASCADE)
|
||||
DELETE FROM public.ak_permissions WHERE id = p_id;
|
||||
-- 2. 获取当前操作用户 ID
|
||||
SELECT id INTO v_user_id
|
||||
FROM public.ak_users
|
||||
WHERE auth_id = auth.uid();
|
||||
|
||||
-- 3. 级联软删除:先删除所有关联了该权限的角色映射
|
||||
UPDATE public.ak_role_permissions
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE permission_id = p_id AND deleted_at IS NULL;
|
||||
|
||||
-- 4. 最后软删除权限本身
|
||||
UPDATE public.ak_permissions
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE id = p_id AND deleted_at IS NULL;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
-- RPC: rpc_admin_delete_role
|
||||
-- 管理端删除角色
|
||||
-- 管理端删除角色(支持级联软删除关联权限)
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_delete_role(
|
||||
p_id UUID
|
||||
@@ -11,17 +11,35 @@ SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok BOOLEAN;
|
||||
v_user_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role = 'admin'
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
-- 1. 权限检查 (使用通用权限校验函数,权限编码: role:delete)
|
||||
IF NOT public.check_admin_permission('role:delete') THEN
|
||||
RAISE EXCEPTION 'Permission denied: role:delete';
|
||||
END IF;
|
||||
|
||||
-- 2. 执行删除
|
||||
DELETE FROM public.ak_roles WHERE id = p_id;
|
||||
-- 2. 获取当前操作用户 ID
|
||||
SELECT id INTO v_user_id
|
||||
FROM public.ak_users
|
||||
WHERE auth_id = auth.uid();
|
||||
|
||||
-- 3. 级联软删除:先删除该角色下的所有权限关联
|
||||
UPDATE public.ak_role_permissions
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE role_id = p_id AND deleted_at IS NULL;
|
||||
|
||||
-- 4. 级联软删除:再删除该角色下的所有管理员关联
|
||||
UPDATE public.ak_admin_roles
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE role_id = p_id AND deleted_at IS NULL;
|
||||
|
||||
-- 5. 最后软删除角色本身
|
||||
UPDATE public.ak_roles
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE id = p_id AND deleted_at IS NULL;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
|
||||
@@ -26,6 +26,7 @@ BEGIN
|
||||
path, icon, sort_order, is_visible,
|
||||
created_at, updated_at
|
||||
FROM public.ak_permissions
|
||||
WHERE deleted_at IS NULL
|
||||
ORDER BY sort_order ASC, created_at ASC
|
||||
) t;
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
-- 位置:docs/sql/30_rpc/cms/
|
||||
-- 对象类型:RPC 函数 (SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:管理端删除文章分类(需检查是否有关联文章)
|
||||
-- 说明:管理端删除文章分类(支持级联软删除分类下的文章)
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_article_category_delete(
|
||||
@@ -15,33 +15,32 @@ SET search_path = public
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_has_articles BOOLEAN;
|
||||
v_ok BOOLEAN;
|
||||
v_user_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
IF NOT public.check_admin_permission('cms:category:delete') THEN
|
||||
RAISE EXCEPTION 'Permission denied: cms:category:delete';
|
||||
END IF;
|
||||
|
||||
-- 2. 检查是否有关联文章
|
||||
SELECT EXISTS (
|
||||
SELECT 1 FROM public.ml_articles
|
||||
WHERE category_id = p_id
|
||||
) INTO v_has_articles;
|
||||
-- 2. 获取当前操作用户 ID
|
||||
SELECT id INTO v_user_id FROM public.ak_users WHERE auth_id = auth.uid();
|
||||
|
||||
IF v_has_articles THEN
|
||||
RAISE EXCEPTION 'Cannot delete category with associated articles';
|
||||
END IF;
|
||||
-- 3. 级联软删除:该分类下的所有文章
|
||||
UPDATE public.ml_articles
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE category_id = p_id AND deleted_at IS NULL;
|
||||
|
||||
-- 3. 执行物理删除
|
||||
DELETE FROM public.ml_article_categories WHERE id = p_id;
|
||||
-- 4. 软删除分类本身
|
||||
UPDATE public.ml_article_categories
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE id = p_id AND deleted_at IS NULL;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
END;
|
||||
$$;
|
||||
|
||||
COMMENT ON FUNCTION public.rpc_admin_article_category_delete IS '管理员删除文章分类(含关联性检查)';
|
||||
COMMENT ON FUNCTION public.rpc_admin_article_category_delete IS '管理员删除文章分类(级联软删除关联文章)';
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
-- 位置:docs/sql/30_rpc/cms/
|
||||
-- 对象类型:RPC 函数 (SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:管理端删除文章记录
|
||||
-- 说明:管理端删除文章记录(使用通用权限校验)
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_article_delete(
|
||||
@@ -16,17 +16,21 @@ LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok BOOLEAN;
|
||||
v_user_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
IF NOT public.check_admin_permission('cms:article:delete') THEN
|
||||
RAISE EXCEPTION 'Permission denied: cms:article:delete';
|
||||
END IF;
|
||||
|
||||
-- 2. 执行物理删除
|
||||
DELETE FROM public.ml_articles WHERE id = p_id;
|
||||
-- 2. 获取当前操作用户 ID
|
||||
SELECT id INTO v_user_id FROM public.ak_users WHERE auth_id = auth.uid();
|
||||
|
||||
-- 3. 执行软删除
|
||||
UPDATE public.ml_articles
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE id = p_id AND deleted_at IS NULL;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
-- RPC: rpc_admin_delete_diy_page
|
||||
-- 管理端删除 DIY 页面配置
|
||||
-- 管理端删除 DIY 页面配置(支持权限检查与首页保护)
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_delete_diy_page(
|
||||
p_id uuid
|
||||
@@ -11,24 +11,29 @@ SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok boolean;
|
||||
v_user_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查 (仅管理员)
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users u
|
||||
WHERE u.id = auth.uid() AND u.role = 'admin'
|
||||
) THEN
|
||||
RAISE EXCEPTION 'permission denied';
|
||||
-- 1. 权限检查 (使用通用权限校验函数)
|
||||
IF NOT public.check_admin_permission('decoration:page:delete') THEN
|
||||
RAISE EXCEPTION 'Permission denied: decoration:page:delete';
|
||||
END IF;
|
||||
|
||||
-- 2. 执行删除 (不允许删除当前生效的首页)
|
||||
-- 2. 获取当前操作用户 ID
|
||||
SELECT id INTO v_user_id FROM public.ak_users WHERE auth_id = auth.uid();
|
||||
|
||||
-- 3. 校验:不允许删除当前生效的首页
|
||||
IF EXISTS (
|
||||
SELECT 1 FROM public.ak_diy_pages
|
||||
WHERE id = p_id AND is_home = true
|
||||
WHERE id = p_id AND is_home = true AND deleted_at IS NULL
|
||||
) THEN
|
||||
RAISE EXCEPTION 'cannot delete the active home page';
|
||||
END IF;
|
||||
|
||||
DELETE FROM public.ak_diy_pages WHERE id = p_id;
|
||||
-- 4. 执行软删除:标记 deleted_at
|
||||
UPDATE public.ak_diy_pages
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE id = p_id AND deleted_at IS NULL;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
-- RPC: rpc_admin_delete_delivery_staff
|
||||
-- 管理端删除配送员
|
||||
-- 管理端删除配送员(支持权限检查)
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_delete_delivery_staff(
|
||||
p_id UUID
|
||||
@@ -11,17 +11,21 @@ SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok BOOLEAN;
|
||||
v_user_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查 (仅管理员)
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role = 'admin'
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
-- 1. 权限检查 (使用通用权限校验函数)
|
||||
IF NOT public.check_admin_permission('delivery:staff:delete') THEN
|
||||
RAISE EXCEPTION 'Permission denied: delivery:staff:delete';
|
||||
END IF;
|
||||
|
||||
-- 2. 执行删除
|
||||
DELETE FROM public.ml_delivery_staff WHERE id = p_id;
|
||||
-- 2. 获取当前操作用户 ID
|
||||
SELECT id INTO v_user_id FROM public.ak_users WHERE auth_id = auth.uid();
|
||||
|
||||
-- 3. 执行软删除:标记 deleted_at
|
||||
UPDATE public.ml_delivery_staff
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE id = p_id AND deleted_at IS NULL;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
-- RPC: rpc_admin_delete_delivery_station
|
||||
-- 管理端删除提货点/核销点
|
||||
-- 管理端删除提货点/核销点(支持级联软删除配送员关联)
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_delete_delivery_station(
|
||||
p_id UUID
|
||||
@@ -11,17 +11,27 @@ SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok BOOLEAN;
|
||||
v_user_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查 (仅管理员)
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role = 'admin'
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
-- 1. 权限检查
|
||||
IF NOT public.check_admin_permission('delivery:station:delete') THEN
|
||||
RAISE EXCEPTION 'Permission denied: delivery:station:delete';
|
||||
END IF;
|
||||
|
||||
-- 2. 执行删除
|
||||
DELETE FROM public.ml_delivery_stations WHERE id = p_id;
|
||||
-- 2. 获取当前操作用户 ID
|
||||
SELECT id INTO v_user_id FROM public.ak_users WHERE auth_id = auth.uid();
|
||||
|
||||
-- 3. 级联软删除:该站点下的所有配送员
|
||||
UPDATE public.ml_delivery_staff
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE station_id = p_id AND deleted_at IS NULL;
|
||||
|
||||
-- 4. 执行软删除站点本身
|
||||
UPDATE public.ml_delivery_stations
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE id = p_id AND deleted_at IS NULL;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
-- RPC: rpc_admin_delete_agent
|
||||
-- 管理端删除代理商
|
||||
-- 管理端删除代理商(支持级联软删除代理申请记录)
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_delete_agent(
|
||||
p_uid uuid
|
||||
@@ -11,16 +11,27 @@ SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok boolean;
|
||||
v_user_id UUID;
|
||||
BEGIN
|
||||
-- 仅管理员可操作
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users u
|
||||
WHERE u.id = auth.uid() AND u.role = 'admin'
|
||||
) THEN
|
||||
RAISE EXCEPTION 'permission denied';
|
||||
-- 1. 权限检查
|
||||
IF NOT public.check_admin_permission('distribution:agent:delete') THEN
|
||||
RAISE EXCEPTION 'Permission denied: distribution:agent:delete';
|
||||
END IF;
|
||||
|
||||
DELETE FROM public.ak_distribution_agents WHERE uid = p_uid;
|
||||
-- 2. 获取当前操作用户 ID
|
||||
SELECT id INTO v_user_id FROM public.ak_users WHERE auth_id = auth.uid();
|
||||
|
||||
-- 3. 级联软删除:该代理的所有申请记录
|
||||
UPDATE public.ak_distribution_agent_applications
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE user_id = p_uid AND deleted_at IS NULL;
|
||||
|
||||
-- 4. 软删除代理商记录
|
||||
UPDATE public.ak_distribution_agents
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE uid = p_uid AND deleted_at IS NULL;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
-- RPC: rpc_admin_delete_division
|
||||
-- 管理端删除事业部
|
||||
-- 管理端删除事业部(支持级联软删除关联代理)
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_delete_division(
|
||||
p_uid uuid
|
||||
@@ -11,23 +11,33 @@ SET search_path = public
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok boolean;
|
||||
v_user_id UUID;
|
||||
BEGIN
|
||||
-- 仅管理员可操作
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users u
|
||||
WHERE u.id = auth.uid() AND u.role = 'admin'
|
||||
) THEN
|
||||
RAISE EXCEPTION 'permission denied';
|
||||
-- 1. 权限检查
|
||||
IF NOT public.check_admin_permission('distribution:division:delete') THEN
|
||||
RAISE EXCEPTION 'Permission denied: distribution:division:delete';
|
||||
END IF;
|
||||
|
||||
-- 检查是否有关联代理商
|
||||
IF EXISTS (
|
||||
SELECT 1 FROM public.ak_distribution_agents WHERE division_uid = p_uid
|
||||
) THEN
|
||||
RAISE EXCEPTION 'cannot delete division with associated agents';
|
||||
END IF;
|
||||
-- 2. 获取当前操作用户 ID
|
||||
SELECT id INTO v_user_id FROM public.ak_users WHERE auth_id = auth.uid();
|
||||
|
||||
DELETE FROM public.ak_distribution_divisions WHERE uid = p_uid;
|
||||
-- 3. 级联软删除:该事业部下的所有代理商
|
||||
UPDATE public.ak_distribution_agents
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE division_uid = p_uid AND deleted_at IS NULL;
|
||||
|
||||
-- 4. 级联软删除:该事业部的所有申请记录
|
||||
UPDATE public.ak_distribution_division_applications
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE user_id = p_uid AND deleted_at IS NULL;
|
||||
|
||||
-- 5. 软删除事业部本身
|
||||
UPDATE public.ak_distribution_divisions
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE uid = p_uid AND deleted_at IS NULL;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
-- 位置:docs/sql/30_rpc/kefu/
|
||||
-- 对象类型:RPC 函数 (SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:管理端删除客服账号
|
||||
-- 说明:管理端删除客服账号(使用通用权限校验)
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_kefu_account_delete(
|
||||
@@ -16,17 +16,21 @@ LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok BOOLEAN;
|
||||
v_user_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
IF NOT public.check_admin_permission('kefu:account:delete') THEN
|
||||
RAISE EXCEPTION 'Permission denied: kefu:account:delete';
|
||||
END IF;
|
||||
|
||||
-- 2. 执行删除
|
||||
DELETE FROM public.ml_kefu_accounts WHERE id = p_id;
|
||||
-- 2. 获取当前操作用户 ID
|
||||
SELECT id INTO v_user_id FROM public.ak_users WHERE auth_id = auth.uid();
|
||||
|
||||
-- 3. 执行软删除:标记 deleted_at
|
||||
UPDATE public.ml_kefu_accounts
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE id = p_id AND deleted_at IS NULL;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
-- 位置:docs/sql/30_rpc/kefu/
|
||||
-- 对象类型:RPC 函数 (SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:管理端删除客服自动回复配置
|
||||
-- 说明:管理端删除客服自动回复配置(使用通用权限校验)
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_kefu_auto_reply_delete(
|
||||
@@ -16,17 +16,21 @@ LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok BOOLEAN;
|
||||
v_user_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
IF NOT public.check_admin_permission('kefu:auto_reply:delete') THEN
|
||||
RAISE EXCEPTION 'Permission denied: kefu:auto_reply:delete';
|
||||
END IF;
|
||||
|
||||
-- 2. 执行删除
|
||||
DELETE FROM public.ml_kefu_auto_replies WHERE id = p_id;
|
||||
-- 2. 获取当前操作用户 ID
|
||||
SELECT id INTO v_user_id FROM public.ak_users WHERE auth_id = auth.uid();
|
||||
|
||||
-- 3. 执行软删除:标记 deleted_at
|
||||
UPDATE public.ml_kefu_auto_replies
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE id = p_id AND deleted_at IS NULL;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
-- 位置:docs/sql/30_rpc/kefu/
|
||||
-- 对象类型:RPC 函数 (SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:管理端删除话术分类
|
||||
-- 说明:管理端删除话术分类(支持级联软删除话术)
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_kefu_word_category_delete(
|
||||
@@ -16,17 +16,27 @@ LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok BOOLEAN;
|
||||
v_user_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
IF NOT public.check_admin_permission('kefu:word:category:delete') THEN
|
||||
RAISE EXCEPTION 'Permission denied: kefu:word:category:delete';
|
||||
END IF;
|
||||
|
||||
-- 2. 执行删除 (ml_kefu_words 已设置 ON DELETE CASCADE)
|
||||
DELETE FROM public.ml_kefu_word_categories WHERE id = p_id;
|
||||
-- 2. 获取当前操作用户 ID
|
||||
SELECT id INTO v_user_id FROM public.ak_users WHERE auth_id = auth.uid();
|
||||
|
||||
-- 3. 级联软删除:先标记该分类下的话术为删除
|
||||
UPDATE public.ml_kefu_words
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE category_id = p_id AND deleted_at IS NULL;
|
||||
|
||||
-- 4. 执行软删除分类本身:标记 deleted_at
|
||||
UPDATE public.ml_kefu_word_categories
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE id = p_id AND deleted_at IS NULL;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
-- 位置:docs/sql/30_rpc/kefu/
|
||||
-- 对象类型:RPC 函数 (SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:管理端删除快捷话术
|
||||
-- 说明:管理端删除快捷话术(使用通用权限校验)
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_kefu_word_delete(
|
||||
@@ -16,17 +16,21 @@ LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok BOOLEAN;
|
||||
v_user_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
IF NOT public.check_admin_permission('kefu:word:delete') THEN
|
||||
RAISE EXCEPTION 'Permission denied: kefu:word:delete';
|
||||
END IF;
|
||||
|
||||
-- 2. 执行删除
|
||||
DELETE FROM public.ml_kefu_words WHERE id = p_id;
|
||||
-- 2. 获取当前操作用户 ID
|
||||
SELECT id INTO v_user_id FROM public.ak_users WHERE auth_id = auth.uid();
|
||||
|
||||
-- 3. 执行软删除:标记 deleted_at
|
||||
UPDATE public.ml_kefu_words
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE id = p_id AND deleted_at IS NULL;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
RETURN v_ok;
|
||||
|
||||
@@ -2,9 +2,8 @@
|
||||
-- Admin 商品模块 - 删除分类 RPC
|
||||
-- 位置:docs/sql/30_rpc/product/
|
||||
-- 对象类型:RPC 函数(SECURITY DEFINER)
|
||||
-- 方案:方案 1(有子项禁止删除)
|
||||
-- 版本:v1
|
||||
-- 依赖:ml_categories, ak_users 表已存在
|
||||
-- 版本:v1(支持级联软删除商品关联)
|
||||
-- 依赖:ml_categories, ml_products, ak_users 表已存在
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_category_delete(
|
||||
@@ -15,31 +14,36 @@ SECURITY DEFINER
|
||||
SET search_path = public
|
||||
LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_user_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
IF NOT public.check_admin_permission('product:category:delete') THEN
|
||||
RAISE EXCEPTION 'Permission denied: product:category:delete';
|
||||
END IF;
|
||||
|
||||
-- 2. 检查是否有子分类 (方案 1)
|
||||
-- 2. 获取当前操作用户 ID
|
||||
SELECT id INTO v_user_id FROM public.ak_users WHERE auth_id = auth.uid();
|
||||
|
||||
-- 3. 检查是否有子分类 (方案 1)
|
||||
IF EXISTS (
|
||||
SELECT 1 FROM public.ml_categories WHERE parent_id = p_id
|
||||
SELECT 1 FROM public.ml_categories
|
||||
WHERE parent_id = p_id AND deleted_at IS NULL
|
||||
) THEN
|
||||
RAISE EXCEPTION '请先删除该分类下的子分类';
|
||||
END IF;
|
||||
|
||||
-- 3. 检查是否有商品关联 (可选,通常作为安全保障)
|
||||
IF EXISTS (
|
||||
SELECT 1 FROM public.ml_products WHERE category_id = p_id AND status != 4
|
||||
) THEN
|
||||
RAISE EXCEPTION '该分类下仍有商品,无法删除';
|
||||
END IF;
|
||||
-- 4. 级联软删除:该分类下的所有商品
|
||||
UPDATE public.ml_products
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE category_id = p_id AND deleted_at IS NULL;
|
||||
|
||||
-- 4. 执行删除
|
||||
DELETE FROM public.ml_categories WHERE id = p_id;
|
||||
-- 5. 执行软删除分类本身
|
||||
UPDATE public.ml_categories
|
||||
SET deleted_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE id = p_id AND deleted_at IS NULL;
|
||||
|
||||
RETURN FOUND;
|
||||
END;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
-- 位置:docs/sql/30_rpc/user/
|
||||
-- 对象类型:RPC 函数 (SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:逻辑删除用户分组(设置 deleted_at)
|
||||
-- 说明:逻辑删除用户分组(使用通用权限校验)
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_user_group_delete(
|
||||
@@ -16,18 +16,21 @@ LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok BOOLEAN;
|
||||
v_user_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
IF NOT public.check_admin_permission('user:group:delete') THEN
|
||||
RAISE EXCEPTION 'Permission denied: user:group:delete';
|
||||
END IF;
|
||||
|
||||
-- 2. 逻辑删除
|
||||
-- 2. 获取当前操作用户 ID
|
||||
SELECT id INTO v_user_id FROM public.ak_users WHERE auth_id = auth.uid();
|
||||
|
||||
-- 3. 逻辑删除
|
||||
UPDATE public.ak_user_groups
|
||||
SET deleted_at = now(), updated_at = now()
|
||||
SET deleted_at = now(),
|
||||
updated_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE id = p_id AND deleted_at IS NULL;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
-- 位置:docs/sql/30_rpc/user/
|
||||
-- 对象类型:RPC 函数 (SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:逻辑删除用户标签(设置 deleted_at)
|
||||
-- 说明:逻辑删除用户标签(使用通用权限校验)
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_user_label_delete(
|
||||
@@ -16,18 +16,21 @@ LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok BOOLEAN;
|
||||
v_user_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
IF NOT public.check_admin_permission('user:label:delete') THEN
|
||||
RAISE EXCEPTION 'Permission denied: user:label:delete';
|
||||
END IF;
|
||||
|
||||
-- 2. 逻辑删除
|
||||
-- 2. 获取当前操作用户 ID
|
||||
SELECT id INTO v_user_id FROM public.ak_users WHERE auth_id = auth.uid();
|
||||
|
||||
-- 3. 逻辑删除
|
||||
UPDATE public.ak_user_labels
|
||||
SET deleted_at = now(), updated_at = now()
|
||||
SET deleted_at = now(),
|
||||
updated_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE id = p_id AND deleted_at IS NULL;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
-- 位置:docs/sql/30_rpc/user/
|
||||
-- 对象类型:RPC 函数 (SECURITY DEFINER)
|
||||
-- 版本:v1
|
||||
-- 说明:逻辑删除用户等级(设置 deleted_at)
|
||||
-- 说明:逻辑删除用户等级(使用通用权限校验)
|
||||
-- =====================================================================================
|
||||
|
||||
CREATE OR REPLACE FUNCTION public.rpc_admin_user_level_delete(
|
||||
@@ -16,18 +16,21 @@ LANGUAGE plpgsql
|
||||
AS $$
|
||||
DECLARE
|
||||
v_ok BOOLEAN;
|
||||
v_user_id UUID;
|
||||
BEGIN
|
||||
-- 1. 权限检查
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM public.ak_users
|
||||
WHERE auth_id = auth.uid() AND role IN ('admin', 'analytics')
|
||||
) THEN
|
||||
RAISE EXCEPTION 'Permission denied';
|
||||
IF NOT public.check_admin_permission('user:level:delete') THEN
|
||||
RAISE EXCEPTION 'Permission denied: user:level:delete';
|
||||
END IF;
|
||||
|
||||
-- 2. 逻辑删除
|
||||
-- 2. 获取当前操作用户 ID
|
||||
SELECT id INTO v_user_id FROM public.ak_users WHERE auth_id = auth.uid();
|
||||
|
||||
-- 3. 逻辑删除
|
||||
UPDATE public.ak_user_levels
|
||||
SET deleted_at = now(), updated_at = now()
|
||||
SET deleted_at = now(),
|
||||
updated_at = now(),
|
||||
deleted_by = v_user_id
|
||||
WHERE id = p_id AND deleted_at IS NULL;
|
||||
|
||||
GET DIAGNOSTICS v_ok = ROW_COUNT;
|
||||
|
||||
Reference in New Issue
Block a user