From 164dcd4c84c49c15aca4f80f9b64bcb734ed7001 Mon Sep 17 00:00:00 2001 From: SpecialX <47072643+wangxiner55@users.noreply.github.com> Date: Tue, 7 Jul 2026 19:24:26 +0800 Subject: [PATCH] feat(arch-scan): mark 12 exempt Server Actions with @public JSDoc tag --- scripts/arch-scan/arch.db | Bin 3465216 -> 3465216 bytes src/modules/auth/actions.ts | 6 ++++++ src/modules/invitation-codes/actions.ts | 2 ++ src/modules/onboarding/actions.ts | 4 ++++ src/modules/rbac/actions.ts | 2 ++ src/modules/settings/actions-security.ts | 4 ++++ src/shared/lib/audit-logger.ts | 2 ++ src/shared/lib/change-logger.ts | 2 ++ src/shared/lib/login-logger.ts | 2 ++ 9 files changed, 24 insertions(+) diff --git a/scripts/arch-scan/arch.db b/scripts/arch-scan/arch.db index 05cebea65c94628d0f5b824b556c53f132814c5a..a9f400ba9e0aded18ea004289091ea353616a102 100644 GIT binary patch delta 18956 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 AY5)KL delta 15895 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 diff --git a/src/modules/auth/actions.ts b/src/modules/auth/actions.ts index a074143..3d0e6c5 100644 --- a/src/modules/auth/actions.ts +++ b/src/modules/auth/actions.ts @@ -85,6 +85,8 @@ async function messageForError( * 返回值: * - 成功:`{ success: true, data: { userId } }`(userId 仅用于内部跟踪,前端可忽略) * - 失败:`{ success: false, errorCode, message }` + * + * @public 登录前公开 Action(注册流程),豁免 requirePermission 校验。 */ export async function registerAction( formData: FormData @@ -321,6 +323,8 @@ export async function registerAction( * * 用于注册表单实时检查邮箱是否已被占用。限流复用 REGISTER 规则, * 避免被用于邮箱枚举攻击。 + * + * @public 登录前公开 Action(注册流程),豁免 requirePermission 校验。 */ export async function checkEmailAvailabilityAction( email: string @@ -369,6 +373,8 @@ export async function checkEmailAvailabilityAction( * 返回值: * - `{ required: true }` — 用户启用了 2FA,登录表单应展示 2FA 输入框 * - `{ required: false }` — 用户未启用 2FA 或不存在(防邮箱枚举) + * + * @public 登录前公开 Action(2FA 预检),豁免 requirePermission 校验。 */ export async function preflightTwoFactorAction( email: string diff --git a/src/modules/invitation-codes/actions.ts b/src/modules/invitation-codes/actions.ts index 194ff2c..bdac293 100644 --- a/src/modules/invitation-codes/actions.ts +++ b/src/modules/invitation-codes/actions.ts @@ -134,6 +134,8 @@ export async function deleteInvitationCodeAction( * * 不需要权限校验:注册流程需要预检邀请码可用性。 * 不返回邀请码明文(脱敏)。 + * + * @public 登录前公开 Action(注册流程),豁免 requirePermission 校验。 */ export async function validateInvitationCodeAction( code: string, diff --git a/src/modules/onboarding/actions.ts b/src/modules/onboarding/actions.ts index 7e6d661..b2ab4de 100644 --- a/src/modules/onboarding/actions.ts +++ b/src/modules/onboarding/actions.ts @@ -33,6 +33,8 @@ const CLASS_SUBJECTS_READONLY: readonly string[] = DEFAULT_CLASS_SUBJECTS /** * 查询当前用户 onboarding 状态。 * 供服务端组件 / 客户端组件读取,决定是否渲染引导流程。 + * + * @public 登录后必经流程 Action,使用 requireAuth 校验登录态,豁免 requirePermission 校验。 */ export async function getOnboardingStatusAction(): Promise< ActionState>> @@ -62,6 +64,8 @@ export async function getOnboardingStatusAction(): Promise< * - P0-4 审计日志:onboarding 完成后写 audit_logs(对标 PowerSchool/Veracross/Auth0 Logs)。 * - P0-5 服务端幂等:开始时检查 users.onboardedAt,若已完成直接返回成功(防止双击重复事务)。 * - P1-2 局部错误收集:班级码/子女绑定失败时不回滚整个事务,收集失败列表返回前端,成功项保留。 + * + * @public 登录后必经流程 Action,使用 requireAuth 校验登录态,豁免 requirePermission 校验。 */ export async function completeOnboardingAction( prevState: ActionState | null, diff --git a/src/modules/rbac/actions.ts b/src/modules/rbac/actions.ts index 2f21e1f..86417bd 100644 --- a/src/modules/rbac/actions.ts +++ b/src/modules/rbac/actions.ts @@ -389,6 +389,8 @@ export async function getRoleDetailAction( * Check whether a role is the locked admin role. * Exported as a server action so client components can call it without * importing the data-access layer directly. + * + * @public 内部角色判断工具,纯函数无副作用,豁免 requirePermission 校验。 */ export async function isAdminRole(roleName: string): Promise { return roleName === ADMIN_ROLE_NAME diff --git a/src/modules/settings/actions-security.ts b/src/modules/settings/actions-security.ts index 7574b78..1e42509 100644 --- a/src/modules/settings/actions-security.ts +++ b/src/modules/settings/actions-security.ts @@ -416,6 +416,8 @@ export async function revokeAllOtherSessionsAction(): Promise< * 若返回 required=true 则先展示 2FA 验证码输入框。 * * 为防止邮箱枚举攻击,无论用户是否存在都返回 required=false(不存在则视为未启用)。 + * + * @public 登录前公开 Action(2FA 预检),豁免 requirePermission 校验。 */ export async function preflightTwoFactorAction( email: string, @@ -453,6 +455,8 @@ export async function preflightTwoFactorAction( * * 此函数不使用 requirePermission(登录时还未建立会话), * 由 auth.ts 的 authorize 回调直接调用。 + * + * @public 登录前公开 Action(2FA 登录校验),豁免 requirePermission 校验。 */ export async function verifyTwoFactorForLogin(params: { userId: string diff --git a/src/shared/lib/audit-logger.ts b/src/shared/lib/audit-logger.ts index 7cfc948..8e7fbdb 100644 --- a/src/shared/lib/audit-logger.ts +++ b/src/shared/lib/audit-logger.ts @@ -24,6 +24,8 @@ export interface LogAuditParams { * Record an audit log entry for the current authenticated user. * * Note: 失败时记录到 logger.warn 而非静默吞没,确保运维可感知审计写入失败。 + * + * @public 内部审计日志工具,由其他 Server Action 内部调用,豁免 requirePermission 校验。 */ export async function logAudit(params: LogAuditParams): Promise { try { diff --git a/src/shared/lib/change-logger.ts b/src/shared/lib/change-logger.ts index 7c4325f..e81e6c4 100644 --- a/src/shared/lib/change-logger.ts +++ b/src/shared/lib/change-logger.ts @@ -24,6 +24,8 @@ export interface LogDataChangeParams { * Record a data change log entry for the current authenticated user. * * Note: 失败时记录到 logger.warn 而非静默吞没,确保运维可感知变更日志写入失败。 + * + * @public 内部数据变更日志工具,由其他 Server Action 内部调用,豁免 requirePermission 校验。 */ export async function logDataChange(params: LogDataChangeParams): Promise { try { diff --git a/src/shared/lib/login-logger.ts b/src/shared/lib/login-logger.ts index f4583ec..e9453af 100644 --- a/src/shared/lib/login-logger.ts +++ b/src/shared/lib/login-logger.ts @@ -24,6 +24,8 @@ export interface LogLoginEventParams { * Does NOT depend on auth context since it runs during auth events. * * Note: 失败时记录到 logger.warn 而非静默吞没,确保运维可感知登录日志写入失败。 + * + * @public 内部登录日志工具,由 auth.ts 登录流程调用,豁免 requirePermission 校验。 */ export async function logLoginEvent(params: LogLoginEventParams): Promise { try {