68 lines
2.4 KiB
TypeScript
68 lines
2.4 KiB
TypeScript
import { canUserAccessPrivateTaskDetail } from '@/lib/user-permission-inherit'
|
|
import { isOperationsGMaterial, isRestrictedMaterial } from '@/lib/material-access-scope'
|
|
import { canAccessOperationsGMaterials } from '@/lib/material-organization-access'
|
|
import { isSuperAdmin } from '@/lib/department-permission'
|
|
|
|
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 async function canViewMaterialPrivacy(
|
|
material: TaskDetailPrivacyMaterial,
|
|
userId?: string | null,
|
|
): Promise<boolean> {
|
|
if (isRestrictedMaterial(material) && await isSuperAdmin(userId)) return true
|
|
return canAccessMaterialPrivacy(material, 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' }] : []),
|
|
] }
|
|
}
|
|
|
|
export async function buildMaterialViewWhere(userId: string) {
|
|
return await isSuperAdmin(userId) ? {} : buildMaterialPrivacyWhere(userId)
|
|
}
|