chew/server/cohort.js

103 lines
No EOL
2.6 KiB
JavaScript

import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
import accepts from 'accepts'
import { Feed } from 'feed'
import express from 'express'
import cors from 'cors'
const app = express.Router()
const cohortController = {
async create (req, res) {
// const { name, sources } = await useBody(req)
console.error(req.body)
const { name, description, sources } = req.body
const cohort = await prisma.cohort.create({ include: { sources: true }, data: {
name,
description,
sources: {
connect: sources.map(id => ({ id }))
}
}})
return res.json(cohort)
},
feed (cohort, posts) {
const feed = new Feed({
title: cohort.name,
description: cohort.description,
id: cohort.id,
// link: cohort.id,
generator: 'Chew'
})
posts.forEach(post => {
feed.addItem({
title: post.title,
id: post.URL,
link: post.URL,
description: post.summary,
content: post.content,
image: post.image,
date: post.updatedAt
})
})
return feed.atom1()
}
}
app.post('/', cohortController.create)
app.get('/:id\.?:format(json|rss|atom|xml)?', cors(), async (req, res) => {
const format = req.params.format || 'json'
const id = Number(req.params.id)
const maxPosts = Number(req.query.maxPosts) || 10
console.error('id', id)
const cohort = await prisma.cohort.findUnique({ where: { id }, include: { sources: { select: { id: true }} } })
if (!id || !cohort || !cohort.sources) return res.sendStatus(404)
await prisma.cohort.update({ where: { id }, data: { dailyView: { increment: 1 } } })
const posts = await prisma.post.findMany({
orderBy: [ { date: 'desc'} ],
take: maxPosts,
where: {
sourceId: {
in: cohort.sources.map(s => s.id)
}
},
include: {
source: true
}
})
const accept = accepts(req)
console.error(accept.types())
switch (format) {
case 'xml':
case 'rss':
return res
.contentType('application/rss+xml')
// .setHeader('Last-Modified', new Date(cohort.updatedAt).toUTCString())
// .set('ETag', Math.round(new Date(cohort.updatedAt).getTime() / 1000))
.send(cohortController.feed(cohort, posts))
case 'json':
default:
return res.json({ cohort, posts })
}
})
// app.use((err, req, res, next) => {
// console.error('sono asodifaosdijf');
// console.error(err);
// res.status(500).json({error: 'an error occurred'});
// });
// if (req.method === 'POST') {
// return cohortController.create(req)
// }
// }
export default app