social-butterfly
Version:
Incorporate federated social network protocols easily. Used with Hello, world federated blog.
91 lines (72 loc) • 2.92 kB
JavaScript
;
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);
}