UNPKG

social-butterfly

Version:

Incorporate federated social network protocols easily. Used with Hello, world federated blog.

91 lines (72 loc) 2.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.reply = reply; exports.default = void 0; var _crawler = require("./util/crawler"); var _cheerio = _interopRequireDefault(require("cheerio")); var _email = require("./email"); var _nodeFetch = _interopRequireDefault(require("node-fetch")); var _discover_user = require("./discover_user"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } async function reply(req, contentOwner, content, userRemote, mentionedRemoteUsers) { try { await (0, _nodeFetch.default)(userRemote.webmention_url, { method: 'POST', body: new URLSearchParams({ source: content.url, target: content.thread || userRemote.profile_url }) }); } catch (ex) {// Not a big deal if this fails. // TODO(mime): add logging later. } } var _default = options => async (req, res) => { if (!req.query.resource || !req.body.source || !req.body.target) { return res.sendStatus(400); } const user = await options.getLocalUser(req.query.resource, req); if (!user) { return res.sendStatus(404); } await handleMention(req, options, user, req.body.source, req.body.target); res.sendStatus(202); }; exports.default = _default; async function handleMention(req, options, user, sourceUrl, targetUrl) { const html = await (0, _crawler.fetchText)(sourceUrl); const $ = _cheerio.default.load(html); if (!$('.h-entry')) { return; } const userRemoteInfo = await (0, _discover_user.getUserRemoteInfo)(sourceUrl, user.username); let userRemote = await options.getRemoteUser(userRemoteInfo.username, userRemoteInfo.profile_url); if (!userRemote) { await options.saveRemoteUser(userRemoteInfo); userRemote = await options.getRemoteUser(user.username, userRemoteInfo.profile_url); } const localContent = await options.getLocalContent(targetUrl, req); const existingModelEntry = await options.getRemoteContent(user.username, sourceUrl); await options.saveRemoteContent(Object.assign({}, existingModelEntry?.dataValues, { id: existingModelEntry?.id || undefined, avatar: userRemote.avatar, date_created: new Date($('.h-entry .t-published').attr('datetime') || new Date()), date_updated: new Date($('.h-entry .t-updated').attr('datetime') || new Date()), from_user: userRemote.profile_url, from_user_remote_id: userRemote.id, creator: userRemote.name, link: sourceUrl, local_content_name: localContent?.name, post_id: sourceUrl, title: $('.h-entry .p-name').first().text() || $('.h-entry .p-summary').first().text(), to_username: user.username, type: 'comment', username: userRemote.username, view: (0, _crawler.sanitizeHTML)($('.h-entry .e-content').html()) })); (0, _email.mention)(req, user.username, undefined /* fromEmail */ , user.email, sourceUrl); }