mirror of
https://github.com/Floriansylvain/CineAllo.git
synced 2026-08-19 19:53:16 +02:00
122 lines
3.2 KiB
JavaScript
122 lines
3.2 KiB
JavaScript
import express from 'express'
|
|
import { Prisma, PrismaClient } from '@prisma/client'
|
|
import createHttpError from 'http-errors'
|
|
|
|
const prisma = new PrismaClient()
|
|
export const showsRouter = express.Router()
|
|
|
|
function pushQueryToFilter(filter, keyValueQuery) {
|
|
if (keyValueQuery.value === undefined) return;
|
|
if (filter.where == undefined) {
|
|
filter.where = {}
|
|
}
|
|
|
|
filter.where[keyValueQuery.key] = {
|
|
[keyValueQuery.query]: keyValueQuery.query === 'contains' ?
|
|
keyValueQuery.value.toString() : parseInt(keyValueQuery.value)
|
|
}
|
|
}
|
|
|
|
function pushOrderByToFilter(filter, valueOrderPair) {
|
|
if (valueOrderPair.value === undefined) return;
|
|
if (filter.orderBy == undefined) {
|
|
filter.orderBy = {}
|
|
}
|
|
filter.orderBy[valueOrderPair.value] = valueOrderPair.order
|
|
}
|
|
|
|
function parseNumberFromQuery(query) {
|
|
const parsedQuery = parseInt(query)
|
|
if (isNaN(parsedQuery)) return undefined;
|
|
return parsedQuery
|
|
}
|
|
|
|
function pushQueriesToFilter(filter, queries) {
|
|
queries.forEach(query => {
|
|
pushOrderByToFilter(query, filter)
|
|
})
|
|
}
|
|
|
|
showsRouter.get('/', function (req, res, next) {
|
|
const queries = req.query
|
|
const filter = {
|
|
skip: parseNumberFromQuery(queries['start']) ?? 0,
|
|
take: parseNumberFromQuery(queries['per_page']) ?? 10
|
|
}
|
|
|
|
pushOrderByToFilter(filter, { value: queries?.sort_asc, order: 'asc' })
|
|
pushOrderByToFilter(filter, { value: queries?.sort_desc, order: 'desc' })
|
|
|
|
pushQueriesToFilter(filter, [
|
|
{ key: 'title', value: queries?.title, query: 'contains' },
|
|
{ key: 'description', value: queries?.description, query: 'contains' },
|
|
{ key: 'thumbmailURL', value: queries?.thumbmailURL, query: 'contains' },
|
|
{ key: 'date', value: queries?.date, query: 'equals' },
|
|
{ key: 'likes', value: queries?.likes, query: 'equals' }
|
|
])
|
|
|
|
prisma.serie.findMany(filter)
|
|
.then(shows => res.send({
|
|
shows,
|
|
pagination: {
|
|
start: filter.skip,
|
|
per_page: filter.take
|
|
},
|
|
links: {
|
|
next: `/v1/shows?start=${filter.skip + filter.take}&per_page=${filter.take}`,
|
|
prev: `/v1/shows?start=${Math.max(0, filter.skip - filter.take)}&per_page=${filter.take}`
|
|
},
|
|
total: shows.length
|
|
}))
|
|
.catch(error => {
|
|
if (error instanceof Prisma.PrismaClientValidationError) {
|
|
next(createHttpError(400, 'Incorrect field in sort query: ' + error))
|
|
}
|
|
})
|
|
})
|
|
|
|
showsRouter.get('/:id', function (req, res, next) {
|
|
prisma.serie.findUniqueOrThrow({
|
|
where: {
|
|
title: req.params.id
|
|
}
|
|
})
|
|
.then(show => res.send({ show }))
|
|
.catch(error => {
|
|
if (error instanceof Prisma.NotFoundError) {
|
|
next(createHttpError(404, 'Show not found.'))
|
|
}
|
|
})
|
|
})
|
|
|
|
showsRouter.post('/', function (req, res, next) {
|
|
prisma.serie.create({
|
|
data: {
|
|
title: req.body.title,
|
|
date: req.body.date,
|
|
description: req.body.description,
|
|
thumbmailURL: req.body.thumbmailURL
|
|
}
|
|
})
|
|
.then(() => res.send({ message: 'Show posted!' }))
|
|
.catch(() => {
|
|
next(createHttpError(400, 'Check your show model/content.'))
|
|
})
|
|
})
|
|
|
|
showsRouter.patch('/:id/like/', function (req, res, next) {
|
|
prisma.serie.update({
|
|
where: {
|
|
title: req.params.id
|
|
},
|
|
data: {
|
|
likes: {
|
|
increment: 1
|
|
}
|
|
}
|
|
})
|
|
.then(() => res.send({ message: 'Show liked!' }))
|
|
.catch(() => {
|
|
next(createHttpError(400, 'Show not found.'))
|
|
})
|
|
}) |