From ca4aae97332694adbd07dea40a0bee02a2c02fcc Mon Sep 17 00:00:00 2001 From: Jamie Tanna Date: Tue, 16 Nov 2021 08:29:32 +0000 Subject: [PATCH 1/2] Refactor context handler usage To make this more scalable, as we add more handlers for retrieving context, we can use a `getHandler` method that can provide the relevant handler. This then allows us to pass around that handler, not worrying what it is, just that it's doing its job. --- src/events/fetch-context/index.js | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/events/fetch-context/index.js b/src/events/fetch-context/index.js index bd28ff2..7f918a4 100644 --- a/src/events/fetch-context/index.js +++ b/src/events/fetch-context/index.js @@ -5,21 +5,19 @@ const granary = require('./granary') const meetup = require('./meetup') const openGraph = require('./open-graph') -async function getContext (url) { - // for specific sites, use custom parsing +async function getHandler (url) { if (meetup.isMeetupUrl(url)) { - const properties = await meetup.fetchContext(url) - if (properties) { - return properties - } + return meetup } else if (eventbrite.isEventbriteUrl(url)) { - const properties = await eventbrite.fetchContext(url) - if (properties) { - return properties - } + return eventbrite + } else { + return granary } - // otherwise fallback to Granary, and then OpenGraph - const properties = await granary.fetchContext(url) +} + +async function getContext (handler, url) { + // if our fetching fails, fallback to OpenGraph + const properties = await handler.fetchContext(url) if (properties) { return properties } @@ -30,7 +28,8 @@ async function getContext (url) { exports.handler = async function subscribe (event) { const data = await arc.tables() const { url } = JSON.parse(event.Records[0].Sns.Message) - const properties = await getContext(url) + const handler = await getHandler(url) + const properties = await getContext(handler, url) await data.contexts.put({ url, properties From 719ef68cfd56ce2dfb4f98b464b059b6f3aea556 Mon Sep 17 00:00:00 2001 From: Jamie Tanna Date: Tue, 16 Nov 2021 08:56:49 +0000 Subject: [PATCH 2/2] Log which handler has been used for context retrieval To better improve visibility of which context retrieval handler has been used, we can add a `name` to each handler that can be logged when retrieving. In the case of our fallback to OpenGraph, we can log a slightly more appropriate message. --- src/events/fetch-context/eventbrite.js | 5 +++++ src/events/fetch-context/granary.js | 6 +++++- src/events/fetch-context/index.js | 3 ++- src/events/fetch-context/meetup.js | 5 +++++ src/events/fetch-context/open-graph.js | 6 +++++- 5 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/events/fetch-context/eventbrite.js b/src/events/fetch-context/eventbrite.js index 4227fdf..52b922b 100644 --- a/src/events/fetch-context/eventbrite.js +++ b/src/events/fetch-context/eventbrite.js @@ -1,6 +1,10 @@ const fetch = require('node-fetch') const logger = require('@architect/shared/logger') +function name () { + return 'Eventbrite' +} + function isEventbriteUrl (url) { return ((url.indexOf('https://eventbrite.com') > -1) || (url.indexOf('https://www.eventbrite.com') > -1) || @@ -29,6 +33,7 @@ async function fetchContext (url) { } module.exports = { + name, isEventbriteUrl, fetchContext } diff --git a/src/events/fetch-context/granary.js b/src/events/fetch-context/granary.js index 3b9a92b..a1f2257 100644 --- a/src/events/fetch-context/granary.js +++ b/src/events/fetch-context/granary.js @@ -1,6 +1,10 @@ const fetch = require('node-fetch') const logger = require('@architect/shared/logger') +function name () { + return 'Granary' +} + function getGranaryUrl (url) { const granaryBaseUrl = 'https://granary.io/' const safeUrl = encodeURIComponent(url) @@ -26,4 +30,4 @@ async function fetchContext (url) { return mf2.items[0].properties } -module.exports = { fetchContext } +module.exports = { name, fetchContext } diff --git a/src/events/fetch-context/index.js b/src/events/fetch-context/index.js index 7f918a4..9933b3e 100644 --- a/src/events/fetch-context/index.js +++ b/src/events/fetch-context/index.js @@ -19,9 +19,11 @@ async function getContext (handler, url) { // if our fetching fails, fallback to OpenGraph const properties = await handler.fetchContext(url) if (properties) { + logger.info(`Context fetched ${url} using ${handler.name()}`, JSON.stringify(properties)) return properties } + logger.info(`Context fetching ${url} using fallback ${openGraph.name()}`, JSON.stringify(properties)) return await openGraph.fetchContext(url) } @@ -34,5 +36,4 @@ exports.handler = async function subscribe (event) { url, properties }) - logger.info(`Context fetched ${url}`, JSON.stringify(properties)) } diff --git a/src/events/fetch-context/meetup.js b/src/events/fetch-context/meetup.js index b914fe3..4e7dcf9 100644 --- a/src/events/fetch-context/meetup.js +++ b/src/events/fetch-context/meetup.js @@ -1,6 +1,10 @@ const fetch = require('node-fetch') const logger = require('@architect/shared/logger') +function name () { + return 'Meetup' +} + function isMeetupUrl (url) { return ((url.indexOf('https://meetup.com') > -1) || (url.indexOf('https://www.meetup.com') > -1)) @@ -27,6 +31,7 @@ async function fetchContext (url) { } module.exports = { + name, isMeetupUrl, fetchContext } diff --git a/src/events/fetch-context/open-graph.js b/src/events/fetch-context/open-graph.js index 011541f..e72fd82 100644 --- a/src/events/fetch-context/open-graph.js +++ b/src/events/fetch-context/open-graph.js @@ -1,6 +1,10 @@ const ogs = require('open-graph-scraper') const logger = require('@architect/shared/logger') +function name () { + return 'OpenGraph' +} + function setName (result, properties) { if (result.ogTitle) { properties.name = [result.ogTitle] @@ -61,4 +65,4 @@ async function fetchContext (url) { return properties } -module.exports = { fetchContext } +module.exports = { name, fetchContext }