@webiny/api-headless-cms 6.5.0-beta.8 → 6.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/features/contentEntry/PublishEntry/PublishEntryUseCase.d.ts +2 -2
- package/features/contentEntry/PublishEntry/PublishEntryUseCase.js +6 -2
- package/features/contentEntry/PublishEntry/PublishEntryUseCase.js.map +1 -1
- package/features/contentEntry/PublishEntry/abstractions.d.ts +8 -1
- package/features/contentEntry/PublishEntry/abstractions.js.map +1 -1
- package/graphql/schema/contentEntries.js +17 -2
- package/graphql/schema/contentEntries.js.map +1 -1
- package/package.json +24 -24
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Result } from "@webiny/feature/api";
|
|
2
2
|
import { EntryEventPublisher } from "../../../features/contentEntry/EntryEventPublisher/index.js";
|
|
3
|
-
import { PublishEntryUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
3
|
+
import { PublishEntryUseCase as UseCaseAbstraction, type IPublishEntryUseCaseOptions } from "./abstractions.js";
|
|
4
4
|
import { PublishEntryRepository } from "./abstractions.js";
|
|
5
5
|
import { AccessControl } from "../../../features/shared/abstractions.js";
|
|
6
6
|
import { GetRevisionByIdUseCase } from "../../../features/contentEntry/GetRevisionById/index.js";
|
|
@@ -13,7 +13,7 @@ declare class PublishEntryUseCaseImpl implements UseCaseAbstraction.Interface {
|
|
|
13
13
|
private eventPublisher;
|
|
14
14
|
private createPublishEntryDataFactory;
|
|
15
15
|
constructor(repository: PublishEntryRepository.Interface, accessControl: AccessControl.Interface, getRevisionById: GetRevisionByIdUseCase.Interface, eventPublisher: EntryEventPublisher.Interface, createPublishEntryDataFactory: CreatePublishEntryDataFactory.Interface);
|
|
16
|
-
execute<T extends CmsEntryValues = CmsEntryValues>(model: CmsModel, id: string): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>>;
|
|
16
|
+
execute<T extends CmsEntryValues = CmsEntryValues>(model: CmsModel, id: string, options?: IPublishEntryUseCaseOptions<T>): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>>;
|
|
17
17
|
}
|
|
18
18
|
export declare const PublishEntryUseCase: import("@webiny/di").Implementation<typeof PublishEntryUseCaseImpl>;
|
|
19
19
|
export {};
|
|
@@ -14,7 +14,7 @@ class PublishEntryUseCaseImpl {
|
|
|
14
14
|
this.eventPublisher = eventPublisher;
|
|
15
15
|
this.createPublishEntryDataFactory = createPublishEntryDataFactory;
|
|
16
16
|
}
|
|
17
|
-
async execute(model, id) {
|
|
17
|
+
async execute(model, id, options) {
|
|
18
18
|
const canAccess = await this.accessControl.canAccessEntry({
|
|
19
19
|
model,
|
|
20
20
|
pw: "p"
|
|
@@ -29,7 +29,11 @@ class PublishEntryUseCaseImpl {
|
|
|
29
29
|
pw: "p"
|
|
30
30
|
});
|
|
31
31
|
if (!canAccessEntry) return Result.fail(EntryNotAuthorizedError.fromModel(model));
|
|
32
|
-
const
|
|
32
|
+
const source = options?.values ? {
|
|
33
|
+
...originalEntry,
|
|
34
|
+
values: options.values
|
|
35
|
+
} : originalEntry;
|
|
36
|
+
const dataResult = await this.createPublishEntryDataFactory.create(model, source);
|
|
33
37
|
if (dataResult.isFail()) return Result.fail(dataResult.error);
|
|
34
38
|
const { entry } = dataResult.value;
|
|
35
39
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentEntry/PublishEntry/PublishEntryUseCase.js","sources":["../../../../src/features/contentEntry/PublishEntry/PublishEntryUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { EntryEventPublisher } from \"~/features/contentEntry/EntryEventPublisher/index.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"features/contentEntry/PublishEntry/PublishEntryUseCase.js","sources":["../../../../src/features/contentEntry/PublishEntry/PublishEntryUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { EntryEventPublisher } from \"~/features/contentEntry/EntryEventPublisher/index.js\";\nimport {\n PublishEntryUseCase as UseCaseAbstraction,\n type IPublishEntryUseCaseOptions\n} from \"./abstractions.js\";\nimport { PublishEntryRepository } from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/index.js\";\nimport type { CmsEntry, CmsEntryValues, CmsModel } from \"~/types/index.js\";\nimport {\n EntryBeforePublishEvent,\n EntryAfterPublishEvent,\n EntryPublishErrorEvent\n} from \"./events.js\";\nimport { EntryNotAuthorizedError, EntryNotFoundError } from \"~/domain/contentEntry/errors.js\";\nimport { CreatePublishEntryDataFactory } from \"~/features/contentEntry/entryDataFactories/CreatePublishEntryDataFactory/index.js\";\n\nclass PublishEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private repository: PublishEntryRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getRevisionById: GetRevisionByIdUseCase.Interface,\n private eventPublisher: EntryEventPublisher.Interface,\n private createPublishEntryDataFactory: CreatePublishEntryDataFactory.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string,\n options?: IPublishEntryUseCaseOptions<T>\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n const canAccess = await this.accessControl.canAccessEntry({ model, pw: \"p\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const result = await this.getRevisionById.execute<T>(model, id);\n\n if (result.isFail()) {\n return Result.fail(new EntryNotFoundError(id));\n }\n\n const originalEntry = result.value;\n\n const canAccessEntry = await this.accessControl.canAccessEntry({\n model,\n entry: originalEntry,\n pw: \"p\"\n });\n\n if (!canAccessEntry) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const source = options?.values\n ? { ...originalEntry, values: options.values }\n : originalEntry;\n const dataResult = await this.createPublishEntryDataFactory.create<T>(model, source);\n if (dataResult.isFail()) {\n return Result.fail(dataResult.error);\n }\n const { entry } = dataResult.value;\n\n try {\n await this.eventPublisher.publish(\n new EntryBeforePublishEvent({\n entry,\n original: originalEntry,\n model\n })\n );\n\n const repositoryResult = await this.repository.execute(model, entry);\n\n if (repositoryResult.isFail()) {\n await this.eventPublisher.publish(\n new EntryPublishErrorEvent({\n entry,\n original: originalEntry,\n model,\n error: repositoryResult.error\n })\n );\n return Result.fail(repositoryResult.error);\n }\n\n const publishedEntry = repositoryResult.value;\n\n await this.eventPublisher.publish(\n new EntryAfterPublishEvent({\n entry: publishedEntry,\n original: originalEntry,\n model\n })\n );\n\n return Result.ok(entry);\n } catch (error) {\n await this.eventPublisher.publish(\n new EntryPublishErrorEvent({\n entry,\n original: originalEntry,\n model,\n error: error as Error\n })\n );\n return Result.fail(error as UseCaseAbstraction.Error);\n }\n }\n}\n\nexport const PublishEntryUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: PublishEntryUseCaseImpl,\n dependencies: [\n PublishEntryRepository,\n AccessControl,\n GetRevisionByIdUseCase,\n EntryEventPublisher,\n CreatePublishEntryDataFactory\n ]\n});\n"],"names":["PublishEntryUseCaseImpl","repository","accessControl","getRevisionById","eventPublisher","createPublishEntryDataFactory","model","id","options","canAccess","Result","EntryNotAuthorizedError","result","EntryNotFoundError","originalEntry","canAccessEntry","source","dataResult","entry","EntryBeforePublishEvent","repositoryResult","EntryPublishErrorEvent","publishedEntry","EntryAfterPublishEvent","error","PublishEntryUseCase","createImplementation","UseCaseAbstraction","PublishEntryRepository","AccessControl","GetRevisionByIdUseCase","EntryEventPublisher","CreatePublishEntryDataFactory"],"mappings":";;;;;;;;AAmBA,MAAMA;IACF,YACYC,UAA4C,EAC5CC,aAAsC,EACtCC,eAAiD,EACjDC,cAA6C,EAC7CC,6BAAsE,CAChF;aALUJ,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,eAAe,GAAfA;aACAC,cAAc,GAAdA;aACAC,6BAA6B,GAA7BA;IACT;IAEH,MAAM,QACFC,KAAe,EACfC,EAAU,EACVC,OAAwC,EACc;QACtD,MAAMC,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAEH;YAAO,IAAI;QAAI;QAC3E,IAAI,CAACG,WACD,OAAOC,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACL;QAGzD,MAAMM,SAAS,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAIN,OAAOC;QAE5D,IAAIK,OAAO,MAAM,IACb,OAAOF,OAAO,IAAI,CAAC,IAAIG,mBAAmBN;QAG9C,MAAMO,gBAAgBF,OAAO,KAAK;QAElC,MAAMG,iBAAiB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAC3DT;YACA,OAAOQ;YACP,IAAI;QACR;QAEA,IAAI,CAACC,gBACD,OAAOL,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACL;QAGzD,MAAMU,SAASR,SAAS,SAClB;YAAE,GAAGM,aAAa;YAAE,QAAQN,QAAQ,MAAM;QAAC,IAC3CM;QACN,MAAMG,aAAa,MAAM,IAAI,CAAC,6BAA6B,CAAC,MAAM,CAAIX,OAAOU;QAC7E,IAAIC,WAAW,MAAM,IACjB,OAAOP,OAAO,IAAI,CAACO,WAAW,KAAK;QAEvC,MAAM,EAAEC,KAAK,EAAE,GAAGD,WAAW,KAAK;QAElC,IAAI;YACA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIE,wBAAwB;gBACxBD;gBACA,UAAUJ;gBACVR;YACJ;YAGJ,MAAMc,mBAAmB,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAACd,OAAOY;YAE9D,IAAIE,iBAAiB,MAAM,IAAI;gBAC3B,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,uBAAuB;oBACvBH;oBACA,UAAUJ;oBACVR;oBACA,OAAOc,iBAAiB,KAAK;gBACjC;gBAEJ,OAAOV,OAAO,IAAI,CAACU,iBAAiB,KAAK;YAC7C;YAEA,MAAME,iBAAiBF,iBAAiB,KAAK;YAE7C,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIG,uBAAuB;gBACvB,OAAOD;gBACP,UAAUR;gBACVR;YACJ;YAGJ,OAAOI,OAAO,EAAE,CAACQ;QACrB,EAAE,OAAOM,OAAO;YACZ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIH,uBAAuB;gBACvBH;gBACA,UAAUJ;gBACVR;gBACA,OAAOkB;YACX;YAEJ,OAAOd,OAAO,IAAI,CAACc;QACvB;IACJ;AACJ;AAEO,MAAMC,0CAAsBC,qBAAqB;IACpD,aAAaC;IACb,gBAAgB3B;IAChB,cAAc;QACV4B;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -4,8 +4,15 @@ import type { EntryNotAuthorizedError, EntryNotFoundError, EntryPersistenceError
|
|
|
4
4
|
/**
|
|
5
5
|
* PublishEntry Use Case - Publishes an entry revision.
|
|
6
6
|
*/
|
|
7
|
+
export interface IPublishEntryUseCaseOptions<T extends CmsEntryValues = CmsEntryValues> {
|
|
8
|
+
/**
|
|
9
|
+
* Values to publish instead of the revision's stored values. They go through the same
|
|
10
|
+
* validation as stored values do.
|
|
11
|
+
*/
|
|
12
|
+
values?: T;
|
|
13
|
+
}
|
|
7
14
|
export interface IPublishEntryUseCase {
|
|
8
|
-
execute<T extends CmsEntryValues = CmsEntryValues>(model: CmsModel, id: string): Promise<Result<CmsEntry<T>, UseCaseError>>;
|
|
15
|
+
execute<T extends CmsEntryValues = CmsEntryValues>(model: CmsModel, id: string, options?: IPublishEntryUseCaseOptions<T>): Promise<Result<CmsEntry<T>, UseCaseError>>;
|
|
9
16
|
}
|
|
10
17
|
export interface IPublishEntryUseCaseErrors {
|
|
11
18
|
notAuthorized: EntryNotAuthorizedError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentEntry/PublishEntry/abstractions.js","sources":["../../../../src/features/contentEntry/PublishEntry/abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\nimport type { CmsEntry, CmsEntryValues, CmsModel } from \"~/types/index.js\";\nimport type {\n EntryNotAuthorizedError,\n EntryNotFoundError,\n EntryPersistenceError,\n EntryValidationError\n} from \"~/domain/contentEntry/errors.js\";\n\n/**\n * PublishEntry Use Case - Publishes an entry revision.\n */\nexport interface IPublishEntryUseCase {\n execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string
|
|
1
|
+
{"version":3,"file":"features/contentEntry/PublishEntry/abstractions.js","sources":["../../../../src/features/contentEntry/PublishEntry/abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\nimport type { CmsEntry, CmsEntryValues, CmsModel } from \"~/types/index.js\";\nimport type {\n EntryNotAuthorizedError,\n EntryNotFoundError,\n EntryPersistenceError,\n EntryValidationError\n} from \"~/domain/contentEntry/errors.js\";\n\n/**\n * PublishEntry Use Case - Publishes an entry revision.\n */\nexport interface IPublishEntryUseCaseOptions<T extends CmsEntryValues = CmsEntryValues> {\n /**\n * Values to publish instead of the revision's stored values. They go through the same\n * validation as stored values do.\n */\n values?: T;\n}\n\nexport interface IPublishEntryUseCase {\n execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string,\n options?: IPublishEntryUseCaseOptions<T>\n ): Promise<Result<CmsEntry<T>, UseCaseError>>;\n}\n\nexport interface IPublishEntryUseCaseErrors {\n notAuthorized: EntryNotAuthorizedError;\n notFound: EntryNotFoundError;\n validation: EntryValidationError;\n storage: EntryPersistenceError;\n}\n\ntype UseCaseError = IPublishEntryUseCaseErrors[keyof IPublishEntryUseCaseErrors];\n\n/** Publish a content entry. */\nexport const PublishEntryUseCase = createAbstraction<IPublishEntryUseCase>(\"PublishEntryUseCase\");\n\nexport namespace PublishEntryUseCase {\n export type Interface = IPublishEntryUseCase;\n export type Error = UseCaseError;\n export type Return<T extends CmsEntryValues = CmsEntryValues> = Promise<\n Result<CmsEntry<T>, UseCaseError>\n >;\n}\n\n/**\n * Payload for before publish event\n */\nexport interface EntryBeforePublishEventPayload {\n entry: CmsEntry;\n original: CmsEntry;\n model: CmsModel;\n}\n\n/**\n * Payload for after publish event\n */\nexport interface EntryAfterPublishEventPayload {\n entry: CmsEntry;\n original: CmsEntry;\n model: CmsModel;\n}\n\n/**\n * Payload for publish error event\n */\nexport interface EntryPublishErrorEventPayload {\n entry: CmsEntry;\n original: CmsEntry;\n model: CmsModel;\n error: Error;\n}\n\n/**\n * PublishEntryRepository - Handles storage operations for publishing entries.\n */\nexport interface IPublishEntryRepository {\n execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n entry: CmsEntry<T>\n ): Promise<Result<CmsEntry<T>, RepositoryError>>;\n}\n\nexport interface IPublishEntryRepositoryErrors {\n storage: EntryPersistenceError;\n}\n\ntype RepositoryError = IPublishEntryRepositoryErrors[keyof IPublishEntryRepositoryErrors];\n\nexport const PublishEntryRepository =\n createAbstraction<IPublishEntryRepository>(\"PublishEntryRepository\");\n\nexport namespace PublishEntryRepository {\n export type Interface = IPublishEntryRepository;\n export type Error = RepositoryError;\n}\n"],"names":["PublishEntryUseCase","createAbstraction","PublishEntryRepository"],"mappings":";AAsCO,MAAMA,sBAAsBC,kBAAwC;AAsDpE,MAAMC,yBACTD,kBAA2C"}
|
|
@@ -16,6 +16,16 @@ const createDate = (date)=>{
|
|
|
16
16
|
return new Date();
|
|
17
17
|
}
|
|
18
18
|
};
|
|
19
|
+
const SEARCH_CANDIDATES_LIMIT = 100;
|
|
20
|
+
const getSearchRank = (title, query)=>{
|
|
21
|
+
const normalizedQuery = query?.trim().toLowerCase();
|
|
22
|
+
if (!normalizedQuery) return 0;
|
|
23
|
+
const normalizedTitle = (title || "").trim().toLowerCase();
|
|
24
|
+
if (normalizedTitle === normalizedQuery) return 0;
|
|
25
|
+
else if (normalizedTitle.startsWith(normalizedQuery)) return 1;
|
|
26
|
+
else if (normalizedTitle.includes(normalizedQuery)) return 2;
|
|
27
|
+
return 3;
|
|
28
|
+
};
|
|
19
29
|
const createCmsEntryRecord = (model, entry)=>({
|
|
20
30
|
id: entry.id,
|
|
21
31
|
entryId: entry.entryId,
|
|
@@ -239,11 +249,12 @@ const createContentEntriesSchema = ({ context })=>{
|
|
|
239
249
|
async searchContentEntries (_, args, context) {
|
|
240
250
|
const { modelIds, fields, query, limit = 10 } = args;
|
|
241
251
|
const models = await context.cms.listModels();
|
|
252
|
+
const storageLimit = query ? Math.max(limit, SEARCH_CANDIDATES_LIMIT) : limit;
|
|
242
253
|
const getters = models.filter((model)=>modelIds.includes(model.modelId)).map(async (model)=>{
|
|
243
254
|
const listLatest = await context.container.resolve(ListLatestEntriesUseCase);
|
|
244
255
|
const where = {};
|
|
245
256
|
const result = await listLatest.execute(model, {
|
|
246
|
-
limit,
|
|
257
|
+
limit: storageLimit,
|
|
247
258
|
where,
|
|
248
259
|
search: query ? query : void 0,
|
|
249
260
|
fields: fields || []
|
|
@@ -254,7 +265,11 @@ const createContentEntriesSchema = ({ context })=>{
|
|
|
254
265
|
});
|
|
255
266
|
try {
|
|
256
267
|
const entries = await Promise.all(getters).then((results)=>results.reduce((result, item)=>result.concat(item), []));
|
|
257
|
-
return new Response(entries.sort((a, b)=>
|
|
268
|
+
return new Response(entries.sort((a, b)=>{
|
|
269
|
+
const rank = getSearchRank(a.title, query) - getSearchRank(b.title, query);
|
|
270
|
+
if (0 !== rank) return rank;
|
|
271
|
+
return b.savedOn.getTime() - a.savedOn.getTime();
|
|
272
|
+
}).slice(0, limit));
|
|
258
273
|
} catch (ex) {
|
|
259
274
|
return new ErrorResponse(ex);
|
|
260
275
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql/schema/contentEntries.js","sources":["../../../src/graphql/schema/contentEntries.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { ErrorResponse, Response } from \"@webiny/handler-graphql\";\nimport type {\n CmsContext,\n CmsEntry,\n CmsEntryListWhere,\n CmsIdentity,\n CmsModel\n} from \"~/types/index.js\";\nimport { getEntryTitle } from \"~/utils/getEntryTitle.js\";\nimport type { ICmsGraphQLSchemaPlugin } from \"~/plugins/index.js\";\nimport { createCmsGraphQLSchemaPlugin } from \"~/plugins/index.js\";\nimport { getEntryDescription } from \"~/utils/getEntryDescription.js\";\nimport { getEntryImage } from \"~/utils/getEntryImage.js\";\nimport { entryFieldFromStorageTransform } from \"~/utils/entryStorage.js\";\nimport type { GraphQLFieldResolver } from \"@webiny/handler-graphql/types.js\";\nimport { ENTRY_META_FIELDS, isDateTimeEntryMetaField } from \"~/constants.js\";\nimport NotAuthorizedResponse from \"@webiny/api-core/graphql/security/NotAuthorizedResponse.js\";\nimport { ListLatestEntriesUseCase } from \"~/features/contentEntry/ListEntries/index.js\";\n\ninterface EntriesByModel {\n [key: string]: string[];\n}\n\ntype GetContentEntryType = \"latest\" | \"published\" | \"exact\";\n\nconst createDate = (date: string | null): Date | null => {\n if (!date) {\n return null;\n }\n\n try {\n return new Date(date);\n } catch {\n return new Date();\n }\n};\n\ninterface CmsEntryRecord {\n id: string;\n entryId: string;\n model: {\n modelId: string;\n name: string;\n };\n status: string;\n title: string;\n description?: string | null;\n image?: string | null;\n\n /**\n * Entry-level meta fields. 👇\n */\n createdOn: Date;\n modifiedOn: Date | null;\n savedOn: Date;\n createdBy: CmsIdentity;\n modifiedBy: CmsIdentity | null;\n savedBy: CmsIdentity;\n firstPublishedOn: Date | null;\n lastPublishedOn: Date | null;\n firstPublishedBy: CmsIdentity | null;\n lastPublishedBy: CmsIdentity | null;\n\n /**\n * Revision-level meta fields. 👇\n */\n revisionCreatedOn: Date;\n revisionModifiedOn: Date | null;\n revisionSavedOn: Date;\n revisionCreatedBy: CmsIdentity;\n revisionModifiedBy: CmsIdentity | null;\n revisionSavedBy: CmsIdentity;\n revisionFirstPublishedOn: Date | null;\n revisionLastPublishedOn: Date | null;\n revisionFirstPublishedBy: CmsIdentity | null;\n revisionLastPublishedBy: CmsIdentity | null;\n\n wbyAco_location?: {\n folderId?: string | null;\n };\n}\n\nconst createCmsEntryRecord = (model: CmsModel, entry: CmsEntry): CmsEntryRecord => {\n return {\n id: entry.id,\n entryId: entry.entryId,\n model: {\n modelId: model.modelId,\n name: model.name\n },\n status: entry.status,\n title: getEntryTitle(model, entry),\n description: getEntryDescription(model, entry),\n image: getEntryImage(model, entry),\n\n /**\n * Entry-level meta fields. 👇\n */\n createdOn: createDate(entry.createdOn)!,\n modifiedOn: createDate(entry.modifiedOn),\n savedOn: createDate(entry.savedOn)!,\n createdBy: entry.createdBy,\n savedBy: entry.savedBy,\n modifiedBy: entry.modifiedBy,\n firstPublishedOn: createDate(entry.firstPublishedOn),\n lastPublishedOn: createDate(entry.lastPublishedOn),\n firstPublishedBy: entry.firstPublishedBy,\n lastPublishedBy: entry.lastPublishedBy,\n\n /**\n * Revision-level meta fields. 👇\n */\n revisionCreatedOn: createDate(entry.revisionCreatedOn)!,\n revisionSavedOn: createDate(entry.revisionSavedOn)!,\n revisionModifiedOn: createDate(entry.revisionModifiedOn),\n revisionCreatedBy: entry.revisionCreatedBy,\n revisionModifiedBy: entry.revisionModifiedBy,\n revisionSavedBy: entry.revisionSavedBy,\n revisionFirstPublishedOn: createDate(entry.revisionFirstPublishedOn),\n revisionLastPublishedOn: createDate(entry.revisionLastPublishedOn),\n revisionFirstPublishedBy: entry.revisionFirstPublishedBy,\n revisionLastPublishedBy: entry.revisionLastPublishedBy,\n\n wbyAco_location: {\n folderId: entry.location?.folderId || null\n }\n };\n};\n\ninterface FetchMethod {\n (model: CmsModel, ids: string[]): Promise<CmsEntry[]>;\n}\n\nconst getFetchMethod = (type: GetContentEntryType, context: CmsContext): FetchMethod => {\n if (!getContentEntriesMethods[type]) {\n throw new WebinyError(\n `Unknown getContentEntries method \"${type}\". Could not fetch content entries.`,\n \"UNKNOWN_METHOD_ERROR\",\n {\n type\n }\n );\n }\n const methodName = getContentEntriesMethods[type] as GetContentEntryMethods;\n if (!context.cms[methodName]) {\n throw new WebinyError(\n `Unknown context.cms method \"${methodName}\". Could not fetch content entries.`,\n \"UNKNOWN_METHOD_ERROR\",\n {\n type,\n methodName\n }\n );\n }\n\n return context.cms[methodName];\n};\n\n/**\n * Function to get the list of content entries depending on latest, published or exact GraphQL queries.\n */\ninterface GetContentEntriesParams {\n args: {\n entries: Pick<CmsEntry, \"id\" | \"modelId\">[];\n };\n context: CmsContext;\n type: GetContentEntryType;\n}\n\nenum GetContentEntryMethods {\n getLatestEntriesByIds = \"getLatestEntriesByIds\",\n getPublishedEntriesByIds = \"getPublishedEntriesByIds\",\n getEntriesByIds = \"getEntriesByIds\"\n}\n\nconst getContentEntriesMethods = {\n latest: \"getLatestEntriesByIds\",\n published: \"getPublishedEntriesByIds\",\n exact: \"getEntriesByIds\"\n};\nconst getContentEntries = async (\n params: GetContentEntriesParams\n): Promise<Response | ErrorResponse> => {\n const { args, context, type } = params;\n\n const method = getFetchMethod(type, context);\n\n const models = await context.cms.listModels();\n\n const modelsMap = models.reduce(\n (collection, model) => {\n collection[model.modelId] = model;\n return collection;\n },\n {} as Record<string, CmsModel>\n );\n\n const argsEntries = args.entries as Pick<CmsEntry, \"id\" | \"modelId\">[];\n\n const entriesByModel = argsEntries.reduce((collection, ref) => {\n if (!collection[ref.modelId]) {\n collection[ref.modelId] = [];\n } else if (collection[ref.modelId].includes(ref.id)) {\n return collection;\n }\n collection[ref.modelId].push(ref.id);\n return collection;\n }, {} as EntriesByModel);\n\n const getters: Promise<CmsEntry[]>[] = Object.keys(entriesByModel).map(async modelId => {\n return method(modelsMap[modelId], entriesByModel[modelId]);\n });\n\n if (getters.length === 0) {\n return new Response([]);\n }\n\n try {\n const results = await Promise.all(getters);\n\n const entries = results\n .reduce<CmsEntryRecord[]>((collection, items) => {\n return collection.concat(\n items.map(item => {\n const model = modelsMap[item.modelId];\n\n return createCmsEntryRecord(model, item);\n })\n );\n }, [])\n .filter(Boolean);\n\n return new Response(entries);\n } catch (ex) {\n return new ErrorResponse(ex);\n }\n};\n\n/**\n * Function to fetch a single content entry depending on latest, published or exact GraphQL query.\n */\ninterface GetContentEntryParams {\n args: {\n entry: Pick<CmsEntry, \"id\" | \"modelId\">;\n };\n context: CmsContext;\n type: \"latest\" | \"published\" | \"exact\";\n}\n\nconst getContentEntry = async (\n params: GetContentEntryParams\n): Promise<Response<CmsEntryRecord | null> | NotAuthorizedResponse> => {\n const { args, context, type } = params;\n if (!getContentEntriesMethods[type]) {\n throw new WebinyError(\n `Unknown getContentEntry method \"${type}\". Could not fetch content entry.`,\n \"UNKNOWN_METHOD_ERROR\",\n {\n args,\n type\n }\n );\n }\n\n const method = getFetchMethod(type, context);\n\n const { modelId, id } = args.entry;\n const models = await context.cms.listModels();\n const model = models.find(m => m.modelId === modelId);\n\n if (!model) {\n return new NotAuthorizedResponse({\n data: {\n modelId\n }\n });\n }\n\n const result = await method(model, [id]);\n\n const entry = result.shift();\n if (!entry) {\n return new Response(null);\n }\n\n return new Response(createCmsEntryRecord(model, entry));\n};\n/**\n * As we support description field, we need to transform the value from storage.\n */\nconst createResolveDescription = (): GraphQLFieldResolver<any, any, CmsContext> => {\n return async (parent, _, context) => {\n const models = await context.cms.listModels();\n const model = models.find(({ modelId }) => {\n return parent.model.modelId === modelId;\n });\n if (!model) {\n return null;\n }\n const field = model.fields.find(f => f.fieldId === model.descriptionFieldId);\n if (!field) {\n return null;\n }\n const value = parent.description || parent[field.fieldId];\n if (!value) {\n return null;\n }\n return entryFieldFromStorageTransform({\n context,\n model,\n field,\n value\n });\n };\n};\n\ninterface Params {\n context: CmsContext;\n}\n\nexport const createContentEntriesSchema = ({\n context\n}: Params): ICmsGraphQLSchemaPlugin<CmsContext> => {\n if (!context.cms.MANAGE) {\n const plugin = createCmsGraphQLSchemaPlugin({\n typeDefs: \"\",\n resolvers: {}\n });\n plugin.name = `headless-cms.graphql.schema.${context.cms.type}.empty`;\n return plugin;\n }\n\n const onByMetaFields = ENTRY_META_FIELDS.map(field => {\n const fieldType = isDateTimeEntryMetaField(field) ? \"DateTime\" : \"CmsIdentity\";\n\n return `${field}: ${fieldType}`;\n }).join(\"\\n\");\n\n const plugin = createCmsGraphQLSchemaPlugin({\n // Had to remove /* GraphQL */ because it causes issues with oxfmt formatting.\n typeDefs: `\n type CmsModelMeta {\n modelId: String!\n name: String!\n }\n\n type CmsPublishedContentEntry {\n id: ID!\n entryId: String!\n title: String\n description: String\n image: String\n }\n\n type CmsContentEntry {\n id: ID!\n entryId: String!\n model: CmsModelMeta!\n status: String!\n published: CmsPublishedContentEntry\n title: String!\n description: String\n image: String\n \n ${onByMetaFields}\n \n wbyAco_location: WbyAcoLocation\n }\n\n type CmsContentEntriesResponse {\n data: [CmsContentEntry!]\n error: CmsError\n }\n\n type CmsContentEntryResponse {\n data: CmsContentEntry\n error: CmsError\n }\n\n input CmsModelEntryInput {\n modelId: ID!\n id: ID!\n }\n\n extend type Query {\n # Search content entries for given content models using the query string.\n searchContentEntries(\n modelIds: [ID!]!\n query: String\n fields: [String!]\n limit: Int\n ): CmsContentEntriesResponse!\n\n # Get content entry meta data\n getContentEntry(entry: CmsModelEntryInput!): CmsContentEntryResponse!\n\n getLatestContentEntry(entry: CmsModelEntryInput!): CmsContentEntryResponse!\n getPublishedContentEntry(entry: CmsModelEntryInput!): CmsContentEntryResponse!\n\n # Get content entries meta data\n getContentEntries(entries: [CmsModelEntryInput!]!): CmsContentEntriesResponse!\n getLatestContentEntries(entries: [CmsModelEntryInput!]!): CmsContentEntriesResponse!\n getPublishedContentEntries(\n entries: [CmsModelEntryInput!]!\n ): CmsContentEntriesResponse!\n }\n `,\n resolvers: {\n CmsContentEntry: {\n published: async (parent, _, context) => {\n try {\n const models = await context.cms.listModels();\n const model = models.find(({ modelId }) => {\n return parent.model.modelId === modelId;\n });\n if (!model) {\n return null;\n }\n const [entry] = await context.cms.getPublishedEntriesByIds(model, [\n parent.id\n ]);\n if (!entry) {\n return null;\n }\n return createCmsEntryRecord(model, entry);\n } catch {\n return null;\n }\n },\n description: createResolveDescription()\n },\n CmsPublishedContentEntry: {\n description: createResolveDescription()\n },\n Query: {\n async searchContentEntries(_, args: any, context) {\n const { modelIds, fields, query, limit = 10 } = args;\n const models = await context.cms.listModels();\n\n const getters = models\n .filter(model => modelIds.includes(model.modelId))\n .map(async model => {\n const listLatest =\n await context.container.resolve(ListLatestEntriesUseCase);\n const where: CmsEntryListWhere = {};\n\n const result = await listLatest.execute(model, {\n limit,\n where,\n search: !!query ? query : undefined,\n fields: fields || []\n });\n // TODO figure a better way to handle errors in parallel execution\n if (result.isFail()) {\n throw result.error;\n }\n const { entries } = result.value;\n return entries.map((entry: CmsEntry) => {\n return createCmsEntryRecord(model, entry);\n });\n });\n\n try {\n const entries = await Promise.all(getters).then(results =>\n results.reduce((result, item) => result.concat(item), [])\n );\n\n return new Response(\n entries\n .sort((a, b) => b.savedOn.getTime() - a.savedOn.getTime())\n .slice(0, limit)\n );\n } catch (ex) {\n return new ErrorResponse(ex);\n }\n },\n async getContentEntry(_, args: any, context) {\n return getContentEntry({\n args,\n context,\n type: \"exact\"\n });\n },\n async getLatestContentEntry(_, args: any, context) {\n return getContentEntry({\n args,\n context,\n type: \"latest\"\n });\n },\n async getPublishedContentEntry(_, args: any, context) {\n return getContentEntry({\n args,\n context,\n type: \"published\"\n });\n },\n async getContentEntries(_, args: any, context) {\n return getContentEntries({\n args,\n context,\n type: \"exact\"\n });\n },\n async getLatestContentEntries(_, args: any, context) {\n return getContentEntries({\n args,\n context,\n type: \"latest\"\n });\n },\n async getPublishedContentEntries(_, args: any, context) {\n return getContentEntries({\n args,\n context,\n type: \"published\"\n });\n }\n }\n }\n });\n\n plugin.name = `headless-cms.graphql.schema.${context.cms.type}.content-entries`;\n\n return plugin;\n};\n"],"names":["createDate","date","Date","createCmsEntryRecord","model","entry","getEntryTitle","getEntryDescription","getEntryImage","getFetchMethod","type","context","getContentEntriesMethods","WebinyError","methodName","getContentEntries","params","args","method","models","modelsMap","collection","argsEntries","entriesByModel","ref","getters","Object","modelId","Response","results","Promise","entries","items","item","Boolean","ex","ErrorResponse","getContentEntry","id","m","NotAuthorizedResponse","result","createResolveDescription","parent","_","field","f","value","entryFieldFromStorageTransform","createContentEntriesSchema","plugin","createCmsGraphQLSchemaPlugin","onByMetaFields","ENTRY_META_FIELDS","fieldType","isDateTimeEntryMetaField","modelIds","fields","query","limit","listLatest","ListLatestEntriesUseCase","where","undefined","a","b"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"graphql/schema/contentEntries.js","sources":["../../../src/graphql/schema/contentEntries.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { ErrorResponse, Response } from \"@webiny/handler-graphql\";\nimport type {\n CmsContext,\n CmsEntry,\n CmsEntryListWhere,\n CmsIdentity,\n CmsModel\n} from \"~/types/index.js\";\nimport { getEntryTitle } from \"~/utils/getEntryTitle.js\";\nimport type { ICmsGraphQLSchemaPlugin } from \"~/plugins/index.js\";\nimport { createCmsGraphQLSchemaPlugin } from \"~/plugins/index.js\";\nimport { getEntryDescription } from \"~/utils/getEntryDescription.js\";\nimport { getEntryImage } from \"~/utils/getEntryImage.js\";\nimport { entryFieldFromStorageTransform } from \"~/utils/entryStorage.js\";\nimport type { GraphQLFieldResolver } from \"@webiny/handler-graphql/types.js\";\nimport { ENTRY_META_FIELDS, isDateTimeEntryMetaField } from \"~/constants.js\";\nimport NotAuthorizedResponse from \"@webiny/api-core/graphql/security/NotAuthorizedResponse.js\";\nimport { ListLatestEntriesUseCase } from \"~/features/contentEntry/ListEntries/index.js\";\n\ninterface EntriesByModel {\n [key: string]: string[];\n}\n\ntype GetContentEntryType = \"latest\" | \"published\" | \"exact\";\n\nconst createDate = (date: string | null): Date | null => {\n if (!date) {\n return null;\n }\n\n try {\n return new Date(date);\n } catch {\n return new Date();\n }\n};\n\n/**\n * How many matches per model `searchContentEntries` reads before ranking them by title.\n */\nconst SEARCH_CANDIDATES_LIMIT = 100;\n\n/**\n * Lower rank comes first: an exact title match, then a title starting with the query,\n * then a title containing it, then entries that matched on some other field.\n */\nconst getSearchRank = (title: string, query?: string): number => {\n const normalizedQuery = query?.trim().toLowerCase();\n if (!normalizedQuery) {\n return 0;\n }\n const normalizedTitle = (title || \"\").trim().toLowerCase();\n if (normalizedTitle === normalizedQuery) {\n return 0;\n } else if (normalizedTitle.startsWith(normalizedQuery)) {\n return 1;\n } else if (normalizedTitle.includes(normalizedQuery)) {\n return 2;\n }\n return 3;\n};\n\ninterface CmsEntryRecord {\n id: string;\n entryId: string;\n model: {\n modelId: string;\n name: string;\n };\n status: string;\n title: string;\n description?: string | null;\n image?: string | null;\n\n /**\n * Entry-level meta fields. 👇\n */\n createdOn: Date;\n modifiedOn: Date | null;\n savedOn: Date;\n createdBy: CmsIdentity;\n modifiedBy: CmsIdentity | null;\n savedBy: CmsIdentity;\n firstPublishedOn: Date | null;\n lastPublishedOn: Date | null;\n firstPublishedBy: CmsIdentity | null;\n lastPublishedBy: CmsIdentity | null;\n\n /**\n * Revision-level meta fields. 👇\n */\n revisionCreatedOn: Date;\n revisionModifiedOn: Date | null;\n revisionSavedOn: Date;\n revisionCreatedBy: CmsIdentity;\n revisionModifiedBy: CmsIdentity | null;\n revisionSavedBy: CmsIdentity;\n revisionFirstPublishedOn: Date | null;\n revisionLastPublishedOn: Date | null;\n revisionFirstPublishedBy: CmsIdentity | null;\n revisionLastPublishedBy: CmsIdentity | null;\n\n wbyAco_location?: {\n folderId?: string | null;\n };\n}\n\nconst createCmsEntryRecord = (model: CmsModel, entry: CmsEntry): CmsEntryRecord => {\n return {\n id: entry.id,\n entryId: entry.entryId,\n model: {\n modelId: model.modelId,\n name: model.name\n },\n status: entry.status,\n title: getEntryTitle(model, entry),\n description: getEntryDescription(model, entry),\n image: getEntryImage(model, entry),\n\n /**\n * Entry-level meta fields. 👇\n */\n createdOn: createDate(entry.createdOn)!,\n modifiedOn: createDate(entry.modifiedOn),\n savedOn: createDate(entry.savedOn)!,\n createdBy: entry.createdBy,\n savedBy: entry.savedBy,\n modifiedBy: entry.modifiedBy,\n firstPublishedOn: createDate(entry.firstPublishedOn),\n lastPublishedOn: createDate(entry.lastPublishedOn),\n firstPublishedBy: entry.firstPublishedBy,\n lastPublishedBy: entry.lastPublishedBy,\n\n /**\n * Revision-level meta fields. 👇\n */\n revisionCreatedOn: createDate(entry.revisionCreatedOn)!,\n revisionSavedOn: createDate(entry.revisionSavedOn)!,\n revisionModifiedOn: createDate(entry.revisionModifiedOn),\n revisionCreatedBy: entry.revisionCreatedBy,\n revisionModifiedBy: entry.revisionModifiedBy,\n revisionSavedBy: entry.revisionSavedBy,\n revisionFirstPublishedOn: createDate(entry.revisionFirstPublishedOn),\n revisionLastPublishedOn: createDate(entry.revisionLastPublishedOn),\n revisionFirstPublishedBy: entry.revisionFirstPublishedBy,\n revisionLastPublishedBy: entry.revisionLastPublishedBy,\n\n wbyAco_location: {\n folderId: entry.location?.folderId || null\n }\n };\n};\n\ninterface FetchMethod {\n (model: CmsModel, ids: string[]): Promise<CmsEntry[]>;\n}\n\nconst getFetchMethod = (type: GetContentEntryType, context: CmsContext): FetchMethod => {\n if (!getContentEntriesMethods[type]) {\n throw new WebinyError(\n `Unknown getContentEntries method \"${type}\". Could not fetch content entries.`,\n \"UNKNOWN_METHOD_ERROR\",\n {\n type\n }\n );\n }\n const methodName = getContentEntriesMethods[type] as GetContentEntryMethods;\n if (!context.cms[methodName]) {\n throw new WebinyError(\n `Unknown context.cms method \"${methodName}\". Could not fetch content entries.`,\n \"UNKNOWN_METHOD_ERROR\",\n {\n type,\n methodName\n }\n );\n }\n\n return context.cms[methodName];\n};\n\n/**\n * Function to get the list of content entries depending on latest, published or exact GraphQL queries.\n */\ninterface GetContentEntriesParams {\n args: {\n entries: Pick<CmsEntry, \"id\" | \"modelId\">[];\n };\n context: CmsContext;\n type: GetContentEntryType;\n}\n\nenum GetContentEntryMethods {\n getLatestEntriesByIds = \"getLatestEntriesByIds\",\n getPublishedEntriesByIds = \"getPublishedEntriesByIds\",\n getEntriesByIds = \"getEntriesByIds\"\n}\n\nconst getContentEntriesMethods = {\n latest: \"getLatestEntriesByIds\",\n published: \"getPublishedEntriesByIds\",\n exact: \"getEntriesByIds\"\n};\nconst getContentEntries = async (\n params: GetContentEntriesParams\n): Promise<Response | ErrorResponse> => {\n const { args, context, type } = params;\n\n const method = getFetchMethod(type, context);\n\n const models = await context.cms.listModels();\n\n const modelsMap = models.reduce(\n (collection, model) => {\n collection[model.modelId] = model;\n return collection;\n },\n {} as Record<string, CmsModel>\n );\n\n const argsEntries = args.entries as Pick<CmsEntry, \"id\" | \"modelId\">[];\n\n const entriesByModel = argsEntries.reduce((collection, ref) => {\n if (!collection[ref.modelId]) {\n collection[ref.modelId] = [];\n } else if (collection[ref.modelId].includes(ref.id)) {\n return collection;\n }\n collection[ref.modelId].push(ref.id);\n return collection;\n }, {} as EntriesByModel);\n\n const getters: Promise<CmsEntry[]>[] = Object.keys(entriesByModel).map(async modelId => {\n return method(modelsMap[modelId], entriesByModel[modelId]);\n });\n\n if (getters.length === 0) {\n return new Response([]);\n }\n\n try {\n const results = await Promise.all(getters);\n\n const entries = results\n .reduce<CmsEntryRecord[]>((collection, items) => {\n return collection.concat(\n items.map(item => {\n const model = modelsMap[item.modelId];\n\n return createCmsEntryRecord(model, item);\n })\n );\n }, [])\n .filter(Boolean);\n\n return new Response(entries);\n } catch (ex) {\n return new ErrorResponse(ex);\n }\n};\n\n/**\n * Function to fetch a single content entry depending on latest, published or exact GraphQL query.\n */\ninterface GetContentEntryParams {\n args: {\n entry: Pick<CmsEntry, \"id\" | \"modelId\">;\n };\n context: CmsContext;\n type: \"latest\" | \"published\" | \"exact\";\n}\n\nconst getContentEntry = async (\n params: GetContentEntryParams\n): Promise<Response<CmsEntryRecord | null> | NotAuthorizedResponse> => {\n const { args, context, type } = params;\n if (!getContentEntriesMethods[type]) {\n throw new WebinyError(\n `Unknown getContentEntry method \"${type}\". Could not fetch content entry.`,\n \"UNKNOWN_METHOD_ERROR\",\n {\n args,\n type\n }\n );\n }\n\n const method = getFetchMethod(type, context);\n\n const { modelId, id } = args.entry;\n const models = await context.cms.listModels();\n const model = models.find(m => m.modelId === modelId);\n\n if (!model) {\n return new NotAuthorizedResponse({\n data: {\n modelId\n }\n });\n }\n\n const result = await method(model, [id]);\n\n const entry = result.shift();\n if (!entry) {\n return new Response(null);\n }\n\n return new Response(createCmsEntryRecord(model, entry));\n};\n/**\n * As we support description field, we need to transform the value from storage.\n */\nconst createResolveDescription = (): GraphQLFieldResolver<any, any, CmsContext> => {\n return async (parent, _, context) => {\n const models = await context.cms.listModels();\n const model = models.find(({ modelId }) => {\n return parent.model.modelId === modelId;\n });\n if (!model) {\n return null;\n }\n const field = model.fields.find(f => f.fieldId === model.descriptionFieldId);\n if (!field) {\n return null;\n }\n const value = parent.description || parent[field.fieldId];\n if (!value) {\n return null;\n }\n return entryFieldFromStorageTransform({\n context,\n model,\n field,\n value\n });\n };\n};\n\ninterface Params {\n context: CmsContext;\n}\n\nexport const createContentEntriesSchema = ({\n context\n}: Params): ICmsGraphQLSchemaPlugin<CmsContext> => {\n if (!context.cms.MANAGE) {\n const plugin = createCmsGraphQLSchemaPlugin({\n typeDefs: \"\",\n resolvers: {}\n });\n plugin.name = `headless-cms.graphql.schema.${context.cms.type}.empty`;\n return plugin;\n }\n\n const onByMetaFields = ENTRY_META_FIELDS.map(field => {\n const fieldType = isDateTimeEntryMetaField(field) ? \"DateTime\" : \"CmsIdentity\";\n\n return `${field}: ${fieldType}`;\n }).join(\"\\n\");\n\n const plugin = createCmsGraphQLSchemaPlugin({\n // Had to remove /* GraphQL */ because it causes issues with oxfmt formatting.\n typeDefs: `\n type CmsModelMeta {\n modelId: String!\n name: String!\n }\n\n type CmsPublishedContentEntry {\n id: ID!\n entryId: String!\n title: String\n description: String\n image: String\n }\n\n type CmsContentEntry {\n id: ID!\n entryId: String!\n model: CmsModelMeta!\n status: String!\n published: CmsPublishedContentEntry\n title: String!\n description: String\n image: String\n \n ${onByMetaFields}\n \n wbyAco_location: WbyAcoLocation\n }\n\n type CmsContentEntriesResponse {\n data: [CmsContentEntry!]\n error: CmsError\n }\n\n type CmsContentEntryResponse {\n data: CmsContentEntry\n error: CmsError\n }\n\n input CmsModelEntryInput {\n modelId: ID!\n id: ID!\n }\n\n extend type Query {\n # Search content entries for given content models using the query string.\n searchContentEntries(\n modelIds: [ID!]!\n query: String\n fields: [String!]\n limit: Int\n ): CmsContentEntriesResponse!\n\n # Get content entry meta data\n getContentEntry(entry: CmsModelEntryInput!): CmsContentEntryResponse!\n\n getLatestContentEntry(entry: CmsModelEntryInput!): CmsContentEntryResponse!\n getPublishedContentEntry(entry: CmsModelEntryInput!): CmsContentEntryResponse!\n\n # Get content entries meta data\n getContentEntries(entries: [CmsModelEntryInput!]!): CmsContentEntriesResponse!\n getLatestContentEntries(entries: [CmsModelEntryInput!]!): CmsContentEntriesResponse!\n getPublishedContentEntries(\n entries: [CmsModelEntryInput!]!\n ): CmsContentEntriesResponse!\n }\n `,\n resolvers: {\n CmsContentEntry: {\n published: async (parent, _, context) => {\n try {\n const models = await context.cms.listModels();\n const model = models.find(({ modelId }) => {\n return parent.model.modelId === modelId;\n });\n if (!model) {\n return null;\n }\n const [entry] = await context.cms.getPublishedEntriesByIds(model, [\n parent.id\n ]);\n if (!entry) {\n return null;\n }\n return createCmsEntryRecord(model, entry);\n } catch {\n return null;\n }\n },\n description: createResolveDescription()\n },\n CmsPublishedContentEntry: {\n description: createResolveDescription()\n },\n Query: {\n async searchContentEntries(_, args: any, context) {\n const { modelIds, fields, query, limit = 10 } = args;\n const models = await context.cms.listModels();\n\n /**\n * Full-text search matches the query against every searchable field, and the storage\n * returns the newest-created matches first. When many entries mention the query somewhere\n * in their content, an older entry whose title is the query falls outside the first `limit`.\n * So when searching, read more candidates than requested, rank them by title, then cut.\n */\n const storageLimit = query ? Math.max(limit, SEARCH_CANDIDATES_LIMIT) : limit;\n\n const getters = models\n .filter(model => modelIds.includes(model.modelId))\n .map(async model => {\n const listLatest =\n await context.container.resolve(ListLatestEntriesUseCase);\n const where: CmsEntryListWhere = {};\n\n const result = await listLatest.execute(model, {\n limit: storageLimit,\n where,\n search: !!query ? query : undefined,\n fields: fields || []\n });\n // TODO figure a better way to handle errors in parallel execution\n if (result.isFail()) {\n throw result.error;\n }\n const { entries } = result.value;\n return entries.map((entry: CmsEntry) => {\n return createCmsEntryRecord(model, entry);\n });\n });\n\n try {\n const entries = await Promise.all(getters).then(results =>\n results.reduce((result, item) => result.concat(item), [])\n );\n\n return new Response(\n entries\n .sort((a, b) => {\n const rank =\n getSearchRank(a.title, query) -\n getSearchRank(b.title, query);\n if (rank !== 0) {\n return rank;\n }\n return b.savedOn.getTime() - a.savedOn.getTime();\n })\n .slice(0, limit)\n );\n } catch (ex) {\n return new ErrorResponse(ex);\n }\n },\n async getContentEntry(_, args: any, context) {\n return getContentEntry({\n args,\n context,\n type: \"exact\"\n });\n },\n async getLatestContentEntry(_, args: any, context) {\n return getContentEntry({\n args,\n context,\n type: \"latest\"\n });\n },\n async getPublishedContentEntry(_, args: any, context) {\n return getContentEntry({\n args,\n context,\n type: \"published\"\n });\n },\n async getContentEntries(_, args: any, context) {\n return getContentEntries({\n args,\n context,\n type: \"exact\"\n });\n },\n async getLatestContentEntries(_, args: any, context) {\n return getContentEntries({\n args,\n context,\n type: \"latest\"\n });\n },\n async getPublishedContentEntries(_, args: any, context) {\n return getContentEntries({\n args,\n context,\n type: \"published\"\n });\n }\n }\n }\n });\n\n plugin.name = `headless-cms.graphql.schema.${context.cms.type}.content-entries`;\n\n return plugin;\n};\n"],"names":["createDate","date","Date","SEARCH_CANDIDATES_LIMIT","getSearchRank","title","query","normalizedQuery","normalizedTitle","createCmsEntryRecord","model","entry","getEntryTitle","getEntryDescription","getEntryImage","getFetchMethod","type","context","getContentEntriesMethods","WebinyError","methodName","getContentEntries","params","args","method","models","modelsMap","collection","argsEntries","entriesByModel","ref","getters","Object","modelId","Response","results","Promise","entries","items","item","Boolean","ex","ErrorResponse","getContentEntry","id","m","NotAuthorizedResponse","result","createResolveDescription","parent","_","field","f","value","entryFieldFromStorageTransform","createContentEntriesSchema","plugin","createCmsGraphQLSchemaPlugin","onByMetaFields","ENTRY_META_FIELDS","fieldType","isDateTimeEntryMetaField","modelIds","fields","limit","storageLimit","Math","listLatest","ListLatestEntriesUseCase","where","undefined","a","b","rank"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/api-headless-cms",
|
|
3
|
-
"version": "6.5.0
|
|
3
|
+
"version": "6.5.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./index.js",
|
|
@@ -23,44 +23,44 @@
|
|
|
23
23
|
"license": "MIT",
|
|
24
24
|
"dependencies": {
|
|
25
25
|
"@babel/code-frame": "8.0.6",
|
|
26
|
-
"@graphql-tools/merge": "9.2.
|
|
27
|
-
"@graphql-tools/schema": "10.1.
|
|
28
|
-
"@webiny/api": "6.5.0
|
|
29
|
-
"@webiny/api-core": "6.5.0
|
|
26
|
+
"@graphql-tools/merge": "9.2.8",
|
|
27
|
+
"@graphql-tools/schema": "10.1.5",
|
|
28
|
+
"@webiny/api": "6.5.0",
|
|
29
|
+
"@webiny/api-core": "6.5.0",
|
|
30
30
|
"@webiny/di": "1.1.0",
|
|
31
|
-
"@webiny/error": "6.5.0
|
|
32
|
-
"@webiny/feature": "6.5.0
|
|
33
|
-
"@webiny/handler": "6.5.0
|
|
34
|
-
"@webiny/handler-aws": "6.5.0
|
|
35
|
-
"@webiny/handler-db": "6.5.0
|
|
36
|
-
"@webiny/handler-graphql": "6.5.0
|
|
37
|
-
"@webiny/plugins": "6.5.0
|
|
38
|
-
"@webiny/project": "6.5.0
|
|
39
|
-
"@webiny/utils": "6.5.0
|
|
40
|
-
"@webiny/validation": "6.5.0
|
|
31
|
+
"@webiny/error": "6.5.0",
|
|
32
|
+
"@webiny/feature": "6.5.0",
|
|
33
|
+
"@webiny/handler": "6.5.0",
|
|
34
|
+
"@webiny/handler-aws": "6.5.0",
|
|
35
|
+
"@webiny/handler-db": "6.5.0",
|
|
36
|
+
"@webiny/handler-graphql": "6.5.0",
|
|
37
|
+
"@webiny/plugins": "6.5.0",
|
|
38
|
+
"@webiny/project": "6.5.0",
|
|
39
|
+
"@webiny/utils": "6.5.0",
|
|
40
|
+
"@webiny/validation": "6.5.0",
|
|
41
41
|
"dot-prop-immutable": "2.1.1",
|
|
42
42
|
"graphql": "16.14.2",
|
|
43
43
|
"graphql-tag": "2.12.7",
|
|
44
44
|
"lodash": "4.18.1",
|
|
45
|
-
"p-map": "7.
|
|
45
|
+
"p-map": "7.1.1",
|
|
46
46
|
"p-reduce": "3.0.0",
|
|
47
47
|
"pluralize": "8.0.0",
|
|
48
48
|
"slugify": "1.6.9",
|
|
49
|
-
"zod": "4.6.
|
|
49
|
+
"zod": "4.6.7"
|
|
50
50
|
},
|
|
51
51
|
"devDependencies": {
|
|
52
52
|
"@types/pluralize": "0.0.33",
|
|
53
|
-
"@webiny/build-tools": "6.5.0
|
|
54
|
-
"@webiny/handler-db": "6.5.0
|
|
55
|
-
"@webiny/project-utils": "6.5.0
|
|
56
|
-
"@webiny/sdk": "6.5.0
|
|
57
|
-
"@webiny/wcp": "6.5.0
|
|
53
|
+
"@webiny/build-tools": "6.5.0",
|
|
54
|
+
"@webiny/handler-db": "6.5.0",
|
|
55
|
+
"@webiny/project-utils": "6.5.0",
|
|
56
|
+
"@webiny/sdk": "6.5.0",
|
|
57
|
+
"@webiny/wcp": "6.5.0",
|
|
58
58
|
"apollo-graphql": "0.9.7",
|
|
59
59
|
"graphql": "16.14.2",
|
|
60
|
-
"oxfmt": "0.
|
|
60
|
+
"oxfmt": "0.73.0",
|
|
61
61
|
"rimraf": "6.1.3",
|
|
62
62
|
"typescript": "7.0.2",
|
|
63
|
-
"vitest": "5.0.
|
|
63
|
+
"vitest": "5.0.5",
|
|
64
64
|
"write-json-file": "7.0.0"
|
|
65
65
|
},
|
|
66
66
|
"publishConfig": {
|