gongxiangp2/lib/task-detail-privacy.ts

55 lines
1.9 KiB
TypeScript

import { canUserAccessPrivateTaskDetail } from '@/lib/user-permission-inherit'
import { isOperationsGMaterial } from '@/lib/material-access-scope'
import { canAccessOperationsGMaterials } from '@/lib/material-organization-access'
export const TASK_DETAIL_PRIVACY_SELECT = {
taskDetailPrivate: true,
taskDetailDemandType: true,
taskDetailRequesterUserId: true,
accessScope: true,
} as const
export interface TaskDetailPrivacyMaterial {
materialType?: string | null
taskDetailPrivate?: boolean | null
taskDetailRequesterUserId?: string | null
accessScope?: string | null
}
export function isPrivateTaskDetail(material: TaskDetailPrivacyMaterial): boolean {
return material.taskDetailPrivate === true
}
/** 素材级准入先于上传者/管理员/分享/类型权限,不能被这些旧放行路径绕过。 */
export async function canAccessMaterialPrivacy(
material: TaskDetailPrivacyMaterial,
userId?: string | null,
): Promise<boolean> {
if (isOperationsGMaterial(material)) return canAccessOperationsGMaterials(userId)
if (!isPrivateTaskDetail(material)) return true
if (!userId) return false
if (material.taskDetailRequesterUserId === userId) return true
return canUserAccessPrivateTaskDetail(userId)
}
export function privateTaskDetailAccessWhere(userId: string, canAccessAll: boolean) {
return {
materialType: '任务-详情',
taskDetailPrivate: true,
accessScope: 'general',
...(canAccessAll ? {} : { taskDetailRequesterUserId: userId }),
}
}
export async function buildMaterialPrivacyWhere(userId: string) {
const [canAccessPrivate, canAccessOperationsG] = await Promise.all([
canUserAccessPrivateTaskDetail(userId),
canAccessOperationsGMaterials(userId),
])
return { OR: [
{ taskDetailPrivate: false, accessScope: 'general' },
privateTaskDetailAccessWhere(userId, canAccessPrivate),
...(canAccessOperationsG ? [{ accessScope: 'operations_g' }] : []),
] }
}