mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-16 13:40:24 +02:00
Update serverfolder enable/disable
This commit is contained in:
@@ -162,12 +162,51 @@ const disableServerUrl = async (
|
|||||||
return res.status(success.statusCode).json(getSuccessResponse(success));
|
return res.status(success.statusCode).json(getSuccessResponse(success));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const deleteServerFolder = async (
|
||||||
|
req: TypedRequest<typeof validation.servers.deleteFolder>,
|
||||||
|
res: Response
|
||||||
|
) => {
|
||||||
|
const { folderId } = req.params;
|
||||||
|
|
||||||
|
await service.servers.deleteFolderById({ id: folderId });
|
||||||
|
|
||||||
|
const success = ApiSuccess.noContent({ data: null });
|
||||||
|
return res.status(success.statusCode).json(getSuccessResponse(success));
|
||||||
|
};
|
||||||
|
|
||||||
|
const enableServerFolder = async (
|
||||||
|
req: TypedRequest<typeof validation.servers.enableFolder>,
|
||||||
|
res: Response
|
||||||
|
) => {
|
||||||
|
const { folderId } = req.params;
|
||||||
|
|
||||||
|
await service.servers.enableFolderById({ id: folderId });
|
||||||
|
|
||||||
|
const success = ApiSuccess.noContent({ data: null });
|
||||||
|
return res.status(success.statusCode).json(getSuccessResponse(success));
|
||||||
|
};
|
||||||
|
|
||||||
|
const disableServerFolder = async (
|
||||||
|
req: TypedRequest<typeof validation.servers.disableFolder>,
|
||||||
|
res: Response
|
||||||
|
) => {
|
||||||
|
const { folderId } = req.params;
|
||||||
|
|
||||||
|
await service.servers.disableFolderById({ id: folderId });
|
||||||
|
|
||||||
|
const success = ApiSuccess.noContent({ data: null });
|
||||||
|
return res.status(success.statusCode).json(getSuccessResponse(success));
|
||||||
|
};
|
||||||
|
|
||||||
export const serversController = {
|
export const serversController = {
|
||||||
createServer,
|
createServer,
|
||||||
createServerUrl,
|
createServerUrl,
|
||||||
deleteServer,
|
deleteServer,
|
||||||
|
deleteServerFolder,
|
||||||
deleteServerUrl,
|
deleteServerUrl,
|
||||||
|
disableServerFolder,
|
||||||
disableServerUrl,
|
disableServerUrl,
|
||||||
|
enableServerFolder,
|
||||||
enableServerUrl,
|
enableServerUrl,
|
||||||
getServerDetail,
|
getServerDetail,
|
||||||
getServerList,
|
getServerList,
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ export enum AlbumSort {
|
|||||||
RATING = 'rating',
|
RATING = 'rating',
|
||||||
}
|
}
|
||||||
|
|
||||||
const include = (options: { songs?: boolean; user?: AuthUser }) => {
|
const include = (user: AuthUser, options: { songs?: boolean }) => {
|
||||||
// Prisma.AlbumInclude
|
// Prisma.AlbumInclude
|
||||||
const props = {
|
const props = {
|
||||||
_count: {
|
_count: {
|
||||||
@@ -24,17 +24,17 @@ const include = (options: { songs?: boolean; user?: AuthUser }) => {
|
|||||||
},
|
},
|
||||||
albumArtists: true,
|
albumArtists: true,
|
||||||
artists: true,
|
artists: true,
|
||||||
favorites: { where: { userId: options.user?.id } },
|
favorites: { where: { userId: user?.id } },
|
||||||
genres: true,
|
genres: true,
|
||||||
images: true,
|
images: true,
|
||||||
ratings: {
|
ratings: {
|
||||||
where: {
|
where: {
|
||||||
userId: options.user?.id,
|
userId: user?.id,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
server: true,
|
server: true,
|
||||||
serverFolders: true,
|
serverFolders: true,
|
||||||
songs: options?.songs && songHelpers.findMany(),
|
songs: options?.songs && songHelpers.findMany(user),
|
||||||
};
|
};
|
||||||
|
|
||||||
return props;
|
return props;
|
||||||
|
|||||||
@@ -176,6 +176,7 @@ const relatedServerFolders = (items: ServerFolder[]) => {
|
|||||||
/* eslint-disable sort-keys-fix/sort-keys-fix */
|
/* eslint-disable sort-keys-fix/sort-keys-fix */
|
||||||
id: item.id,
|
id: item.id,
|
||||||
name: item.name,
|
name: item.name,
|
||||||
|
enabled: item.enabled,
|
||||||
remoteId: item.remoteId,
|
remoteId: item.remoteId,
|
||||||
lastScannedAt: item.lastScannedAt,
|
lastScannedAt: item.lastScannedAt,
|
||||||
/* eslint-enable sort-keys-fix/sort-keys-fix */
|
/* eslint-enable sort-keys-fix/sort-keys-fix */
|
||||||
@@ -266,13 +267,14 @@ const songs = (
|
|||||||
) => {
|
) => {
|
||||||
return (
|
return (
|
||||||
items?.map((item) => {
|
items?.map((item) => {
|
||||||
const url = options.url ? options.url : item.server.serverUrls[0].url;
|
const customUrl = item.server.serverUrls[0].url;
|
||||||
|
const baseUrl = customUrl ? customUrl : options.url;
|
||||||
|
|
||||||
const stream = streamUrl(options.type, {
|
const stream = streamUrl(options.type, {
|
||||||
deviceId: options.deviceId,
|
deviceId: options.deviceId,
|
||||||
remoteId: item.remoteId,
|
remoteId: item.remoteId,
|
||||||
token: options.token,
|
token: options.token,
|
||||||
url: options.url,
|
url: baseUrl,
|
||||||
userId: options.userId,
|
userId: options.userId,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -294,7 +296,7 @@ const songs = (
|
|||||||
item.images,
|
item.images,
|
||||||
options.type,
|
options.type,
|
||||||
ImageType.PRIMARY,
|
ImageType.PRIMARY,
|
||||||
url,
|
baseUrl,
|
||||||
item.remoteId
|
item.remoteId
|
||||||
),
|
),
|
||||||
releaseDate: item.releaseDate,
|
releaseDate: item.releaseDate,
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { Prisma } from '@prisma/client';
|
import { Prisma } from '@prisma/client';
|
||||||
|
import { AuthUser } from '@middleware/authenticate';
|
||||||
|
|
||||||
const include = () => {
|
const include = () => {
|
||||||
const props: Prisma.SongInclude = {
|
const props: Prisma.SongInclude = {
|
||||||
@@ -16,7 +17,7 @@ const include = () => {
|
|||||||
return props;
|
return props;
|
||||||
};
|
};
|
||||||
|
|
||||||
const findMany = () => {
|
const findMany = (user: AuthUser) => {
|
||||||
const props: Prisma.SongFindManyArgs = {
|
const props: Prisma.SongFindManyArgs = {
|
||||||
include: {
|
include: {
|
||||||
album: true,
|
album: true,
|
||||||
@@ -26,7 +27,11 @@ const findMany = () => {
|
|||||||
images: true,
|
images: true,
|
||||||
ratings: true,
|
ratings: true,
|
||||||
server: {
|
server: {
|
||||||
include: { serverUrls: true },
|
include: {
|
||||||
|
serverUrls: {
|
||||||
|
where: { userServerUrls: { some: { userId: user.id } } },
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
orderBy: [
|
orderBy: [
|
||||||
|
|||||||
@@ -85,3 +85,30 @@ router
|
|||||||
validateRequest(validation.servers.disableUrl),
|
validateRequest(validation.servers.disableUrl),
|
||||||
controller.servers.disableServerUrl
|
controller.servers.disableServerUrl
|
||||||
);
|
);
|
||||||
|
|
||||||
|
router.param('folderId', async (_req, _res, next, folderId) => {
|
||||||
|
await service.servers.findFolderById({ id: folderId });
|
||||||
|
next();
|
||||||
|
});
|
||||||
|
|
||||||
|
router
|
||||||
|
.route('/:serverId/folder/:folderId')
|
||||||
|
.delete(
|
||||||
|
authenticateAdmin,
|
||||||
|
validateRequest(validation.servers.deleteFolder),
|
||||||
|
controller.servers.deleteServerFolder
|
||||||
|
);
|
||||||
|
|
||||||
|
router
|
||||||
|
.route('/:serverId/folder/:folderId/enable')
|
||||||
|
.post(
|
||||||
|
validateRequest(validation.servers.enableFolder),
|
||||||
|
controller.servers.enableServerFolder
|
||||||
|
);
|
||||||
|
|
||||||
|
router
|
||||||
|
.route('/:serverId/folder/:folderId/disable')
|
||||||
|
.post(
|
||||||
|
validateRequest(validation.servers.disableFolder),
|
||||||
|
controller.servers.disableServerFolder
|
||||||
|
);
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ const findById = async (user: AuthUser, options: { id: string }) => {
|
|||||||
const { id } = options;
|
const { id } = options;
|
||||||
|
|
||||||
const album = await prisma.album.findUnique({
|
const album = await prisma.album.findUnique({
|
||||||
include: helpers.albums.include({ songs: true }),
|
include: helpers.albums.include(user, { songs: true }),
|
||||||
where: { id },
|
where: { id },
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ const findMany = async (options: AlbumFindManyOptions) => {
|
|||||||
prisma.albumRating.findMany({
|
prisma.albumRating.findMany({
|
||||||
include: {
|
include: {
|
||||||
album: {
|
album: {
|
||||||
include: helpers.albums.include({ songs: false, user }),
|
include: helpers.albums.include(user, { songs: false }),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
orderBy: { value: orderBy },
|
orderBy: { value: orderBy },
|
||||||
@@ -78,7 +78,7 @@ const findMany = async (options: AlbumFindManyOptions) => {
|
|||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
prisma.album.findMany({
|
prisma.album.findMany({
|
||||||
include: helpers.albums.include({ songs: false, user }),
|
include: helpers.albums.include(user, { songs: false }),
|
||||||
skip,
|
skip,
|
||||||
take,
|
take,
|
||||||
where: {
|
where: {
|
||||||
@@ -95,7 +95,7 @@ const findMany = async (options: AlbumFindManyOptions) => {
|
|||||||
where: { OR: helpers.shared.serverFolderFilter(serverFolderIds) },
|
where: { OR: helpers.shared.serverFolderFilter(serverFolderIds) },
|
||||||
}),
|
}),
|
||||||
prisma.album.findMany({
|
prisma.album.findMany({
|
||||||
include: helpers.albums.include({ songs: false, user }),
|
include: helpers.albums.include(user, { songs: false }),
|
||||||
orderBy: [helpers.albums.sort(sortBy, orderBy)],
|
orderBy: [helpers.albums.sort(sortBy, orderBy)],
|
||||||
skip,
|
skip,
|
||||||
take,
|
take,
|
||||||
|
|||||||
@@ -370,8 +370,10 @@ const refresh = async (options: { id: string }) => {
|
|||||||
|
|
||||||
const fullScan = async (options: { id: string; serverFolderId?: string[] }) => {
|
const fullScan = async (options: { id: string; serverFolderId?: string[] }) => {
|
||||||
const { id, serverFolderId } = options;
|
const { id, serverFolderId } = options;
|
||||||
|
|
||||||
|
// Only allow scan of enabled folders
|
||||||
const server = await prisma.server.findUnique({
|
const server = await prisma.server.findUnique({
|
||||||
include: { serverFolders: true },
|
include: { serverFolders: { where: { enabled: true } } },
|
||||||
where: { id },
|
where: { id },
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -544,14 +546,52 @@ const disableUrlById = async (user: AuthUser) => {
|
|||||||
return null;
|
return null;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const findFolderById = async (options: { id: string }) => {
|
||||||
|
const url = await prisma.serverFolder.findUnique({
|
||||||
|
where: { id: options.id },
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!url) {
|
||||||
|
throw ApiError.notFound('Folder not found.');
|
||||||
|
}
|
||||||
|
|
||||||
|
return url;
|
||||||
|
};
|
||||||
|
|
||||||
|
const deleteFolderById = async (options: { id: string }) => {
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
const enableFolderById = async (options: { id: string }) => {
|
||||||
|
await prisma.serverFolder.update({
|
||||||
|
data: { enabled: true },
|
||||||
|
where: { id: options.id },
|
||||||
|
});
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
|
const disableFolderById = async (options: { id: string }) => {
|
||||||
|
await prisma.serverFolder.update({
|
||||||
|
data: { enabled: false },
|
||||||
|
where: { id: options.id },
|
||||||
|
});
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
|
||||||
export const serversService = {
|
export const serversService = {
|
||||||
create,
|
create,
|
||||||
createUrl,
|
createUrl,
|
||||||
deleteById,
|
deleteById,
|
||||||
|
deleteFolderById,
|
||||||
deleteUrlById,
|
deleteUrlById,
|
||||||
|
disableFolderById,
|
||||||
disableUrlById,
|
disableUrlById,
|
||||||
|
enableFolderById,
|
||||||
enableUrlById,
|
enableUrlById,
|
||||||
findById,
|
findById,
|
||||||
|
findFolderById,
|
||||||
findMany,
|
findMany,
|
||||||
findServerUrlById,
|
findServerUrlById,
|
||||||
findUrlById,
|
findUrlById,
|
||||||
|
|||||||
@@ -134,17 +134,47 @@ const disableUrl = {
|
|||||||
query: z.object({}),
|
query: z.object({}),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const deleteFolder = {
|
||||||
|
body: z.object({}),
|
||||||
|
params: z.object({
|
||||||
|
...idValidation('serverId'),
|
||||||
|
...idValidation('folderId'),
|
||||||
|
}),
|
||||||
|
query: z.object({}),
|
||||||
|
};
|
||||||
|
|
||||||
|
const enableFolder = {
|
||||||
|
body: z.object({}),
|
||||||
|
params: z.object({
|
||||||
|
...idValidation('serverId'),
|
||||||
|
...idValidation('folderId'),
|
||||||
|
}),
|
||||||
|
query: z.object({}),
|
||||||
|
};
|
||||||
|
|
||||||
|
const disableFolder = {
|
||||||
|
body: z.object({}),
|
||||||
|
params: z.object({
|
||||||
|
...idValidation('serverId'),
|
||||||
|
...idValidation('folderId'),
|
||||||
|
}),
|
||||||
|
query: z.object({}),
|
||||||
|
};
|
||||||
|
|
||||||
export const serversValidation = {
|
export const serversValidation = {
|
||||||
create,
|
create,
|
||||||
createCredential,
|
createCredential,
|
||||||
createUrl,
|
createUrl,
|
||||||
deleteCredential,
|
deleteCredential,
|
||||||
|
deleteFolder,
|
||||||
deleteServer,
|
deleteServer,
|
||||||
deleteUrl,
|
deleteUrl,
|
||||||
detail,
|
detail,
|
||||||
disableCredential,
|
disableCredential,
|
||||||
|
disableFolder,
|
||||||
disableUrl,
|
disableUrl,
|
||||||
enableCredential,
|
enableCredential,
|
||||||
|
enableFolder,
|
||||||
enableUrl,
|
enableUrl,
|
||||||
getCredentialDetail,
|
getCredentialDetail,
|
||||||
list,
|
list,
|
||||||
|
|||||||
Reference in New Issue
Block a user