diff --git a/src/controllers/premium-album-controller.ts b/src/controllers/premium-album-controller.ts index 36595e5d942e933b415c570af386d4097468b6a6..651b430fb65dd6c134e0c4373cf80ed57fd86d08 100644 --- a/src/controllers/premium-album-controller.ts +++ b/src/controllers/premium-album-controller.ts @@ -37,6 +37,22 @@ const createPremiumAlbum = async ( } }; +const getPremiumAlbumById = async ( + req: Request, + res: Response, + next: NextFunction, +): Promise<void> => { + try { + const premiumAlbumId = Number(req.params.premiumAlbumId); + const responseData = await PremiumAlbumService.getPremiumAlbumById( + premiumAlbumId, + ); + generateResponse(res, StatusCodes.OK, responseData); + } catch (err) { + next(err); + } +} + const searchPremiumAlbum = async ( req: Request, res: Response, @@ -56,6 +72,29 @@ const searchPremiumAlbum = async ( } }; +const searchPremiumAlbumOwned = async ( + req: Request, + res: Response, + next: NextFunction, +): Promise<void> => { + try { + const allPremiumAlbum = await PremiumAlbumService.searchPremiumAlbumOwned( + { + size: req.query.size ? Number(req.query.size) : undefined, + page: req.query.page ? Number(req.query.page) : undefined, + searchQuery: req.query.searchQuery ? String(req.query.searchQuery) : undefined, + premiumAlbumIds: JSON.parse(<string>req.query.premiumAlbumIds, (key, value) => { + if (key === "") return value; + return typeof value === "string" ? Number(value) : value; + }), + }, + ); + generateResponse(res, StatusCodes.OK, allPremiumAlbum); + } catch (err) { + next(err); + } +} + const updatePremiumAlbum = async ( req: Request, res: Response, @@ -120,7 +159,9 @@ const deletePremiumAlbum = async ( export { createPremiumAlbum, + getPremiumAlbumById, searchPremiumAlbum, + searchPremiumAlbumOwned, updatePremiumAlbum, deletePremiumAlbum, }; diff --git a/src/services/premium-album-service.ts b/src/services/premium-album-service.ts index 740cfa4f6c3301d47eca841d2c96ae84746d1d24..2b0701b15601e05699fcb131d682286b514fe6b6 100644 --- a/src/services/premium-album-service.ts +++ b/src/services/premium-album-service.ts @@ -4,7 +4,7 @@ import {ErrorType, StandardError} from "../errors/standard-error"; import {validate} from "../validation/validation"; import { createPremiumAlbumSchema, - deletePremiumAlbumSchema, + deletePremiumAlbumSchema, searchPremiumAlbumOwnSchema, searchPremiumAlbumSchema, updatePremiumAlbumSchema } from "../validation/premium-album-validation"; @@ -25,6 +25,34 @@ const createPremiumAlbum = async ( }); }; +const getPremiumAlbumById = async ( + premiumAlbumId: number, +): Promise<{ data: PremiumAlbum, duration: number }> => { + const album = await prismaClient.premiumAlbum.findUnique({ + where: { + albumId: premiumAlbumId, + }, + }); + + if (!album) { + throw new StandardError(ErrorType.ALBUM_NOT_FOUND); + } + + const albumDuration = await prismaClient.premiumSong.aggregate({ + where: { + albumId: premiumAlbumId + }, + _sum: { + duration: true + } + }) + + return { + data : album, + duration: albumDuration._sum.duration ?? 0 + }; +}; + const searchPremiumAlbum = async (reqQuery: { size: number | undefined; page: number | undefined; @@ -77,6 +105,79 @@ const searchPremiumAlbum = async (reqQuery: { }; }; +const searchPremiumAlbumOwned = async (reqQuery: { + size: number | undefined; + page: number | undefined; + searchQuery: string | undefined; + premiumAlbumIds : number[] +}) => { + validate(searchPremiumAlbumOwnSchema, reqQuery) + + const skip: number = ((reqQuery.page ?? 1) - 1) * (reqQuery.size ?? 10); + + const filters = []; + + if (reqQuery.searchQuery) { + filters.push({ + OR: [ + { + albumName: { + contains: reqQuery.searchQuery, + }, + }, + { + artist: { + contains: reqQuery.searchQuery, + }, + }, + ], + }); + } + + + const albums = await prismaClient.premiumAlbum.findMany({ + where: { + AND: [ + { + albumId: { + in: reqQuery.premiumAlbumIds + } + }, + { + AND: filters, + } + ] + }, + take: reqQuery.size ?? 10, + skip: skip, + }); + + const totalAlbums = await prismaClient.premiumAlbum.count({ + where: { + AND: [ + { + albumId: { + in: reqQuery.premiumAlbumIds + } + }, + { + AND: filters, + } + ] + }, + }); + + return { + data: albums, + paging: { + page: reqQuery.page ?? 1, + totalAlbums: totalAlbums, + totalPages: Math.ceil(totalAlbums / (reqQuery.size ?? 10)), + }, + }; +}; + + const updatePremiumAlbum = async ( inputData: Prisma.PremiumAlbumUpdateInput, premiumAlbumId: number, @@ -125,7 +226,9 @@ const deletePremiumAlbum = async ( export { createPremiumAlbum, + getPremiumAlbumById, searchPremiumAlbum, + searchPremiumAlbumOwned, updatePremiumAlbum, deletePremiumAlbum, }; diff --git a/src/validation/premium-album-validation.ts b/src/validation/premium-album-validation.ts index c4945bcea9bf17112c648bcef084f8937098931c..173ac5d8bfb77908e81f1b41643224c0549f9474 100644 --- a/src/validation/premium-album-validation.ts +++ b/src/validation/premium-album-validation.ts @@ -13,6 +13,13 @@ const searchPremiumAlbumSchema = z.object({ searchQuery: z.optional(z.string().min(1).max(255)), }); +const searchPremiumAlbumOwnSchema = z.object({ + size: z.optional(z.number().int().min(10).max(100)), + page: z.optional(z.number().int().min(1)), + searchQuery: z.optional(z.string().min(1).max(255)), + premiumAlbumIds : z.array(z.number().int().min(1)), +}); + const updatePremiumAlbumSchema = z.object({ premiumAlbumId: z.number().int().min(1), albumName: z.optional(z.string().min(1).max(255)), @@ -28,6 +35,7 @@ const deletePremiumAlbumSchema = z.object({ export { createPremiumAlbumSchema, searchPremiumAlbumSchema, + searchPremiumAlbumOwnSchema, updatePremiumAlbumSchema, deletePremiumAlbumSchema, }