diff --git a/.gitignore b/.gitignore index 95b8b82..e404755 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .well-known -node_modules \ No newline at end of file +node_modules +db.json \ No newline at end of file diff --git a/index.js b/index.js index 526a6cd..2bd7982 100644 --- a/index.js +++ b/index.js @@ -1,6 +1,7 @@ const express = require('express') const app = express() const fs = require('fs') +const util = require('./server/util') require('dotenv').config() app.set('env', process.env.NODE_ENV || "production") @@ -29,6 +30,8 @@ app.use('/', require('./routes/static')) app.use('/feed', require('./routes/feed')) app.use('/rss', require('./routes/feed')) +util.updateDB() + app.listen(app.get('port'), () => { console.log(`Node server listening at http://localhost:${app.get('port')}`) }) diff --git a/nodemon.json b/nodemon.json index 1690325..4bdba63 100644 --- a/nodemon.json +++ b/nodemon.json @@ -1,5 +1,5 @@ { - "ignore": [], + "ignore": ["db.json"], "env": { "NODE_ENV": "development" } diff --git a/routes/main.js b/routes/main.js index 893b603..24496a0 100644 --- a/routes/main.js +++ b/routes/main.js @@ -55,4 +55,9 @@ router.get('/pgp', (req, res) => { res.render('pgp', { title: 'PGP — yarmo.eu' }) }) +// router.get('/updateDB', async (req, res) => { +// const response = await util.updateDB() +// res.send(response) +// }) + module.exports = router diff --git a/server/util.js b/server/util.js index 7c4a08d..00e395a 100644 --- a/server/util.js +++ b/server/util.js @@ -9,6 +9,13 @@ const md = require('markdown-it')({ typographer: true }) const yamlFront = require('yaml-front-matter') const { DateTime } = require('luxon') const Feed = require('feed').Feed +const low = require('lowdb') +const FileSync = require('lowdb/adapters/FileSync') + +const adapter = new FileSync('db.json') +const db = low(adapter) +db.defaults({ posts: [] }) + .write() md.use(require("markdown-it-anchor"), { "level": 2, @@ -34,6 +41,15 @@ const getBlogPosts = async (opts) => { if (!opts) { opts = {} } opts.publishedOnly = 'publishedOnly' in opts ? opts.publishedOnly : true + return db._.reverse(db.get('posts') + .filter({ type: 'blog', published: opts.publishedOnly }) + .sortBy('date') + .value()) +} +const getBlogPostsFromFiles = async (opts) => { + if (!opts) { opts = {} } + opts.publishedOnly = 'publishedOnly' in opts ? opts.publishedOnly : true + let data = [] for await (const f of getFiles(path.join(__dirname, '../', 'content', 'blog'))) { const rawContent = fs.readFileSync(f, 'utf8') @@ -62,6 +78,15 @@ const getNotes = async (opts) => { if (!opts) { opts = {} } opts.publishedOnly = 'publishedOnly' in opts ? opts.publishedOnly : true + return db._.reverse(db.get('posts') + .filter({ type: 'note', published: opts.publishedOnly }) + .sortBy('date') + .value()) +} +const getNotesFromFiles = async (opts) => { + if (!opts) { opts = {} } + opts.publishedOnly = 'publishedOnly' in opts ? opts.publishedOnly : true + let data = [] for await (const f of getFiles(path.join(__dirname, '../', 'content', 'notes'))) { const rawContent = fs.readFileSync(f, 'utf8') @@ -87,15 +112,19 @@ const getNotes = async (opts) => { } const getPost = async (slug) => { - let post = null, posts = await getBlogPosts() - posts = _.filter(posts, (p) => { return slug == p.slug }) - post = posts.length > 0 ? posts[0] : null + // let post = null, posts = await getBlogPosts() + // posts = _.filter(posts, (p) => { return slug == p.slug }) + // post = posts.length > 0 ? posts[0] : null + // + // if (!post) { + // posts = await getNotes() + // posts = _.filter(posts, (p) => { return slug == p.slug }) + // post = posts.length > 0 ? posts[0] : null + // } - if (!post) { - posts = await getNotes() - posts = _.filter(posts, (p) => { return slug == p.slug }) - post = posts.length > 0 ? posts[0] : null - } + let post = db.get('posts') + .find({ slug: slug }) + .value() return post } @@ -111,7 +140,7 @@ const getWebmentions = async (url) => { x.time = DateTime.fromISO(x.created_at).setLocale("en").setZone('utc').toLocaleString(DateTime.TIME_24_WITH_SHORT_OFFSET) return x }) - + return data } @@ -196,11 +225,35 @@ const getRSS = async (opts) => { return response } +const updateDB = async () => { + db.read() + + let data + data = await getBlogPostsFromFiles({ publishedOnly: false }) + data = data.concat(await getNotesFromFiles({ publishedOnly: false })) + + data.forEach((item, i) => { + if (db.get('posts').find({ slug: item.slug }).size().value() == 0) { + db.get('posts') + .push(item) + .write() + } else { + db.get('posts') + .find({ slug: item.slug }) + .assign(item) + .write() + } + }) +} + module.exports = { getFiles: getFiles, getBlogPosts: getBlogPosts, + getBlogPostsFromFiles: getBlogPostsFromFiles, getNotes: getNotes, + getNotesFromFiles: getNotesFromFiles, getPost: getPost, getWebmentions: getWebmentions, - getRSS: getRSS + getRSS: getRSS, + updateDB: updateDB }