You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
82 lines
1.8 KiB
82 lines
1.8 KiB
import { Router } from 'express';
|
|
import { getRepository, FindOperator, FindOneOptions } from 'typeorm';
|
|
import Media from '../entity/Media';
|
|
import { MediaStatus } from '../constants/media';
|
|
|
|
export interface MediaResultsResponse {
|
|
pageInfo: {
|
|
pages: number;
|
|
page: number;
|
|
results: number;
|
|
pageSize: number;
|
|
};
|
|
results: Media[];
|
|
}
|
|
|
|
const mediaRoutes = Router();
|
|
|
|
mediaRoutes.get('/', async (req, res, next) => {
|
|
const mediaRepository = getRepository(Media);
|
|
|
|
const pageSize = Number(req.query.take) ?? 20;
|
|
const skip = Number(req.query.skip) ?? 0;
|
|
|
|
let statusFilter:
|
|
| MediaStatus
|
|
| FindOperator<MediaStatus>
|
|
| undefined = undefined;
|
|
|
|
switch (req.query.filter) {
|
|
case 'available':
|
|
statusFilter = MediaStatus.AVAILABLE;
|
|
break;
|
|
case 'partial':
|
|
statusFilter = MediaStatus.PARTIALLY_AVAILABLE;
|
|
break;
|
|
case 'processing':
|
|
statusFilter = MediaStatus.PROCESSING;
|
|
break;
|
|
case 'pending':
|
|
statusFilter = MediaStatus.PENDING;
|
|
break;
|
|
default:
|
|
statusFilter = undefined;
|
|
}
|
|
|
|
let sortFilter: FindOneOptions<Media>['order'] = {
|
|
id: 'DESC',
|
|
};
|
|
|
|
switch (req.query.sort) {
|
|
case 'modified':
|
|
sortFilter = {
|
|
updatedAt: 'DESC',
|
|
};
|
|
break;
|
|
}
|
|
|
|
try {
|
|
const [media, mediaCount] = await mediaRepository.findAndCount({
|
|
order: sortFilter,
|
|
where: {
|
|
status: statusFilter,
|
|
},
|
|
take: pageSize,
|
|
skip,
|
|
});
|
|
return res.status(200).json({
|
|
pageInfo: {
|
|
pages: Math.ceil(mediaCount / pageSize),
|
|
pageSize,
|
|
results: mediaCount,
|
|
page: Math.ceil(skip / pageSize) + 1,
|
|
},
|
|
results: media,
|
|
} as MediaResultsResponse);
|
|
} catch (e) {
|
|
next({ status: 500, message: e.message });
|
|
}
|
|
});
|
|
|
|
export default mediaRoutes;
|