Added verified member and verify method to Mention entity

closes https://github.com/TryGhost/Team/issues/2548

Rather than use a setter here we've used a verify method which takes the HTML
string and naively validates that the target URL is present. This is so that the
logic of verification is encapsulated in the Mention, and should mean that
erroneous verification doesn't happen.

We could consider down the line that the verify method fetches the content
itself, but if we're to do that we should pass in `got` as a param, so that it's
possible to stub in tests.

One thing to think about when it comes time to making this as performant as
possible is doing a single fetch of the source document and using that for
verification and metadata extraction. At that point we should probably
consolidate both of those operations, either moving the metadata extraction into
the Mention entity (passing in any necessary deps) OR we move the verification
out to the same layer as metadata extraction.
This commit is contained in:
Fabien "egg" O'Carroll 2023-02-13 19:18:17 +07:00
parent bf6bcdbff3
commit 90b7a3f4d0
2 changed files with 30 additions and 0 deletions

View File

@ -12,6 +12,23 @@ module.exports = class Mention {
return this.#id; return this.#id;
} }
/** @type {boolean} */
#verified = false;
get verified() {
return this.#verified;
}
/**
* @param {string} html
*/
verify(html) {
if (html.includes(this.target.href)) {
this.#verified = true;
} else {
this.#verified = false;
}
}
/** @type {URL} */ /** @type {URL} */
#source; #source;
get source() { get source() {

View File

@ -32,6 +32,19 @@ describe('Mention', function () {
}); });
}); });
describe('verify', function () {
it('Does basic check for the target URL and updates verified property', async function () {
const mention = await Mention.create(validInput);
assert(!mention.verified);
mention.verify('<a href="https://target.com/">');
assert(mention.verified);
mention.verify('<a href="https://not-da-target.com">');
assert(!mention.verified);
});
});
describe('create', function () { describe('create', function () {
it('Will error with invalid inputs', async function () { it('Will error with invalid inputs', async function () {
const invalidInputs = [ const invalidInputs = [