From cb9ae25d94f21e97113dfea3ca45c7002089e344 Mon Sep 17 00:00:00 2001 From: sct Date: Tue, 17 Nov 2020 15:03:17 +0000 Subject: [PATCH] feat: add filtering for requests api --- overseerr-api.yml | 25 ++++++++++++++++ server/routes/request.ts | 50 ++++++++++++++++++++++++++----- src/components/Discover/index.tsx | 2 +- 3 files changed, 68 insertions(+), 9 deletions(-) diff --git a/overseerr-api.yml b/overseerr-api.yml index 41f6a2a2..32413d65 100644 --- a/overseerr-api.yml +++ b/overseerr-api.yml @@ -1581,6 +1581,31 @@ paths: Returns all requests if the user has the `ADMIN` or `MANAGE_REQUESTS` permissions. Otherwise, only the logged in users requests are returned. tags: - request + parameters: + - in: query + name: take + schema: + type: number + nullable: true + example: 20 + - in: query + name: skip + schema: + type: number + nullable: true + example: 0 + - in: query + name: filter + schema: + type: string + nullable: true + enum: [all, available, approved, pending, unavailable] + - in: query + name: sort + schema: + type: string + enum: [added, modified] + default: added responses: '200': description: Requests returned diff --git a/server/routes/request.ts b/server/routes/request.ts index 2b4a4023..04d896e3 100644 --- a/server/routes/request.ts +++ b/server/routes/request.ts @@ -1,7 +1,7 @@ import { Router } from 'express'; import { isAuthenticated } from '../middleware/auth'; import { Permission } from '../lib/permissions'; -import { getRepository } from 'typeorm'; +import { getRepository, FindOperator, FindOneOptions, In } from 'typeorm'; import { MediaRequest } from '../entity/MediaRequest'; import TheMovieDb from '../api/themoviedb'; import Media from '../entity/Media'; @@ -14,21 +14,55 @@ const requestRoutes = Router(); requestRoutes.get('/', async (req, res, next) => { const requestRepository = getRepository(MediaRequest); try { + let statusFilter: + | MediaRequestStatus + | FindOperator + | undefined = undefined; + + switch (req.query.filter) { + case 'available': + statusFilter = MediaRequestStatus.AVAILABLE; + break; + case 'approved': + statusFilter = MediaRequestStatus.APPROVED; + break; + case 'pending': + statusFilter = MediaRequestStatus.PENDING; + break; + case 'unavailable': + statusFilter = In([ + MediaRequestStatus.PENDING, + MediaRequestStatus.APPROVED, + ]); + break; + default: + statusFilter = In(Object.values(MediaRequestStatus)); + } + + let sortFilter: FindOneOptions['order'] = { + id: 'DESC', + }; + + switch (req.query.sort) { + case 'modified': + sortFilter = { + updatedAt: 'DESC', + }; + break; + } + const requests = req.user?.hasPermission(Permission.MANAGE_REQUESTS) ? await requestRepository.find({ - order: { - id: 'DESC', - }, + order: sortFilter, relations: ['media'], + where: { status: statusFilter }, take: Number(req.query.take) ?? 20, skip: Number(req.query.skip) ?? 0, }) : await requestRepository.find({ - where: { requestedBy: { id: req.user?.id } }, + where: { requestedBy: { id: req.user?.id }, status: statusFilter }, relations: ['media'], - order: { - id: 'DESC', - }, + order: sortFilter, take: Number(req.query.limit) ?? 20, skip: Number(req.query.skip) ?? 0, }); diff --git a/src/components/Discover/index.tsx b/src/components/Discover/index.tsx index 0ffa024b..56e72b7e 100644 --- a/src/components/Discover/index.tsx +++ b/src/components/Discover/index.tsx @@ -70,7 +70,7 @@ const Discover: React.FC = () => { ); const { data: requests, error: requestError } = useSWR( - '/api/v1/request' + '/api/v1/request?filter=unavailable&take=20&sort=modified&skip=0' ); return (