mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-07 04:20:12 +02:00
110 lines
2.3 KiB
TypeScript
110 lines
2.3 KiB
TypeScript
import { AuthUser } from '@/middleware';
|
|
import { ApiError } from '@/utils';
|
|
import { prisma } from '@lib/prisma';
|
|
|
|
const checkServerPermissions = (
|
|
user: AuthUser,
|
|
options: { serverId?: string }
|
|
) => {
|
|
const { serverId } = options;
|
|
|
|
if (user.isAdmin || !serverId) {
|
|
return;
|
|
}
|
|
|
|
if (serverId && !user.flatServerPermissions.includes(serverId)) {
|
|
throw ApiError.forbidden();
|
|
}
|
|
};
|
|
|
|
const checkServerFolderPermissions = (
|
|
user: AuthUser,
|
|
options: { serverFolderId?: string[] | string }
|
|
) => {
|
|
const { serverFolderId } = options;
|
|
|
|
if (user.isAdmin || !serverFolderId) {
|
|
return;
|
|
}
|
|
|
|
let ids: string[] = [];
|
|
if (typeof serverFolderId === 'string') {
|
|
ids = [serverFolderId];
|
|
} else if (typeof serverFolderId === 'object') {
|
|
ids = serverFolderId;
|
|
}
|
|
|
|
for (const id of ids) {
|
|
if (!user.flatServerFolderPermissions.includes(id)) {
|
|
throw ApiError.forbidden('');
|
|
}
|
|
}
|
|
};
|
|
|
|
const getAvailableServerFolderIds = async (
|
|
user: AuthUser,
|
|
options: { serverId: string }
|
|
) => {
|
|
const { serverId } = options;
|
|
|
|
if (user.isAdmin) {
|
|
const serverFoldersWithAccess = await prisma.serverFolder.findMany({
|
|
where: { enabled: true, serverId },
|
|
});
|
|
|
|
const serverFoldersWithAccessIds = serverFoldersWithAccess.map(
|
|
(serverFolder) => serverFolder.id
|
|
);
|
|
|
|
return serverFoldersWithAccessIds;
|
|
}
|
|
|
|
const serverFoldersWithAccess = await prisma.serverFolder.findMany({
|
|
where: {
|
|
OR: [
|
|
{
|
|
AND: [
|
|
{
|
|
enabled: true,
|
|
serverFolderPermissions: {
|
|
some: { userId: { equals: user.id } },
|
|
},
|
|
},
|
|
],
|
|
},
|
|
],
|
|
},
|
|
});
|
|
|
|
const serverFoldersWithAccessIds = serverFoldersWithAccess.map(
|
|
(serverFolder) => serverFolder.id
|
|
);
|
|
|
|
return serverFoldersWithAccessIds;
|
|
};
|
|
|
|
const serverFolderFilter = (serverFolderIds: string[]) => {
|
|
return {
|
|
serverFolders: { every: { id: { in: serverFolderIds } } },
|
|
};
|
|
};
|
|
|
|
const paginationParams = (options: { skip: any; take: any }) => {
|
|
const { skip, take } = options;
|
|
|
|
return {
|
|
skip: Number(skip),
|
|
take: Number(take),
|
|
};
|
|
};
|
|
|
|
export const sharedHelpers = {
|
|
checkServerFolderPermissions,
|
|
checkServerPermissions,
|
|
getAvailableServerFolderIds,
|
|
params: {
|
|
pagination: paginationParams,
|
|
},
|
|
serverFolderFilter,
|
|
};
|