Files
ln-bi/src/server/auth/permissions.ts
T

61 lines
2.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { AuthUser } from './types.js';
import type { Vehicle } from '../types.js';
import { isInventoryVehicle } from '../routes/vehicles/model.js';
/** 当前库存为公共资产;非库存车辆继续遵守本人/部门权限。历史业务使用原权限过滤。 */
export function filterAssetVehiclesByPermission<T extends Vehicle>(items: T[], user: AuthUser): T[] {
if (user.permissionLevel === 'full') return items;
const authorized = new Set(filterByPermission(items, user));
return items.filter(vehicle => isInventoryVehicle(vehicle) || authorized.has(vehicle));
}
/** 客户名称脱敏 */
export function maskCustomerName(name: string | null): string | null {
if (!name) return name;
const len = name.length;
if (len <= 1) return '*';
if (len <= 3) return name[0] + '*';
if (len <= 6) return name.slice(0, 2) + '***' + name.slice(-1);
return name.slice(0, 4) + '***' + name.slice(-2);
}
/** 对数据列表中的客户名称进行脱敏 */
export function maskCustomerNames<T>(items: T[]): T[] {
return items.map(v => {
const obj = v as any;
const copy = { ...obj };
if ('customer' in copy && copy.customer) copy.customer = maskCustomerName(copy.customer);
if ('customerName' in copy && copy.customerName) copy.customerName = maskCustomerName(copy.customerName);
if (copy.pendingDelivery) copy.pendingDelivery = {
...copy.pendingDelivery,
customerName: maskCustomerName(copy.pendingDelivery.customerName),
};
return copy as T;
});
}
/**
* 通用权限过滤函数
* 适配 CachedVehicle(department, manager, managerId)和 Vehicle(departmentName, customerManager, managerId)
*/
export function filterByPermission<T>(
items: T[],
user: AuthUser,
): T[] {
if (user.permissionLevel === 'full') return items;
if (user.permissionLevel === 'department') {
return items.filter(v => {
const obj = v as any;
const dept = obj.departmentName || obj.department || null;
return dept === user.depName;
});
}
// personal: 仅看自己负责的车辆 (bd = userId)
return items.filter(v => {
const obj = v as any;
return (user.managerIds ?? [user.userId]).includes(obj.managerId);
});
}