Add genres route

This commit is contained in:
jeffvli
2022-11-01 11:30:40 -07:00
parent 97486b23ee
commit 73fff64a75
9 changed files with 136 additions and 0 deletions
+23
View File
@@ -0,0 +1,23 @@
import { Response } from 'express';
import { toApiModel } from '@helpers/api-model';
import { service } from '@services/index';
import { ApiSuccess } from '@utils/api-success';
import { getSuccessResponse } from '@utils/get-success-response';
import { validation } from '@validations/index';
import { TypedRequest } from '@validations/shared.validation';
const getList = async (
req: TypedRequest<typeof validation.genres.list>,
res: Response
) => {
const { serverId } = req.params;
const data = await service.genres.findManyByServer({ serverId });
const success = ApiSuccess.ok({ data: toApiModel.genres(data) });
return res.status(success.statusCode).json(getSuccessResponse(success));
};
export const genresController = {
getList,
};
+2
View File
@@ -2,6 +2,7 @@ import { albumArtistsController } from '@controllers/album-artists.controller';
import { albumsController } from '@controllers/albums.controller';
import { artistsController } from '@controllers/artists.controller';
import { authController } from '@controllers/auth.controller';
import { genresController } from '@controllers/genres.controller';
import { serversController } from '@controllers/servers.controller';
import { songsController } from '@controllers/songs.controller';
import { tasksController } from '@controllers/tasks.controller';
@@ -12,6 +13,7 @@ export const controller = {
albums: albumsController,
artists: artistsController,
auth: authController,
genres: genresController,
servers: serversController,
songs: songsController,
tasks: tasksController,
+22
View File
@@ -210,6 +210,28 @@ const relatedGenres = (items: Genre[]) => {
);
};
const genres = (items: (Genre & { _count?: any })[]) => {
return (
items?.map((item) => {
const totalCount = Object.keys(item._count)
.map((key) => item._count[key])
.reduce((a, b) => a + b, 0);
return {
/* eslint-disable sort-keys-fix/sort-keys-fix */
id: item.id,
name: item.name,
songCount: item._count?.songs,
albumCount: item._count?.albums,
artistCount: item._count?.artists,
albumArtistCount: item._count?.albumArtists,
totalCount,
/* eslint-enable sort-keys-fix/sort-keys-fix */
};
}) || []
);
};
const relatedServerFolders = (items: ServerFolder[]) => {
const serverFolders = items?.map((item) => {
return {
+12
View File
@@ -0,0 +1,12 @@
import express, { Router } from 'express';
import { controller } from '@controllers/index';
import { validation } from '@validations/index';
import { validateRequest } from '@validations/shared.validation';
export const router: Router = express.Router({ mergeParams: true });
router.get(
'/',
validateRequest(validation.genres.list),
controller.genres.getList
);
+2
View File
@@ -5,6 +5,7 @@ import { router as albumArtistsRouter } from './album-artists.route';
import { router as albumsRouter } from './albums.route';
import { router as artistsRouter } from './artists.route';
import { router as authRouter } from './auth.route';
import { router as genresRouter } from './genres.route';
import { router as serversRouter } from './servers.route';
import { router as songsRouter } from './songs.route';
import { router as tasksRouter } from './tasks.route';
@@ -44,4 +45,5 @@ routes.param('serverId', (req, _res, next, serverId) => {
routes.use('/api/servers/:serverId/album-artists', albumArtistsRouter);
routes.use('/api/servers/:serverId/artists', artistsRouter);
routes.use('/api/servers/:serverId/albums', albumsRouter);
routes.use('/api/servers/:serverId/genres', genresRouter);
routes.use('/api/servers/:serverId/songs', songsRouter);
+59
View File
@@ -0,0 +1,59 @@
import { prisma } from '@lib/prisma';
import { ApiError } from '@utils/api-error';
const findManyByServer = async (options: { serverId: string }) => {
const { serverId } = options;
const genres = await prisma.genre.findMany({
include: {
_count: {
select: {
albumArtists: { where: { serverId } },
albums: { where: { serverId } },
artists: { where: { serverId } },
songs: { where: { serverId } },
},
},
},
where: {
OR: [
{ albumArtists: { some: { serverId } } },
{ albums: { some: { serverId } } },
{ artists: { some: { serverId } } },
{ songs: { some: { serverId } } },
],
},
});
if (!genres) {
throw ApiError.notFound('');
}
return genres;
};
const findMany = async () => {
const genres = await prisma.genre.findMany({
include: {
_count: {
select: {
albumArtists: true,
albums: true,
artists: true,
songs: true,
},
},
},
});
if (!genres) {
throw ApiError.notFound('');
}
return genres;
};
export const genresService = {
findMany,
findManyByServer,
};
+2
View File
@@ -2,6 +2,7 @@ import { albumArtistsService } from './album-artists.service';
import { albumsService } from './albums.service';
import { artistsService } from './artists.service';
import { authService } from './auth.service';
import { genresService } from './genres.service';
import { serversService } from './servers.service';
import { usersService } from './users.service';
@@ -10,6 +11,7 @@ export const service = {
albums: albumsService,
artists: artistsService,
auth: authService,
genres: genresService,
servers: serversService,
users: usersService,
};
+12
View File
@@ -0,0 +1,12 @@
import { z } from 'zod';
import { idValidation } from '@validations/shared.validation';
const list = {
body: z.object({}),
params: z.object({ ...idValidation('serverId') }),
query: z.object({}),
};
export const genresValidation = {
list,
};
+2
View File
@@ -2,6 +2,7 @@ import { albumArtistsValidation } from '@validations/album-artists.validation';
import { albumsValidation } from '@validations/albums.validation';
import { artistsValidation } from '@validations/artists.validation';
import { authValidation } from '@validations/auth.validation';
import { genresValidation } from '@validations/genres.validation';
import { serversValidation } from '@validations/servers.validation';
import { songsValidation } from '@validations/songs.validation';
import { tasksValidation } from '@validations/tasks.validation';
@@ -14,6 +15,7 @@ export const validation = {
albums: albumsValidation,
artists: artistsValidation,
auth: authValidation,
genres: genresValidation,
servers: serversValidation,
songs: songsValidation,
tasks: tasksValidation,