Skip to content

Commit 5bc7e35

Browse files
committed
Add coveo jwt caching
1 parent 74d8746 commit 5bc7e35

File tree

1 file changed

+77
-51
lines changed

1 file changed

+77
-51
lines changed

assets/js/coveo.js

Lines changed: 77 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,82 @@
1-
document.addEventListener('DOMContentLoaded', async function () {
1+
function isJwtExpired(token) {
2+
const parts = token.split(".");
3+
if (parts.length !== 3) {
4+
return true;
5+
}
26

3-
// Netlify function to get the coveo search token via API
4-
async function getsearchObj() {
5-
const response = await fetch(
6-
window.location.origin+"/api/v1/auth/search_token"
7-
);
8-
return response.json();
9-
}
7+
const [_, payload] = parts;
8+
const decodedPayload = atob(payload);
9+
const payloadObj = JSON.parse(decodedPayload);
1010

11-
const searchObj = await getsearchObj()
12-
Coveo.SearchEndpoint.configureCloudV2Endpoint(searchObj.org_id, searchObj.token, `https://${searchObj.org_id}.org.coveo.com/rest/search`);
11+
const currentTime = Math.floor(Date.now() / 1000);
12+
const expTime = payloadObj.exp;
13+
return currentTime >= expTime;
14+
}
1315

14-
const analyticsElement = document.querySelector('.CoveoAnalytics');
15-
if (analyticsElement) {
16-
const analyticsEndpoint = `https://${searchObj.org_id}.analytics.org.coveo.com/rest/ua`;
17-
analyticsElement.setAttribute('data-endpoint', analyticsEndpoint);
18-
}
16+
async function getsearchObj() {
17+
const response = await fetch(
18+
window.location.origin + "/api/v1/auth/search_token"
19+
);
20+
return response.json();
21+
}
22+
23+
document.addEventListener("DOMContentLoaded", async function () {
24+
const token = localStorage.getItem("coveo_jwt_v1");
25+
const org_id = localStorage.getItem("coveo_org_id_v1");
26+
let searchObj = { token, org_id };
27+
if (token === null || org_id === null || isJwtExpired(token)) {
28+
searchObj = await getsearchObj();
29+
localStorage.setItem("coveo_jwt_v1", searchObj.token);
30+
localStorage.setItem("coveo_org_id_v1", searchObj.org_id);
31+
}
1932

20-
const root = document.getElementById("search");
21-
const searchBoxRoot = document.getElementById("searchbox");
22-
Coveo.initSearchbox(searchBoxRoot, "/search.html");
23-
var resetbtn = document.querySelector('#reset_btn');
24-
if (resetbtn) {
25-
resetbtn.onclick = function () {
26-
document.querySelector('.coveo-facet-header-eraser').click();
27-
};
33+
Coveo.SearchEndpoint.configureCloudV2Endpoint(
34+
searchObj.org_id,
35+
searchObj.token,
36+
`https://${searchObj.org_id}.org.coveo.com/rest/search`
37+
);
38+
39+
const analyticsElement = document.querySelector(".CoveoAnalytics");
40+
if (analyticsElement) {
41+
const analyticsEndpoint = `https://${searchObj.org_id}.analytics.org.coveo.com/rest/ua`;
42+
analyticsElement.setAttribute("data-endpoint", analyticsEndpoint);
43+
}
44+
45+
const root = document.getElementById("search");
46+
const searchBoxRoot = document.getElementById("searchbox");
47+
Coveo.initSearchbox(searchBoxRoot, "/search.html");
48+
var resetbtn = document.querySelector("#reset_btn");
49+
if (resetbtn) {
50+
resetbtn.onclick = function () {
51+
document.querySelector(".coveo-facet-header-eraser").click();
52+
};
53+
}
54+
Coveo.$$(root).on("querySuccess", function (e, args) {
55+
resetbtn.style.display = "block";
56+
});
57+
Coveo.$$(root).on("afterComponentsInitialization", function (e, data) {
58+
setTimeout(function () {
59+
document.querySelector(".CoveoOmnibox input").value = Coveo.state(
60+
root,
61+
"q"
62+
);
63+
}, 1000);
64+
});
65+
Coveo.$("#search").on("newResultsDisplayed", function (e, args) {
66+
for (var i = 0; i < e.target.lastChild.children.length; i++) {
67+
//Remove the title for tooltip box
68+
Coveo.$(".CoveoResultLink").removeAttr("title");
2869
}
29-
Coveo.$$(root).on("querySuccess", function (e, args) {
30-
resetbtn.style.display = "block";
31-
});
32-
Coveo.$$(root).on('afterComponentsInitialization', function (e, data) {
33-
setTimeout(function () {
34-
document.querySelector('.CoveoOmnibox input').value = Coveo.state(root, 'q');
35-
}, 1000);
36-
});
37-
Coveo.$('#search').on("newResultsDisplayed", function (e, args) {
38-
for (var i = 0; i < e.target.lastChild.children.length; i++) {
39-
//Remove the title for tooltip box
40-
Coveo.$('.CoveoResultLink').removeAttr('title');
41-
}
42-
});
43-
Coveo.init(root, {
44-
f5_product_module: {
45-
dependsOn: "@f5_product",
46-
dependsOnCondition: (parentFacet) => {
47-
const id = parentFacet.options.id;
48-
const value = "NGINX Management Suite";
49-
const selected = parentFacet.queryStateModel.get(`f:${id}`)
50-
return selected.includes(value);
51-
}
52-
}
53-
});
54-
})
55-
56-
70+
});
71+
Coveo.init(root, {
72+
f5_product_module: {
73+
dependsOn: "@f5_product",
74+
dependsOnCondition: (parentFacet) => {
75+
const id = parentFacet.options.id;
76+
const value = "NGINX Management Suite";
77+
const selected = parentFacet.queryStateModel.get(`f:${id}`);
78+
return selected.includes(value);
79+
},
80+
},
81+
});
82+
});

0 commit comments

Comments
 (0)