Skip to content

Commit

Permalink
feat: add filtering for requests api
Browse files Browse the repository at this point in the history
  • Loading branch information
sct committed Nov 17, 2020
1 parent f5f2545 commit cb9ae25
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 9 deletions.
25 changes: 25 additions & 0 deletions overseerr-api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
50 changes: 42 additions & 8 deletions server/routes/request.ts
Original file line number Diff line number Diff line change
@@ -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';
Expand All @@ -14,21 +14,55 @@ const requestRoutes = Router();
requestRoutes.get('/', async (req, res, next) => {
const requestRepository = getRepository(MediaRequest);
try {
let statusFilter:
| MediaRequestStatus
| FindOperator<MediaRequestStatus>
| 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<MediaRequest>['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,
});
Expand Down
2 changes: 1 addition & 1 deletion src/components/Discover/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ const Discover: React.FC = () => {
);

const { data: requests, error: requestError } = useSWR<MediaRequest[]>(
'/api/v1/request'
'/api/v1/request?filter=unavailable&take=20&sort=modified&skip=0'
);

return (
Expand Down

0 comments on commit cb9ae25

Please sign in to comment.