scrivito
Version:
Scrivito is a professional, yet easy to use SaaS Enterprise Content Management Service, built for digital agencies and medium to large businesses. It is completely maintenance-free, cost-effective, and has unprecedented performance and security.
79 lines (69 loc) • 2.08 kB
text/typescript
import {
BackendSuggestParams,
BackendSuggestResponse,
ObjSpaceId,
cmsRetrieval,
getWorkspaceId,
isWorkspaceObjSpaceId,
} from 'scrivito_sdk/client';
import {
QueryParams,
assertNotUsingInMemoryTenant,
getContentStateId,
} from 'scrivito_sdk/data';
import {
LoadableData,
createLoadableCollection,
loadableWithDefault,
} from 'scrivito_sdk/loadable';
export interface SuggestOptions {
attributes?: string[];
limit?: number;
}
type CollectionKey = [ObjSpaceId, BackendSuggestParams];
const loadableCollection = createLoadableCollection({
name: 'suggest',
loadElement: ([objSpaceId, params]: CollectionKey) => ({
loader: () =>
cmsRetrieval.retrieveSuggest(getWorkspaceId(objSpaceId), params),
invalidation: () =>
loadableWithDefault('', () => getContentStateId(objSpaceId)),
}),
});
export function suggest(
objSpaceId: ObjSpaceId,
prefix: string,
options: SuggestOptions,
fromSearch?: Partial<QueryParams>
): string[] {
assertNotUsingInMemoryTenant('Search API');
const results: string[] = [];
if (!isWorkspaceObjSpaceId(objSpaceId)) return results;
const loadableData = getLoadable(objSpaceId, prefix, options, fromSearch);
return loadableData.getWithDefault({ results }).results;
}
// For test purpose only
export function storeSuggest(
objSpaceId: ObjSpaceId,
prefix: string,
options: SuggestOptions,
fromSearch: Partial<QueryParams> | undefined,
response: BackendSuggestResponse
): void {
getLoadable(objSpaceId, prefix, options, fromSearch).set(response);
}
function getLoadable(
objSpaceId: ObjSpaceId,
prefix: string,
{ attributes, limit }: SuggestOptions,
fromSearch?: Partial<QueryParams>
): LoadableData<BackendSuggestResponse> {
const backendParams: BackendSuggestParams = {
prefix,
options: { site_aware: true },
};
if (fromSearch) backendParams.from_search = fromSearch;
if (attributes) backendParams.fields = attributes;
if (typeof limit === 'number') backendParams.limit = limit;
return loadableCollection.get([objSpaceId, backendParams]);
}