@botonic/plugin-contentful
Version:
## What Does This Plugin Do?
82 lines • 4.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.KeywordsDelivery = void 0;
const tslib_1 = require("tslib");
const cms_1 = require("../../cms");
const search_1 = require("../../search");
const delivery_utils_1 = require("../delivery-utils");
class KeywordsDelivery {
constructor(delivery) {
this.delivery = delivery;
}
contentsWithKeywords(context, paging, modelsWithKeywords = this.delivery.getOptions()
.contentModelsWithKeywords || [
cms_1.ContentType.TEXT,
cms_1.ContentType.CAROUSEL,
cms_1.ContentType.URL,
], modelsWithSearchableByKeywords = [cms_1.ContentType.QUEUE]) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
// TODO maybe it's more efficient to get all contents (since most have keywords anyway and we normally have few non
// TopContents such as Buttons)
const fromKeywords = this.entriesWithKeywords(context, modelsWithKeywords, paging);
const fromSearchable = this.entriesWithSearchableByKeywords(context, modelsWithSearchableByKeywords);
return (yield fromKeywords).concat(yield fromSearchable);
});
}
static candidateFromEntry(entry, keywords, priority) {
const contentModel = delivery_utils_1.ContentfulEntryUtils.getContentModel(entry);
if (!entry.fields.shortText) {
console.error(`No shortText found for content of type ${contentModel} and name: ${entry.fields.name}`);
entry.fields.shortText = entry.fields.name;
}
const contentId = new cms_1.TopContentId(contentModel, entry.sys.id);
return new search_1.SearchCandidate(contentId, new cms_1.CommonFields(contentId.id, entry.fields.name, {
shortText: entry.fields.shortText,
keywords,
}), priority);
}
entriesWithSearchableByKeywords(context, models) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const getWithKeywords = (contentType) => this.delivery.getEntries(context, {
// eslint-disable-next-line @typescript-eslint/naming-convention
content_type: contentType,
'fields.searchableBy[exists]': true,
include: 1,
});
const promises = [];
for (const contentType of models) {
promises.push(getWithKeywords(contentType));
}
const queues = yield Promise.all(promises);
const results = [];
for (const q of queues) {
for (const queueFields of q.items) {
for (const result of KeywordsDelivery.candidatesFromQueue(queueFields)) {
results.push(result);
}
}
}
return results;
});
}
static candidatesFromQueue(queue) {
return queue.fields.searchableBy.map(searchable => this.candidateFromEntry(queue, searchable.fields.keywords, searchable.fields.priority));
}
entriesWithKeywords(context, models, paging) {
const getWithKeywords = (contentType) => this.delivery.getEntries(context, Object.assign(Object.assign({}, paging), {
// eslint-disable-next-line @typescript-eslint/naming-convention
content_type: contentType, 'fields.keywords[exists]': true, include: 0 }));
const promises = [];
for (const contentType of models) {
promises.push(getWithKeywords(contentType));
}
return Promise.all(promises).then(entryCollections => KeywordsDelivery.flatMapEntryCollection(entryCollections).map(entry => KeywordsDelivery.candidateFromEntry(entry, entry.fields.keywords || [])));
}
static flatMapEntryCollection(collections) {
const entries = [];
collections.forEach(collection => entries.push(...collection.items));
return entries;
}
}
exports.KeywordsDelivery = KeywordsDelivery;
//# sourceMappingURL=keywords.js.map