-
-
Notifications
You must be signed in to change notification settings - Fork 8
/
handler.js
115 lines (100 loc) · 2.97 KB
/
handler.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import { formatPost, setIndex } from './helper-functions.js';
async function addIndex(req) {
const body = JSON.parse(req.body);
const currState = body.post.current;
const newArticle = formatPost(currState);
const index = setIndex(newArticle.url);
try {
const addObj = await index.saveObject(newArticle);
return {
statusCode: 200,
body: JSON.stringify({
addedArticleId: newArticle.id,
algoliaRes: addObj
})
};
} catch (err) {
console.error(err);
return {
statusCode: 500,
body: `Error: ${err}`
};
}
}
async function deleteIndex(req) {
// Deleting a published article returns the article
// obj in `req.body.post.previous`. Unpublishing a published
// article returns the article obj in `req.body.post.current`
const body = JSON.parse(req.body);
const prevState = body.post.previous;
const currState = body.post.current;
const targetId = prevState.id ? prevState.id : currState.id;
const publishedStatus = prevState.status === 'published' ? true : false;
// Only update Algolia index if a published article is
// unpublished or deleted
if (publishedStatus) {
// Deleted articles don't include an article url. But since
// every article must include at least one author, set index
// based on primary author page url instead
const primaryAuthorUrl = prevState.authors
? prevState.authors[0].url
: currState.authors[0].url;
const index = setIndex(primaryAuthorUrl);
try {
const deleteObj = await index.deleteObject(targetId);
return {
statusCode: 200,
body: JSON.stringify({
deletedArticleId: targetId,
algoliaRes: deleteObj
})
};
} catch (err) {
console.error(err);
return {
statusCode: 500,
body: `Error: ${err}`
};
}
}
}
async function updateIndex(req) {
const body = JSON.parse(req.body);
const prevState = body.post.previous;
const currState = body.post.current;
// The Ghost webhook returns only the updated values in
// `req.body.post.previous`. Parse the keys from that
// and only trigger an update if specific values changed
const keys = Object.keys(prevState);
const targets = [
'slug',
'title',
'authors',
'tags',
'feature_image',
'published_at'
];
const diff = keys.filter((val) => targets.includes(val));
// Check for meaningful changes here before updating Algolia index
if (diff.length > 0) {
const updatedArticle = formatPost(currState);
const index = setIndex(updatedArticle.url);
try {
const saveObj = await index.saveObject(updatedArticle);
return {
statusCode: 200,
body: JSON.stringify({
updatedArticleId: updatedArticle.id,
algoliaRes: saveObj
})
};
} catch (err) {
console.error(err);
return {
statusCode: 500,
body: `Error: ${err}`
};
}
}
}
export { addIndex, updateIndex, deleteIndex };