backend/controller/latest.js

66 lines
1.8 KiB
JavaScript
Raw Normal View History

2023-03-03 16:44:40 +00:00
const { PrismaClient } = require('@prisma/client')
2024-09-12 17:32:18 +01:00
const { SitemapStream, streamToPromise } = require('sitemap')
2024-02-15 15:13:12 +00:00
const redis = require('../utils/redis.js')
2023-03-03 16:44:40 +00:00
const prisma = new PrismaClient()
exports.getLatest = async (req, res) => {
2024-02-15 15:13:12 +00:00
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
2023-03-03 16:44:40 +00:00
}
2024-02-15 15:13:12 +00:00
})
await redis.set('latest', JSON.stringify(json), 'EX', 3600)
}
res.json(json)
2024-09-12 17:32:18 +01:00
}
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);
};