From e5a8171087b3e51a1b38b934a561ba21863c2436 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 20 Feb 2023 08:43:10 -0600 Subject: [PATCH 1/7] trigger pages and posts recording views only when published --- .gitignore | 1 + app/controllers/page.js | 4 +++- app/controllers/post.js | 5 +++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 1616fc5..95f99b0 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ data/minio data/minio.old node_modules dist +start-local-* \ No newline at end of file diff --git a/app/controllers/page.js b/app/controllers/page.js index 6d71085..9cd05d0 100644 --- a/app/controllers/page.js +++ b/app/controllers/page.js @@ -51,7 +51,9 @@ class PageController extends SiteController { async getView (req, res, next) { const { resource: resourceService } = this.dtp.services; try { - await resourceService.recordView(req, 'Page', res.locals.page._id); + if (res.locals.page.status === 'published') { + await resourceService.recordView(req, 'Page', res.locals.page._id); + } res.locals.pageSlug = res.locals.page.slug; res.locals.pageTitle = `${res.locals.page.title} on ${this.dtp.config.site.name}`; res.render('page/view'); diff --git a/app/controllers/post.js b/app/controllers/post.js index 7c75691..faddb5f 100644 --- a/app/controllers/post.js +++ b/app/controllers/post.js @@ -277,8 +277,9 @@ class PostController extends SiteController { throw new SiteError(403, 'The post is not published'); } } - - await resourceService.recordView(req, 'Post', res.locals.post._id); + if (res.locals.post.status === 'published') { + await resourceService.recordView(req, 'Post', res.locals.post._id); + } res.locals.countPerPage = 20; res.locals.pagination = this.getPaginationParameters(req, res.locals.countPerPage); From a79ccb45dc518720ff36d23df8c5bc75165861d6 Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 20 Feb 2023 14:24:26 -0600 Subject: [PATCH 2/7] fix for numbers on posts --- app/views/post/view.pug | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/post/view.pug b/app/views/post/view.pug index 1994378..6ada831 100644 --- a/app/views/post/view.pug +++ b/app/views/post/view.pug @@ -47,7 +47,7 @@ block content +renderButtonIcon('fa-trash', 'delete') .uk-width-auto - +renderButtonIcon('fa-eye', displayIntegerValue(post.stats.totalViewCount)) + +renderButtonIcon('fa-eye', displayIntegerValue(post.stats.totalVisitCount)) .uk-width-auto +renderButtonIcon('fa-chevron-up', displayIntegerValue(post.stats.upvoteCount)) .uk-width-auto From a4527f65c46da49c3c23d5557d9d4fc62953f28b Mon Sep 17 00:00:00 2001 From: rob Date: Sat, 25 Feb 2023 06:55:51 -0500 Subject: [PATCH 3/7] a couple enhancements - switch from `user-agent` to `user-agents` - add favicons for feeds - new layout for Venue embed --- app/models/feed.js | 1 + app/services/feed.js | 59 ++++++ app/views/newsroom/feed-view.pug | 17 +- app/views/newsroom/index.pug | 7 +- app/views/venue/embed.pug | 13 +- app/workers/media/job/webpage-screenshot.js | 3 +- app/workers/newsroom.js | 1 + package.json | 3 +- yarn.lock | 211 +++++++++++++++++++- 9 files changed, 296 insertions(+), 19 deletions(-) diff --git a/app/models/feed.js b/app/models/feed.js index 84bc39e..e35f1d6 100644 --- a/app/models/feed.js +++ b/app/models/feed.js @@ -12,6 +12,7 @@ const FeedSchema = new Schema({ url: { type: String, required: true, unique: true }, title: { type: String }, link: { type: String }, + favicons: { type: [String] }, description: { type: String }, language: { type: String }, generator: { type: String }, diff --git a/app/services/feed.js b/app/services/feed.js index 27b55f2..20677d1 100644 --- a/app/services/feed.js +++ b/app/services/feed.js @@ -9,10 +9,12 @@ const Feed = mongoose.model('Feed'); const FeedEntry = mongoose.model('FeedEntry'); const moment = require('moment'); +const UserAgent = require('user-agents'); const { SiteService, SiteError, SiteAsync } = require('../../lib/site-lib'); const { read: feedReader } = require('feed-reader'); const { Feed: FeedGenerator } = require('feed'); +const { getLinkPreview } = require('link-preview-js'); class FeedService extends SiteService { @@ -27,6 +29,7 @@ class FeedService extends SiteService { } async start ( ) { + this.userAgent = new UserAgent(); this.jobQueue = await this.getJobQueue('newsroom', this.dtp.config.jobQueues.newsroom); } @@ -85,6 +88,26 @@ class FeedService extends SiteService { this.jobQueue.add('update-feed', { feedId: feed._id }); } + async updateFavicon (feed) { + const linkPreview = await getLinkPreview(feed.link || feed.url, { + headers: { + 'user-agent': this.userAgent.toString(), + 'Accept-Language': 'en-US', + }, + followRedirects: true, + resolveDNSHost: module.resolveHost, + timeout: 15000, + }); + await Feed.updateOne( + { _id: feed._id }, + { + $set: { + favicons: linkPreview.favicons, + }, + }, + ); + } + async getFeeds (pagination, options) { options = Object.assign({ withEntries: false, entryCount: 3 }, options); pagination = Object.assign({ skip: 0, cpp: 10 }, pagination); @@ -234,6 +257,42 @@ class FeedService extends SiteService { return feed; } + + async resolveHost (url) { + const dns = require('dns'); + return new Promise((resolve, reject) => { + const hostname = new URL(url).hostname; + module.log.info('resolving DNS hostname', { hostname }); + dns.lookup(hostname, (err, address, family) => { + if (err) { + reject(err); + return; + } + if (['127.0.0.1','0.0.0.0'].includes(address)) { + /* + * TODO: maybe automatically add to domain blacklist? Want to get some + * miles on this service and observe results in prod before auto- + * blocking based on this result. + */ + module.log.alert('malicious intent link hostname detected', { hostname, address, family }); + } else { + module.log.info('resolved link hostname', { hostname, address, family }); + } + + // dailyhodl resolves to 192.0.x.x, and the Page Preview library threw an + // SSRF exception on that. So, I'm just hacking the address to lie to the + // library as long as we're not mapping to 192.168.0.1 + const tokens = address.split('.'); + if (tokens[0] === '192' && tokens[1] === '0') { + if (tokens[2] !== '0' && tokens[3] !== '1') { + tokens[1] = '1'; + } + } + address = tokens.join('.'); + resolve(address); + }); + }); + } } module.exports = { diff --git a/app/views/newsroom/feed-view.pug b/app/views/newsroom/feed-view.pug index 48eb681..77af214 100644 --- a/app/views/newsroom/feed-view.pug +++ b/app/views/newsroom/feed-view.pug @@ -9,15 +9,24 @@ block content article.uk-article .uk-margin-large .uk-margin - h1.uk-article-title.uk-margin-remove= feed.title + h1.uk-article-title.uk-margin-remove.no-select= feed.title + .uk-article-meta div(uk-grid) .uk-width-auto - a(href= feed.link, target="_blank") #[i.fas.fa-external-link-alt]#[span.uk-margin-small-left Visit site] + a(href= feed.link, target="_blank", uk-tooltip={ title: "Visit site" }).no-select + if Array.isArray(feed.favicons) && (feed.favicons.length > 0) + span + img(src= feed.favicons[0], style="height: 24px; width: auto;") + else + span + i.fas.fa-external-link-alt + span.uk-margin-small-left Visit site + .uk-width-auto - div last updated #{moment(feed.published).fromNow()} + .no-select last updated #{moment(feed.published).fromNow()} - .uk-text-lead= feed.description + .uk-text-lead.no-select= feed.description .uk-margin-large if Array.isArray(newsroom.entries) && (newsroom.entries.length > 0) diff --git a/app/views/newsroom/index.pug b/app/views/newsroom/index.pug index bcdfc08..be94255 100644 --- a/app/views/newsroom/index.pug +++ b/app/views/newsroom/index.pug @@ -27,7 +27,12 @@ block content a(href=`/newsroom/${feed._id}`, uk-tooltip=`See all for ${feed.title}`).uk-text-small ALL .uk-text-small.uk-text-muted - div last update #{moment(feed.published).fromNow()} + div(uk-grid).uk-grid-collapse.uk-flex-middle + if Array.isArray(feed.favicons) && (feed.favicons.length > 0) + .uk-width-auto + img(src= feed.favicons[0], style="height: 16px; width: auto; margin-right: 6px;") + .uk-width-auto + div last update #{moment(feed.published).fromNow()} //- div= feed.description .uk-card-body diff --git a/app/views/venue/embed.pug b/app/views/venue/embed.pug index 065d6bc..7329655 100644 --- a/app/views/venue/embed.pug +++ b/app/views/venue/embed.pug @@ -1,8 +1,19 @@ extends ../layouts/main block content + style. + .embedded-frame { + flex-grow: 1; + } + - var shingBaseUrl = `https://${dtp.services.venue.soapboxDomain}`; - iframe(src= `${shingBaseUrl}/channel/${channel.slug}/embed/venue?k=${channelCredentials.widgetKey}`, style="width: 100%; height: 720px;", allowfullscreen) + div(style="position: fixed; top: 64px; right: 0; bottom: 0; left: 0; width: 100%;").uk-flex.uk-flex-column + iframe( + src= `${shingBaseUrl}/channel/${channel.slug}/embed/venue?k=${channelCredentials.widgetKey}`, + allowfullscreen, + ).embedded-frame + +block page-footer block viewjs script. diff --git a/app/workers/media/job/webpage-screenshot.js b/app/workers/media/job/webpage-screenshot.js index a4a0bcd..3aebe24 100644 --- a/app/workers/media/job/webpage-screenshot.js +++ b/app/workers/media/job/webpage-screenshot.js @@ -9,7 +9,7 @@ const fs = require('fs'); const mongoose = require('mongoose'); const puppeteer = require('puppeteer'); -const userAgent = require('user-agent'); +const UserAgent = require('user-agents'); const { SiteWorkerProcess } = require(path.join(__dirname, '..', '..', '..', '..', 'lib', 'site-lib')); @@ -88,6 +88,7 @@ class WebpageScreenshotJob extends SiteWorkerProcess { throw new Error('failed to create new browser page for capturing screenshot', { modelName, documentId, pageUrl }); } + const userAgent = new UserAgent(); await job.page.setUserAgent(userAgent.toString()); await job.page.setViewport(job.data.viewport); await job.page.goto(pageUrl, { waitUntil: 'networkidle2' }); diff --git a/app/workers/newsroom.js b/app/workers/newsroom.js index 6ca4fdc..a0c37af 100644 --- a/app/workers/newsroom.js +++ b/app/workers/newsroom.js @@ -54,6 +54,7 @@ class NewsroomWorker extends SiteWorker { const { feed: feedService } = this.dtp.services; try { this.log.info('loading latest feed data', { feedId: feed._id, title: feed.title }); + await feedService.updateFavicon(feed); const response = await feedReader(feed.url); await SiteAsync.each(response.entries, async (entry) => { await Feed.updateOne({ _id: feed._id }, { $set: { published: feed.published || NOW }}); diff --git a/package.json b/package.json index d00d174..4f4144d 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "ioredis": "^5.2.2", "jsdom": "^19.0.0", "libphonenumber-js": "^1.9.49", + "link-preview-js": "^3.0.4", "marked": "^4.0.12", "mediasoup": "3", "method-override": "^3.0.0", @@ -91,7 +92,7 @@ "unzalgo": "^3.0.0", "upload": "^1.3.1", "url-validation": "^2.1.0", - "user-agent": "^1.0.4", + "user-agents": "^1.0.1295", "uuid": "^8.3.2", "zxcvbn": "^4.4.2" }, diff --git a/yarn.lock b/yarn.lock index 8582465..e2c8439 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1246,6 +1246,13 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + accepts@~1.3.4, accepts@~1.3.5: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -1865,6 +1872,11 @@ body-parser@1.19.2: raw-body "2.4.3" type-is "~1.6.18" +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + boxen@^5.0.0: version "5.1.2" resolved "https://registry.yarnpkg.com/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" @@ -2249,6 +2261,32 @@ chartjs-adapter-moment@^1.0.0: resolved "https://registry.yarnpkg.com/chartjs-adapter-moment/-/chartjs-adapter-moment-1.0.0.tgz#9174b1093c68bcfe285aff24f7388ad60d44e8f7" integrity sha512-PqlerEvQcc5hZLQ/NQWgBxgVQ4TRdvkW3c/t+SUEQSj78ia3hgLkf2VZ2yGJtltNbEEFyYGm+cA6XXevodYvWA== +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@1.0.0-rc.11: + version "1.0.0-rc.11" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.11.tgz#1be84be1a126958366bcc57a11648cd9b30a60c2" + integrity sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + parse5 "^7.0.0" + parse5-htmlparser2-tree-adapter "^7.0.0" + tslib "^2.4.0" + chokidar@^2.0.0: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -2776,6 +2814,22 @@ crypto-random-string@^2.0.0: resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + cssom@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.5.0.tgz#d254fa92cd8b6fbd83811b9fbaed34663cc17c36" @@ -3014,6 +3068,11 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= +detect-indent@~6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" + integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== + detect-libc@^2.0.0, detect-libc@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd" @@ -3079,6 +3138,11 @@ dnscache@^1.0.1: asap "^2.0.6" lodash.clone "^4.5.0" +docopt@~0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/docopt/-/docopt-0.6.2.tgz#b28e9e2220da5ec49f7ea5bb24a47787405eeb11" + integrity sha512-NqTbaYeE4gA/wU1hdKFdU+AFahpDOpgGLzHP42k6H6DKExJd0A55KEVWYhL9FEmHmgeLvEU2vuKXDuU+4yToOw== + doctypes@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9" @@ -3092,6 +3156,15 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + domelementtype@1: version "1.3.1" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" @@ -3102,6 +3175,11 @@ domelementtype@^2.0.1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + domexception@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/domexception/-/domexception-4.0.0.tgz#4ad1be56ccadc86fc76d033353999a8037d03673" @@ -3116,6 +3194,13 @@ domhandler@2.3: dependencies: domelementtype "1" +domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + domutils@1.5: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" @@ -3124,6 +3209,24 @@ domutils@1.5: dom-serializer "0" domelementtype "1" +domutils@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" + integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.1" + +dot-json@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/dot-json/-/dot-json-1.2.2.tgz#7d35abece4aa22aa75a761388953f98495401bcc" + integrity sha512-AKL+GsO4wSEU4LU+fAk/PqN4nQ6PB1vT3HpMiZous9xCzK5S0kh4DzfUY0EfU67jsIXLlu0ty71659N9Nmg+Tw== + dependencies: + detect-indent "~6.0.0" + docopt "~0.6.2" + underscore-keypath "~0.0.22" + dot-prop@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" @@ -3353,6 +3456,11 @@ entities@^2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== +entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + errno@^0.1.1, errno@^0.1.3: version "0.1.8" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" @@ -3525,6 +3633,11 @@ etag@1.8.1, etag@^1.8.1, etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + eventemitter2@^6.4.9: version "6.4.9" resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.9.tgz#41f2750781b4230ed58827bc119d293471ecb125" @@ -4364,6 +4477,13 @@ gulplog@^1.0.0: dependencies: glogg "^1.0.0" +h264-profile-level-id@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/h264-profile-level-id/-/h264-profile-level-id-1.0.1.tgz#92033c190766c846e57c6a97e4c1d922943a9cce" + integrity sha512-D3Rln/jKNjKDW5ZTJTK3niSoOGE+pFqPvRHHVgQN3G7umcn/zWGPUo8Q8VpDj16x3hKz++zVviRNRmXu5cpN+Q== + dependencies: + debug "^4.1.1" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -4376,12 +4496,6 @@ har-validator@~5.1.3: dependencies: ajv "^6.12.3" har-schema "^2.0.0" -h264-profile-level-id@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/h264-profile-level-id/-/h264-profile-level-id-1.0.1.tgz#92033c190766c846e57c6a97e4c1d922943a9cce" - integrity sha512-D3Rln/jKNjKDW5ZTJTK3niSoOGE+pFqPvRHHVgQN3G7umcn/zWGPUo8Q8VpDj16x3hKz++zVviRNRmXu5cpN+Q== - dependencies: - debug "^4.1.1" has-ansi@^2.0.0: version "2.0.0" @@ -4548,6 +4662,16 @@ htmlparser2@3.8.x: entities "1.0" readable-stream "1.1" +htmlparser2@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" + integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + domutils "^3.0.1" + entities "^4.3.0" + http-cache-semantics@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" @@ -5556,6 +5680,16 @@ limiter@^1.0.5: resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.5.tgz#8f92a25b3b16c6131293a0cc834b4a838a2aa7c2" integrity sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA== +link-preview-js@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/link-preview-js/-/link-preview-js-3.0.4.tgz#1e053f80ee20ef50d03e6742dc30dc8487112653" + integrity sha512-xsuxMigAZd4xmj6BIwMNuQjjpJdh0DWeIo1NXQgaoWSi9Z/dzz/Kxy6vzzsUonFlMTPJ1i0EC8aeOg/xrOMidg== + dependencies: + abort-controller "^3.0.0" + cheerio "1.0.0-rc.11" + cross-fetch "3.1.5" + url "0.11.0" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -5599,7 +5733,7 @@ lodash.clone@^4.3.2, lodash.clone@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= -lodash.clonedeep@^4.3.2: +lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= @@ -6256,6 +6390,13 @@ npmlog@^4.0.1: gauge "~2.7.3" set-blocking "~2.0.0" +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -6537,11 +6678,26 @@ parse-passwd@^1.0.0: resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + dependencies: + domhandler "^5.0.2" + parse5 "^7.0.0" + parse5@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== +parse5@^7.0.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + parseqs@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5" @@ -7020,6 +7176,11 @@ pumpify@^1.3.5: inherits "^2.0.3" pump "^2.0.0" +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== + punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" @@ -8657,6 +8818,11 @@ tslib@^2.3.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== +tslib@^2.4.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" + integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== + tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" @@ -8771,6 +8937,18 @@ undefsafe@^2.0.5: resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.5.tgz#38733b9327bdcd226db889fb723a6efd162e6e2c" integrity sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== +underscore-keypath@~0.0.22: + version "0.0.22" + resolved "https://registry.yarnpkg.com/underscore-keypath/-/underscore-keypath-0.0.22.tgz#48a528392bb6efc424be1caa56da4b5faccf264d" + integrity sha512-fU7aYj1J2LQd+jqdQ67AlCOZKK3Pl+VErS8fGYcgZG75XB9/bY+RLM+F2xEcKHhHNtLvqqFyXAoZQlLYfec3Xg== + dependencies: + underscore "*" + +underscore@*: + version "1.13.6" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" + integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== + undertaker-registry@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/undertaker-registry/-/undertaker-registry-1.0.1.tgz#5e4bda308e4a8a2ae584f9b9a4359a499825cc50" @@ -8931,15 +9109,26 @@ url-validation@^2.1.0: resolved "https://registry.yarnpkg.com/url-validation/-/url-validation-2.1.0.tgz#7c61b96bc8d215c040c3cddadbfd81f2bd3f3853" integrity sha512-DGEik6FuB31DEXnpGRDtDr6Re8GIzsWeXOCtN8lQP9bS0a9sa7MfOf5LDdKRSzipVckyU+DsEOJ3dIow+Gd/dA== +url@0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ== + dependencies: + punycode "1.3.2" + querystring "0.2.0" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -user-agent@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/user-agent/-/user-agent-1.0.4.tgz#61201431fc7e84ea4a5e1e76392f163a1539c9a4" - integrity sha512-NPTnJ89e6ttUK+Q3ZQ6aMFo4+4HAdvsb39IypyRw/bPjE/F8TjeVpB8uqFPnUCVbI6247qPryd8OLpkEYuOwWg== +user-agents@^1.0.1295: + version "1.0.1295" + resolved "https://registry.yarnpkg.com/user-agents/-/user-agents-1.0.1295.tgz#24cb53e431847470dbe29d3c857d061bcb1b52a3" + integrity sha512-9Rgw4X4FeHZ1d11X9zASRgLYlPKeBINZNRsitoL/RwNEXuNTnDiImMfqa5/+OoGBNRJ1kqxmH3bJL8Fu4m0VIg== + dependencies: + dot-json "^1.2.2" + lodash.clonedeep "^4.5.0" util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" From ffbd0798662234d669de21ce6ffa01b211791cd1 Mon Sep 17 00:00:00 2001 From: rob Date: Sat, 25 Feb 2023 06:57:24 -0500 Subject: [PATCH 4/7] v0.6.17 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4f4144d..bca9c70 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dtp-sites", - "version": "0.6.16", + "version": "0.6.17", "description": "Open source blogging engine for the Digital Telepresence Platform.", "main": "dtp-sites.js", "author": "DTP Technologies, LLC", From 1074f4f6242df836f6a1846f86221ba64c6c2c50 Mon Sep 17 00:00:00 2001 From: rob Date: Sat, 25 Feb 2023 06:58:34 -0500 Subject: [PATCH 5/7] v0.6.18 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bca9c70..be46700 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dtp-sites", - "version": "0.6.17", + "version": "0.6.18", "description": "Open source blogging engine for the Digital Telepresence Platform.", "main": "dtp-sites.js", "author": "DTP Technologies, LLC", From 9add8e57b641106e1827f7f0ed9d33c2e43af42c Mon Sep 17 00:00:00 2001 From: rob Date: Sat, 25 Feb 2023 07:27:56 -0500 Subject: [PATCH 6/7] fix for uniqueVisitCount --- app/services/resource.js | 2 +- app/views/post/view.pug | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/services/resource.js b/app/services/resource.js index a4f6d84..69415a4 100644 --- a/app/services/resource.js +++ b/app/services/resource.js @@ -61,7 +61,7 @@ class ResourceService extends SiteService { ); if (response.upsertedCount > 0) { - modelUpdate.$inc['stats.uniqueViewCount'] = 1; + modelUpdate.$inc['stats.uniqueVisitCount'] = 1; } /* diff --git a/app/views/post/view.pug b/app/views/post/view.pug index 6ada831..a340c3c 100644 --- a/app/views/post/view.pug +++ b/app/views/post/view.pug @@ -47,15 +47,16 @@ block content +renderButtonIcon('fa-trash', 'delete') .uk-width-auto - +renderButtonIcon('fa-eye', displayIntegerValue(post.stats.totalVisitCount)) + +renderButtonIcon('fa-eye', displayIntegerValue(post.stats.uniqueVisitCount)) .uk-width-auto +renderButtonIcon('fa-chevron-up', displayIntegerValue(post.stats.upvoteCount)) .uk-width-auto +renderButtonIcon('fa-chevron-down', displayIntegerValue(post.stats.downvoteCount)) .uk-width-auto +renderButtonIcon('fa-comment', displayIntegerValue(post.stats.commentCount)) + .uk-margin - != post.content + div!= post.content if post.updated .uk-margin From dec1cb62852c6220b5386953b392958d22cf822a Mon Sep 17 00:00:00 2001 From: rob Date: Sat, 25 Feb 2023 07:30:08 -0500 Subject: [PATCH 7/7] v0.6.19 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index be46700..a220254 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "dtp-sites", - "version": "0.6.18", + "version": "0.6.19", "description": "Open source blogging engine for the Digital Telepresence Platform.", "main": "dtp-sites.js", "author": "DTP Technologies, LLC",