Skip to content

Commit 463f89c

Browse files
authored
feat: index only visible_to_public articles to algolia (#3001)
* feat: index only visible_to_public articles to algolia * refactor: move isVisibleToPublic to article model * chore: improvements on indexing * spec: updated tests
1 parent 7ae2d1e commit 463f89c

File tree

6 files changed

+34
-15
lines changed

6 files changed

+34
-15
lines changed

scripts/reindex_articles.coffee

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ mongojs = require 'mongojs'
33
path = require 'path'
44
{ indexForSearch, indexForAlgolia } = Save = require '../src/api/apps/articles/model/distribute'
55
Article = require '../src/api/apps/articles/model/index.js'
6+
ArticleModel = require '../src/api/models/article.coffee'
67
search = require '../src/api/lib/elasticsearch'
78
async = require 'async'
9+
{ cloneDeep } = require 'lodash'
810

911
# Setup environment variables
1012
env = require 'node-env-file'
@@ -28,9 +30,12 @@ indexWorker = (article, cb) ->
2830
articlePresent = Article.present(article)
2931
indexForSearch articlePresent, () =>
3032
console.log('indexed on Elasticsearch ', article.id or article._id)
31-
if (articlePresent.published or articlePresent.scheduled_publish_at) and articlePresent.indexable
33+
isArticleVisibleToPublic = new ArticleModel(cloneDeep article).isVisibleToPublic()
34+
if (articlePresent.indexable and isArticleVisibleToPublic)
3235
indexForAlgolia articlePresent, () =>
3336
console.log('indexed on Algolia ', article.id or article._id)
3437
cb()
3538
else
36-
cb()
39+
removeFromAlgolia articlePresent, () =>
40+
console.log('removed from Algolia ', article.id or article._id)
41+
cb()

src/api/apps/articles/model/distribute.coffee

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ moment = require 'moment'
9797
section.body
9898
tags = article.tags
9999
tags = tags.concat article.vertical.name if article.vertical
100-
101100
search.client.index(
102101
index: search.index,
103102
type: 'article',
@@ -109,7 +108,7 @@ moment = require 'moment'
109108
published: article.published
110109
published_at: article.published_at
111110
scheduled_publish_at: article.scheduled_publish_at
112-
visible_to_public: article.published and sections?.length > 0 and article.channel_id?.toString() is EDITORIAL_CHANNEL
111+
visible_to_public: new Article(cloneDeep article).isVisibleToPublic()
113112
author: article.author and article.author.name or ''
114113
featured: article.featured
115114
tags: tags
@@ -122,9 +121,6 @@ moment = require 'moment'
122121
)
123122

124123
@indexForAlgolia = (article, cb) ->
125-
if article.sections
126-
sections = for section in article.sections
127-
section.body
128124
tags = article.tags
129125
tags = tags.concat article.vertical.name if article.vertical
130126

src/api/apps/articles/model/index.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -341,15 +341,18 @@ export const backfill = callback => {
341341
articles,
342342
(article, cb) => {
343343
console.log("---------------------")
344-
console.log("---------------------")
344+
console.log("---------------------")
345345
console.log("---------------------")
346346
console.log("---------------------")
347347
console.log("---------------------")
348348
console.log("---------------------")
349349
console.log(
350-
`Backfilling article: ${articles.indexOf(article) + 1} of ${articles.length}, ${article.slugs[article.slugs.length - 1]}, published at ${article.published_at}`
350+
`Backfilling article: ${articles.indexOf(article) + 1} of ${
351+
articles.length
352+
}, ${article.slugs[article.slugs.length - 1]}, published at ${
353+
article.published_at
354+
}`
351355
)
352-
353356

354357
/*
355358
Write backfill logic here. Make sure to callback with cb()

src/api/apps/articles/model/save.coffee

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,13 @@ url = require 'url'
1010
Q = require 'bluebird-q'
1111
request = require 'superagent'
1212
Article = require './index'
13+
ArticleModel = require './../../../../api/models/article.coffee'
1314
{ distributeArticle, deleteArticleFromSailthru, getArticleUrl, indexForSearch, indexForAlgolia, removeFromAlgolia } = require './distribute'
1415
{ ARTSY_URL, GEMINI_CLOUDFRONT_URL } = process.env
1516
artsyXapp = require('artsy-xapp')
1617
{ sanitizeLink } = require "./sanitize.js"
1718
chalk = require 'chalk'
19+
{ cloneDeep } = require 'lodash'
1820

1921
@onPublish = (article, cb) =>
2022
unless article.published_at or article.scheduled_publish_at
@@ -163,14 +165,18 @@ removeStopWords = (title) ->
163165
if article.published or article.scheduled_publish_at
164166
article = setOnPublishFields article
165167
indexForSearch(article, ->) if article.indexable
166-
indexForAlgolia(article, ->) if article.indexable
167168
distributeArticle article, =>
168169
db.articles.save sanitize(article), callback
169170
else
170171
indexForSearch(article, ->) if article.indexable
171-
removeFromAlgolia(article.id, ->) if article.indexable
172172
db.articles.save sanitize(article), callback
173173

174+
isArticleVisibleToPublic = new ArticleModel(cloneDeep article).isVisibleToPublic()
175+
if (isArticleVisibleToPublic and article.indexable)
176+
indexForAlgolia(article, ->)
177+
else
178+
removeFromAlgolia(article.id, ->)
179+
174180
# TODO: Create a Joi plugin for this https://github.com/hapijs/joi/issues/577
175181
sanitize = (article) ->
176182
if article.sections

src/api/apps/articles/test/model/save.spec.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,6 @@ describe("Save", () => {
615615
if (err) {
616616
done(err)
617617
}
618-
indexForAlgolia.callCount.should.eql(1)
619618
indexForSearch.callCount.should.eql(1)
620619
done()
621620
})
@@ -643,7 +642,7 @@ describe("Save", () => {
643642

644643
it("indexes published & indexable articles to algolia", done => {
645644
Save.sanitizeAndSave(() => {
646-
Article.find("5086df098523e60002000011", (err, _article) => {
645+
Article.find("54276766fd4f50996aeca2b8", (err, _article) => {
647646
if (err) {
648647
done(err)
649648
}
@@ -653,7 +652,14 @@ describe("Save", () => {
653652
})(null, {
654653
indexable: true,
655654
published: true,
656-
_id: ObjectId("5086df098523e60002000011"),
655+
_id: ObjectId("54276766fd4f50996aeca2b8"),
656+
sections: [
657+
{
658+
type: "text",
659+
body: "<a href='http://artsy.net/artist/andy-warhol'>link</a>",
660+
},
661+
],
662+
channel_id: "5086df098523e60002000018",
657663
})
658664
})
659665

src/api/models/article.coffee

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ module.exports = class Article extends Backbone.Model
4141
isEditorial: ->
4242
@get('channel_id')?.toString() is EDITORIAL_CHANNEL
4343

44+
isVisibleToPublic: ->
45+
@get('published') && @isEditorial() && @get('sections')?.length > 0
46+
4447
replaceTagWith: (htmlStr, findTag, replaceTag) ->
4548
$ = cheerio.load(htmlStr)
4649
$(findTag).each ->

0 commit comments

Comments
 (0)