import { SetMetadata } from '@nestjs/common';

export const SKIP_ASSERT_ACCESS_KEY = 'skip_assert_access';

/**
 * 跳过静态契约检查中"update/delete 必须配 assertAccess"的强制要求。
 *
 * 规则对齐（09-iam-security.md §7.1）：理由必填；PR review 会质疑；
 * 仅限"天然无 IDOR 风险"（如只写当前用户自己的记录）或"业务上批量操作已内建过滤"。
 *
 * @param reason 为什么这个写操作不需要 assertAccess（例：'只更新当前用户自己的偏好'）
 * @example @SkipAssertAccess('更新当前用户自己的偏好，天然隔离')
 */
export const SkipAssertAccess = (reason: string) => {
  if (!reason || !reason.trim()) {
    throw new Error('@SkipAssertAccess 必须提供理由');
  }
  return SetMetadata(SKIP_ASSERT_ACCESS_KEY, reason);
};
