@webiny/api-headless-cms 6.5.0-beta.2 → 6.5.0-beta.4
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/exports/api/cms/entry.d.ts +2 -0
- package/exports/api/cms/entry.js +2 -0
- package/features/contentEntry/ContentEntriesFeature.js +4 -0
- package/features/contentEntry/ContentEntriesFeature.js.map +1 -1
- package/features/contentEntry/CreateEntry/CreateEntryUseCase.d.ts +2 -2
- package/features/contentEntry/CreateEntry/CreateEntryUseCase.js +2 -2
- package/features/contentEntry/CreateEntry/CreateEntryUseCase.js.map +1 -1
- package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.d.ts +2 -2
- package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js +2 -2
- package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js.map +1 -1
- package/features/contentEntry/DeleteEntry/DeleteEntryUseCase.d.ts +2 -2
- package/features/contentEntry/DeleteEntry/DeleteEntryUseCase.js +2 -2
- package/features/contentEntry/DeleteEntry/DeleteEntryUseCase.js.map +1 -1
- package/features/contentEntry/DeleteEntry/MoveEntryToBinUseCase.d.ts +2 -2
- package/features/contentEntry/DeleteEntry/MoveEntryToBinUseCase.js +2 -2
- package/features/contentEntry/DeleteEntry/MoveEntryToBinUseCase.js.map +1 -1
- package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionUseCase.d.ts +2 -2
- package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionUseCase.js +2 -2
- package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionUseCase.js.map +1 -1
- package/features/contentEntry/DeleteMultipleEntries/DeleteMultipleEntriesUseCase.d.ts +2 -2
- package/features/contentEntry/DeleteMultipleEntries/DeleteMultipleEntriesUseCase.js +2 -2
- package/features/contentEntry/DeleteMultipleEntries/DeleteMultipleEntriesUseCase.js.map +1 -1
- package/features/contentEntry/DuplicateEntry/DuplicateEntryUseCase.d.ts +17 -0
- package/features/contentEntry/DuplicateEntry/DuplicateEntryUseCase.js +83 -0
- package/features/contentEntry/DuplicateEntry/DuplicateEntryUseCase.js.map +1 -0
- package/features/contentEntry/DuplicateEntry/abstractions.d.ts +47 -0
- package/features/contentEntry/DuplicateEntry/abstractions.js +5 -0
- package/features/contentEntry/DuplicateEntry/abstractions.js.map +1 -0
- package/features/contentEntry/DuplicateEntry/events.d.ts +41 -0
- package/features/contentEntry/DuplicateEntry/events.js +32 -0
- package/features/contentEntry/DuplicateEntry/events.js.map +1 -0
- package/features/contentEntry/DuplicateEntry/feature.d.ts +4 -0
- package/features/contentEntry/DuplicateEntry/feature.js +11 -0
- package/features/contentEntry/DuplicateEntry/feature.js.map +1 -0
- package/features/contentEntry/DuplicateEntry/index.d.ts +2 -0
- package/features/contentEntry/DuplicateEntry/index.js +2 -0
- package/features/contentEntry/DuplicateEntry/prepareDuplicateValues.d.ts +7 -0
- package/features/contentEntry/DuplicateEntry/prepareDuplicateValues.js +12 -0
- package/features/contentEntry/DuplicateEntry/prepareDuplicateValues.js.map +1 -0
- package/features/contentEntry/EntryEventPublisher/EntryEventPublisher.d.ts +10 -0
- package/features/contentEntry/EntryEventPublisher/EntryEventPublisher.js +25 -0
- package/features/contentEntry/EntryEventPublisher/EntryEventPublisher.js.map +1 -0
- package/features/contentEntry/EntryEventPublisher/abstractions.d.ts +16 -0
- package/features/contentEntry/EntryEventPublisher/abstractions.js +5 -0
- package/features/contentEntry/EntryEventPublisher/abstractions.js.map +1 -0
- package/features/contentEntry/EntryEventPublisher/feature.d.ts +4 -0
- package/features/contentEntry/EntryEventPublisher/feature.js +11 -0
- package/features/contentEntry/EntryEventPublisher/feature.js.map +1 -0
- package/features/contentEntry/EntryEventPublisher/index.d.ts +2 -0
- package/features/contentEntry/EntryEventPublisher/index.js +2 -0
- package/features/contentEntry/MoveEntry/MoveEntryUseCase.d.ts +2 -2
- package/features/contentEntry/MoveEntry/MoveEntryUseCase.js +2 -2
- package/features/contentEntry/MoveEntry/MoveEntryUseCase.js.map +1 -1
- package/features/contentEntry/PublishEntry/PublishEntryUseCase.d.ts +2 -2
- package/features/contentEntry/PublishEntry/PublishEntryUseCase.js +2 -2
- package/features/contentEntry/PublishEntry/PublishEntryUseCase.js.map +1 -1
- package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.d.ts +2 -2
- package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.js +2 -2
- package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.js.map +1 -1
- package/features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.d.ts +2 -2
- package/features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.js +2 -2
- package/features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.js.map +1 -1
- package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.d.ts +2 -2
- package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.js +2 -2
- package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.js.map +1 -1
- package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.d.ts +2 -2
- package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.js +2 -2
- package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.js.map +1 -1
- package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.d.ts +2 -2
- package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.js +2 -2
- package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.js.map +1 -1
- package/features/modelBuilder/abstractions.d.ts +4 -0
- package/features/modelBuilder/abstractions.js.map +1 -1
- package/features/modelBuilder/fields/DateTimeFieldType.js +1 -0
- package/features/modelBuilder/fields/DateTimeFieldType.js.map +1 -1
- package/features/modelBuilder/models/ModelBuilder.d.ts +8 -0
- package/features/modelBuilder/models/ModelBuilder.js +1 -0
- package/features/modelBuilder/models/ModelBuilder.js.map +1 -1
- package/features/modelBuilder/models/PrivateModelBuilder.d.ts +5 -0
- package/features/modelBuilder/models/PrivateModelBuilder.js +12 -1
- package/features/modelBuilder/models/PrivateModelBuilder.js.map +1 -1
- package/graphql/schema/createManageResolvers.js +3 -1
- package/graphql/schema/createManageResolvers.js.map +1 -1
- package/graphql/schema/createManageSDL.js +2 -0
- package/graphql/schema/createManageSDL.js.map +1 -1
- package/graphql/schema/resolvers/manage/resolveDuplicate.d.ts +7 -0
- package/graphql/schema/resolvers/manage/resolveDuplicate.js +11 -0
- package/graphql/schema/resolvers/manage/resolveDuplicate.js.map +1 -0
- package/package.json +18 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentEntry/RepublishEntry/RepublishEntryUseCase.js","sources":["../../../../src/features/contentEntry/RepublishEntry/RepublishEntryUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport {
|
|
1
|
+
{"version":3,"file":"features/contentEntry/RepublishEntry/RepublishEntryUseCase.js","sources":["../../../../src/features/contentEntry/RepublishEntry/RepublishEntryUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { EntryEventPublisher } from \"~/features/contentEntry/EntryEventPublisher/index.js\";\nimport { RepublishEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { RepublishEntryRepository } 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 EntryBeforeRepublishEvent,\n EntryAfterRepublishEvent,\n EntryRepublishErrorEvent\n} from \"./events.js\";\nimport { EntryNotAuthorizedError } from \"~/domain/contentEntry/errors.js\";\nimport { EntryNotFoundError } from \"~/domain/contentEntry/errors.js\";\nimport { CreateRepublishEntryDataFactory } from \"~/features/contentEntry/entryDataFactories/CreateRepublishEntryDataFactory/index.js\";\n\nclass RepublishEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private repository: RepublishEntryRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getRevisionById: GetRevisionByIdUseCase.Interface,\n private eventPublisher: EntryEventPublisher.Interface,\n private createRepublishEntryDataFactory: CreateRepublishEntryDataFactory.Interface\n ) {}\n\n public async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n const canAccess = await this.accessControl.canAccessEntry({ model, rwd: \"w\", 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 rwd: \"w\",\n pw: \"p\"\n });\n\n if (!canAccessEntry) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const dataResult = await this.createRepublishEntryDataFactory.create<T>(\n model,\n originalEntry\n );\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 EntryBeforeRepublishEvent({\n entry,\n model\n })\n );\n\n const repositoryResult = await this.repository.execute<T>(model, entry);\n\n if (repositoryResult.isFail()) {\n await this.eventPublisher.publish(\n new EntryRepublishErrorEvent({\n entry,\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 EntryAfterRepublishEvent({\n entry: publishedEntry,\n model\n })\n );\n\n return Result.ok(entry);\n } catch (error) {\n await this.eventPublisher.publish(\n new EntryRepublishErrorEvent({\n entry,\n model,\n error: error as Error\n })\n );\n return Result.fail(error as any);\n }\n }\n}\n\nexport const RepublishEntryUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: RepublishEntryUseCaseImpl,\n dependencies: [\n RepublishEntryRepository,\n AccessControl,\n GetRevisionByIdUseCase,\n EntryEventPublisher,\n CreateRepublishEntryDataFactory\n ]\n});\n"],"names":["RepublishEntryUseCaseImpl","repository","accessControl","getRevisionById","eventPublisher","createRepublishEntryDataFactory","model","id","canAccess","Result","EntryNotAuthorizedError","result","EntryNotFoundError","originalEntry","canAccessEntry","dataResult","entry","EntryBeforeRepublishEvent","repositoryResult","EntryRepublishErrorEvent","publishedEntry","EntryAfterRepublishEvent","error","RepublishEntryUseCase","createImplementation","UseCaseAbstraction","RepublishEntryRepository","AccessControl","GetRevisionByIdUseCase","EntryEventPublisher","CreateRepublishEntryDataFactory"],"mappings":";;;;;;;;AAiBA,MAAMA;IACF,YACYC,UAA8C,EAC9CC,aAAsC,EACtCC,eAAiD,EACjDC,cAA6C,EAC7CC,+BAA0E,CACpF;aALUJ,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,eAAe,GAAfA;aACAC,cAAc,GAAdA;aACAC,+BAA+B,GAA/BA;IACT;IAEH,MAAa,QACTC,KAAe,EACfC,EAAU,EAC4C;QACtD,MAAMC,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAEF;YAAO,KAAK;YAAK,IAAI;QAAI;QACrF,IAAI,CAACE,WACD,OAAOC,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACJ;QAGzD,MAAMK,SAAS,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAIL,OAAOC;QAE5D,IAAII,OAAO,MAAM,IACb,OAAOF,OAAO,IAAI,CAAC,IAAIG,mBAAmBL;QAG9C,MAAMM,gBAAgBF,OAAO,KAAK;QAElC,MAAMG,iBAAiB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAC3DR;YACA,OAAOO;YACP,KAAK;YACL,IAAI;QACR;QAEA,IAAI,CAACC,gBACD,OAAOL,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACJ;QAGzD,MAAMS,aAAa,MAAM,IAAI,CAAC,+BAA+B,CAAC,MAAM,CAChET,OACAO;QAEJ,IAAIE,WAAW,MAAM,IACjB,OAAON,OAAO,IAAI,CAACM,WAAW,KAAK;QAEvC,MAAM,EAAEC,KAAK,EAAE,GAAGD,WAAW,KAAK;QAElC,IAAI;YACA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIE,0BAA0B;gBAC1BD;gBACAV;YACJ;YAGJ,MAAMY,mBAAmB,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAIZ,OAAOU;YAEjE,IAAIE,iBAAiB,MAAM,IAAI;gBAC3B,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,yBAAyB;oBACzBH;oBACAV;oBACA,OAAOY,iBAAiB,KAAK;gBACjC;gBAEJ,OAAOT,OAAO,IAAI,CAACS,iBAAiB,KAAK;YAC7C;YAEA,MAAME,iBAAiBF,iBAAiB,KAAK;YAE7C,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIG,yBAAyB;gBACzB,OAAOD;gBACPd;YACJ;YAGJ,OAAOG,OAAO,EAAE,CAACO;QACrB,EAAE,OAAOM,OAAO;YACZ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIH,yBAAyB;gBACzBH;gBACAV;gBACA,OAAOgB;YACX;YAEJ,OAAOb,OAAO,IAAI,CAACa;QACvB;IACJ;AACJ;AAEO,MAAMC,8CAAwBC,qBAAqB;IACtD,aAAaC;IACb,gBAAgBzB;IAChB,cAAc;QACV0B;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Result } from "@webiny/feature/api";
|
|
2
2
|
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
3
|
-
import {
|
|
3
|
+
import { EntryEventPublisher } from "../../../features/contentEntry/EntryEventPublisher/index.js";
|
|
4
4
|
import { RestoreEntryFromBinUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
5
5
|
import { RestoreEntryFromBinRepository } from "./abstractions.js";
|
|
6
6
|
import { AccessControl } from "../../../features/shared/abstractions.js";
|
|
@@ -24,7 +24,7 @@ declare class RestoreEntryFromBinUseCaseImpl implements UseCaseAbstraction.Inter
|
|
|
24
24
|
private getDeletedEntry;
|
|
25
25
|
private identityContext;
|
|
26
26
|
private eventPublisher;
|
|
27
|
-
constructor(repository: RestoreEntryFromBinRepository.Interface, accessControl: AccessControl.Interface, getDeletedEntry: GetLatestDeletedRevisionByEntryIdUseCase.Interface, identityContext: IdentityContext.Interface, eventPublisher:
|
|
27
|
+
constructor(repository: RestoreEntryFromBinRepository.Interface, accessControl: AccessControl.Interface, getDeletedEntry: GetLatestDeletedRevisionByEntryIdUseCase.Interface, identityContext: IdentityContext.Interface, eventPublisher: EntryEventPublisher.Interface);
|
|
28
28
|
execute<T extends CmsEntryValues = CmsEntryValues>(model: CmsModel, id: string): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>>;
|
|
29
29
|
}
|
|
30
30
|
export declare const RestoreEntryFromBinUseCase: import("@webiny/di").Implementation<typeof RestoreEntryFromBinUseCaseImpl>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Result, createImplementation } from "@webiny/feature/api";
|
|
2
2
|
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
3
|
-
import {
|
|
3
|
+
import { EntryEventPublisher } from "../EntryEventPublisher/index.js";
|
|
4
4
|
import { RestoreEntryFromBinRepository, RestoreEntryFromBinUseCase } from "./abstractions.js";
|
|
5
5
|
import { AccessControl } from "../../shared/abstractions.js";
|
|
6
6
|
import { GetLatestDeletedRevisionByEntryIdUseCase } from "../GetLatestRevisionByEntryId/index.js";
|
|
@@ -85,7 +85,7 @@ const RestoreEntryFromBinUseCase_RestoreEntryFromBinUseCase = createImplementati
|
|
|
85
85
|
AccessControl,
|
|
86
86
|
GetLatestDeletedRevisionByEntryIdUseCase,
|
|
87
87
|
IdentityContext,
|
|
88
|
-
|
|
88
|
+
EntryEventPublisher
|
|
89
89
|
]
|
|
90
90
|
});
|
|
91
91
|
export { RestoreEntryFromBinUseCase_RestoreEntryFromBinUseCase as RestoreEntryFromBinUseCase };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.js","sources":["../../../../src/features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.js","sources":["../../../../src/features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { EntryEventPublisher } from \"~/features/contentEntry/EntryEventPublisher/index.js\";\nimport { RestoreEntryFromBinUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { RestoreEntryFromBinRepository } from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetLatestDeletedRevisionByEntryIdUseCase } from \"~/features/contentEntry/GetLatestRevisionByEntryId/index.js\";\nimport type { CmsEntry, CmsEntryValues, CmsModel } from \"~/types/index.js\";\nimport {\n EntryBeforeRestoreFromBinEvent,\n EntryAfterRestoreFromBinEvent,\n EntryRestoreFromBinErrorEvent\n} from \"./events.js\";\nimport { EntryNotAuthorizedError } from \"~/domain/contentEntry/errors.js\";\nimport { EntryNotFoundError } from \"~/domain/contentEntry/errors.js\";\nimport { getDate } from \"~/utils/date.js\";\nimport { getIdentity } from \"~/utils/identity.js\";\n\n/**\n * RestoreEntryFromBinUseCase - Orchestrates restoring a soft-deleted entry from the bin.\n *\n * Responsibilities:\n * - Apply access control\n * - Get the deleted entry to restore by ID\n * - Clear deletion flags (wbyDeleted = false)\n * - Restore entry to its original folder\n * - Update restoration metadata\n * - Publish domain events\n * - Delegate to repository for storage operations\n */\nclass RestoreEntryFromBinUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private repository: RestoreEntryFromBinRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getDeletedEntry: GetLatestDeletedRevisionByEntryIdUseCase.Interface,\n private identityContext: IdentityContext.Interface,\n private eventPublisher: EntryEventPublisher.Interface\n ) {}\n\n public async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n // Check access control\n const canAccess = await this.accessControl.canAccessEntry({ model, rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n // Get the deleted entry to restore by ID\n const getResult = await this.getDeletedEntry.execute<T>(model, { id });\n\n if (getResult.isFail()) {\n return Result.fail(new EntryNotFoundError(id));\n }\n\n const originalEntry = getResult.value;\n\n // Check access control on the specific entry\n const canAccessEntry = await this.accessControl.canAccessEntry({\n model,\n entry: originalEntry,\n rwd: \"w\"\n });\n\n if (!canAccessEntry) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n // Create the restored entry data\n const currentDateTime = new Date().toISOString();\n const currentIdentity = this.identityContext.getIdentity();\n\n const entryToRestore: CmsEntry<T> = {\n ...originalEntry,\n wbyDeleted: false,\n\n // Entry location fields - restore to original folder\n location: {\n folderId: originalEntry.binOriginalFolderId\n },\n binOriginalFolderId: undefined,\n\n // Entry-level meta fields\n restoredOn: getDate(currentDateTime, null),\n restoredBy: getIdentity(currentIdentity, null),\n\n // Revision-level meta fields\n revisionRestoredOn: getDate(currentDateTime, null),\n revisionRestoredBy: getIdentity(currentIdentity, null)\n };\n\n try {\n // Publish before event\n await this.eventPublisher.publish(\n new EntryBeforeRestoreFromBinEvent({\n entry: entryToRestore,\n model\n })\n );\n\n // Delegate to repository\n const result = await this.repository.execute<T>(model, entryToRestore);\n\n if (result.isFail()) {\n await this.eventPublisher.publish(\n new EntryRestoreFromBinErrorEvent({\n entry: entryToRestore,\n model,\n error: result.error\n })\n );\n return Result.fail(result.error);\n }\n\n const restoredEntry = result.value;\n\n // Publish after event\n await this.eventPublisher.publish(\n new EntryAfterRestoreFromBinEvent({\n entry: restoredEntry,\n model\n })\n );\n\n return Result.ok(restoredEntry);\n } catch (error) {\n await this.eventPublisher.publish(\n new EntryRestoreFromBinErrorEvent({\n entry: entryToRestore,\n model,\n error: error as Error\n })\n );\n return Result.fail(error as any);\n }\n }\n}\n\nexport const RestoreEntryFromBinUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: RestoreEntryFromBinUseCaseImpl,\n dependencies: [\n RestoreEntryFromBinRepository,\n AccessControl,\n GetLatestDeletedRevisionByEntryIdUseCase,\n IdentityContext,\n EntryEventPublisher\n ]\n});\n"],"names":["RestoreEntryFromBinUseCaseImpl","repository","accessControl","getDeletedEntry","identityContext","eventPublisher","model","id","canAccess","Result","EntryNotAuthorizedError","getResult","EntryNotFoundError","originalEntry","canAccessEntry","currentDateTime","Date","currentIdentity","entryToRestore","undefined","getDate","getIdentity","EntryBeforeRestoreFromBinEvent","result","EntryRestoreFromBinErrorEvent","restoredEntry","EntryAfterRestoreFromBinEvent","error","RestoreEntryFromBinUseCase","createImplementation","UseCaseAbstraction","RestoreEntryFromBinRepository","AccessControl","GetLatestDeletedRevisionByEntryIdUseCase","IdentityContext","EntryEventPublisher"],"mappings":";;;;;;;;;;AA+BA,MAAMA;IACF,YACYC,UAAmD,EACnDC,aAAsC,EACtCC,eAAmE,EACnEC,eAA0C,EAC1CC,cAA6C,CACvD;aALUJ,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,eAAe,GAAfA;aACAC,eAAe,GAAfA;aACAC,cAAc,GAAdA;IACT;IAEH,MAAa,QACTC,KAAe,EACfC,EAAU,EAC4C;QAEtD,MAAMC,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAEF;YAAO,KAAK;QAAI;QAC5E,IAAI,CAACE,WACD,OAAOC,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACJ;QAIzD,MAAMK,YAAY,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAIL,OAAO;YAAEC;QAAG;QAEpE,IAAII,UAAU,MAAM,IAChB,OAAOF,OAAO,IAAI,CAAC,IAAIG,mBAAmBL;QAG9C,MAAMM,gBAAgBF,UAAU,KAAK;QAGrC,MAAMG,iBAAiB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAC3DR;YACA,OAAOO;YACP,KAAK;QACT;QAEA,IAAI,CAACC,gBACD,OAAOL,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACJ;QAIzD,MAAMS,kBAAkB,IAAIC,OAAO,WAAW;QAC9C,MAAMC,kBAAkB,IAAI,CAAC,eAAe,CAAC,WAAW;QAExD,MAAMC,iBAA8B;YAChC,GAAGL,aAAa;YAChB,YAAY;YAGZ,UAAU;gBACN,UAAUA,cAAc,mBAAmB;YAC/C;YACA,qBAAqBM;YAGrB,YAAYC,QAAQL,iBAAiB;YACrC,YAAYM,YAAYJ,iBAAiB;YAGzC,oBAAoBG,QAAQL,iBAAiB;YAC7C,oBAAoBM,YAAYJ,iBAAiB;QACrD;QAEA,IAAI;YAEA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIK,+BAA+B;gBAC/B,OAAOJ;gBACPZ;YACJ;YAIJ,MAAMiB,SAAS,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAIjB,OAAOY;YAEvD,IAAIK,OAAO,MAAM,IAAI;gBACjB,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,8BAA8B;oBAC9B,OAAON;oBACPZ;oBACA,OAAOiB,OAAO,KAAK;gBACvB;gBAEJ,OAAOd,OAAO,IAAI,CAACc,OAAO,KAAK;YACnC;YAEA,MAAME,gBAAgBF,OAAO,KAAK;YAGlC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIG,8BAA8B;gBAC9B,OAAOD;gBACPnB;YACJ;YAGJ,OAAOG,OAAO,EAAE,CAACgB;QACrB,EAAE,OAAOE,OAAO;YACZ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIH,8BAA8B;gBAC9B,OAAON;gBACPZ;gBACA,OAAOqB;YACX;YAEJ,OAAOlB,OAAO,IAAI,CAACkB;QACvB;IACJ;AACJ;AAEO,MAAMC,wDAA6BC,qBAAqB;IAC3D,aAAaC;IACb,gBAAgB9B;IAChB,cAAc;QACV+B;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EntryEventPublisher } from "../../../features/contentEntry/EntryEventPublisher/index.js";
|
|
2
2
|
import { Result } from "@webiny/feature/api";
|
|
3
3
|
import { UnpublishEntryUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
4
4
|
import { UnpublishEntryRepository } from "./abstractions.js";
|
|
@@ -13,7 +13,7 @@ declare class UnpublishEntryUseCaseImpl implements UseCaseAbstraction.Interface
|
|
|
13
13
|
private accessControl;
|
|
14
14
|
private getPublishedRevisionByEntryId;
|
|
15
15
|
private createUnpublishEntryDataFactory;
|
|
16
|
-
constructor(eventPublisher:
|
|
16
|
+
constructor(eventPublisher: EntryEventPublisher.Interface, repository: UnpublishEntryRepository.Interface, accessControl: AccessControl.Interface, getPublishedRevisionByEntryId: GetPublishedRevisionByEntryIdUseCase.Interface, createUnpublishEntryDataFactory: CreateUnpublishEntryDataFactory.Interface);
|
|
17
17
|
execute<T extends CmsEntryValues = CmsEntryValues>(model: CmsModel, id: string): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>>;
|
|
18
18
|
}
|
|
19
19
|
export declare const UnpublishEntryUseCase: import("@webiny/di").Implementation<typeof UnpublishEntryUseCaseImpl>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { EntryEventPublisher } from "../EntryEventPublisher/index.js";
|
|
2
2
|
import { Result, createImplementation } from "@webiny/feature/api";
|
|
3
3
|
import { parseIdentifier } from "@webiny/utils";
|
|
4
4
|
import { UnpublishEntryRepository, UnpublishEntryUseCase } from "./abstractions.js";
|
|
@@ -71,7 +71,7 @@ const UnpublishEntryUseCase_UnpublishEntryUseCase = createImplementation({
|
|
|
71
71
|
abstraction: UnpublishEntryUseCase,
|
|
72
72
|
implementation: UnpublishEntryUseCaseImpl,
|
|
73
73
|
dependencies: [
|
|
74
|
-
|
|
74
|
+
EntryEventPublisher,
|
|
75
75
|
UnpublishEntryRepository,
|
|
76
76
|
AccessControl,
|
|
77
77
|
GetPublishedRevisionByEntryIdUseCase,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.js","sources":["../../../../src/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.js","sources":["../../../../src/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.ts"],"sourcesContent":["import { EntryEventPublisher } from \"~/features/contentEntry/EntryEventPublisher/index.js\";\nimport { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { UnpublishEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { UnpublishEntryRepository } from \"./abstractions.js\";\nimport { EntryBeforeUnpublishEvent } from \"./events.js\";\nimport { EntryAfterUnpublishEvent } from \"./events.js\";\nimport { EntryUnpublishErrorEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetPublishedRevisionByEntryIdUseCase } from \"~/features/contentEntry/GetPublishedRevisionByEntryId/index.js\";\nimport type { CmsEntry, CmsEntryValues } from \"~/types/index.js\";\nimport type { CmsModel } from \"~/types/index.js\";\nimport { EntryNotAuthorizedError } from \"~/domain/contentEntry/errors.js\";\nimport { EntryNotFoundError } from \"~/domain/contentEntry/errors.js\";\nimport { EntryValidationError } from \"~/domain/contentEntry/errors.js\";\nimport { CreateUnpublishEntryDataFactory } from \"~/features/contentEntry/entryDataFactories/CreateUnpublishEntryDataFactory/index.js\";\n\nclass UnpublishEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private eventPublisher: EntryEventPublisher.Interface,\n private repository: UnpublishEntryRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getPublishedRevisionByEntryId: GetPublishedRevisionByEntryIdUseCase.Interface,\n private createUnpublishEntryDataFactory: CreateUnpublishEntryDataFactory.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n const canAccess = await this.accessControl.canAccessEntry({ model, pw: \"u\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const { id: entryId } = parseIdentifier(id);\n\n const publishedResult = await this.getPublishedRevisionByEntryId.execute<T>(model, entryId);\n\n if (publishedResult.isFail()) {\n return Result.fail(publishedResult.error);\n }\n\n const originalEntry = publishedResult.value;\n\n if (!originalEntry) {\n return Result.fail(new EntryNotFoundError(id));\n }\n\n if (originalEntry.id !== id) {\n return Result.fail(new EntryValidationError(`Entry is not published!`));\n }\n\n const canAccessEntry = await this.accessControl.canAccessEntry({\n model,\n entry: originalEntry,\n pw: \"u\"\n });\n\n if (!canAccessEntry) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const dataResult = await this.createUnpublishEntryDataFactory.create<T>(\n model,\n originalEntry\n );\n if (dataResult.isFail()) {\n return Result.fail(dataResult.error);\n }\n const { entry } = dataResult.value;\n\n try {\n await this.eventPublisher.publish(new EntryBeforeUnpublishEvent({ entry, model }));\n\n const unpublishResult = await this.repository.execute<T>(model, entry);\n if (unpublishResult.isFail()) {\n await this.eventPublisher.publish(\n new EntryUnpublishErrorEvent({ entry, model, error: unpublishResult.error })\n );\n return Result.fail(unpublishResult.error);\n }\n\n const storageEntry = unpublishResult.value;\n\n await this.eventPublisher.publish(\n new EntryAfterUnpublishEvent({\n entry,\n storageEntry,\n model\n })\n );\n\n return Result.ok(entry);\n } catch (error) {\n await this.eventPublisher.publish(\n new EntryUnpublishErrorEvent({ entry, model, error: error as Error })\n );\n return Result.fail(error as UseCaseAbstraction.Error);\n }\n }\n}\n\nexport const UnpublishEntryUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: UnpublishEntryUseCaseImpl,\n dependencies: [\n EntryEventPublisher,\n UnpublishEntryRepository,\n AccessControl,\n GetPublishedRevisionByEntryIdUseCase,\n CreateUnpublishEntryDataFactory\n ]\n});\n"],"names":["UnpublishEntryUseCaseImpl","eventPublisher","repository","accessControl","getPublishedRevisionByEntryId","createUnpublishEntryDataFactory","model","id","canAccess","Result","EntryNotAuthorizedError","entryId","parseIdentifier","publishedResult","originalEntry","EntryNotFoundError","EntryValidationError","canAccessEntry","dataResult","entry","EntryBeforeUnpublishEvent","unpublishResult","EntryUnpublishErrorEvent","storageEntry","EntryAfterUnpublishEvent","error","UnpublishEntryUseCase","createImplementation","UseCaseAbstraction","EntryEventPublisher","UnpublishEntryRepository","AccessControl","GetPublishedRevisionByEntryIdUseCase","CreateUnpublishEntryDataFactory"],"mappings":";;;;;;;;;AAkBA,MAAMA;IACF,YACYC,cAA6C,EAC7CC,UAA8C,EAC9CC,aAAsC,EACtCC,6BAA6E,EAC7EC,+BAA0E,CACpF;aALUJ,cAAc,GAAdA;aACAC,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,6BAA6B,GAA7BA;aACAC,+BAA+B,GAA/BA;IACT;IAEH,MAAM,QACFC,KAAe,EACfC,EAAU,EAC4C;QACtD,MAAMC,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAEF;YAAO,IAAI;QAAI;QAC3E,IAAI,CAACE,WACD,OAAOC,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACJ;QAGzD,MAAM,EAAE,IAAIK,OAAO,EAAE,GAAGC,gBAAgBL;QAExC,MAAMM,kBAAkB,MAAM,IAAI,CAAC,6BAA6B,CAAC,OAAO,CAAIP,OAAOK;QAEnF,IAAIE,gBAAgB,MAAM,IACtB,OAAOJ,OAAO,IAAI,CAACI,gBAAgB,KAAK;QAG5C,MAAMC,gBAAgBD,gBAAgB,KAAK;QAE3C,IAAI,CAACC,eACD,OAAOL,OAAO,IAAI,CAAC,IAAIM,mBAAmBR;QAG9C,IAAIO,cAAc,EAAE,KAAKP,IACrB,OAAOE,OAAO,IAAI,CAAC,IAAIO,qBAAqB;QAGhD,MAAMC,iBAAiB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAC3DX;YACA,OAAOQ;YACP,IAAI;QACR;QAEA,IAAI,CAACG,gBACD,OAAOR,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACJ;QAGzD,MAAMY,aAAa,MAAM,IAAI,CAAC,+BAA+B,CAAC,MAAM,CAChEZ,OACAQ;QAEJ,IAAII,WAAW,MAAM,IACjB,OAAOT,OAAO,IAAI,CAACS,WAAW,KAAK;QAEvC,MAAM,EAAEC,KAAK,EAAE,GAAGD,WAAW,KAAK;QAElC,IAAI;YACA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAIE,0BAA0B;gBAAED;gBAAOb;YAAM;YAE/E,MAAMe,kBAAkB,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAIf,OAAOa;YAChE,IAAIE,gBAAgB,MAAM,IAAI;gBAC1B,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,yBAAyB;oBAAEH;oBAAOb;oBAAO,OAAOe,gBAAgB,KAAK;gBAAC;gBAE9E,OAAOZ,OAAO,IAAI,CAACY,gBAAgB,KAAK;YAC5C;YAEA,MAAME,eAAeF,gBAAgB,KAAK;YAE1C,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIG,yBAAyB;gBACzBL;gBACAI;gBACAjB;YACJ;YAGJ,OAAOG,OAAO,EAAE,CAACU;QACrB,EAAE,OAAOM,OAAO;YACZ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIH,yBAAyB;gBAAEH;gBAAOb;gBAAO,OAAOmB;YAAe;YAEvE,OAAOhB,OAAO,IAAI,CAACgB;QACvB;IACJ;AACJ;AAEO,MAAMC,8CAAwBC,qBAAqB;IACtD,aAAaC;IACb,gBAAgB5B;IAChB,cAAc;QACV6B;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Result } from "@webiny/feature/api";
|
|
2
2
|
import { UpdateEntryRepository, UpdateEntryUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
3
|
-
import {
|
|
3
|
+
import { EntryEventPublisher } from "../../../features/contentEntry/EntryEventPublisher/index.js";
|
|
4
4
|
import { AccessControl } from "../../../features/shared/abstractions.js";
|
|
5
5
|
import { GetRevisionByIdUseCase } from "../../../features/contentEntry/GetRevisionById/abstractions.js";
|
|
6
6
|
import type { CmsEntry, CmsEntryValues, CmsModel, UpdateCmsEntryInput, UpdateCmsEntryOptionsInput } from "../../../types/index.js";
|
|
@@ -11,7 +11,7 @@ declare class UpdateEntryUseCaseImpl implements UseCaseAbstraction.Interface {
|
|
|
11
11
|
private accessControl;
|
|
12
12
|
private getRevisionByIdUseCase;
|
|
13
13
|
private updateEntryDataFactory;
|
|
14
|
-
constructor(eventPublisher:
|
|
14
|
+
constructor(eventPublisher: EntryEventPublisher.Interface, repository: UpdateEntryRepository.Interface, accessControl: AccessControl.Interface, getRevisionByIdUseCase: GetRevisionByIdUseCase.Interface, updateEntryDataFactory: UpdateEntryDataFactory.Interface);
|
|
15
15
|
execute<T extends CmsEntryValues = CmsEntryValues>(model: CmsModel, id: string, rawInput: UpdateCmsEntryInput<T>, options?: UpdateCmsEntryOptionsInput): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>>;
|
|
16
16
|
}
|
|
17
17
|
export declare const UpdateEntryUseCase: import("@webiny/di").Implementation<typeof UpdateEntryUseCaseImpl>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Result, createImplementation } from "@webiny/feature/api";
|
|
2
2
|
import { UpdateEntryRepository, UpdateEntryUseCase } from "./abstractions.js";
|
|
3
|
-
import {
|
|
3
|
+
import { EntryEventPublisher } from "../EntryEventPublisher/index.js";
|
|
4
4
|
import { EntryAfterUpdateEvent, EntryBeforeUpdateEvent } from "./events.js";
|
|
5
5
|
import { AccessControl } from "../../shared/abstractions.js";
|
|
6
6
|
import { GetRevisionByIdUseCase } from "../GetRevisionById/abstractions.js";
|
|
@@ -58,7 +58,7 @@ const UpdateEntryUseCase_UpdateEntryUseCase = createImplementation({
|
|
|
58
58
|
abstraction: UpdateEntryUseCase,
|
|
59
59
|
implementation: UpdateEntryUseCaseImpl,
|
|
60
60
|
dependencies: [
|
|
61
|
-
|
|
61
|
+
EntryEventPublisher,
|
|
62
62
|
UpdateEntryRepository,
|
|
63
63
|
AccessControl,
|
|
64
64
|
GetRevisionByIdUseCase,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentEntry/UpdateEntry/UpdateEntryUseCase.js","sources":["../../../../src/features/contentEntry/UpdateEntry/UpdateEntryUseCase.ts"],"sourcesContent":["import { createImplementation, Result } from \"@webiny/feature/api\";\nimport { UpdateEntryRepository, UpdateEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"features/contentEntry/UpdateEntry/UpdateEntryUseCase.js","sources":["../../../../src/features/contentEntry/UpdateEntry/UpdateEntryUseCase.ts"],"sourcesContent":["import { createImplementation, Result } from \"@webiny/feature/api\";\nimport { UpdateEntryRepository, UpdateEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { EntryEventPublisher } from \"~/features/contentEntry/EntryEventPublisher/index.js\";\nimport { EntryAfterUpdateEvent, EntryBeforeUpdateEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/abstractions.js\";\nimport type {\n CmsEntry,\n CmsEntryValues,\n CmsModel,\n UpdateCmsEntryInput,\n UpdateCmsEntryOptionsInput\n} from \"~/types/index.js\";\nimport { EntryLockedError, EntryNotAuthorizedError } from \"~/domain/contentEntry/errors.js\";\nimport { UpdateEntryDataFactory } from \"~/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/index.js\";\n\nclass UpdateEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private eventPublisher: EntryEventPublisher.Interface,\n private repository: UpdateEntryRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getRevisionByIdUseCase: GetRevisionByIdUseCase.Interface,\n private updateEntryDataFactory: UpdateEntryDataFactory.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string,\n rawInput: UpdateCmsEntryInput<T>,\n options?: UpdateCmsEntryOptionsInput\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n const canAccess = await this.accessControl.canAccessEntry({ model, rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n try {\n const result = await this.getRevisionByIdUseCase.execute<T>(model, id);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const originalEntry = result.value;\n\n if (originalEntry.locked) {\n return Result.fail(new EntryLockedError());\n }\n\n const dataResult = await this.updateEntryDataFactory.create<T>(\n model,\n rawInput,\n originalEntry,\n options\n );\n if (dataResult.isFail()) {\n return Result.fail(dataResult.error);\n }\n const { entry, input } = dataResult.value;\n\n const canAccessEntry = await this.accessControl.canAccessEntry({\n model,\n entry,\n rwd: \"w\"\n });\n\n if (!canAccessEntry) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n await this.eventPublisher.publish(\n new EntryBeforeUpdateEvent({ entry, original: originalEntry, input, model })\n );\n\n const updateResult = await this.repository.execute(model, entry);\n if (updateResult.isFail()) {\n return Result.fail(updateResult.error);\n }\n\n await this.eventPublisher.publish(\n new EntryAfterUpdateEvent({\n entry,\n original: originalEntry,\n input,\n model\n })\n );\n\n return Result.ok(entry);\n } catch (error) {\n return Result.fail(error as UseCaseAbstraction.Error);\n }\n }\n}\n\nexport const UpdateEntryUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: UpdateEntryUseCaseImpl,\n dependencies: [\n EntryEventPublisher,\n UpdateEntryRepository,\n AccessControl,\n GetRevisionByIdUseCase,\n UpdateEntryDataFactory\n ]\n});\n"],"names":["UpdateEntryUseCaseImpl","eventPublisher","repository","accessControl","getRevisionByIdUseCase","updateEntryDataFactory","model","id","rawInput","options","canAccess","Result","EntryNotAuthorizedError","result","originalEntry","EntryLockedError","dataResult","entry","input","canAccessEntry","EntryBeforeUpdateEvent","updateResult","EntryAfterUpdateEvent","error","UpdateEntryUseCase","createImplementation","UseCaseAbstraction","EntryEventPublisher","UpdateEntryRepository","AccessControl","GetRevisionByIdUseCase","UpdateEntryDataFactory"],"mappings":";;;;;;;;AAgBA,MAAMA;IACF,YACYC,cAA6C,EAC7CC,UAA2C,EAC3CC,aAAsC,EACtCC,sBAAwD,EACxDC,sBAAwD,CAClE;aALUJ,cAAc,GAAdA;aACAC,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,sBAAsB,GAAtBA;aACAC,sBAAsB,GAAtBA;IACT;IAEH,MAAM,QACFC,KAAe,EACfC,EAAU,EACVC,QAAgC,EAChCC,OAAoC,EACkB;QACtD,MAAMC,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAEJ;YAAO,KAAK;QAAI;QAC5E,IAAI,CAACI,WACD,OAAOC,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACN;QAGzD,IAAI;YACA,MAAMO,SAAS,MAAM,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAIP,OAAOC;YAEnE,IAAIM,OAAO,MAAM,IACb,OAAOF,OAAO,IAAI,CAACE,OAAO,KAAK;YAGnC,MAAMC,gBAAgBD,OAAO,KAAK;YAElC,IAAIC,cAAc,MAAM,EACpB,OAAOH,OAAO,IAAI,CAAC,IAAII;YAG3B,MAAMC,aAAa,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,CACvDV,OACAE,UACAM,eACAL;YAEJ,IAAIO,WAAW,MAAM,IACjB,OAAOL,OAAO,IAAI,CAACK,WAAW,KAAK;YAEvC,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGF,WAAW,KAAK;YAEzC,MAAMG,iBAAiB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;gBAC3Db;gBACAW;gBACA,KAAK;YACT;YAEA,IAAI,CAACE,gBACD,OAAOR,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACN;YAGzD,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIc,uBAAuB;gBAAEH;gBAAO,UAAUH;gBAAeI;gBAAOZ;YAAM;YAG9E,MAAMe,eAAe,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAACf,OAAOW;YAC1D,IAAII,aAAa,MAAM,IACnB,OAAOV,OAAO,IAAI,CAACU,aAAa,KAAK;YAGzC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,sBAAsB;gBACtBL;gBACA,UAAUH;gBACVI;gBACAZ;YACJ;YAGJ,OAAOK,OAAO,EAAE,CAACM;QACrB,EAAE,OAAOM,OAAO;YACZ,OAAOZ,OAAO,IAAI,CAACY;QACvB;IACJ;AACJ;AAEO,MAAMC,wCAAqBC,qBAAqB;IACnD,aAAaC;IACb,gBAAgB1B;IAChB,cAAc;QACV2B;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
|
package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Result } from "@webiny/feature/api";
|
|
2
2
|
import { UpdateRevisionDescriptionUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
3
|
-
import {
|
|
3
|
+
import { EntryEventPublisher } from "../../../features/contentEntry/EntryEventPublisher/index.js";
|
|
4
4
|
import { AccessControl } from "../../../features/shared/abstractions.js";
|
|
5
5
|
import { GetRevisionByIdUseCase } from "../../../features/contentEntry/GetRevisionById/abstractions.js";
|
|
6
6
|
import { UpdateRevisionRepository } from "../../../features/contentEntry/UpdateRevision/abstractions.js";
|
|
@@ -10,7 +10,7 @@ declare class UpdateRevisionDescriptionUseCaseImpl implements UseCaseAbstraction
|
|
|
10
10
|
private repository;
|
|
11
11
|
private accessControl;
|
|
12
12
|
private getRevisionByIdUseCase;
|
|
13
|
-
constructor(eventPublisher:
|
|
13
|
+
constructor(eventPublisher: EntryEventPublisher.Interface, repository: UpdateRevisionRepository.Interface, accessControl: AccessControl.Interface, getRevisionByIdUseCase: GetRevisionByIdUseCase.Interface);
|
|
14
14
|
execute<T extends CmsEntryValues = CmsEntryValues>(model: CmsModel, id: string, revisionDescription: string | undefined): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>>;
|
|
15
15
|
}
|
|
16
16
|
export declare const UpdateRevisionDescriptionUseCase: import("@webiny/di").Implementation<typeof UpdateRevisionDescriptionUseCaseImpl>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Result, createImplementation } from "@webiny/feature/api";
|
|
2
2
|
import { UpdateRevisionDescriptionUseCase } from "./abstractions.js";
|
|
3
|
-
import {
|
|
3
|
+
import { EntryEventPublisher } from "../EntryEventPublisher/index.js";
|
|
4
4
|
import { EntryAfterUpdateRevisionDescriptionEvent, EntryBeforeUpdateRevisionDescriptionEvent } from "./events.js";
|
|
5
5
|
import { AccessControl } from "../../shared/abstractions.js";
|
|
6
6
|
import { GetRevisionByIdUseCase } from "../GetRevisionById/abstractions.js";
|
|
@@ -57,7 +57,7 @@ const UpdateRevisionDescriptionUseCase_UpdateRevisionDescriptionUseCase = create
|
|
|
57
57
|
abstraction: UpdateRevisionDescriptionUseCase,
|
|
58
58
|
implementation: UpdateRevisionDescriptionUseCaseImpl,
|
|
59
59
|
dependencies: [
|
|
60
|
-
|
|
60
|
+
EntryEventPublisher,
|
|
61
61
|
UpdateRevisionRepository,
|
|
62
62
|
AccessControl,
|
|
63
63
|
GetRevisionByIdUseCase
|
package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.js","sources":["../../../../src/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.ts"],"sourcesContent":["import { createImplementation, Result } from \"@webiny/feature/api\";\nimport { UpdateRevisionDescriptionUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.js","sources":["../../../../src/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.ts"],"sourcesContent":["import { createImplementation, Result } from \"@webiny/feature/api\";\nimport { UpdateRevisionDescriptionUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { EntryEventPublisher } from \"~/features/contentEntry/EntryEventPublisher/index.js\";\nimport {\n EntryAfterUpdateRevisionDescriptionEvent,\n EntryBeforeUpdateRevisionDescriptionEvent\n} from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/abstractions.js\";\nimport { UpdateRevisionRepository } from \"~/features/contentEntry/UpdateRevision/abstractions.js\";\nimport type { CmsEntry, CmsEntryValues, CmsModel } from \"~/types/index.js\";\nimport { EntryNotAuthorizedError } from \"~/domain/contentEntry/errors.js\";\n\nclass UpdateRevisionDescriptionUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private eventPublisher: EntryEventPublisher.Interface,\n private repository: UpdateRevisionRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getRevisionByIdUseCase: GetRevisionByIdUseCase.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string,\n revisionDescription: string | undefined\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n const canAccess = await this.accessControl.canAccessEntry({ model, rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n try {\n const result = await this.getRevisionByIdUseCase.execute<T>(model, id);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const originalEntry = result.value;\n\n const entry = {\n ...originalEntry,\n revisionDescription\n };\n\n const canAccessEntry = await this.accessControl.canAccessEntry({\n model,\n entry,\n rwd: \"w\"\n });\n\n if (!canAccessEntry) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n await this.eventPublisher.publish(\n new EntryBeforeUpdateRevisionDescriptionEvent({\n entry,\n original: originalEntry,\n revisionDescription,\n model\n })\n );\n\n const updateResult = await this.repository.execute(model, entry);\n if (updateResult.isFail()) {\n return Result.fail(updateResult.error);\n }\n\n await this.eventPublisher.publish(\n new EntryAfterUpdateRevisionDescriptionEvent({\n entry,\n original: originalEntry,\n revisionDescription,\n model\n })\n );\n\n return Result.ok(entry);\n } catch (error) {\n return Result.fail(error as UseCaseAbstraction.Error);\n }\n }\n}\n\nexport const UpdateRevisionDescriptionUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: UpdateRevisionDescriptionUseCaseImpl,\n dependencies: [\n EntryEventPublisher,\n UpdateRevisionRepository,\n AccessControl,\n GetRevisionByIdUseCase\n ]\n});\n"],"names":["UpdateRevisionDescriptionUseCaseImpl","eventPublisher","repository","accessControl","getRevisionByIdUseCase","model","id","revisionDescription","canAccess","Result","EntryNotAuthorizedError","result","originalEntry","entry","canAccessEntry","EntryBeforeUpdateRevisionDescriptionEvent","updateResult","EntryAfterUpdateRevisionDescriptionEvent","error","UpdateRevisionDescriptionUseCase","createImplementation","UseCaseAbstraction","EntryEventPublisher","UpdateRevisionRepository","AccessControl","GetRevisionByIdUseCase"],"mappings":";;;;;;;;AAaA,MAAMA;IACF,YACYC,cAA6C,EAC7CC,UAA8C,EAC9CC,aAAsC,EACtCC,sBAAwD,CAClE;aAJUH,cAAc,GAAdA;aACAC,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,sBAAsB,GAAtBA;IACT;IAEH,MAAM,QACFC,KAAe,EACfC,EAAU,EACVC,mBAAuC,EACe;QACtD,MAAMC,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAEH;YAAO,KAAK;QAAI;QAC5E,IAAI,CAACG,WACD,OAAOC,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACL;QAGzD,IAAI;YACA,MAAMM,SAAS,MAAM,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAIN,OAAOC;YAEnE,IAAIK,OAAO,MAAM,IACb,OAAOF,OAAO,IAAI,CAACE,OAAO,KAAK;YAGnC,MAAMC,gBAAgBD,OAAO,KAAK;YAElC,MAAME,QAAQ;gBACV,GAAGD,aAAa;gBAChBL;YACJ;YAEA,MAAMO,iBAAiB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;gBAC3DT;gBACAQ;gBACA,KAAK;YACT;YAEA,IAAI,CAACC,gBACD,OAAOL,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACL;YAGzD,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIU,0CAA0C;gBAC1CF;gBACA,UAAUD;gBACVL;gBACAF;YACJ;YAGJ,MAAMW,eAAe,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAACX,OAAOQ;YAC1D,IAAIG,aAAa,MAAM,IACnB,OAAOP,OAAO,IAAI,CAACO,aAAa,KAAK;YAGzC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,yCAAyC;gBACzCJ;gBACA,UAAUD;gBACVL;gBACAF;YACJ;YAGJ,OAAOI,OAAO,EAAE,CAACI;QACrB,EAAE,OAAOK,OAAO;YACZ,OAAOT,OAAO,IAAI,CAACS;QACvB;IACJ;AACJ;AAEO,MAAMC,oEAAmCC,qBAAqB;IACjE,aAAaC;IACb,gBAAgBrB;IAChB,cAAc;QACVsB;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -8,6 +8,10 @@ import type { IModelBuilderPrivateInput, IModelBuilderPublicInput } from "./mode
|
|
|
8
8
|
export interface IModelSettings {
|
|
9
9
|
aiEntryWizard?: boolean;
|
|
10
10
|
previewPath?: string;
|
|
11
|
+
/**
|
|
12
|
+
* Set via `builder.private({ lifecycleEvents: false })`. Only honored for private models.
|
|
13
|
+
*/
|
|
14
|
+
lifecycleEvents?: boolean;
|
|
11
15
|
[key: string]: any;
|
|
12
16
|
}
|
|
13
17
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/modelBuilder/abstractions.js","sources":["../../../src/features/modelBuilder/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { PrivateModelBuilder } from \"./models/PrivateModelBuilder.js\";\nimport type { PublicModelBuilder } from \"./models/PublicModelBuilder.js\";\nimport type { IModelBuilderPrivateInput, IModelBuilderPublicInput } from \"./models/ModelBuilder.js\";\n\n/**\n * Augmentable model settings interface.\n * External packages can extend this via module augmentation.\n */\nexport interface IModelSettings {\n aiEntryWizard?: boolean;\n previewPath?: string;\n [key: string]: any;\n}\n\n/**\n * Augmentable field builder registry. Provides access to all registered field types.\n */\nexport interface IFieldBuilderRegistry {\n /**\n * Mark the next field creation as an extension.\n * When extending, the registry will create a temporary builder marked with _extendMode,\n * and BaseModelBuilder will merge its operations into the existing field.\n */\n extend(): this;\n\n // Field types will be added via module augmentation by field type implementations\n // Example: text(): ITextFieldBuilder;\n}\n\n/**\n * @internal Do not export this abstraction. We don't want external developers to use it.\n */\nexport const FieldBuilderRegistry =\n createAbstraction<FieldBuilderRegistry.Interface>(\"FieldBuilderRegistry\");\n\nexport namespace FieldBuilderRegistry {\n export interface Interface extends IFieldBuilderRegistry {}\n}\n\n/**\n * Unified Model abstraction\n * External developers implement this to provide both public and private models\n */\n\nexport interface IModelBuilder {\n private(input: IModelBuilderPrivateInput): PrivateModelBuilder;\n public(input: IModelBuilderPublicInput): PublicModelBuilder;\n}\n\nexport interface IModelFactory {\n execute(builder: IModelBuilder): Promise<PrivateModelBuilder[] | PublicModelBuilder[]>;\n}\n\n/** Provide code-defined content models. */\nexport const ModelFactory = createAbstraction<IModelFactory>(\"Cms/ModelFactory\");\nexport namespace ModelFactory {\n export type Interface = IModelFactory;\n export type Return = Promise<PrivateModelBuilder[] | PublicModelBuilder[]>;\n export type Builder = IModelBuilder;\n export type FieldBuilder = FieldBuilderRegistry.Interface;\n}\n"],"names":["FieldBuilderRegistry","createAbstraction","ModelFactory"],"mappings":";
|
|
1
|
+
{"version":3,"file":"features/modelBuilder/abstractions.js","sources":["../../../src/features/modelBuilder/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { PrivateModelBuilder } from \"./models/PrivateModelBuilder.js\";\nimport type { PublicModelBuilder } from \"./models/PublicModelBuilder.js\";\nimport type { IModelBuilderPrivateInput, IModelBuilderPublicInput } from \"./models/ModelBuilder.js\";\n\n/**\n * Augmentable model settings interface.\n * External packages can extend this via module augmentation.\n */\nexport interface IModelSettings {\n aiEntryWizard?: boolean;\n previewPath?: string;\n /**\n * Set via `builder.private({ lifecycleEvents: false })`. Only honored for private models.\n */\n lifecycleEvents?: boolean;\n [key: string]: any;\n}\n\n/**\n * Augmentable field builder registry. Provides access to all registered field types.\n */\nexport interface IFieldBuilderRegistry {\n /**\n * Mark the next field creation as an extension.\n * When extending, the registry will create a temporary builder marked with _extendMode,\n * and BaseModelBuilder will merge its operations into the existing field.\n */\n extend(): this;\n\n // Field types will be added via module augmentation by field type implementations\n // Example: text(): ITextFieldBuilder;\n}\n\n/**\n * @internal Do not export this abstraction. We don't want external developers to use it.\n */\nexport const FieldBuilderRegistry =\n createAbstraction<FieldBuilderRegistry.Interface>(\"FieldBuilderRegistry\");\n\nexport namespace FieldBuilderRegistry {\n export interface Interface extends IFieldBuilderRegistry {}\n}\n\n/**\n * Unified Model abstraction\n * External developers implement this to provide both public and private models\n */\n\nexport interface IModelBuilder {\n private(input: IModelBuilderPrivateInput): PrivateModelBuilder;\n public(input: IModelBuilderPublicInput): PublicModelBuilder;\n}\n\nexport interface IModelFactory {\n execute(builder: IModelBuilder): Promise<PrivateModelBuilder[] | PublicModelBuilder[]>;\n}\n\n/** Provide code-defined content models. */\nexport const ModelFactory = createAbstraction<IModelFactory>(\"Cms/ModelFactory\");\nexport namespace ModelFactory {\n export type Interface = IModelFactory;\n export type Return = Promise<PrivateModelBuilder[] | PublicModelBuilder[]>;\n export type Builder = IModelBuilder;\n export type FieldBuilder = FieldBuilderRegistry.Interface;\n}\n"],"names":["FieldBuilderRegistry","createAbstraction","ModelFactory"],"mappings":";AAqCO,MAAMA,uBACTC,kBAAkD;AAqB/C,MAAMC,eAAeD,kBAAiC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/modelBuilder/fields/DateTimeFieldType.js","sources":["../../../../src/features/modelBuilder/fields/DateTimeFieldType.ts"],"sourcesContent":["import { FieldType, type IFieldTypeFactory } from \"./abstractions.js\";\nimport { DataFieldBuilder } from \"./FieldBuilder.js\";\nimport { RequiredValidator, DateGteValidator, DateLteValidator } from \"./fieldTypeValidator.js\";\n\nexport type DateTimeType = \"date\" | \"time\" | \"dateTimeWithTimezone\" | \"dateTimeWithoutTimezone\";\n\nexport interface IDateTimeFieldBuilder\n extends DataFieldBuilder<\"datetime\">, RequiredValidator, DateGteValidator, DateLteValidator {\n dateTimeType(type: DateTimeType): this;\n dateOnly(): this;\n timeOnly(): this;\n withTimezone(): this;\n withoutTimezone(): this;\n}\n\nclass DateTimeFieldBuilder extends DataFieldBuilder<\"datetime\"> implements IDateTimeFieldBuilder {\n public constructor() {\n super(\"datetime\");\n }\n\n required(message?: string): this {\n return this.validation({\n name: \"required\",\n message: message || \"Value is required.\",\n settings: {}\n });\n }\n\n dateTimeType(type: DateTimeType): this {\n this.config.settings = this.config.settings || {};\n this.config.settings.type = type;\n return this;\n }\n\n /**\n * Just a calendar date, no time, no timezone. Useful for things like birthdays, holidays, or due dates where the time of day doesn't matter.\n * Example: 2026-04-30\n */\n dateOnly(): this {\n return this.dateTimeType(\"date\");\n }\n\n /**\n * Time in 24-hours format.\n * Example: 19:35\n */\n timeOnly(): this {\n return this.dateTimeType(\"time\");\n }\n\n /**\n * This is an ISO 8601 datetime with an explicit timezone offset.\n * Example: 2026-04-29T13:25:00+02:00\n */\n withTimezone(): this {\n return this.dateTimeType(\"dateTimeWithTimezone\");\n }\n\n /**\n * This is an ISO 8601 datetime in UTC (Zulu time). \"Z\" means \"this is UTC, no offset.\"\n * Example: 2026-04-30T13:25:00.000Z\n */\n withoutTimezone(): this {\n return this.dateTimeType(\"dateTimeWithoutTimezone\");\n }\n\n dateGte(value: string, message?: string): this {\n const type = this.config.settings?.type || \"date\";\n return this.validation({\n name: \"dateGte\",\n message: message || \"Date/time is earlier than the provided one.\",\n settings: { value, type }\n });\n }\n\n dateLte(value: string, message?: string): this {\n const type = this.config.settings?.type || \"date\";\n return this.validation({\n name: \"dateLte\",\n message: message || \"Date/time is later than the provided one.\",\n settings: { value, type }\n });\n }\n}\n\nclass DateTimeFieldTypeFactory implements IFieldTypeFactory {\n readonly type = \"datetime\";\n\n create(): IDateTimeFieldBuilder {\n return new DateTimeFieldBuilder();\n }\n}\n\nexport const DateTimeFieldType = FieldType.createImplementation({\n implementation: DateTimeFieldTypeFactory,\n dependencies: []\n});\n\n// Module augmentation for TypeScript autocomplete\ndeclare module \"../abstractions.js\" {\n interface IFieldBuilderRegistry {\n datetime(): IDateTimeFieldBuilder;\n }\n}\n"],"names":["DateTimeFieldBuilder","DataFieldBuilder","message","type","value","DateTimeFieldTypeFactory","DateTimeFieldType","FieldType"],"mappings":";;AAeA,MAAMA,6BAA6BC;IAC/B,aAAqB;QACjB,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"features/modelBuilder/fields/DateTimeFieldType.js","sources":["../../../../src/features/modelBuilder/fields/DateTimeFieldType.ts"],"sourcesContent":["import { FieldType, type IFieldTypeFactory } from \"./abstractions.js\";\nimport { DataFieldBuilder } from \"./FieldBuilder.js\";\nimport { RequiredValidator, DateGteValidator, DateLteValidator } from \"./fieldTypeValidator.js\";\n\nexport type DateTimeType = \"date\" | \"time\" | \"dateTimeWithTimezone\" | \"dateTimeWithoutTimezone\";\n\nexport interface IDateTimeFieldBuilder\n extends DataFieldBuilder<\"datetime\">, RequiredValidator, DateGteValidator, DateLteValidator {\n dateTimeType(type: DateTimeType): this;\n dateOnly(): this;\n timeOnly(): this;\n withTimezone(): this;\n withoutTimezone(): this;\n}\n\nclass DateTimeFieldBuilder extends DataFieldBuilder<\"datetime\"> implements IDateTimeFieldBuilder {\n public constructor() {\n super(\"datetime\");\n /**\n * Without a subtype the GraphQL, storage and admin layers each assume a different\n * format. Default to an ISO datetime with timezone; subtype methods override it.\n */\n this.withTimezone();\n }\n\n required(message?: string): this {\n return this.validation({\n name: \"required\",\n message: message || \"Value is required.\",\n settings: {}\n });\n }\n\n dateTimeType(type: DateTimeType): this {\n this.config.settings = this.config.settings || {};\n this.config.settings.type = type;\n return this;\n }\n\n /**\n * Just a calendar date, no time, no timezone. Useful for things like birthdays, holidays, or due dates where the time of day doesn't matter.\n * Example: 2026-04-30\n */\n dateOnly(): this {\n return this.dateTimeType(\"date\");\n }\n\n /**\n * Time in 24-hours format.\n * Example: 19:35\n */\n timeOnly(): this {\n return this.dateTimeType(\"time\");\n }\n\n /**\n * This is an ISO 8601 datetime with an explicit timezone offset.\n * Example: 2026-04-29T13:25:00+02:00\n */\n withTimezone(): this {\n return this.dateTimeType(\"dateTimeWithTimezone\");\n }\n\n /**\n * This is an ISO 8601 datetime in UTC (Zulu time). \"Z\" means \"this is UTC, no offset.\"\n * Example: 2026-04-30T13:25:00.000Z\n */\n withoutTimezone(): this {\n return this.dateTimeType(\"dateTimeWithoutTimezone\");\n }\n\n dateGte(value: string, message?: string): this {\n const type = this.config.settings?.type || \"date\";\n return this.validation({\n name: \"dateGte\",\n message: message || \"Date/time is earlier than the provided one.\",\n settings: { value, type }\n });\n }\n\n dateLte(value: string, message?: string): this {\n const type = this.config.settings?.type || \"date\";\n return this.validation({\n name: \"dateLte\",\n message: message || \"Date/time is later than the provided one.\",\n settings: { value, type }\n });\n }\n}\n\nclass DateTimeFieldTypeFactory implements IFieldTypeFactory {\n readonly type = \"datetime\";\n\n create(): IDateTimeFieldBuilder {\n return new DateTimeFieldBuilder();\n }\n}\n\nexport const DateTimeFieldType = FieldType.createImplementation({\n implementation: DateTimeFieldTypeFactory,\n dependencies: []\n});\n\n// Module augmentation for TypeScript autocomplete\ndeclare module \"../abstractions.js\" {\n interface IFieldBuilderRegistry {\n datetime(): IDateTimeFieldBuilder;\n }\n}\n"],"names":["DateTimeFieldBuilder","DataFieldBuilder","message","type","value","DateTimeFieldTypeFactory","DateTimeFieldType","FieldType"],"mappings":";;AAeA,MAAMA,6BAA6BC;IAC/B,aAAqB;QACjB,KAAK,CAAC;QAKN,IAAI,CAAC,YAAY;IACrB;IAEA,SAASC,OAAgB,EAAQ;QAC7B,OAAO,IAAI,CAAC,UAAU,CAAC;YACnB,MAAM;YACN,SAASA,WAAW;YACpB,UAAU,CAAC;QACf;IACJ;IAEA,aAAaC,IAAkB,EAAQ;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC;QAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAGA;QAC5B,OAAO,IAAI;IACf;IAMA,WAAiB;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B;IAMA,WAAiB;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B;IAMA,eAAqB;QACjB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B;IAMA,kBAAwB;QACpB,OAAO,IAAI,CAAC,YAAY,CAAC;IAC7B;IAEA,QAAQC,KAAa,EAAEF,OAAgB,EAAQ;QAC3C,MAAMC,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ;QAC3C,OAAO,IAAI,CAAC,UAAU,CAAC;YACnB,MAAM;YACN,SAASD,WAAW;YACpB,UAAU;gBAAEE;gBAAOD;YAAK;QAC5B;IACJ;IAEA,QAAQC,KAAa,EAAEF,OAAgB,EAAQ;QAC3C,MAAMC,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ;QAC3C,OAAO,IAAI,CAAC,UAAU,CAAC;YACnB,MAAM;YACN,SAASD,WAAW;YACpB,UAAU;gBAAEE;gBAAOD;YAAK;QAC5B;IACJ;AACJ;AAEA,MAAME;IAGF,SAAgC;QAC5B,OAAO,IAAIL;IACf;;aAJS,IAAI,GAAG;;AAKpB;AAEO,MAAMM,oBAAoBC,UAAU,oBAAoB,CAAC;IAC5D,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -4,6 +4,14 @@ import { PublicModelBuilder } from "./PublicModelBuilder.js";
|
|
|
4
4
|
export interface IModelBuilderPrivateInput {
|
|
5
5
|
modelId: string;
|
|
6
6
|
name: string;
|
|
7
|
+
/**
|
|
8
|
+
* Publish entry lifecycle events (`Cms/Entry/*`) for this model. Defaults to `true`.
|
|
9
|
+
*
|
|
10
|
+
* Set to `false` when the model is used as a storage layer, and your own use cases publish
|
|
11
|
+
* app-specific events. No entry event handlers will run for this model: that includes
|
|
12
|
+
* `Before*` handlers (validation, data modification), audit logs, webhooks, etc.
|
|
13
|
+
*/
|
|
14
|
+
lifecycleEvents?: boolean;
|
|
7
15
|
}
|
|
8
16
|
export interface IModelBuilderPublicInput {
|
|
9
17
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/modelBuilder/models/ModelBuilder.js","sources":["../../../../src/features/modelBuilder/models/ModelBuilder.ts"],"sourcesContent":["import { FieldBuilderRegistry } from \"../abstractions.js\";\nimport { PrivateModelBuilder } from \"./PrivateModelBuilder.js\";\nimport { PublicModelBuilder } from \"./PublicModelBuilder.js\";\n\nexport interface IModelBuilderPrivateInput {\n modelId: string;\n name: string;\n}\n\nexport interface IModelBuilderPublicInput {\n name: string;\n modelId: string;\n group: string;\n singularApiName?: string;\n pluralApiName?: string;\n}\n\n/**\n * Entry point builder that allows selecting model type.\n * Call .private() or .public() to get the appropriate typed builder.\n */\nexport class ModelBuilder {\n public constructor(private registry: FieldBuilderRegistry.Interface) {}\n\n /**\n * Create a private model (internal models, no GraphQL API).\n */\n public private(input: IModelBuilderPrivateInput): PrivateModelBuilder {\n const model = new PrivateModelBuilder(this.registry);\n model.modelId(input.modelId);\n model.name(input.name);\n return model;\n }\n\n /**\n * Create a public model (with GraphQL API).\n */\n public public(input: IModelBuilderPublicInput): PublicModelBuilder {\n const model = new PublicModelBuilder(this.registry);\n model.name(input.name);\n model.modelId(input.modelId);\n model.group(input.group);\n if (input.singularApiName) {\n model.singularApiName(input.singularApiName);\n }\n if (input.pluralApiName) {\n model.pluralApiName(input.pluralApiName);\n }\n return model;\n }\n}\n"],"names":["ModelBuilder","registry","input","model","PrivateModelBuilder","PublicModelBuilder"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"features/modelBuilder/models/ModelBuilder.js","sources":["../../../../src/features/modelBuilder/models/ModelBuilder.ts"],"sourcesContent":["import { FieldBuilderRegistry } from \"../abstractions.js\";\nimport { PrivateModelBuilder } from \"./PrivateModelBuilder.js\";\nimport { PublicModelBuilder } from \"./PublicModelBuilder.js\";\n\nexport interface IModelBuilderPrivateInput {\n modelId: string;\n name: string;\n /**\n * Publish entry lifecycle events (`Cms/Entry/*`) for this model. Defaults to `true`.\n *\n * Set to `false` when the model is used as a storage layer, and your own use cases publish\n * app-specific events. No entry event handlers will run for this model: that includes\n * `Before*` handlers (validation, data modification), audit logs, webhooks, etc.\n */\n lifecycleEvents?: boolean;\n}\n\nexport interface IModelBuilderPublicInput {\n name: string;\n modelId: string;\n group: string;\n singularApiName?: string;\n pluralApiName?: string;\n}\n\n/**\n * Entry point builder that allows selecting model type.\n * Call .private() or .public() to get the appropriate typed builder.\n */\nexport class ModelBuilder {\n public constructor(private registry: FieldBuilderRegistry.Interface) {}\n\n /**\n * Create a private model (internal models, no GraphQL API).\n */\n public private(input: IModelBuilderPrivateInput): PrivateModelBuilder {\n const model = new PrivateModelBuilder(this.registry);\n model.modelId(input.modelId);\n model.name(input.name);\n if (input.lifecycleEvents === false) {\n model.disableLifecycleEvents();\n }\n return model;\n }\n\n /**\n * Create a public model (with GraphQL API).\n */\n public public(input: IModelBuilderPublicInput): PublicModelBuilder {\n const model = new PublicModelBuilder(this.registry);\n model.name(input.name);\n model.modelId(input.modelId);\n model.group(input.group);\n if (input.singularApiName) {\n model.singularApiName(input.singularApiName);\n }\n if (input.pluralApiName) {\n model.pluralApiName(input.pluralApiName);\n }\n return model;\n }\n}\n"],"names":["ModelBuilder","registry","input","model","PrivateModelBuilder","PublicModelBuilder"],"mappings":";;AA6BO,MAAMA;IACT,YAA2BC,QAAwC,CAAE;aAA1CA,QAAQ,GAARA;IAA2C;IAK/D,QAAQC,KAAgC,EAAuB;QAClE,MAAMC,QAAQ,IAAIC,oBAAoB,IAAI,CAAC,QAAQ;QACnDD,MAAM,OAAO,CAACD,MAAM,OAAO;QAC3BC,MAAM,IAAI,CAACD,MAAM,IAAI;QACrB,IAAIA,AAA0B,UAA1BA,MAAM,eAAe,EACrBC,MAAM,sBAAsB;QAEhC,OAAOA;IACX;IAKO,OAAOD,KAA+B,EAAsB;QAC/D,MAAMC,QAAQ,IAAIE,mBAAmB,IAAI,CAAC,QAAQ;QAClDF,MAAM,IAAI,CAACD,MAAM,IAAI;QACrBC,MAAM,OAAO,CAACD,MAAM,OAAO;QAC3BC,MAAM,KAAK,CAACD,MAAM,KAAK;QACvB,IAAIA,MAAM,eAAe,EACrBC,MAAM,eAAe,CAACD,MAAM,eAAe;QAE/C,IAAIA,MAAM,aAAa,EACnBC,MAAM,aAAa,CAACD,MAAM,aAAa;QAE3C,OAAOC;IACX;AACJ"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { BaseModelBuilder } from "./BaseModelBuilder.js";
|
|
2
2
|
export declare class PrivateModelBuilder extends BaseModelBuilder {
|
|
3
|
+
private lifecycleEvents;
|
|
4
|
+
/**
|
|
5
|
+
* @internal Use `builder.private({ lifecycleEvents: false })` instead.
|
|
6
|
+
*/
|
|
7
|
+
disableLifecycleEvents(): this;
|
|
3
8
|
build(): import("~/plugins/CmsModelPlugin.js").CmsModelPlugin;
|
|
4
9
|
}
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import { createPrivateModelPlugin } from "../../../plugins/CmsModelPlugin.js";
|
|
2
2
|
import { BaseModelBuilder } from "./BaseModelBuilder.js";
|
|
3
3
|
class PrivateModelBuilder extends BaseModelBuilder {
|
|
4
|
+
disableLifecycleEvents() {
|
|
5
|
+
this.lifecycleEvents = false;
|
|
6
|
+
return this;
|
|
7
|
+
}
|
|
4
8
|
build() {
|
|
5
9
|
if (!this.config.modelId) throw new Error("modelId is required");
|
|
6
10
|
if (!this.config.name) throw new Error("name is required");
|
|
7
11
|
if (0 === this.fieldBuildersMap.size) throw new Error("fields are required");
|
|
8
12
|
const { fields } = this.buildFields();
|
|
13
|
+
const settings = {
|
|
14
|
+
...this.config.settings || {}
|
|
15
|
+
};
|
|
16
|
+
if (!this.lifecycleEvents) settings.lifecycleEvents = false;
|
|
9
17
|
return createPrivateModelPlugin({
|
|
10
18
|
modelId: this.config.modelId,
|
|
11
19
|
name: this.config.name,
|
|
@@ -13,9 +21,12 @@ class PrivateModelBuilder extends BaseModelBuilder {
|
|
|
13
21
|
authorization: false,
|
|
14
22
|
noValidate: true,
|
|
15
23
|
tags: this.getTags(),
|
|
16
|
-
settings
|
|
24
|
+
settings
|
|
17
25
|
});
|
|
18
26
|
}
|
|
27
|
+
constructor(...args){
|
|
28
|
+
super(...args), this.lifecycleEvents = true;
|
|
29
|
+
}
|
|
19
30
|
}
|
|
20
31
|
export { PrivateModelBuilder };
|
|
21
32
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/modelBuilder/models/PrivateModelBuilder.js","sources":["../../../../src/features/modelBuilder/models/PrivateModelBuilder.ts"],"sourcesContent":["import { createPrivateModelPlugin } from \"~/plugins/CmsModelPlugin.js\";\nimport { BaseModelBuilder } from \"./BaseModelBuilder.js\";\n\nexport class PrivateModelBuilder extends BaseModelBuilder {\n public build() {\n if (!this.config.modelId) {\n throw new Error(\"modelId is required\");\n }\n if (!this.config.name) {\n throw new Error(\"name is required\");\n }\n if (this.fieldBuildersMap.size === 0) {\n throw new Error(\"fields are required\");\n }\n\n // Build all fields from field builders (layout replacements ignored for private models)\n const { fields } = this.buildFields();\n\n return createPrivateModelPlugin({\n modelId: this.config.modelId,\n name: this.config.name,\n fields,\n authorization: false,\n noValidate: true,\n tags: this.getTags(),\n settings
|
|
1
|
+
{"version":3,"file":"features/modelBuilder/models/PrivateModelBuilder.js","sources":["../../../../src/features/modelBuilder/models/PrivateModelBuilder.ts"],"sourcesContent":["import { createPrivateModelPlugin } from \"~/plugins/CmsModelPlugin.js\";\nimport { BaseModelBuilder } from \"./BaseModelBuilder.js\";\n\nexport class PrivateModelBuilder extends BaseModelBuilder {\n private lifecycleEvents = true;\n\n /**\n * @internal Use `builder.private({ lifecycleEvents: false })` instead.\n */\n public disableLifecycleEvents(): this {\n this.lifecycleEvents = false;\n return this;\n }\n\n public build() {\n if (!this.config.modelId) {\n throw new Error(\"modelId is required\");\n }\n if (!this.config.name) {\n throw new Error(\"name is required\");\n }\n if (this.fieldBuildersMap.size === 0) {\n throw new Error(\"fields are required\");\n }\n\n // Build all fields from field builders (layout replacements ignored for private models)\n const { fields } = this.buildFields();\n\n const settings = { ...(this.config.settings || {}) };\n if (!this.lifecycleEvents) {\n settings.lifecycleEvents = false;\n }\n\n return createPrivateModelPlugin({\n modelId: this.config.modelId,\n name: this.config.name,\n fields,\n authorization: false,\n noValidate: true,\n tags: this.getTags(),\n settings\n });\n }\n}\n"],"names":["PrivateModelBuilder","BaseModelBuilder","Error","fields","settings","createPrivateModelPlugin"],"mappings":";;AAGO,MAAMA,4BAA4BC;IAM9B,yBAA+B;QAClC,IAAI,CAAC,eAAe,GAAG;QACvB,OAAO,IAAI;IACf;IAEO,QAAQ;QACX,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EACpB,MAAM,IAAIC,MAAM;QAEpB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EACjB,MAAM,IAAIA,MAAM;QAEpB,IAAI,AAA+B,MAA/B,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAC1B,MAAM,IAAIA,MAAM;QAIpB,MAAM,EAAEC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW;QAEnC,MAAMC,WAAW;YAAE,GAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;QAAE;QACnD,IAAI,CAAC,IAAI,CAAC,eAAe,EACrBA,SAAS,eAAe,GAAG;QAG/B,OAAOC,yBAAyB;YAC5B,SAAS,IAAI,CAAC,MAAM,CAAC,OAAO;YAC5B,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI;YACtBF;YACA,eAAe;YACf,YAAY;YACZ,MAAM,IAAI,CAAC,OAAO;YAClBC;QACJ;IACJ;;QAvCG,qBACK,eAAe,GAAG;;AAuC9B"}
|
|
@@ -15,6 +15,7 @@ import { resolvePublish } from "./resolvers/manage/resolvePublish.js";
|
|
|
15
15
|
import { resolveRepublish } from "./resolvers/manage/resolveRepublish.js";
|
|
16
16
|
import { resolveUnpublish } from "./resolvers/manage/resolveUnpublish.js";
|
|
17
17
|
import { resolveCreateFrom } from "./resolvers/manage/resolveCreateFrom.js";
|
|
18
|
+
import { resolveDuplicate } from "./resolvers/manage/resolveDuplicate.js";
|
|
18
19
|
import { normalizeGraphQlInput } from "./resolvers/manage/normalizeGraphQlInput.js";
|
|
19
20
|
import { createFieldResolversFactory } from "./createFieldResolvers.js";
|
|
20
21
|
import { getEntryTitle } from "../../utils/getEntryTitle.js";
|
|
@@ -62,7 +63,8 @@ const createManageResolvers = ({ models, model, fieldRegistry })=>{
|
|
|
62
63
|
[`publish${model.singularApiName}`]: resolvePublish(resolverFactoryParams),
|
|
63
64
|
[`republish${model.singularApiName}`]: resolveRepublish(resolverFactoryParams),
|
|
64
65
|
[`unpublish${model.singularApiName}`]: resolveUnpublish(resolverFactoryParams),
|
|
65
|
-
[`create${model.singularApiName}From`]: normalizeGraphQlInput(resolveCreateFrom)(resolverFactoryParams)
|
|
66
|
+
[`create${model.singularApiName}From`]: normalizeGraphQlInput(resolveCreateFrom)(resolverFactoryParams),
|
|
67
|
+
[`duplicate${model.singularApiName}`]: resolveDuplicate(resolverFactoryParams)
|
|
66
68
|
},
|
|
67
69
|
...fieldResolvers,
|
|
68
70
|
[`${model.singularApiName}Meta`]: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql/schema/createManageResolvers.js","sources":["../../../src/graphql/schema/createManageResolvers.ts"],"sourcesContent":["import type { CmsContext, CmsEntry, CmsModel } from \"~/types/index.js\";\nimport type { CmsModelFieldToGraphQLRegistry } from \"~/features/graphql/index.js\";\nimport { resolveGet } from \"./resolvers/manage/resolveGet.js\";\nimport { resolveList } from \"./resolvers/manage/resolveList.js\";\nimport { resolveListDeleted } from \"./resolvers/manage/resolveListDeleted.js\";\nimport { resolveGetRevisions } from \"./resolvers/manage/resolveGetRevisions.js\";\nimport { resolveGetByIds } from \"./resolvers/manage/resolveGetByIds.js\";\nimport { resolveCreate } from \"./resolvers/manage/resolveCreate.js\";\nimport { resolveUpdate } from \"./resolvers/manage/resolveUpdate.js\";\nimport { resolveUpdateRevisionDescription } from \"./resolvers/manage/resolveUpdateRevisionDescription.js\";\nimport { resolveValidate } from \"./resolvers/manage/resolveValidate.js\";\nimport { resolveMove } from \"./resolvers/manage/resolveMove.js\";\nimport { resolveDelete } from \"./resolvers/manage/resolveDelete.js\";\nimport { resolveRestoreFromBin } from \"./resolvers/manage/resolveRestoreFromBin.js\";\nimport { resolveDeleteMultiple } from \"./resolvers/manage/resolveDeleteMultiple.js\";\nimport { resolvePublish } from \"./resolvers/manage/resolvePublish.js\";\nimport { resolveRepublish } from \"./resolvers/manage/resolveRepublish.js\";\nimport { resolveUnpublish } from \"./resolvers/manage/resolveUnpublish.js\";\nimport { resolveCreateFrom } from \"./resolvers/manage/resolveCreateFrom.js\";\nimport { normalizeGraphQlInput } from \"./resolvers/manage/normalizeGraphQlInput.js\";\nimport { createFieldResolversFactory } from \"./createFieldResolvers.js\";\nimport { getEntryTitle } from \"~/utils/getEntryTitle.js\";\nimport { getEntryImage } from \"~/utils/getEntryImage.js\";\nimport { entryFieldFromStorageTransform } from \"~/utils/entryStorage.js\";\n\ninterface CreateManageResolversParams {\n models: CmsModel[];\n model: CmsModel;\n fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface;\n}\n\ninterface CreateManageResolvers {\n // TODO @ts-refactor determine correct type.\n (params: CreateManageResolversParams): any;\n}\n\nexport const createManageResolvers: CreateManageResolvers = ({ models, model, fieldRegistry }) => {\n const createFieldResolvers = createFieldResolversFactory({\n endpointType: \"manage\",\n models,\n model,\n fieldRegistry\n });\n\n const fieldResolvers = createFieldResolvers({\n graphQLType: model.singularApiName,\n fields: model.fields,\n isRoot: true,\n // These are extra fields we want to apply to field resolvers of \"gqlType\"\n extraResolvers: {\n /**\n * Advanced Content Organization\n */\n wbyAco_location: async (entry: CmsEntry) => {\n return entry.location || null;\n },\n meta(entry) {\n return entry;\n }\n }\n });\n\n const resolverFactoryParams = { model, fieldRegistry };\n\n return {\n Query: {\n [`get${model.singularApiName}`]: resolveGet(resolverFactoryParams),\n [`get${model.singularApiName}Revisions`]: resolveGetRevisions(resolverFactoryParams),\n [`get${model.pluralApiName}ByIds`]: resolveGetByIds(resolverFactoryParams),\n [`list${model.pluralApiName}`]: resolveList(resolverFactoryParams),\n [`listDeleted${model.pluralApiName}`]: resolveListDeleted(resolverFactoryParams)\n },\n Mutation: {\n [`create${model.singularApiName}`]:\n normalizeGraphQlInput(resolveCreate)(resolverFactoryParams),\n [`update${model.singularApiName}`]:\n normalizeGraphQlInput(resolveUpdate)(resolverFactoryParams),\n [`update${model.singularApiName}RevisionDescription`]: normalizeGraphQlInput(\n resolveUpdateRevisionDescription\n )(resolverFactoryParams),\n [`validate${model.singularApiName}`]: resolveValidate(resolverFactoryParams),\n [`move${model.singularApiName}`]: resolveMove(resolverFactoryParams),\n [`delete${model.singularApiName}`]: resolveDelete(resolverFactoryParams),\n [`restore${model.singularApiName}FromBin`]:\n resolveRestoreFromBin(resolverFactoryParams),\n [`deleteMultiple${model.pluralApiName}`]: resolveDeleteMultiple(resolverFactoryParams),\n [`publish${model.singularApiName}`]: resolvePublish(resolverFactoryParams),\n [`republish${model.singularApiName}`]: resolveRepublish(resolverFactoryParams),\n [`unpublish${model.singularApiName}`]: resolveUnpublish(resolverFactoryParams),\n [`create${model.singularApiName}From`]:\n normalizeGraphQlInput(resolveCreateFrom)(resolverFactoryParams)\n },\n ...fieldResolvers,\n [`${model.singularApiName}Meta`]: {\n title(entry: Pick<CmsEntry, \"id\" | \"values\">) {\n return getEntryTitle(model, entry);\n },\n description: (entry: Pick<CmsEntry, \"values\">, _: any, context: CmsContext) => {\n if (!model.descriptionFieldId) {\n return \"\";\n }\n const field = model.fields.find(f => f.fieldId === model.descriptionFieldId);\n if (!field) {\n return \"\";\n }\n\n return entryFieldFromStorageTransform({\n context,\n model,\n field,\n value: entry.values[field.fieldId as keyof CmsEntry[\"values\"]]\n });\n },\n image: (entry: Pick<CmsEntry, \"values\">) => {\n return getEntryImage(model, entry);\n },\n status(entry: Pick<CmsEntry, \"status\">) {\n return entry.status;\n },\n async revisions(entry: Pick<CmsEntry, \"entryId\">, _: any, context: CmsContext) {\n const revisions = await context.cms.getEntryRevisions(model, entry.entryId);\n return revisions.sort((a, b) => b.version - a.version);\n }\n }\n };\n};\n"],"names":["createManageResolvers","models","model","fieldRegistry","createFieldResolvers","createFieldResolversFactory","fieldResolvers","entry","resolverFactoryParams","resolveGet","resolveGetRevisions","resolveGetByIds","resolveList","resolveListDeleted","normalizeGraphQlInput","resolveCreate","resolveUpdate","resolveUpdateRevisionDescription","resolveValidate","resolveMove","resolveDelete","resolveRestoreFromBin","resolveDeleteMultiple","resolvePublish","resolveRepublish","resolveUnpublish","resolveCreateFrom","getEntryTitle","_","context","field","f","entryFieldFromStorageTransform","getEntryImage","revisions","a","b"],"mappings":"
|
|
1
|
+
{"version":3,"file":"graphql/schema/createManageResolvers.js","sources":["../../../src/graphql/schema/createManageResolvers.ts"],"sourcesContent":["import type { CmsContext, CmsEntry, CmsModel } from \"~/types/index.js\";\nimport type { CmsModelFieldToGraphQLRegistry } from \"~/features/graphql/index.js\";\nimport { resolveGet } from \"./resolvers/manage/resolveGet.js\";\nimport { resolveList } from \"./resolvers/manage/resolveList.js\";\nimport { resolveListDeleted } from \"./resolvers/manage/resolveListDeleted.js\";\nimport { resolveGetRevisions } from \"./resolvers/manage/resolveGetRevisions.js\";\nimport { resolveGetByIds } from \"./resolvers/manage/resolveGetByIds.js\";\nimport { resolveCreate } from \"./resolvers/manage/resolveCreate.js\";\nimport { resolveUpdate } from \"./resolvers/manage/resolveUpdate.js\";\nimport { resolveUpdateRevisionDescription } from \"./resolvers/manage/resolveUpdateRevisionDescription.js\";\nimport { resolveValidate } from \"./resolvers/manage/resolveValidate.js\";\nimport { resolveMove } from \"./resolvers/manage/resolveMove.js\";\nimport { resolveDelete } from \"./resolvers/manage/resolveDelete.js\";\nimport { resolveRestoreFromBin } from \"./resolvers/manage/resolveRestoreFromBin.js\";\nimport { resolveDeleteMultiple } from \"./resolvers/manage/resolveDeleteMultiple.js\";\nimport { resolvePublish } from \"./resolvers/manage/resolvePublish.js\";\nimport { resolveRepublish } from \"./resolvers/manage/resolveRepublish.js\";\nimport { resolveUnpublish } from \"./resolvers/manage/resolveUnpublish.js\";\nimport { resolveCreateFrom } from \"./resolvers/manage/resolveCreateFrom.js\";\nimport { resolveDuplicate } from \"./resolvers/manage/resolveDuplicate.js\";\nimport { normalizeGraphQlInput } from \"./resolvers/manage/normalizeGraphQlInput.js\";\nimport { createFieldResolversFactory } from \"./createFieldResolvers.js\";\nimport { getEntryTitle } from \"~/utils/getEntryTitle.js\";\nimport { getEntryImage } from \"~/utils/getEntryImage.js\";\nimport { entryFieldFromStorageTransform } from \"~/utils/entryStorage.js\";\n\ninterface CreateManageResolversParams {\n models: CmsModel[];\n model: CmsModel;\n fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface;\n}\n\ninterface CreateManageResolvers {\n // TODO @ts-refactor determine correct type.\n (params: CreateManageResolversParams): any;\n}\n\nexport const createManageResolvers: CreateManageResolvers = ({ models, model, fieldRegistry }) => {\n const createFieldResolvers = createFieldResolversFactory({\n endpointType: \"manage\",\n models,\n model,\n fieldRegistry\n });\n\n const fieldResolvers = createFieldResolvers({\n graphQLType: model.singularApiName,\n fields: model.fields,\n isRoot: true,\n // These are extra fields we want to apply to field resolvers of \"gqlType\"\n extraResolvers: {\n /**\n * Advanced Content Organization\n */\n wbyAco_location: async (entry: CmsEntry) => {\n return entry.location || null;\n },\n meta(entry) {\n return entry;\n }\n }\n });\n\n const resolverFactoryParams = { model, fieldRegistry };\n\n return {\n Query: {\n [`get${model.singularApiName}`]: resolveGet(resolverFactoryParams),\n [`get${model.singularApiName}Revisions`]: resolveGetRevisions(resolverFactoryParams),\n [`get${model.pluralApiName}ByIds`]: resolveGetByIds(resolverFactoryParams),\n [`list${model.pluralApiName}`]: resolveList(resolverFactoryParams),\n [`listDeleted${model.pluralApiName}`]: resolveListDeleted(resolverFactoryParams)\n },\n Mutation: {\n [`create${model.singularApiName}`]:\n normalizeGraphQlInput(resolveCreate)(resolverFactoryParams),\n [`update${model.singularApiName}`]:\n normalizeGraphQlInput(resolveUpdate)(resolverFactoryParams),\n [`update${model.singularApiName}RevisionDescription`]: normalizeGraphQlInput(\n resolveUpdateRevisionDescription\n )(resolverFactoryParams),\n [`validate${model.singularApiName}`]: resolveValidate(resolverFactoryParams),\n [`move${model.singularApiName}`]: resolveMove(resolverFactoryParams),\n [`delete${model.singularApiName}`]: resolveDelete(resolverFactoryParams),\n [`restore${model.singularApiName}FromBin`]:\n resolveRestoreFromBin(resolverFactoryParams),\n [`deleteMultiple${model.pluralApiName}`]: resolveDeleteMultiple(resolverFactoryParams),\n [`publish${model.singularApiName}`]: resolvePublish(resolverFactoryParams),\n [`republish${model.singularApiName}`]: resolveRepublish(resolverFactoryParams),\n [`unpublish${model.singularApiName}`]: resolveUnpublish(resolverFactoryParams),\n [`create${model.singularApiName}From`]:\n normalizeGraphQlInput(resolveCreateFrom)(resolverFactoryParams),\n [`duplicate${model.singularApiName}`]: resolveDuplicate(resolverFactoryParams)\n },\n ...fieldResolvers,\n [`${model.singularApiName}Meta`]: {\n title(entry: Pick<CmsEntry, \"id\" | \"values\">) {\n return getEntryTitle(model, entry);\n },\n description: (entry: Pick<CmsEntry, \"values\">, _: any, context: CmsContext) => {\n if (!model.descriptionFieldId) {\n return \"\";\n }\n const field = model.fields.find(f => f.fieldId === model.descriptionFieldId);\n if (!field) {\n return \"\";\n }\n\n return entryFieldFromStorageTransform({\n context,\n model,\n field,\n value: entry.values[field.fieldId as keyof CmsEntry[\"values\"]]\n });\n },\n image: (entry: Pick<CmsEntry, \"values\">) => {\n return getEntryImage(model, entry);\n },\n status(entry: Pick<CmsEntry, \"status\">) {\n return entry.status;\n },\n async revisions(entry: Pick<CmsEntry, \"entryId\">, _: any, context: CmsContext) {\n const revisions = await context.cms.getEntryRevisions(model, entry.entryId);\n return revisions.sort((a, b) => b.version - a.version);\n }\n }\n };\n};\n"],"names":["createManageResolvers","models","model","fieldRegistry","createFieldResolvers","createFieldResolversFactory","fieldResolvers","entry","resolverFactoryParams","resolveGet","resolveGetRevisions","resolveGetByIds","resolveList","resolveListDeleted","normalizeGraphQlInput","resolveCreate","resolveUpdate","resolveUpdateRevisionDescription","resolveValidate","resolveMove","resolveDelete","resolveRestoreFromBin","resolveDeleteMultiple","resolvePublish","resolveRepublish","resolveUnpublish","resolveCreateFrom","resolveDuplicate","getEntryTitle","_","context","field","f","entryFieldFromStorageTransform","getEntryImage","revisions","a","b"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAqCO,MAAMA,wBAA+C,CAAC,EAAEC,MAAM,EAAEC,KAAK,EAAEC,aAAa,EAAE;IACzF,MAAMC,uBAAuBC,4BAA4B;QACrD,cAAc;QACdJ;QACAC;QACAC;IACJ;IAEA,MAAMG,iBAAiBF,qBAAqB;QACxC,aAAaF,MAAM,eAAe;QAClC,QAAQA,MAAM,MAAM;QACpB,QAAQ;QAER,gBAAgB;YAIZ,iBAAiB,OAAOK,QACbA,MAAM,QAAQ,IAAI;YAE7B,MAAKA,KAAK;gBACN,OAAOA;YACX;QACJ;IACJ;IAEA,MAAMC,wBAAwB;QAAEN;QAAOC;IAAc;IAErD,OAAO;QACH,OAAO;YACH,CAAC,CAAC,GAAG,EAAED,MAAM,eAAe,EAAE,CAAC,EAAEO,WAAWD;YAC5C,CAAC,CAAC,GAAG,EAAEN,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC,EAAEQ,oBAAoBF;YAC9D,CAAC,CAAC,GAAG,EAAEN,MAAM,aAAa,CAAC,KAAK,CAAC,CAAC,EAAES,gBAAgBH;YACpD,CAAC,CAAC,IAAI,EAAEN,MAAM,aAAa,EAAE,CAAC,EAAEU,YAAYJ;YAC5C,CAAC,CAAC,WAAW,EAAEN,MAAM,aAAa,EAAE,CAAC,EAAEW,mBAAmBL;QAC9D;QACA,UAAU;YACN,CAAC,CAAC,MAAM,EAAEN,MAAM,eAAe,EAAE,CAAC,EAC9BY,sBAAsBC,eAAeP;YACzC,CAAC,CAAC,MAAM,EAAEN,MAAM,eAAe,EAAE,CAAC,EAC9BY,sBAAsBE,eAAeR;YACzC,CAAC,CAAC,MAAM,EAAEN,MAAM,eAAe,CAAC,mBAAmB,CAAC,CAAC,EAAEY,sBACnDG,kCACFT;YACF,CAAC,CAAC,QAAQ,EAAEN,MAAM,eAAe,EAAE,CAAC,EAAEgB,gBAAgBV;YACtD,CAAC,CAAC,IAAI,EAAEN,MAAM,eAAe,EAAE,CAAC,EAAEiB,YAAYX;YAC9C,CAAC,CAAC,MAAM,EAAEN,MAAM,eAAe,EAAE,CAAC,EAAEkB,cAAcZ;YAClD,CAAC,CAAC,OAAO,EAAEN,MAAM,eAAe,CAAC,OAAO,CAAC,CAAC,EACtCmB,sBAAsBb;YAC1B,CAAC,CAAC,cAAc,EAAEN,MAAM,aAAa,EAAE,CAAC,EAAEoB,sBAAsBd;YAChE,CAAC,CAAC,OAAO,EAAEN,MAAM,eAAe,EAAE,CAAC,EAAEqB,eAAef;YACpD,CAAC,CAAC,SAAS,EAAEN,MAAM,eAAe,EAAE,CAAC,EAAEsB,iBAAiBhB;YACxD,CAAC,CAAC,SAAS,EAAEN,MAAM,eAAe,EAAE,CAAC,EAAEuB,iBAAiBjB;YACxD,CAAC,CAAC,MAAM,EAAEN,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC,EAClCY,sBAAsBY,mBAAmBlB;YAC7C,CAAC,CAAC,SAAS,EAAEN,MAAM,eAAe,EAAE,CAAC,EAAEyB,iBAAiBnB;QAC5D;QACA,GAAGF,cAAc;QACjB,CAAC,GAAGJ,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC,EAAE;YAC9B,OAAMK,KAAsC;gBACxC,OAAOqB,cAAc1B,OAAOK;YAChC;YACA,aAAa,CAACA,OAAiCsB,GAAQC;gBACnD,IAAI,CAAC5B,MAAM,kBAAkB,EACzB,OAAO;gBAEX,MAAM6B,QAAQ7B,MAAM,MAAM,CAAC,IAAI,CAAC8B,CAAAA,IAAKA,EAAE,OAAO,KAAK9B,MAAM,kBAAkB;gBAC3E,IAAI,CAAC6B,OACD,OAAO;gBAGX,OAAOE,+BAA+B;oBAClCH;oBACA5B;oBACA6B;oBACA,OAAOxB,MAAM,MAAM,CAACwB,MAAM,OAAO,CAA6B;gBAClE;YACJ;YACA,OAAO,CAACxB,QACG2B,cAAchC,OAAOK;YAEhC,QAAOA,KAA+B;gBAClC,OAAOA,MAAM,MAAM;YACvB;YACA,MAAM,WAAUA,KAAgC,EAAEsB,CAAM,EAAEC,OAAmB;gBACzE,MAAMK,YAAY,MAAML,QAAQ,GAAG,CAAC,iBAAiB,CAAC5B,OAAOK,MAAM,OAAO;gBAC1E,OAAO4B,UAAU,IAAI,CAAC,CAACC,GAAGC,IAAMA,EAAE,OAAO,GAAGD,EAAE,OAAO;YACzD;QACJ;IACJ;AACJ"}
|
|
@@ -181,6 +181,8 @@ const createManageSDL = ({ models, model, fieldRegistry, sorters })=>{
|
|
|
181
181
|
create${singularName}(data: ${singularName}Input!, options: CreateCmsEntryOptionsInput): ${singularName}Response
|
|
182
182
|
|
|
183
183
|
create${singularName}From(revision: ID!, data: ${singularName}Input, options: CreateRevisionCmsEntryOptionsInput): ${singularName}Response
|
|
184
|
+
|
|
185
|
+
duplicate${singularName}(revision: ID!): ${singularName}Response
|
|
184
186
|
|
|
185
187
|
update${singularName}(revision: ID!, data: ${singularName}Input!, options: UpdateCmsEntryOptionsInput): ${singularName}Response
|
|
186
188
|
|