backend/controller/latest.js

66 lines
1.8 KiB
JavaScript

const { PrismaClient } = require('@prisma/client')
const { SitemapStream, streamToPromise } = require('sitemap')
const redis = require('../utils/redis.js')
const prisma = new PrismaClient()
exports.getLatest = async (req, res) => {
let json
const cached = await redis.get('latest')
if (cached) {
json = JSON.parse(cached)
} else {
json = await prisma.videos.findMany({
take: 90,
orderBy: [
{
archived: 'desc'
}
],
select: {
id: true,
title: true,
thumbnail: true,
published: true,
archived: true,
channel: true,
channelId: true,
channelAvatar: true,
channelVerified: true
}
})
await redis.set('latest', JSON.stringify(json), 'EX', 3600)
}
res.json(json)
}
exports.getSitemap = async (req, res) => {
const cachedSitemap = await redis.get('sitemap');
if (cachedSitemap) {
res.header('Content-Type', 'application/xml');
return res.send(cachedSitemap);
}
const dbVideos = await prisma.videos.findMany({
select: {
id: true,
},
});
const videos = dbVideos.map((video) => ({
url: `/videos/${video.id}`,
changefreq: 'never',
priority: 0.7,
}));
const smStream = new SitemapStream({ hostname: 'https://preservetube.com' });
videos.forEach((video) => smStream.write(video));
smStream.end();
const sitemap = await streamToPromise(smStream).then((data) => data.toString());
await redis.set('sitemap', sitemap, 'EX', 86400);
res.header('Content-Type', 'application/xml');
res.send(sitemap);
};