SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;

USE hyapp_user;

-- 管理员封禁与经理中心封禁保持独立事实，解封时在 user-service 内同时检查两种来源。
CREATE TABLE IF NOT EXISTS admin_user_bans (
  app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码，用于多租户隔离',
  ban_id VARCHAR(96) NOT NULL COMMENT '管理员封禁事实 ID',
  command_id VARCHAR(128) NOT NULL COMMENT '后台请求幂等命令 ID',
  target_user_id BIGINT NOT NULL COMMENT '被封禁用户 ID',
  target_old_status VARCHAR(32) NOT NULL COMMENT '创建事实前的用户状态，仅供审计',
  expires_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '到期时间，UTC epoch ms；0 表示永久',
  status VARCHAR(32) NOT NULL COMMENT 'active/released/expired',
  reason VARCHAR(255) NOT NULL DEFAULT '' COMMENT '封禁原因',
  operator_admin_id BIGINT NOT NULL COMMENT '创建封禁的后台管理员 ID',
  released_by_admin_id BIGINT NOT NULL DEFAULT 0 COMMENT '手动解封管理员 ID；系统到期为 0',
  released_reason VARCHAR(255) NOT NULL DEFAULT '' COMMENT '释放原因',
  released_at_ms BIGINT NOT NULL DEFAULT 0 COMMENT '释放时间，UTC epoch ms',
  created_at_ms BIGINT NOT NULL COMMENT '创建时间，UTC epoch ms',
  updated_at_ms BIGINT NOT NULL COMMENT '更新时间，UTC epoch ms',
  PRIMARY KEY (app_code, ban_id),
  UNIQUE KEY uk_admin_user_bans_command (app_code, command_id),
  KEY idx_admin_user_bans_target (app_code, target_user_id, status, created_at_ms),
  KEY idx_admin_user_bans_expire (app_code, status, expires_at_ms)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='后台管理员用户封禁事实表';

-- 解封命令必须独立保存幂等事实：后台在合并摘要只看到经理封禁时会按用户释放最新管理员封禁，
-- 若 HTTP/gRPC 超时后重试，不能继续释放下一条重叠的管理员封禁。
CREATE TABLE IF NOT EXISTS admin_user_ban_release_commands (
  app_code VARCHAR(32) NOT NULL DEFAULT 'lalu' COMMENT '应用编码，用于多租户隔离',
  command_id VARCHAR(128) NOT NULL COMMENT '稳定解封命令 ID，通常取 request_id',
  target_user_id BIGINT NOT NULL COMMENT '目标用户 ID',
  requested_ban_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '调用方指定 ban_id；空表示选择最新 active 管理员封禁',
  resolved_ban_id VARCHAR(96) NOT NULL DEFAULT '' COMMENT '本命令实际释放的 ban_id',
  release_status VARCHAR(32) NOT NULL COMMENT 'released/expired',
  operator_admin_id BIGINT NOT NULL DEFAULT 0 COMMENT '手动操作管理员 ID；系统到期为 0',
  reason VARCHAR(255) NOT NULL DEFAULT '' COMMENT '释放原因快照，用于校验幂等载荷',
  created_at_ms BIGINT NOT NULL COMMENT '创建时间，UTC epoch ms',
  updated_at_ms BIGINT NOT NULL COMMENT '更新时间，UTC epoch ms',
  PRIMARY KEY (app_code, command_id),
  KEY idx_admin_ban_release_resolved (app_code, resolved_ban_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='后台管理员解封命令幂等事实表';
