@webiny/api-headless-cms 6.4.12-beta.4 → 6.5.0-beta.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/crud/contentEntry/entryDataValidation.d.ts +1 -1
- package/crud/contentEntry/entryDataValidation.js +33 -18
- package/crud/contentEntry/entryDataValidation.js.map +1 -1
- package/crud/contentEntry.crud.js +12 -39
- package/crud/contentEntry.crud.js.map +1 -1
- package/crud/contentModel/defaultFields.js +3 -2
- package/crud/contentModel/defaultFields.js.map +1 -1
- package/crud/contentModel/validate/endingAllowed.js +1 -1
- package/crud/contentModel/validate/endingAllowed.js.map +1 -1
- package/crud/contentModel/validate/pluralApiName.js +1 -1
- package/crud/contentModel/validate/pluralApiName.js.map +1 -1
- package/crud/contentModel/validate/singularApiName.js +1 -1
- package/crud/contentModel/validate/singularApiName.js.map +1 -1
- package/crud/contentModel/validation.js +2 -2
- package/crud/contentModel/validation.js.map +1 -1
- package/domain/contentModel/schemas.d.ts +4 -0
- package/domain/contentModel/schemas.js +5 -2
- package/domain/contentModel/schemas.js.map +1 -1
- package/domain/contentModel/validation/endingAllowed.js +1 -1
- package/domain/contentModel/validation/endingAllowed.js.map +1 -1
- package/domain/contentModel/validation/pluralApiName.js +1 -1
- package/domain/contentModel/validation/pluralApiName.js.map +1 -1
- package/domain/contentModel/validation/singularApiName.js +1 -1
- package/domain/contentModel/validation/singularApiName.js.map +1 -1
- package/export/crud/exporting.js +2 -2
- package/export/crud/exporting.js.map +1 -1
- package/export/crud/imports/importGroups.js +2 -1
- package/export/crud/imports/importGroups.js.map +1 -1
- package/export/crud/imports/validateModels.js +1 -1
- package/export/crud/imports/validateModels.js.map +1 -1
- package/exports/api/cms/model.d.ts +4 -1
- package/exports/api/cms/model.js +2 -0
- package/extension.d.ts +3 -0
- package/extension.js +19 -0
- package/extension.js.map +1 -0
- package/features/contentEntry/ContentEntriesFeature.js +2 -0
- package/features/contentEntry/ContentEntriesFeature.js.map +1 -1
- package/features/contentEntry/CreateEntry/CreateEntryUseCase.js +1 -2
- package/features/contentEntry/CreateEntry/CreateEntryUseCase.js.map +1 -1
- package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js.map +1 -1
- package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionRepository.js +1 -0
- package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionRepository.js.map +1 -1
- package/features/contentEntry/GetSingletonEntry/GetSingletonEntryUseCase.js +1 -3
- package/features/contentEntry/GetSingletonEntry/GetSingletonEntryUseCase.js.map +1 -1
- package/features/contentEntry/PublishEntry/PublishEntryUseCase.js.map +1 -1
- package/features/contentEntry/UpdateRevision/UpdateRevisionRepository.d.ts +14 -0
- package/features/contentEntry/UpdateRevision/UpdateRevisionRepository.js +34 -0
- package/features/contentEntry/UpdateRevision/UpdateRevisionRepository.js.map +1 -0
- package/features/contentEntry/UpdateRevision/abstractions.d.ts +10 -0
- package/features/contentEntry/UpdateRevision/abstractions.js +5 -0
- package/features/contentEntry/UpdateRevision/abstractions.js.map +1 -0
- package/features/contentEntry/UpdateRevision/feature.d.ts +4 -0
- package/features/contentEntry/UpdateRevision/feature.js +11 -0
- package/features/contentEntry/UpdateRevision/feature.js.map +1 -0
- package/features/contentEntry/UpdateRevision/index.d.ts +1 -0
- package/features/contentEntry/UpdateRevision/index.js +1 -0
- 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/contentEntry/ensureItemIds.d.ts +13 -0
- package/features/contentEntry/ensureItemIds.js +22 -0
- package/features/contentEntry/ensureItemIds.js.map +1 -0
- package/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.d.ts +3 -1
- package/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.js +9 -3
- package/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.js.map +1 -1
- package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/CreateEntryRevisionFromDataFactory.d.ts +3 -3
- package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/CreateEntryRevisionFromDataFactory.js +10 -6
- package/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/CreateEntryRevisionFromDataFactory.js.map +1 -1
- package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/UpdateEntryDataFactory.d.ts +3 -1
- package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/UpdateEntryDataFactory.js +9 -3
- package/features/contentEntry/entryDataFactories/UpdateEntryDataFactory/UpdateEntryDataFactory.js.map +1 -1
- package/features/contentEntry/entryDataFactories/expiresAt.js +2 -2
- package/features/contentEntry/entryDataFactories/expiresAt.js.map +1 -1
- package/features/contentModel/ComponentMapGenerator/ComponentMapGenerator.d.ts +14 -0
- package/features/contentModel/ComponentMapGenerator/ComponentMapGenerator.js +32 -0
- package/features/contentModel/ComponentMapGenerator/ComponentMapGenerator.js.map +1 -0
- package/features/contentModel/ComponentMapGenerator/abstractions.d.ts +8 -0
- package/features/contentModel/ComponentMapGenerator/abstractions.js +5 -0
- package/features/contentModel/ComponentMapGenerator/abstractions.js.map +1 -0
- package/features/contentModel/ComponentMapGenerator/feature.d.ts +4 -0
- package/features/contentModel/ComponentMapGenerator/feature.js +11 -0
- package/features/contentModel/ComponentMapGenerator/feature.js.map +1 -0
- package/features/contentModel/ComponentMapGenerator/index.d.ts +2 -0
- package/features/contentModel/ComponentMapGenerator/index.js +2 -0
- package/features/contentModel/ContentModelFeature.js +6 -0
- package/features/contentModel/ContentModelFeature.js.map +1 -1
- package/features/contentModel/CreateModel/CreateModelRepository.js +2 -1
- package/features/contentModel/CreateModel/CreateModelRepository.js.map +1 -1
- package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js +2 -1
- package/features/contentModel/CreateModelFrom/CreateModelFromRepository.js.map +1 -1
- package/features/contentModel/RefModelsGenerator/RefModelsGenerator.d.ts +19 -0
- package/features/contentModel/RefModelsGenerator/RefModelsGenerator.js +56 -0
- package/features/contentModel/RefModelsGenerator/RefModelsGenerator.js.map +1 -0
- package/features/contentModel/RefModelsGenerator/abstractions.d.ts +11 -0
- package/features/contentModel/RefModelsGenerator/abstractions.js +5 -0
- package/features/contentModel/RefModelsGenerator/abstractions.js.map +1 -0
- package/features/contentModel/RefModelsGenerator/feature.d.ts +4 -0
- package/features/contentModel/RefModelsGenerator/feature.js +11 -0
- package/features/contentModel/RefModelsGenerator/feature.js.map +1 -0
- package/features/contentModel/RefModelsGenerator/index.d.ts +2 -0
- package/features/contentModel/RefModelsGenerator/index.js +2 -0
- package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.d.ts +16 -0
- package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.js +54 -0
- package/features/contentModel/ValuesSelectionGenerator/ValuesSelectionGenerator.js.map +1 -0
- package/features/contentModel/ValuesSelectionGenerator/abstractions.d.ts +8 -0
- package/features/contentModel/ValuesSelectionGenerator/abstractions.js +5 -0
- package/features/contentModel/ValuesSelectionGenerator/abstractions.js.map +1 -0
- package/features/contentModel/ValuesSelectionGenerator/feature.d.ts +4 -0
- package/features/contentModel/ValuesSelectionGenerator/feature.js +11 -0
- package/features/contentModel/ValuesSelectionGenerator/feature.js.map +1 -0
- package/features/contentModel/ValuesSelectionGenerator/index.d.ts +1 -0
- package/features/contentModel/ValuesSelectionGenerator/index.js +1 -0
- package/features/graphql/feature.js +2 -0
- package/features/graphql/feature.js.map +1 -1
- package/features/graphql/fields/base/AssetToGraphQL.d.ts +26 -0
- package/features/graphql/fields/base/AssetToGraphQL.js +148 -0
- package/features/graphql/fields/base/AssetToGraphQL.js.map +1 -0
- package/features/graphql/fields/base/DynamicZoneToGraphQL.js +12 -2
- package/features/graphql/fields/base/DynamicZoneToGraphQL.js.map +1 -1
- package/features/graphql/fields/base/ObjectToGraphQL.js +8 -5
- package/features/graphql/fields/base/ObjectToGraphQL.js.map +1 -1
- package/features/modelBuilder/abstractions.d.ts +9 -0
- package/features/modelBuilder/abstractions.js.map +1 -1
- package/features/modelBuilder/feature.js +2 -0
- package/features/modelBuilder/feature.js.map +1 -1
- package/features/modelBuilder/fields/AssetFieldType.d.ts +20 -0
- package/features/modelBuilder/fields/AssetFieldType.js +46 -0
- package/features/modelBuilder/fields/AssetFieldType.js.map +1 -0
- package/features/modelBuilder/fields/DataFieldBuilder.d.ts +62 -18
- package/features/modelBuilder/fields/DataFieldBuilder.js +8 -0
- package/features/modelBuilder/fields/DataFieldBuilder.js.map +1 -1
- package/features/modelBuilder/fields/DynamicZoneFieldType.d.ts +1 -0
- package/features/modelBuilder/fields/DynamicZoneFieldType.js +2 -6
- package/features/modelBuilder/fields/DynamicZoneFieldType.js.map +1 -1
- package/features/modelBuilder/fields/resolveAssetUrl.d.ts +35 -0
- package/features/modelBuilder/fields/resolveAssetUrl.js +26 -0
- package/features/modelBuilder/fields/resolveAssetUrl.js.map +1 -0
- package/features/modelBuilder/index.d.ts +1 -1
- package/features/modelBuilder/models/BaseModelBuilder.d.ts +3 -1
- package/features/modelBuilder/models/BaseModelBuilder.js +7 -0
- package/features/modelBuilder/models/BaseModelBuilder.js.map +1 -1
- package/features/modelBuilder/models/PrivateModelBuilder.js +2 -1
- package/features/modelBuilder/models/PrivateModelBuilder.js.map +1 -1
- package/features/modelBuilder/models/PublicModelBuilder.js +2 -1
- package/features/modelBuilder/models/PublicModelBuilder.js.map +1 -1
- package/features/sortMapper/SortMapper.js +2 -5
- package/features/sortMapper/SortMapper.js.map +1 -1
- package/features/storage/fields/CompressedTextStorageTransform.js +1 -1
- package/features/storage/fields/CompressedTextStorageTransform.js.map +1 -1
- package/features/storage/fields/DateStorageTransform.js +4 -3
- package/features/storage/fields/DateStorageTransform.js.map +1 -1
- package/features/storage/fields/DynamicZoneStorageTransform.js +2 -2
- package/features/storage/fields/DynamicZoneStorageTransform.js.map +1 -1
- package/features/storage/fields/JsonStorageTransform.js +1 -1
- package/features/storage/fields/JsonStorageTransform.js.map +1 -1
- package/features/storage/fields/LongTextStorageTransform.js +1 -1
- package/features/storage/fields/LongTextStorageTransform.js.map +1 -1
- package/features/storage/fields/ObjectStorageTransform.js +27 -7
- package/features/storage/fields/ObjectStorageTransform.js.map +1 -1
- package/features/storage/fields/RichTextStorageTransform.js +1 -1
- package/features/storage/fields/RichTextStorageTransform.js.map +1 -1
- package/features/validation/validators/DateGteValidator.js +1 -1
- package/features/validation/validators/DateGteValidator.js.map +1 -1
- package/features/validation/validators/DateLteValidator.js +1 -1
- package/features/validation/validators/DateLteValidator.js.map +1 -1
- package/features/validation/validators/PatternValidator.js +1 -1
- package/features/validation/validators/PatternValidator.js.map +1 -1
- package/features/whereMapper/WhereMapper.js +10 -7
- package/features/whereMapper/WhereMapper.js.map +1 -1
- package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js +8 -2
- package/fieldConverters/CmsModelDynamicZoneFieldConverterPlugin.js.map +1 -1
- package/fieldConverters/CmsModelObjectFieldConverterPlugin.js +8 -2
- package/fieldConverters/CmsModelObjectFieldConverterPlugin.js.map +1 -1
- package/fieldConverters/index.d.ts +1 -1
- package/graphql/getSchema/generateCacheKey.js +1 -1
- package/graphql/getSchema/generateCacheKey.js.map +1 -1
- package/graphql/scalars/RevisionId.js +1 -1
- package/graphql/scalars/RevisionId.js.map +1 -1
- package/graphql/schema/baseSchema.js +5 -25
- package/graphql/schema/baseSchema.js.map +1 -1
- package/graphql/schema/cms/getEntryResolver.js +3 -2
- package/graphql/schema/cms/getEntryResolver.js.map +1 -1
- package/graphql/schema/cms/getModelResolver.d.ts +35 -0
- package/graphql/schema/cms/getModelResolver.js +49 -0
- package/graphql/schema/cms/getModelResolver.js.map +1 -0
- package/graphql/schema/cms/helpers/buildFieldsSelection.js +9 -2
- package/graphql/schema/cms/helpers/buildFieldsSelection.js.map +1 -1
- package/graphql/schema/cms/helpers/expandFieldWildcards.d.ts +2 -0
- package/graphql/schema/cms/helpers/expandFieldWildcards.js +13 -0
- package/graphql/schema/cms/helpers/expandFieldWildcards.js.map +1 -0
- package/graphql/schema/cms/helpers/index.d.ts +1 -0
- package/graphql/schema/cms/helpers/index.js +1 -0
- package/graphql/schema/cms/helpers.d.ts +1 -0
- package/graphql/schema/cms/helpers.js +1 -0
- package/graphql/schema/cms/index.js +2 -1
- package/graphql/schema/cms/index.js.map +1 -1
- package/graphql/schema/cms/listEntriesResolver.js +3 -2
- package/graphql/schema/cms/listEntriesResolver.js.map +1 -1
- package/graphql/schema/cms/resolvers/getModel.d.ts +8 -0
- package/graphql/schema/cms/resolvers/getModel.js +18 -0
- package/graphql/schema/cms/resolvers/getModel.js.map +1 -0
- package/graphql/schema/cms/resolvers/index.d.ts +1 -0
- package/graphql/schema/cms/resolvers/index.js +1 -0
- package/graphql/schema/cms/typeDefs/query.js +1 -0
- package/graphql/schema/cms/typeDefs/query.js.map +1 -1
- package/graphql/schema/cms/typeDefs/responses.js +5 -0
- package/graphql/schema/cms/typeDefs/responses.js.map +1 -1
- package/graphql/schema/contentModels.js +40 -1
- package/graphql/schema/contentModels.js.map +1 -1
- package/graphql/schema/createFieldResolvers.js +1 -1
- package/graphql/schema/createFieldResolvers.js.map +1 -1
- package/index.d.ts +2 -5
- package/index.js +1 -21
- package/package.json +26 -29
- package/plugins/CmsModelPlugin.js +12 -10
- package/plugins/CmsModelPlugin.js.map +1 -1
- package/types/fields/dynamicZoneField.d.ts +1 -0
- package/types/model.d.ts +6 -0
- package/types/modelField.d.ts +13 -0
- package/types/types.d.ts +8 -4
- package/types/types.js.map +1 -1
- package/utils/caching/Cache.js +1 -1
- package/utils/caching/Cache.js.map +1 -1
- package/utils/contentModelToJsonSchema/CmsModelToJsonSchemaConverter.d.ts +28 -0
- package/utils/contentModelToJsonSchema/CmsModelToJsonSchemaConverter.js +324 -0
- package/utils/contentModelToJsonSchema/CmsModelToJsonSchemaConverter.js.map +1 -0
- package/utils/contentModelToJsonSchema/index.d.ts +2 -0
- package/utils/contentModelToJsonSchema/index.js +1 -0
- package/utils/contentModelToJsonSchema/types.d.ts +24 -0
- package/utils/contentModelToJsonSchema/types.js +0 -0
- package/utils/createModelField.js +2 -1
- package/utils/createModelField.js.map +1 -1
- package/utils/date.js +1 -1
- package/utils/date.js.map +1 -1
- package/utils/entryStorage.js +1 -1
- package/utils/entryStorage.js.map +1 -1
- package/utils/index.d.ts +1 -0
- package/utils/index.js +1 -0
- package/utils/renderFields.js +1 -1
- package/utils/renderFields.js.map +1 -1
- package/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentEntry/CreateEntry/CreateEntryUseCase.js","sources":["../../../../src/features/contentEntry/CreateEntry/CreateEntryUseCase.ts"],"sourcesContent":["import { createImplementation, Result } from \"@webiny/feature/api\";\nimport { CreateEntryRepository, CreateEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { EntryAfterCreateEvent, EntryBeforeCreateEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport type {\n CmsEntry,\n CmsEntryValues,\n CmsModel,\n CreateCmsEntryInput,\n CreateCmsEntryOptionsInput\n} from \"~/types/index.js\";\nimport { EntryNotAuthorizedError
|
|
1
|
+
{"version":3,"file":"features/contentEntry/CreateEntry/CreateEntryUseCase.js","sources":["../../../../src/features/contentEntry/CreateEntry/CreateEntryUseCase.ts"],"sourcesContent":["import { createImplementation, Result } from \"@webiny/feature/api\";\nimport { CreateEntryRepository, CreateEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { EntryAfterCreateEvent, EntryBeforeCreateEvent } from \"./events.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport type {\n CmsEntry,\n CmsEntryValues,\n CmsModel,\n CreateCmsEntryInput,\n CreateCmsEntryOptionsInput\n} from \"~/types/index.js\";\nimport { EntryNotAuthorizedError } from \"~/domain/contentEntry/errors.js\";\nimport { CreateEntryDataFactory } from \"~/features/contentEntry/entryDataFactories/CreateEntryDataFactory/index.js\";\n\nclass CreateEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private eventPublisher: EventPublisher.Interface,\n private repository: CreateEntryRepository.Interface,\n private accessControl: AccessControl.Interface,\n private createEntryDataFactory: CreateEntryDataFactory.Interface\n ) {}\n\n public async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n rawInput: CreateCmsEntryInput<T>,\n options?: CreateCmsEntryOptionsInput\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 { entry, input } = await this.createEntryDataFactory.create<T>(\n model,\n rawInput,\n options\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.fromEntry(entry));\n }\n\n await this.eventPublisher.publish(new EntryBeforeCreateEvent({ entry, input, model }));\n\n const result = await this.repository.execute(model, entry);\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n await this.eventPublisher.publish(\n new EntryAfterCreateEvent({\n entry,\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 CreateEntryUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: CreateEntryUseCaseImpl,\n dependencies: [EventPublisher, CreateEntryRepository, AccessControl, CreateEntryDataFactory]\n});\n"],"names":["CreateEntryUseCaseImpl","eventPublisher","repository","accessControl","createEntryDataFactory","model","rawInput","options","canAccess","Result","EntryNotAuthorizedError","entry","input","canAccessEntry","EntryBeforeCreateEvent","result","EntryAfterCreateEvent","error","CreateEntryUseCase","createImplementation","UseCaseAbstraction","EventPublisher","CreateEntryRepository","AccessControl","CreateEntryDataFactory"],"mappings":";;;;;;;AAeA,MAAMA;IACF,YACYC,cAAwC,EACxCC,UAA2C,EAC3CC,aAAsC,EACtCC,sBAAwD,CAClE;aAJUH,cAAc,GAAdA;aACAC,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,sBAAsB,GAAtBA;IACT;IAEH,MAAa,QACTC,KAAe,EACfC,QAAgC,EAChCC,OAAoC,EACkB;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,MAAM,EAAEM,KAAK,EAAEC,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAC7DP,OACAC,UACAC;YAGJ,MAAMM,iBAAiB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;gBAC3DR;gBACAM;gBACA,KAAK;YACT;YAEA,IAAI,CAACE,gBACD,OAAOJ,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACC;YAGzD,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAIG,uBAAuB;gBAAEH;gBAAOC;gBAAOP;YAAM;YAEnF,MAAMU,SAAS,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAACV,OAAOM;YACpD,IAAII,OAAO,MAAM,IACb,OAAON,OAAO,IAAI,CAACM,OAAO,KAAK;YAGnC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,sBAAsB;gBACtBL;gBACAC;gBACAP;YACJ;YAGJ,OAAOI,OAAO,EAAE,CAACE;QACrB,EAAE,OAAOM,OAAO;YACZ,OAAOR,OAAO,IAAI,CAACQ;QACvB;IACJ;AACJ;AAEO,MAAMC,wCAAqBC,qBAAqB;IACnD,aAAaC;IACb,gBAAgBpB;IAChB,cAAc;QAACqB;QAAgBC;QAAuBC;QAAeC;KAAuB;AAChG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js","sources":["../../../../src/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.ts"],"sourcesContent":["import { createImplementation, Result } from \"@webiny/feature/api\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport {\n CreateEntryRevisionFromRepository,\n CreateEntryRevisionFromUseCase as UseCaseAbstraction\n} from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/index.js\";\nimport { GetLatestRevisionByEntryIdUseCase } from \"~/features/contentEntry/GetLatestRevisionByEntryId/index.js\";\nimport type {\n CmsEntry,\n CmsEntryValues,\n CmsModel,\n CreateCmsEntryInput,\n CreateCmsEntryOptionsInput\n} from \"~/types/index.js\";\nimport {\n EntryRevisionAfterCreateEvent,\n EntryRevisionBeforeCreateEvent,\n EntryRevisionCreateErrorEvent\n} from \"./events.js\";\nimport { EntryNotAuthorizedError } from \"~/domain/contentEntry/errors.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { CreateEntryRevisionFromDataFactory } from \"~/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/index.js\";\n\nclass CreateEntryRevisionFromUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private repository: CreateEntryRevisionFromRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getRevisionById: GetRevisionByIdUseCase.Interface,\n private getLatestRevision: GetLatestRevisionByEntryIdUseCase.Interface,\n private eventPublisher: EventPublisher.Interface,\n private createEntryRevisionFromDataFactory: CreateEntryRevisionFromDataFactory.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n sourceId: string,\n rawInput: CreateCmsEntryInput<T>,\n options?: CreateCmsEntryOptionsInput\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 const { id: uniqueId } = parseIdentifier(sourceId);\n const originalResult = await this.getRevisionById.execute<T>(model, sourceId);\n\n if (originalResult.isFail()) {\n return Result.fail(originalResult.error);\n }\n\n const originalEntry = originalResult.value;\n\n const latestResult = await this.getLatestRevision.execute<T>(model, { id: uniqueId });\n\n if (latestResult.isFail()) {\n return Result.fail(latestResult.error);\n }\n\n const latestStorageEntry = latestResult.value;\n\n const { entry, input } = await this.createEntryRevisionFromDataFactory.create<T>(\n sourceId,\n model,\n rawInput,\n originalEntry,\n latestStorageEntry,\n options\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 try {\n await this.eventPublisher.publish(\n new EntryRevisionBeforeCreateEvent({\n entry,\n model,\n input,\n original: originalEntry\n })\n );\n\n const result = await this.repository.execute<T>(model, entry);\n\n if (result.isFail()) {\n await this.eventPublisher.publish(\n new EntryRevisionCreateErrorEvent({\n entry,\n model,\n input,\n original: originalEntry,\n error: result.error\n })\n );\n return Result.fail(result.error);\n }\n\n const createdEntry = result.value;\n\n await this.eventPublisher.publish(\n new EntryRevisionAfterCreateEvent({\n entry: createdEntry,\n model,\n input,\n original: originalEntry\n })\n );\n\n return Result.ok(createdEntry);\n } catch (error) {\n await this.eventPublisher.publish(\n new EntryRevisionCreateErrorEvent({\n entry,\n model,\n input,\n original: originalEntry,\n error: error as Error\n })\n );\n return Result.fail(error as
|
|
1
|
+
{"version":3,"file":"features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js","sources":["../../../../src/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.ts"],"sourcesContent":["import { createImplementation, Result } from \"@webiny/feature/api\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport {\n CreateEntryRevisionFromRepository,\n CreateEntryRevisionFromUseCase as UseCaseAbstraction\n} from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/index.js\";\nimport { GetLatestRevisionByEntryIdUseCase } from \"~/features/contentEntry/GetLatestRevisionByEntryId/index.js\";\nimport type {\n CmsEntry,\n CmsEntryValues,\n CmsModel,\n CreateCmsEntryInput,\n CreateCmsEntryOptionsInput\n} from \"~/types/index.js\";\nimport {\n EntryRevisionAfterCreateEvent,\n EntryRevisionBeforeCreateEvent,\n EntryRevisionCreateErrorEvent\n} from \"./events.js\";\nimport { EntryNotAuthorizedError } from \"~/domain/contentEntry/errors.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { CreateEntryRevisionFromDataFactory } from \"~/features/contentEntry/entryDataFactories/CreateEntryRevisionFromDataFactory/index.js\";\n\nclass CreateEntryRevisionFromUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private repository: CreateEntryRevisionFromRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getRevisionById: GetRevisionByIdUseCase.Interface,\n private getLatestRevision: GetLatestRevisionByEntryIdUseCase.Interface,\n private eventPublisher: EventPublisher.Interface,\n private createEntryRevisionFromDataFactory: CreateEntryRevisionFromDataFactory.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n sourceId: string,\n rawInput: CreateCmsEntryInput<T>,\n options?: CreateCmsEntryOptionsInput\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 const { id: uniqueId } = parseIdentifier(sourceId);\n const originalResult = await this.getRevisionById.execute<T>(model, sourceId);\n\n if (originalResult.isFail()) {\n return Result.fail(originalResult.error);\n }\n\n const originalEntry = originalResult.value;\n\n const latestResult = await this.getLatestRevision.execute<T>(model, { id: uniqueId });\n\n if (latestResult.isFail()) {\n return Result.fail(latestResult.error);\n }\n\n const latestStorageEntry = latestResult.value;\n\n const { entry, input } = await this.createEntryRevisionFromDataFactory.create<T>(\n sourceId,\n model,\n rawInput,\n originalEntry,\n latestStorageEntry,\n options\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 try {\n await this.eventPublisher.publish(\n new EntryRevisionBeforeCreateEvent({\n entry,\n model,\n input,\n original: originalEntry\n })\n );\n\n const result = await this.repository.execute<T>(model, entry);\n\n if (result.isFail()) {\n await this.eventPublisher.publish(\n new EntryRevisionCreateErrorEvent({\n entry,\n model,\n input,\n original: originalEntry,\n error: result.error\n })\n );\n return Result.fail(result.error);\n }\n\n const createdEntry = result.value;\n\n await this.eventPublisher.publish(\n new EntryRevisionAfterCreateEvent({\n entry: createdEntry,\n model,\n input,\n original: originalEntry\n })\n );\n\n return Result.ok(createdEntry);\n } catch (error) {\n await this.eventPublisher.publish(\n new EntryRevisionCreateErrorEvent({\n entry,\n model,\n input,\n original: originalEntry,\n error: error as Error\n })\n );\n return Result.fail(error as UseCaseAbstraction.Error);\n }\n }\n}\n\nexport const CreateEntryRevisionFromUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: CreateEntryRevisionFromUseCaseImpl,\n dependencies: [\n CreateEntryRevisionFromRepository,\n AccessControl,\n GetRevisionByIdUseCase,\n GetLatestRevisionByEntryIdUseCase,\n EventPublisher,\n CreateEntryRevisionFromDataFactory\n ]\n});\n"],"names":["CreateEntryRevisionFromUseCaseImpl","repository","accessControl","getRevisionById","getLatestRevision","eventPublisher","createEntryRevisionFromDataFactory","model","sourceId","rawInput","options","canAccess","Result","EntryNotAuthorizedError","uniqueId","parseIdentifier","originalResult","originalEntry","latestResult","latestStorageEntry","entry","input","canAccessEntry","EntryRevisionBeforeCreateEvent","result","EntryRevisionCreateErrorEvent","createdEntry","EntryRevisionAfterCreateEvent","error","CreateEntryRevisionFromUseCase","createImplementation","UseCaseAbstraction","CreateEntryRevisionFromRepository","AccessControl","GetRevisionByIdUseCase","GetLatestRevisionByEntryIdUseCase","EventPublisher","CreateEntryRevisionFromDataFactory"],"mappings":";;;;;;;;;;AAyBA,MAAMA;IACF,YACYC,UAAuD,EACvDC,aAAsC,EACtCC,eAAiD,EACjDC,iBAA8D,EAC9DC,cAAwC,EACxCC,kCAAgF,CAC1F;aANUL,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,eAAe,GAAfA;aACAC,iBAAiB,GAAjBA;aACAC,cAAc,GAAdA;aACAC,kCAAkC,GAAlCA;IACT;IAEH,MAAM,QACFC,KAAe,EACfC,QAAgB,EAChBC,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,MAAM,EAAE,IAAIO,QAAQ,EAAE,GAAGC,gBAAgBP;QACzC,MAAMQ,iBAAiB,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAIT,OAAOC;QAEpE,IAAIQ,eAAe,MAAM,IACrB,OAAOJ,OAAO,IAAI,CAACI,eAAe,KAAK;QAG3C,MAAMC,gBAAgBD,eAAe,KAAK;QAE1C,MAAME,eAAe,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAIX,OAAO;YAAE,IAAIO;QAAS;QAEnF,IAAII,aAAa,MAAM,IACnB,OAAON,OAAO,IAAI,CAACM,aAAa,KAAK;QAGzC,MAAMC,qBAAqBD,aAAa,KAAK;QAE7C,MAAM,EAAEE,KAAK,EAAEC,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,kCAAkC,CAAC,MAAM,CACzEb,UACAD,OACAE,UACAQ,eACAE,oBACAT;QAGJ,MAAMY,iBAAiB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAC3Df;YACAa;YACA,KAAK;QACT;QAEA,IAAI,CAACE,gBACD,OAAOV,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACN;QAGzD,IAAI;YACA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIgB,+BAA+B;gBAC/BH;gBACAb;gBACAc;gBACA,UAAUJ;YACd;YAGJ,MAAMO,SAAS,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAIjB,OAAOa;YAEvD,IAAII,OAAO,MAAM,IAAI;gBACjB,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,8BAA8B;oBAC9BL;oBACAb;oBACAc;oBACA,UAAUJ;oBACV,OAAOO,OAAO,KAAK;gBACvB;gBAEJ,OAAOZ,OAAO,IAAI,CAACY,OAAO,KAAK;YACnC;YAEA,MAAME,eAAeF,OAAO,KAAK;YAEjC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIG,8BAA8B;gBAC9B,OAAOD;gBACPnB;gBACAc;gBACA,UAAUJ;YACd;YAGJ,OAAOL,OAAO,EAAE,CAACc;QACrB,EAAE,OAAOE,OAAO;YACZ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIH,8BAA8B;gBAC9BL;gBACAb;gBACAc;gBACA,UAAUJ;gBACV,OAAOW;YACX;YAEJ,OAAOhB,OAAO,IAAI,CAACgB;QACvB;IACJ;AACJ;AAEO,MAAMC,gEAAiCC,qBAAqB;IAC/D,aAAaC;IACb,gBAAgB/B;IAChB,cAAc;QACVgC;QACAC;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -20,6 +20,7 @@ class DeleteEntryRevisionRepositoryImpl {
|
|
|
20
20
|
let storageLatestEntry = null;
|
|
21
21
|
if (latestEntry) {
|
|
22
22
|
const pickedEntryLevelMetaFields = pickEntryMetaFields(entry, isEntryLevelEntryMetaField);
|
|
23
|
+
if ("published" === entry.status) pickedEntryLevelMetaFields.live = null;
|
|
23
24
|
const updatedLatestEntry = {
|
|
24
25
|
...latestEntry,
|
|
25
26
|
...pickedEntryLevelMetaFields
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionRepository.js","sources":["../../../../src/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { DeleteEntryRevisionRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { EntryPersistenceError } from \"~/domain/contentEntry/errors.js\";\nimport type { CmsEntry, CmsModel } from \"~/types/index.js\";\nimport { StorageOperations } from \"~/features/shared/abstractions.js\";\nimport { EntryToStorageTransform } from \"~/legacy/abstractions.js\";\nimport { isEntryLevelEntryMetaField, pickEntryMetaFields } from \"~/constants.js\";\nimport { RuntimeTenant } from \"~/features/runtimeTenant/abstractions.js\";\n\n/**\n * DeleteEntryRevisionRepository - Handles storage operations for deleting entry revisions.\n */\nclass DeleteEntryRevisionRepositoryImpl implements RepositoryAbstraction.Interface {\n public constructor(\n private entryToStorageTransform: EntryToStorageTransform.Interface,\n private storageOperations: StorageOperations.Interface,\n private runtimeTenant: RuntimeTenant.Interface\n ) {}\n\n async execute(params: {\n model: CmsModel;\n entry: CmsEntry;\n latestEntry: CmsEntry | null;\n }): Promise<Result<void, RepositoryAbstraction.Error>> {\n const model = this.runtimeTenant.assign(params.model);\n const entry = this.runtimeTenant.assign(params.entry);\n const latestEntry = params.latestEntry\n ? this.runtimeTenant.assign(params.latestEntry)\n : null;\n\n try {\n const storageEntry = await this.entryToStorageTransform(model, entry);\n\n let storageLatestEntry = null;\n if (latestEntry) {\n
|
|
1
|
+
{"version":3,"file":"features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionRepository.js","sources":["../../../../src/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { DeleteEntryRevisionRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { EntryPersistenceError } from \"~/domain/contentEntry/errors.js\";\nimport type { CmsEntry, CmsModel } from \"~/types/index.js\";\nimport { StorageOperations } from \"~/features/shared/abstractions.js\";\nimport { EntryToStorageTransform } from \"~/legacy/abstractions.js\";\nimport { isEntryLevelEntryMetaField, pickEntryMetaFields } from \"~/constants.js\";\nimport { RuntimeTenant } from \"~/features/runtimeTenant/abstractions.js\";\n\n/**\n * DeleteEntryRevisionRepository - Handles storage operations for deleting entry revisions.\n */\nclass DeleteEntryRevisionRepositoryImpl implements RepositoryAbstraction.Interface {\n public constructor(\n private entryToStorageTransform: EntryToStorageTransform.Interface,\n private storageOperations: StorageOperations.Interface,\n private runtimeTenant: RuntimeTenant.Interface\n ) {}\n\n async execute(params: {\n model: CmsModel;\n entry: CmsEntry;\n latestEntry: CmsEntry | null;\n }): Promise<Result<void, RepositoryAbstraction.Error>> {\n const model = this.runtimeTenant.assign(params.model);\n const entry = this.runtimeTenant.assign(params.entry);\n const latestEntry = params.latestEntry\n ? this.runtimeTenant.assign(params.latestEntry)\n : null;\n\n try {\n const storageEntry = await this.entryToStorageTransform(model, entry);\n\n let storageLatestEntry = null;\n if (latestEntry) {\n const pickedEntryLevelMetaFields = pickEntryMetaFields(\n entry,\n isEntryLevelEntryMetaField\n );\n\n // If the deleted revision was published, clear the live field\n // so the new latest entry does not inherit a stale live pointer.\n if (entry.status === \"published\") {\n pickedEntryLevelMetaFields.live = null;\n }\n\n const updatedLatestEntry = {\n ...latestEntry,\n ...pickedEntryLevelMetaFields\n };\n\n storageLatestEntry = await this.entryToStorageTransform(model, updatedLatestEntry);\n }\n\n await this.storageOperations.entries.deleteRevision(model, {\n entry,\n storageEntry,\n latestEntry: latestEntry,\n latestStorageEntry: storageLatestEntry\n });\n\n return Result.ok();\n } catch (error) {\n return Result.fail(new EntryPersistenceError(error as Error));\n }\n }\n}\n\nexport const DeleteEntryRevisionRepository = createImplementation({\n abstraction: RepositoryAbstraction,\n implementation: DeleteEntryRevisionRepositoryImpl,\n dependencies: [EntryToStorageTransform, StorageOperations, RuntimeTenant]\n});\n"],"names":["DeleteEntryRevisionRepositoryImpl","entryToStorageTransform","storageOperations","runtimeTenant","params","model","entry","latestEntry","storageEntry","storageLatestEntry","pickedEntryLevelMetaFields","pickEntryMetaFields","isEntryLevelEntryMetaField","updatedLatestEntry","Result","error","EntryPersistenceError","DeleteEntryRevisionRepository","createImplementation","RepositoryAbstraction","EntryToStorageTransform","StorageOperations","RuntimeTenant"],"mappings":";;;;;;;AAaA,MAAMA;IACF,YACYC,uBAA0D,EAC1DC,iBAA8C,EAC9CC,aAAsC,CAChD;aAHUF,uBAAuB,GAAvBA;aACAC,iBAAiB,GAAjBA;aACAC,aAAa,GAAbA;IACT;IAEH,MAAM,QAAQC,MAIb,EAAsD;QACnD,MAAMC,QAAQ,IAAI,CAAC,aAAa,CAAC,MAAM,CAACD,OAAO,KAAK;QACpD,MAAME,QAAQ,IAAI,CAAC,aAAa,CAAC,MAAM,CAACF,OAAO,KAAK;QACpD,MAAMG,cAAcH,OAAO,WAAW,GAChC,IAAI,CAAC,aAAa,CAAC,MAAM,CAACA,OAAO,WAAW,IAC5C;QAEN,IAAI;YACA,MAAMI,eAAe,MAAM,IAAI,CAAC,uBAAuB,CAACH,OAAOC;YAE/D,IAAIG,qBAAqB;YACzB,IAAIF,aAAa;gBACb,MAAMG,6BAA6BC,oBAC/BL,OACAM;gBAKJ,IAAIN,AAAiB,gBAAjBA,MAAM,MAAM,EACZI,2BAA2B,IAAI,GAAG;gBAGtC,MAAMG,qBAAqB;oBACvB,GAAGN,WAAW;oBACd,GAAGG,0BAA0B;gBACjC;gBAEAD,qBAAqB,MAAM,IAAI,CAAC,uBAAuB,CAACJ,OAAOQ;YACnE;YAEA,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,cAAc,CAACR,OAAO;gBACvDC;gBACAE;gBACA,aAAaD;gBACb,oBAAoBE;YACxB;YAEA,OAAOK,OAAO,EAAE;QACpB,EAAE,OAAOC,OAAO;YACZ,OAAOD,OAAO,IAAI,CAAC,IAAIE,sBAAsBD;QACjD;IACJ;AACJ;AAEO,MAAME,8DAAgCC,qBAAqB;IAC9D,aAAaC;IACb,gBAAgBnB;IAChB,cAAc;QAACoB;QAAyBC;QAAmBC;KAAc;AAC7E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentEntry/GetSingletonEntry/GetSingletonEntryUseCase.js","sources":["../../../../src/features/contentEntry/GetSingletonEntry/GetSingletonEntryUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { GetSingletonEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { CMS_MODEL_SINGLETON_TAG } from \"~/constants.js\";\nimport { EntryValidationError } from \"~/domain/contentEntry/errors.js\";\nimport { createCacheKey } from \"@webiny/utils\";\nimport type { CmsEntry, CmsEntryValues, CmsModel } from \"~/types/index.js\";\nimport { CreateEntryUseCase } from \"~/features/contentEntry/CreateEntry/index.js\";\nimport { GetEntryByIdUseCase } from \"~/features/contentEntry/GetEntryById/index.js\";\n\n/**\n * GetSingletonEntryUseCase - Gets the singleton entry for a model.\n *\n * Responsibilities:\n * - Validate model is marked as singleton\n * - Generate singleton entry ID from model ID\n * - Try to get existing entry\n * - If not found, create a new entry with skipValidators: [\"required\"]\n * - Delegate to generic GetEntry and CreateEntry use cases\n */\nclass GetSingletonEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private getEntryById: GetEntryByIdUseCase.Interface,\n private createEntry: CreateEntryUseCase.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n // Validate model is marked as singleton\n if (!model.tags?.includes(CMS_MODEL_SINGLETON_TAG)) {\n return Result.fail(new EntryValidationError(\"Model is not marked as singleton.\"));\n }\n\n // Generate singleton entry ID from model ID\n const id = createCacheKey(model.modelId);\n const entryId = `${id}#0001`;\n\n // Try to get existing entry\n const getResult = await this.getEntryById.execute<T>(model, entryId);\n\n if (getResult.isOk()) {\n return getResult;\n }\n\n // Entry doesn't exist, create it\n return await this.createEntry.execute<T>(\n model,\n {\n id,\n values: {\n // safe to cast\n } as T\n },\n {
|
|
1
|
+
{"version":3,"file":"features/contentEntry/GetSingletonEntry/GetSingletonEntryUseCase.js","sources":["../../../../src/features/contentEntry/GetSingletonEntry/GetSingletonEntryUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { GetSingletonEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { CMS_MODEL_SINGLETON_TAG } from \"~/constants.js\";\nimport { EntryValidationError } from \"~/domain/contentEntry/errors.js\";\nimport { createCacheKey } from \"@webiny/utils\";\nimport type { CmsEntry, CmsEntryValues, CmsModel } from \"~/types/index.js\";\nimport { CreateEntryUseCase } from \"~/features/contentEntry/CreateEntry/index.js\";\nimport { GetEntryByIdUseCase } from \"~/features/contentEntry/GetEntryById/index.js\";\n\n/**\n * GetSingletonEntryUseCase - Gets the singleton entry for a model.\n *\n * Responsibilities:\n * - Validate model is marked as singleton\n * - Generate singleton entry ID from model ID\n * - Try to get existing entry\n * - If not found, create a new entry with skipValidators: [\"required\"]\n * - Delegate to generic GetEntry and CreateEntry use cases\n */\nclass GetSingletonEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private getEntryById: GetEntryByIdUseCase.Interface,\n private createEntry: CreateEntryUseCase.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n // Validate model is marked as singleton\n if (!model.tags?.includes(CMS_MODEL_SINGLETON_TAG)) {\n return Result.fail(new EntryValidationError(\"Model is not marked as singleton.\"));\n }\n\n // Generate singleton entry ID from model ID\n const id = createCacheKey(model.modelId);\n const entryId = `${id}#0001`;\n\n // Try to get existing entry\n const getResult = await this.getEntryById.execute<T>(model, entryId);\n\n if (getResult.isOk()) {\n return getResult;\n }\n\n // Entry doesn't exist, create it\n return await this.createEntry.execute<T>(\n model,\n {\n id,\n values: {\n // safe to cast\n } as T\n },\n { skipValidation: true }\n );\n }\n}\n\nexport const GetSingletonEntryUseCase = UseCaseAbstraction.createImplementation({\n implementation: GetSingletonEntryUseCaseImpl,\n dependencies: [GetEntryByIdUseCase, CreateEntryUseCase]\n});\n"],"names":["GetSingletonEntryUseCaseImpl","getEntryById","createEntry","model","CMS_MODEL_SINGLETON_TAG","Result","EntryValidationError","id","createCacheKey","entryId","getResult","GetSingletonEntryUseCase","UseCaseAbstraction","GetEntryByIdUseCase","CreateEntryUseCase"],"mappings":";;;;;;;AAmBA,MAAMA;IACF,YACYC,YAA2C,EAC3CC,WAAyC,CACnD;aAFUD,YAAY,GAAZA;aACAC,WAAW,GAAXA;IACT;IAEH,MAAM,QACFC,KAAe,EACuC;QAEtD,IAAI,CAACA,MAAM,IAAI,EAAE,SAASC,0BACtB,OAAOC,OAAO,IAAI,CAAC,IAAIC,qBAAqB;QAIhD,MAAMC,KAAKC,eAAeL,MAAM,OAAO;QACvC,MAAMM,UAAU,GAAGF,GAAG,KAAK,CAAC;QAG5B,MAAMG,YAAY,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAIP,OAAOM;QAE5D,IAAIC,UAAU,IAAI,IACd,OAAOA;QAIX,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CACjCP,OACA;YACII;YACA,QAAQ,CAER;QACJ,GACA;YAAE,gBAAgB;QAAK;IAE/B;AACJ;AAEO,MAAMI,oDAA2BC,yBAAAA,oBAAuC,CAAC;IAC5E,gBAAgBZ;IAChB,cAAc;QAACa;QAAqBC;KAAmB;AAC3D"}
|
|
@@ -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 { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { PublishEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { PublishEntryRepository } from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/index.js\";\nimport { GetLatestRevisionByEntryIdUseCase } from \"~/features/contentEntry/GetLatestRevisionByEntryId/index.js\";\nimport type { CmsEntry, CmsEntryValues, CmsModel } from \"~/types/index.js\";\nimport {\n EntryBeforePublishEvent,\n EntryAfterPublishEvent,\n EntryPublishErrorEvent\n} from \"./events.js\";\nimport { EntryNotAuthorizedError
|
|
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 { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { PublishEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { PublishEntryRepository } from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/index.js\";\nimport { GetLatestRevisionByEntryIdUseCase } from \"~/features/contentEntry/GetLatestRevisionByEntryId/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 getLatestRevision: GetLatestRevisionByEntryIdUseCase.Interface,\n private eventPublisher: EventPublisher.Interface,\n private createPublishEntryDataFactory: CreatePublishEntryDataFactory.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: \"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 latestResult = await this.getLatestRevision.execute<T>(model, {\n id: originalEntry.entryId\n });\n\n if (latestResult.isFail()) {\n return Result.fail(latestResult.error);\n }\n\n const latestEntry = latestResult.value;\n\n const { entry } = await this.createPublishEntryDataFactory.create<T>(\n model,\n originalEntry,\n latestEntry\n );\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 GetLatestRevisionByEntryIdUseCase,\n EventPublisher,\n CreatePublishEntryDataFactory\n ]\n});\n"],"names":["PublishEntryUseCaseImpl","repository","accessControl","getRevisionById","getLatestRevision","eventPublisher","createPublishEntryDataFactory","model","id","canAccess","Result","EntryNotAuthorizedError","result","EntryNotFoundError","originalEntry","canAccessEntry","latestResult","latestEntry","entry","EntryBeforePublishEvent","repositoryResult","EntryPublishErrorEvent","publishedEntry","EntryAfterPublishEvent","error","PublishEntryUseCase","createImplementation","UseCaseAbstraction","PublishEntryRepository","AccessControl","GetRevisionByIdUseCase","GetLatestRevisionByEntryIdUseCase","EventPublisher","CreatePublishEntryDataFactory"],"mappings":";;;;;;;;;AAiBA,MAAMA;IACF,YACYC,UAA4C,EAC5CC,aAAsC,EACtCC,eAAiD,EACjDC,iBAA8D,EAC9DC,cAAwC,EACxCC,6BAAsE,CAChF;aANUL,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,eAAe,GAAfA;aACAC,iBAAiB,GAAjBA;aACAC,cAAc,GAAdA;aACAC,6BAA6B,GAA7BA;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,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,IAAI;QACR;QAEA,IAAI,CAACC,gBACD,OAAOL,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACJ;QAGzD,MAAMS,eAAe,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAIT,OAAO;YAChE,IAAIO,cAAc,OAAO;QAC7B;QAEA,IAAIE,aAAa,MAAM,IACnB,OAAON,OAAO,IAAI,CAACM,aAAa,KAAK;QAGzC,MAAMC,cAAcD,aAAa,KAAK;QAEtC,MAAM,EAAEE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,6BAA6B,CAAC,MAAM,CAC7DX,OACAO,eACAG;QAGJ,IAAI;YACA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIE,wBAAwB;gBACxBD;gBACA,UAAUJ;gBACVP;YACJ;YAGJ,MAAMa,mBAAmB,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAACb,OAAOW;YAE9D,IAAIE,iBAAiB,MAAM,IAAI;gBAC3B,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,uBAAuB;oBACvBH;oBACA,UAAUJ;oBACVP;oBACA,OAAOa,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;gBACVP;YACJ;YAGJ,OAAOG,OAAO,EAAE,CAACQ;QACrB,EAAE,OAAOM,OAAO;YACZ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIH,uBAAuB;gBACvBH;gBACA,UAAUJ;gBACVP;gBACA,OAAOiB;YACX;YAEJ,OAAOd,OAAO,IAAI,CAACc;QACvB;IACJ;AACJ;AAEO,MAAMC,0CAAsBC,qBAAqB;IACpD,aAAaC;IACb,gBAAgB3B;IAChB,cAAc;QACV4B;QACAC;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Result } from "@webiny/feature/api";
|
|
2
|
+
import { UpdateRevisionRepository as RepositoryAbstraction } from "./abstractions.js";
|
|
3
|
+
import { EntryPersistenceError } from "../../../domain/contentEntry/errors.js";
|
|
4
|
+
import type { CmsEntry, CmsEntryValues, CmsModel } from "../../../types/index.js";
|
|
5
|
+
import { StorageOperations } from "../../../features/shared/abstractions.js";
|
|
6
|
+
import { EntryToStorageTransform } from "../../../legacy/abstractions.js";
|
|
7
|
+
declare class UpdateRevisionRepositoryImpl implements RepositoryAbstraction.Interface {
|
|
8
|
+
private entryToStorageTransform;
|
|
9
|
+
private storageOperations;
|
|
10
|
+
constructor(entryToStorageTransform: EntryToStorageTransform.Interface, storageOperations: StorageOperations.Interface);
|
|
11
|
+
execute<T extends CmsEntryValues = CmsEntryValues>(model: CmsModel, entry: CmsEntry<T>): Promise<Result<void, EntryPersistenceError>>;
|
|
12
|
+
}
|
|
13
|
+
export declare const UpdateRevisionRepository: import("@webiny/di").Implementation<typeof UpdateRevisionRepositoryImpl>;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Result, createImplementation } from "@webiny/feature/api";
|
|
2
|
+
import { UpdateRevisionRepository } from "./abstractions.js";
|
|
3
|
+
import { EntryPersistenceError } from "../../../domain/contentEntry/errors.js";
|
|
4
|
+
import { StorageOperations } from "../../shared/abstractions.js";
|
|
5
|
+
import { EntryToStorageTransform } from "../../../legacy/abstractions.js";
|
|
6
|
+
class UpdateRevisionRepositoryImpl {
|
|
7
|
+
constructor(entryToStorageTransform, storageOperations){
|
|
8
|
+
this.entryToStorageTransform = entryToStorageTransform;
|
|
9
|
+
this.storageOperations = storageOperations;
|
|
10
|
+
}
|
|
11
|
+
async execute(model, entry) {
|
|
12
|
+
try {
|
|
13
|
+
const storageEntry = await this.entryToStorageTransform(model, entry);
|
|
14
|
+
await this.storageOperations.entries.updateRevision(model, {
|
|
15
|
+
entry,
|
|
16
|
+
storageEntry
|
|
17
|
+
});
|
|
18
|
+
return Result.ok();
|
|
19
|
+
} catch (error) {
|
|
20
|
+
return Result.fail(new EntryPersistenceError(error));
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const UpdateRevisionRepository_UpdateRevisionRepository = createImplementation({
|
|
25
|
+
abstraction: UpdateRevisionRepository,
|
|
26
|
+
implementation: UpdateRevisionRepositoryImpl,
|
|
27
|
+
dependencies: [
|
|
28
|
+
EntryToStorageTransform,
|
|
29
|
+
StorageOperations
|
|
30
|
+
]
|
|
31
|
+
});
|
|
32
|
+
export { UpdateRevisionRepository_UpdateRevisionRepository as UpdateRevisionRepository };
|
|
33
|
+
|
|
34
|
+
//# sourceMappingURL=UpdateRevisionRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/contentEntry/UpdateRevision/UpdateRevisionRepository.js","sources":["../../../../src/features/contentEntry/UpdateRevision/UpdateRevisionRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { UpdateRevisionRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { EntryPersistenceError } from \"~/domain/contentEntry/errors.js\";\nimport type { CmsEntry, CmsEntryValues, CmsModel } from \"~/types/index.js\";\nimport { StorageOperations } from \"~/features/shared/abstractions.js\";\nimport { EntryToStorageTransform } from \"~/legacy/abstractions.js\";\n\nclass UpdateRevisionRepositoryImpl implements RepositoryAbstraction.Interface {\n public constructor(\n private entryToStorageTransform: EntryToStorageTransform.Interface,\n private storageOperations: StorageOperations.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n entry: CmsEntry<T>\n ): Promise<Result<void, EntryPersistenceError>> {\n try {\n const storageEntry = await this.entryToStorageTransform<T>(model, entry);\n\n await this.storageOperations.entries.updateRevision<T>(model, {\n entry,\n storageEntry\n });\n\n return Result.ok();\n } catch (error) {\n return Result.fail(new EntryPersistenceError(error as Error));\n }\n }\n}\n\nexport const UpdateRevisionRepository = createImplementation({\n abstraction: RepositoryAbstraction,\n implementation: UpdateRevisionRepositoryImpl,\n dependencies: [EntryToStorageTransform, StorageOperations]\n});\n"],"names":["UpdateRevisionRepositoryImpl","entryToStorageTransform","storageOperations","model","entry","storageEntry","Result","error","EntryPersistenceError","UpdateRevisionRepository","createImplementation","RepositoryAbstraction","EntryToStorageTransform","StorageOperations"],"mappings":";;;;;AAQA,MAAMA;IACF,YACYC,uBAA0D,EAC1DC,iBAA8C,CACxD;aAFUD,uBAAuB,GAAvBA;aACAC,iBAAiB,GAAjBA;IACT;IAEH,MAAM,QACFC,KAAe,EACfC,KAAkB,EAC0B;QAC5C,IAAI;YACA,MAAMC,eAAe,MAAM,IAAI,CAAC,uBAAuB,CAAIF,OAAOC;YAElE,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,cAAc,CAAID,OAAO;gBAC1DC;gBACAC;YACJ;YAEA,OAAOC,OAAO,EAAE;QACpB,EAAE,OAAOC,OAAO;YACZ,OAAOD,OAAO,IAAI,CAAC,IAAIE,sBAAsBD;QACjD;IACJ;AACJ;AAEO,MAAME,oDAA2BC,qBAAqB;IACzD,aAAaC;IACb,gBAAgBX;IAChB,cAAc;QAACY;QAAyBC;KAAkB;AAC9D"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Result } from "@webiny/feature/api";
|
|
2
|
+
import type { CmsEntry, CmsModel } from "../../../types/index.js";
|
|
3
|
+
import type { EntryPersistenceError } from "../../../domain/contentEntry/errors.js";
|
|
4
|
+
export interface IUpdateRevisionRepository {
|
|
5
|
+
execute(model: CmsModel, entry: CmsEntry): Promise<Result<void, EntryPersistenceError>>;
|
|
6
|
+
}
|
|
7
|
+
export declare const UpdateRevisionRepository: import("@webiny/di").Abstraction<IUpdateRevisionRepository>;
|
|
8
|
+
export declare namespace UpdateRevisionRepository {
|
|
9
|
+
type Interface = IUpdateRevisionRepository;
|
|
10
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/contentEntry/UpdateRevision/abstractions.js","sources":["../../../../src/features/contentEntry/UpdateRevision/abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\nimport type { CmsEntry, CmsModel } from \"~/types/index.js\";\nimport type { EntryPersistenceError } from \"~/domain/contentEntry/errors.js\";\n\nexport interface IUpdateRevisionRepository {\n execute(model: CmsModel, entry: CmsEntry): Promise<Result<void, EntryPersistenceError>>;\n}\n\nexport const UpdateRevisionRepository = createAbstraction<IUpdateRevisionRepository>(\n \"UpdateRevisionRepository\"\n);\n\nexport namespace UpdateRevisionRepository {\n export type Interface = IUpdateRevisionRepository;\n}\n"],"names":["UpdateRevisionRepository","createAbstraction"],"mappings":";AAQO,MAAMA,2BAA2BC,kBACpC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import { UpdateRevisionRepository } from "./UpdateRevisionRepository.js";
|
|
3
|
+
const UpdateRevisionFeature = createFeature({
|
|
4
|
+
name: "UpdateRevision",
|
|
5
|
+
register (container) {
|
|
6
|
+
container.register(UpdateRevisionRepository);
|
|
7
|
+
}
|
|
8
|
+
});
|
|
9
|
+
export { UpdateRevisionFeature };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/contentEntry/UpdateRevision/feature.js","sources":["../../../../src/features/contentEntry/UpdateRevision/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { UpdateRevisionRepository } from \"./UpdateRevisionRepository.js\";\n\nexport const UpdateRevisionFeature = createFeature({\n name: \"UpdateRevision\",\n register(container) {\n container.register(UpdateRevisionRepository);\n }\n});\n"],"names":["UpdateRevisionFeature","createFeature","container","UpdateRevisionRepository"],"mappings":";;AAGO,MAAMA,wBAAwBC,cAAc;IAC/C,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { UpdateRevisionRepository } from "./abstractions.js";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { UpdateRevisionRepository } from "./abstractions.js";
|
package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.d.ts
CHANGED
|
@@ -3,14 +3,14 @@ import { UpdateRevisionDescriptionUseCase as UseCaseAbstraction } from "./abstra
|
|
|
3
3
|
import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
|
|
4
4
|
import { AccessControl } from "../../../features/shared/abstractions.js";
|
|
5
5
|
import { GetRevisionByIdUseCase } from "../../../features/contentEntry/GetRevisionById/abstractions.js";
|
|
6
|
+
import { UpdateRevisionRepository } from "../../../features/contentEntry/UpdateRevision/abstractions.js";
|
|
6
7
|
import type { CmsEntry, CmsEntryValues, CmsModel } from "../../../types/index.js";
|
|
7
|
-
import { UpdateEntryRepository } from "../UpdateEntry/index.js";
|
|
8
8
|
declare class UpdateRevisionDescriptionUseCaseImpl implements UseCaseAbstraction.Interface {
|
|
9
9
|
private eventPublisher;
|
|
10
10
|
private repository;
|
|
11
11
|
private accessControl;
|
|
12
12
|
private getRevisionByIdUseCase;
|
|
13
|
-
constructor(eventPublisher: EventPublisher.Interface, repository:
|
|
13
|
+
constructor(eventPublisher: EventPublisher.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>;
|
|
@@ -4,8 +4,8 @@ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.j
|
|
|
4
4
|
import { EntryAfterUpdateRevisionDescriptionEvent, EntryBeforeUpdateRevisionDescriptionEvent } from "./events.js";
|
|
5
5
|
import { AccessControl } from "../../shared/abstractions.js";
|
|
6
6
|
import { GetRevisionByIdUseCase } from "../GetRevisionById/abstractions.js";
|
|
7
|
+
import { UpdateRevisionRepository } from "../UpdateRevision/abstractions.js";
|
|
7
8
|
import { EntryNotAuthorizedError } from "../../../domain/contentEntry/errors.js";
|
|
8
|
-
import { UpdateEntryRepository } from "../UpdateEntry/index.js";
|
|
9
9
|
class UpdateRevisionDescriptionUseCaseImpl {
|
|
10
10
|
constructor(eventPublisher, repository, accessControl, getRevisionByIdUseCase){
|
|
11
11
|
this.eventPublisher = eventPublisher;
|
|
@@ -58,7 +58,7 @@ const UpdateRevisionDescriptionUseCase_UpdateRevisionDescriptionUseCase = create
|
|
|
58
58
|
implementation: UpdateRevisionDescriptionUseCaseImpl,
|
|
59
59
|
dependencies: [
|
|
60
60
|
EventPublisher,
|
|
61
|
-
|
|
61
|
+
UpdateRevisionRepository,
|
|
62
62
|
AccessControl,
|
|
63
63
|
GetRevisionByIdUseCase
|
|
64
64
|
]
|
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 { EventPublisher } from \"@webiny/api-core/features/eventPublisher/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
|
|
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 { EventPublisher } from \"@webiny/api-core/features/eventPublisher/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: EventPublisher.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: [EventPublisher, UpdateRevisionRepository, AccessControl, GetRevisionByIdUseCase]\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","EventPublisher","UpdateRevisionRepository","AccessControl","GetRevisionByIdUseCase"],"mappings":";;;;;;;;AAaA,MAAMA;IACF,YACYC,cAAwC,EACxCC,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;QAACsB;QAAgBC;QAA0BC;QAAeC;KAAuB;AACnG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CmsModelAst, CmsEntryValues } from "../../types/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Walk entry values using the model AST and assign a stable `_id` to every
|
|
4
|
+
* object and dynamic-zone value — both list items and single values.
|
|
5
|
+
*
|
|
6
|
+
* - Values that already carry an `_id` keep it.
|
|
7
|
+
* - Values without `_id` get a newly generated one.
|
|
8
|
+
* - Duplicate `_id` values within a list array are silently regenerated.
|
|
9
|
+
*
|
|
10
|
+
* Uses `ContentEntryTraverser` so nested objects / dynamic zones are handled
|
|
11
|
+
* automatically — no manual recursion needed.
|
|
12
|
+
*/
|
|
13
|
+
export declare function ensureItemIds(modelAst: CmsModelAst, values: CmsEntryValues): Promise<void>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { generateAlphaNumericLowerCaseId } from "@webiny/utils";
|
|
2
|
+
import { ContentEntryTraverser } from "./ContentEntryTraverser/ContentEntryTraverser.js";
|
|
3
|
+
async function ensureItemIds(modelAst, values) {
|
|
4
|
+
const traverser = new ContentEntryTraverser(modelAst);
|
|
5
|
+
await traverser.traverse(values, async ({ field, value })=>{
|
|
6
|
+
if ("object" !== field.type && "dynamicZone" !== field.type) return;
|
|
7
|
+
if (field.list && Array.isArray(value)) {
|
|
8
|
+
const seen = new Set();
|
|
9
|
+
for (const item of value)if (null != item && "object" == typeof item) {
|
|
10
|
+
if (!item._id || seen.has(item._id)) item._id = generateAlphaNumericLowerCaseId(12);
|
|
11
|
+
seen.add(item._id);
|
|
12
|
+
}
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (!field.list && null != value && "object" == typeof value && !Array.isArray(value)) {
|
|
16
|
+
if (!value._id) value._id = generateAlphaNumericLowerCaseId(12);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
export { ensureItemIds };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=ensureItemIds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/contentEntry/ensureItemIds.js","sources":["../../../src/features/contentEntry/ensureItemIds.ts"],"sourcesContent":["import { generateAlphaNumericLowerCaseId } from \"@webiny/utils\";\nimport type { CmsModelAst, CmsEntryValues } from \"~/types/index.js\";\nimport { ContentEntryTraverser } from \"./ContentEntryTraverser/ContentEntryTraverser.js\";\n\n/**\n * Walk entry values using the model AST and assign a stable `_id` to every\n * object and dynamic-zone value — both list items and single values.\n *\n * - Values that already carry an `_id` keep it.\n * - Values without `_id` get a newly generated one.\n * - Duplicate `_id` values within a list array are silently regenerated.\n *\n * Uses `ContentEntryTraverser` so nested objects / dynamic zones are handled\n * automatically — no manual recursion needed.\n */\nexport async function ensureItemIds(modelAst: CmsModelAst, values: CmsEntryValues): Promise<void> {\n const traverser = new ContentEntryTraverser(modelAst);\n\n await traverser.traverse(values, async ({ field, value }) => {\n if (field.type !== \"object\" && field.type !== \"dynamicZone\") {\n return;\n }\n\n // List fields: assign _id to every array item.\n if (field.list && Array.isArray(value)) {\n const seen = new Set<string>();\n\n for (const item of value) {\n if (item == null || typeof item !== \"object\") {\n continue;\n }\n\n if (!item._id || seen.has(item._id)) {\n item._id = generateAlphaNumericLowerCaseId(12);\n }\n\n seen.add(item._id);\n }\n return;\n }\n\n // Single-value: assign _id to the value object.\n if (!field.list && value != null && typeof value === \"object\" && !Array.isArray(value)) {\n if (!value._id) {\n value._id = generateAlphaNumericLowerCaseId(12);\n }\n }\n });\n}\n"],"names":["ensureItemIds","modelAst","values","traverser","ContentEntryTraverser","field","value","Array","seen","Set","item","generateAlphaNumericLowerCaseId"],"mappings":";;AAeO,eAAeA,cAAcC,QAAqB,EAAEC,MAAsB;IAC7E,MAAMC,YAAY,IAAIC,sBAAsBH;IAE5C,MAAME,UAAU,QAAQ,CAACD,QAAQ,OAAO,EAAEG,KAAK,EAAEC,KAAK,EAAE;QACpD,IAAID,AAAe,aAAfA,MAAM,IAAI,IAAiBA,AAAe,kBAAfA,MAAM,IAAI,EACrC;QAIJ,IAAIA,MAAM,IAAI,IAAIE,MAAM,OAAO,CAACD,QAAQ;YACpC,MAAME,OAAO,IAAIC;YAEjB,KAAK,MAAMC,QAAQJ,MACf,IAAII,AAAQ,QAARA,QAAgB,AAAgB,YAAhB,OAAOA;gBAI3B,IAAI,CAACA,KAAK,GAAG,IAAIF,KAAK,GAAG,CAACE,KAAK,GAAG,GAC9BA,KAAK,GAAG,GAAGC,gCAAgC;gBAG/CH,KAAK,GAAG,CAACE,KAAK,GAAG;;YAErB;QACJ;QAGA,IAAI,CAACL,MAAM,IAAI,IAAIC,AAAS,QAATA,SAAiB,AAAiB,YAAjB,OAAOA,SAAsB,CAACC,MAAM,OAAO,CAACD,QAC5E;YAAA,IAAI,CAACA,MAAM,GAAG,EACVA,MAAM,GAAG,GAAGK,gCAAgC;QAChD;IAER;AACJ"}
|
package/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.d.ts
CHANGED
|
@@ -3,12 +3,14 @@ import { AccessControl, CmsContext } from "../../../../features/shared/abstracti
|
|
|
3
3
|
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
4
4
|
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
5
5
|
import type { CmsEntryValues, CmsModel, CreateCmsEntryInput, CreateCmsEntryOptionsInput } from "../../../../types/index.js";
|
|
6
|
+
import { ModelToAstConverter } from "../../../../features/contentModel/ModelToAstConverter/abstractions.js";
|
|
6
7
|
declare class CreateEntryDataFactoryImpl implements ICreateEntryDataFactory {
|
|
7
8
|
private readonly cmsContext;
|
|
8
9
|
private readonly identityContext;
|
|
9
10
|
private readonly tenantContext;
|
|
10
11
|
private readonly accessControl;
|
|
11
|
-
|
|
12
|
+
private readonly modelToAstConverter;
|
|
13
|
+
constructor(cmsContext: CmsContext.Interface, identityContext: IdentityContext.Interface, tenantContext: TenantContext.Interface, accessControl: AccessControl.Interface, modelToAstConverter: ModelToAstConverter.Interface);
|
|
12
14
|
create<TValues extends CmsEntryValues = CmsEntryValues>(model: CmsModel, rawInput: CreateCmsEntryInput<TValues>, options?: CreateCmsEntryOptionsInput): Promise<ICreateEntryDataResponse<TValues>>;
|
|
13
15
|
}
|
|
14
16
|
export declare const CreateEntryDataFactory: import("@webiny/di").Implementation<typeof CreateEntryDataFactoryImpl>;
|
package/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.js
CHANGED
|
@@ -14,6 +14,8 @@ import { getIdentity } from "../../../../utils/identity.js";
|
|
|
14
14
|
import { NotAuthorizedError } from "../../../../utils/errors.js";
|
|
15
15
|
import { getSystem } from "../system.js";
|
|
16
16
|
import { getExpiresAt } from "../expiresAt.js";
|
|
17
|
+
import { ModelToAstConverter } from "../../../contentModel/ModelToAstConverter/abstractions.js";
|
|
18
|
+
import { ensureItemIds } from "../../ensureItemIds.js";
|
|
17
19
|
const convertDefaultValue = (field, value)=>{
|
|
18
20
|
switch(field.type){
|
|
19
21
|
case "boolean":
|
|
@@ -64,19 +66,22 @@ const createEntryId = (input)=>{
|
|
|
64
66
|
};
|
|
65
67
|
};
|
|
66
68
|
class CreateEntryDataFactoryImpl {
|
|
67
|
-
constructor(cmsContext, identityContext, tenantContext, accessControl){
|
|
69
|
+
constructor(cmsContext, identityContext, tenantContext, accessControl, modelToAstConverter){
|
|
68
70
|
this.cmsContext = cmsContext;
|
|
69
71
|
this.identityContext = identityContext;
|
|
70
72
|
this.tenantContext = tenantContext;
|
|
71
73
|
this.accessControl = accessControl;
|
|
74
|
+
this.modelToAstConverter = modelToAstConverter;
|
|
72
75
|
}
|
|
73
76
|
async create(model, rawInput, options) {
|
|
74
77
|
const initialValues = cleanInputValues(model, rawInput.values || {});
|
|
78
|
+
const modelAst = this.modelToAstConverter.toAst(model);
|
|
79
|
+
await ensureItemIds(modelAst, initialValues);
|
|
75
80
|
await validateModelEntryDataOrThrow({
|
|
76
81
|
context: this.cmsContext,
|
|
77
82
|
model,
|
|
78
83
|
values: initialValues,
|
|
79
|
-
|
|
84
|
+
skipValidation: options?.skipValidation
|
|
80
85
|
});
|
|
81
86
|
const values = await referenceFieldsMapping({
|
|
82
87
|
context: this.cmsContext,
|
|
@@ -208,7 +213,8 @@ const CreateEntryDataFactory_CreateEntryDataFactory = createImplementation({
|
|
|
208
213
|
CmsContext,
|
|
209
214
|
IdentityContext,
|
|
210
215
|
TenantContext,
|
|
211
|
-
AccessControl
|
|
216
|
+
AccessControl,
|
|
217
|
+
ModelToAstConverter
|
|
212
218
|
]
|
|
213
219
|
});
|
|
214
220
|
export { CreateEntryDataFactory_CreateEntryDataFactory as CreateEntryDataFactory };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.js","sources":["../../../../../src/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.ts"],"sourcesContent":["import { createImplementation } from \"@webiny/feature/api\";\nimport {\n CreateEntryDataFactory as FactoryAbstraction,\n type ICreateEntryDataFactory,\n type ICreateEntryDataResponse\n} from \"./abstractions.js\";\nimport { AccessControl, CmsContext } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport type {\n CmsEntry,\n CmsEntryValues,\n CmsModel,\n CmsModelField,\n CreateCmsEntryInput,\n CreateCmsEntryOptionsInput\n} from \"~/types/index.js\";\nimport { getDate } from \"~/utils/date.js\";\nimport { ROOT_FOLDER } from \"~/constants.js\";\nimport WebinyError from \"@webiny/error\";\nimport { validateModelEntryDataOrThrow } from \"~/crud/contentEntry/entryDataValidation.js\";\nimport { referenceFieldsMapping } from \"~/crud/contentEntry/referenceFieldsMapping.js\";\nimport { createIdentifier, mdbid } from \"@webiny/utils\";\nimport { STATUS_DRAFT, STATUS_PUBLISHED, STATUS_UNPUBLISHED } from \"../statuses.js\";\nimport { getIdentity } from \"~/utils/identity.js\";\nimport { NotAuthorizedError } from \"~/utils/errors.js\";\nimport { getSystem } from \"../system.js\";\nimport { getExpiresAt } from \"../expiresAt.js\";\n\ntype DefaultValue = boolean | number | string | null;\n\nconst convertDefaultValue = (field: CmsModelField, value: DefaultValue): DefaultValue => {\n switch (field.type) {\n case \"boolean\":\n return Boolean(value);\n case \"number\":\n return Number(value);\n default:\n return value;\n }\n};\n\nconst getDefaultValue = (field: CmsModelField): (DefaultValue | DefaultValue[]) | undefined => {\n const { settings, list } = field;\n if (settings && settings.defaultValue !== undefined) {\n return convertDefaultValue(field, settings.defaultValue);\n }\n const { predefinedValues } = field;\n if (\n !predefinedValues ||\n !predefinedValues.enabled ||\n Array.isArray(predefinedValues.values) === false\n ) {\n return undefined;\n }\n if (!list) {\n const selectedValue = predefinedValues.values.find(value => {\n return !!value.selected;\n });\n if (selectedValue) {\n return convertDefaultValue(field, selectedValue.value);\n }\n return undefined;\n }\n return predefinedValues.values\n .filter(({ selected }) => !!selected)\n .map(({ value }) => {\n return convertDefaultValue(field, value);\n });\n};\n\nconst cleanInputValues = <TValues extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n input: TValues\n) => {\n return model.fields.reduce<TValues>((acc, field) => {\n if (!field.fieldId) {\n throw new WebinyError(\"Field does not have an fieldId.\", \"MISSING_FIELD_ID\", {\n field\n });\n }\n const key = field.fieldId as keyof TValues;\n const value = input[key] as TValues[keyof TValues];\n acc[key] = value === undefined ? (getDefaultValue(field) as TValues[keyof TValues]) : value;\n return acc;\n }, {} as TValues);\n};\n\nconst createEntryId = (input: CreateCmsEntryInput) => {\n let entryId = mdbid();\n if (input.id) {\n if (input.id.match(/^([a-zA-Z0-9])([a-zA-Z0-9-]+)([a-zA-Z0-9])$/) === null) {\n throw new WebinyError(\n \"The provided ID is not valid. It must be a string which can be A-Z, a-z, 0-9, - and it cannot start or end with a -.\",\n \"INVALID_ID\",\n {\n id: input.id\n }\n );\n }\n entryId = input.id;\n }\n const version = 1;\n return {\n entryId,\n version,\n id: createIdentifier({\n id: entryId,\n version\n })\n };\n};\n\nclass CreateEntryDataFactoryImpl implements ICreateEntryDataFactory {\n public constructor(\n private readonly cmsContext: CmsContext.Interface,\n private readonly identityContext: IdentityContext.Interface,\n private readonly tenantContext: TenantContext.Interface,\n private readonly accessControl: AccessControl.Interface\n ) {}\n\n public async create<TValues extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n rawInput: CreateCmsEntryInput<TValues>,\n options?: CreateCmsEntryOptionsInput\n ): Promise<ICreateEntryDataResponse<TValues>> {\n const initialValues = cleanInputValues<TValues>(model, rawInput.values || ({} as TValues));\n\n await validateModelEntryDataOrThrow({\n context: this.cmsContext,\n model,\n values: initialValues,\n skipValidators: options?.skipValidators\n });\n\n const values = await referenceFieldsMapping<TValues>({\n context: this.cmsContext,\n model,\n values: initialValues,\n validateEntries: true\n });\n\n const { id, entryId, version } = createEntryId(rawInput);\n\n const currentIdentity = this.identityContext.getIdentity();\n const currentDateTime = new Date();\n\n const status = rawInput.status || STATUS_DRAFT;\n if (status !== STATUS_DRAFT) {\n if (status === STATUS_PUBLISHED) {\n const canPublish = await this.accessControl.canAccessEntry({ model, pw: \"p\" });\n if (!canPublish) {\n throw new NotAuthorizedError(\n `Not allowed to access \"${model.modelId}\" entries.`\n );\n }\n } else if (status === STATUS_UNPUBLISHED) {\n const canUnpublish = await this.accessControl.canAccessEntry({ model, pw: \"u\" });\n if (!canUnpublish) {\n throw new NotAuthorizedError(\n `Not allowed to access \"${model.modelId}\" entries.`\n );\n }\n }\n }\n\n const locked = status !== STATUS_DRAFT;\n\n let revisionLevelPublishingMetaFields: Pick<\n CmsEntry,\n | \"revisionFirstPublishedOn\"\n | \"revisionLastPublishedOn\"\n | \"revisionFirstPublishedBy\"\n | \"revisionLastPublishedBy\"\n > = {\n revisionFirstPublishedOn: null,\n revisionLastPublishedOn: null,\n revisionFirstPublishedBy: null,\n revisionLastPublishedBy: null\n };\n\n let entryLevelPublishingMetaFields: Pick<\n CmsEntry,\n \"firstPublishedOn\" | \"lastPublishedOn\" | \"firstPublishedBy\" | \"lastPublishedBy\"\n > = {\n firstPublishedOn: null,\n lastPublishedOn: null,\n firstPublishedBy: null,\n lastPublishedBy: null\n };\n\n if (status === STATUS_PUBLISHED) {\n revisionLevelPublishingMetaFields = {\n revisionFirstPublishedOn: getDate(\n rawInput.revisionFirstPublishedOn,\n currentDateTime\n ),\n revisionLastPublishedOn: getDate(rawInput.revisionLastPublishedOn, currentDateTime),\n revisionFirstPublishedBy: getIdentity(\n rawInput.revisionFirstPublishedBy,\n currentIdentity\n ),\n revisionLastPublishedBy: getIdentity(\n rawInput.revisionLastPublishedBy,\n currentIdentity\n )\n };\n\n entryLevelPublishingMetaFields = {\n firstPublishedOn: getDate(rawInput.firstPublishedOn, currentDateTime),\n lastPublishedOn: getDate(rawInput.lastPublishedOn, currentDateTime),\n firstPublishedBy: getIdentity(rawInput.firstPublishedBy, currentIdentity),\n lastPublishedBy: getIdentity(rawInput.lastPublishedBy, currentIdentity)\n };\n }\n\n const entry: CmsEntry<TValues> = {\n tenant: this.tenantContext.getTenant().id,\n entryId,\n id,\n modelId: model.modelId,\n createdOn: getDate(rawInput.createdOn, currentDateTime),\n modifiedOn: getDate(rawInput.modifiedOn, null),\n savedOn: getDate(rawInput.savedOn, currentDateTime),\n deletedOn: getDate(rawInput.deletedOn, null),\n restoredOn: getDate(rawInput.restoredOn, null),\n createdBy: getIdentity(rawInput.createdBy, currentIdentity)!,\n modifiedBy: getIdentity(rawInput.modifiedBy, null),\n savedBy: getIdentity(rawInput.savedBy, currentIdentity)!,\n deletedBy: getIdentity(rawInput.deletedBy, null),\n restoredBy: getIdentity(rawInput.restoredBy, null),\n ...entryLevelPublishingMetaFields,\n revisionCreatedOn: getDate(rawInput.revisionCreatedOn, currentDateTime),\n revisionModifiedOn: getDate(rawInput.revisionModifiedOn, null),\n revisionSavedOn: getDate(rawInput.revisionSavedOn, currentDateTime),\n revisionDeletedOn: getDate(rawInput.revisionDeletedOn, null),\n revisionRestoredOn: getDate(rawInput.revisionRestoredOn, null),\n revisionCreatedBy: getIdentity(rawInput.revisionCreatedBy, currentIdentity)!,\n revisionModifiedBy: getIdentity(rawInput.revisionModifiedBy, null),\n revisionSavedBy: getIdentity(rawInput.revisionSavedBy, currentIdentity)!,\n revisionDeletedBy: getIdentity(rawInput.revisionDeletedBy, null),\n revisionRestoredBy: getIdentity(rawInput.revisionRestoredBy, null),\n ...revisionLevelPublishingMetaFields,\n version,\n status,\n locked,\n values,\n location: {\n folderId:\n rawInput.location?.folderId || rawInput.wbyAco_location?.folderId || ROOT_FOLDER\n },\n system: getSystem({\n input: rawInput\n }),\n live:\n status === STATUS_PUBLISHED\n ? {\n version\n }\n : null,\n revisionDescription: \"\",\n expiresAt: getExpiresAt({ expiresAt: rawInput.expiresAt })\n };\n\n if (status !== STATUS_DRAFT) {\n if (status === STATUS_PUBLISHED) {\n const canPublish = await this.accessControl.canAccessEntry({\n model,\n entry,\n pw: \"p\"\n });\n if (!canPublish) {\n throw new NotAuthorizedError(`Not allowed to access entry \"${entry.entryId}\".`);\n }\n } else if (status === STATUS_UNPUBLISHED) {\n const canUnpublish = await this.accessControl.canAccessEntry({\n model,\n entry,\n pw: \"u\"\n });\n if (!canUnpublish) {\n throw new NotAuthorizedError(`Not allowed to access entry \"${entry.entryId}\".`);\n }\n }\n }\n\n return {\n entry,\n input: {\n ...rawInput,\n values: structuredClone(values)\n }\n };\n }\n}\n\nexport const CreateEntryDataFactory = createImplementation({\n abstraction: FactoryAbstraction,\n implementation: CreateEntryDataFactoryImpl,\n dependencies: [CmsContext, IdentityContext, TenantContext, AccessControl]\n});\n"],"names":["convertDefaultValue","field","value","Boolean","Number","getDefaultValue","settings","list","undefined","predefinedValues","Array","selectedValue","selected","cleanInputValues","model","input","acc","WebinyError","key","createEntryId","entryId","mdbid","version","createIdentifier","CreateEntryDataFactoryImpl","cmsContext","identityContext","tenantContext","accessControl","rawInput","options","initialValues","validateModelEntryDataOrThrow","values","referenceFieldsMapping","id","currentIdentity","currentDateTime","Date","status","STATUS_DRAFT","STATUS_PUBLISHED","canPublish","NotAuthorizedError","STATUS_UNPUBLISHED","canUnpublish","locked","revisionLevelPublishingMetaFields","entryLevelPublishingMetaFields","getDate","getIdentity","entry","ROOT_FOLDER","getSystem","getExpiresAt","structuredClone","CreateEntryDataFactory","createImplementation","FactoryAbstraction","CmsContext","IdentityContext","TenantContext","AccessControl"],"mappings":";;;;;;;;;;;;;;;;AA+BA,MAAMA,sBAAsB,CAACC,OAAsBC;IAC/C,OAAQD,MAAM,IAAI;QACd,KAAK;YACD,OAAOE,QAAQD;QACnB,KAAK;YACD,OAAOE,OAAOF;QAClB;YACI,OAAOA;IACf;AACJ;AAEA,MAAMG,kBAAkB,CAACJ;IACrB,MAAM,EAAEK,QAAQ,EAAEC,IAAI,EAAE,GAAGN;IAC3B,IAAIK,YAAYA,AAA0BE,WAA1BF,SAAS,YAAY,EACjC,OAAON,oBAAoBC,OAAOK,SAAS,YAAY;IAE3D,MAAM,EAAEG,gBAAgB,EAAE,GAAGR;IAC7B,IACI,CAACQ,oBACD,CAACA,iBAAiB,OAAO,IACzBC,AAA2C,UAA3CA,MAAM,OAAO,CAACD,iBAAiB,MAAM,GAErC;IAEJ,IAAI,CAACF,MAAM;QACP,MAAMI,gBAAgBF,iBAAiB,MAAM,CAAC,IAAI,CAACP,CAAAA,QACxC,CAAC,CAACA,MAAM,QAAQ;QAE3B,IAAIS,eACA,OAAOX,oBAAoBC,OAAOU,cAAc,KAAK;QAEzD;IACJ;IACA,OAAOF,iBAAiB,MAAM,CACzB,MAAM,CAAC,CAAC,EAAEG,QAAQ,EAAE,GAAK,CAAC,CAACA,UAC3B,GAAG,CAAC,CAAC,EAAEV,KAAK,EAAE,GACJF,oBAAoBC,OAAOC;AAE9C;AAEA,MAAMW,mBAAmB,CACrBC,OACAC,QAEOD,MAAM,MAAM,CAAC,MAAM,CAAU,CAACE,KAAKf;QACtC,IAAI,CAACA,MAAM,OAAO,EACd,MAAM,IAAIgB,MAAY,mCAAmC,oBAAoB;YACzEhB;QACJ;QAEJ,MAAMiB,MAAMjB,MAAM,OAAO;QACzB,MAAMC,QAAQa,KAAK,CAACG,IAAI;QACxBF,GAAG,CAACE,IAAI,GAAGhB,AAAUM,WAAVN,QAAuBG,gBAAgBJ,SAAoCC;QACtF,OAAOc;IACX,GAAG,CAAC;AAGR,MAAMG,gBAAgB,CAACJ;IACnB,IAAIK,UAAUC;IACd,IAAIN,MAAM,EAAE,EAAE;QACV,IAAIA,AAAkE,SAAlEA,MAAM,EAAE,CAAC,KAAK,CAAC,gDACf,MAAM,IAAIE,MACN,wHACA,cACA;YACI,IAAIF,MAAM,EAAE;QAChB;QAGRK,UAAUL,MAAM,EAAE;IACtB;IACA,MAAMO,UAAU;IAChB,OAAO;QACHF;QACAE;QACA,IAAIC,iBAAiB;YACjB,IAAIH;YACJE;QACJ;IACJ;AACJ;AAEA,MAAME;IACF,YACqBC,UAAgC,EAChCC,eAA0C,EAC1CC,aAAsC,EACtCC,aAAsC,CACzD;aAJmBH,UAAU,GAAVA;aACAC,eAAe,GAAfA;aACAC,aAAa,GAAbA;aACAC,aAAa,GAAbA;IAClB;IAEH,MAAa,OACTd,KAAe,EACfe,QAAsC,EACtCC,OAAoC,EACM;QAC1C,MAAMC,gBAAgBlB,iBAA0BC,OAAOe,SAAS,MAAM,IAAK,CAAC;QAE5E,MAAMG,8BAA8B;YAChC,SAAS,IAAI,CAAC,UAAU;YACxBlB;YACA,QAAQiB;YACR,gBAAgBD,SAAS;QAC7B;QAEA,MAAMG,SAAS,MAAMC,uBAAgC;YACjD,SAAS,IAAI,CAAC,UAAU;YACxBpB;YACA,QAAQiB;YACR,iBAAiB;QACrB;QAEA,MAAM,EAAEI,EAAE,EAAEf,OAAO,EAAEE,OAAO,EAAE,GAAGH,cAAcU;QAE/C,MAAMO,kBAAkB,IAAI,CAAC,eAAe,CAAC,WAAW;QACxD,MAAMC,kBAAkB,IAAIC;QAE5B,MAAMC,SAASV,SAAS,MAAM,IAAIW;QAClC,IAAID,WAAWC,cACX;YAAA,IAAID,WAAWE,kBAAkB;gBAC7B,MAAMC,aAAa,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;oBAAE5B;oBAAO,IAAI;gBAAI;gBAC5E,IAAI,CAAC4B,YACD,MAAM,IAAIC,mBACN,CAAC,uBAAuB,EAAE7B,MAAM,OAAO,CAAC,UAAU,CAAC;YAG/D,OAAO,IAAIyB,WAAWK,oBAAoB;gBACtC,MAAMC,eAAe,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;oBAAE/B;oBAAO,IAAI;gBAAI;gBAC9E,IAAI,CAAC+B,cACD,MAAM,IAAIF,mBACN,CAAC,uBAAuB,EAAE7B,MAAM,OAAO,CAAC,UAAU,CAAC;YAG/D;QAAA;QAGJ,MAAMgC,SAASP,WAAWC;QAE1B,IAAIO,oCAMA;YACA,0BAA0B;YAC1B,yBAAyB;YACzB,0BAA0B;YAC1B,yBAAyB;QAC7B;QAEA,IAAIC,iCAGA;YACA,kBAAkB;YAClB,iBAAiB;YACjB,kBAAkB;YAClB,iBAAiB;QACrB;QAEA,IAAIT,WAAWE,kBAAkB;YAC7BM,oCAAoC;gBAChC,0BAA0BE,QACtBpB,SAAS,wBAAwB,EACjCQ;gBAEJ,yBAAyBY,QAAQpB,SAAS,uBAAuB,EAAEQ;gBACnE,0BAA0Ba,YACtBrB,SAAS,wBAAwB,EACjCO;gBAEJ,yBAAyBc,YACrBrB,SAAS,uBAAuB,EAChCO;YAER;YAEAY,iCAAiC;gBAC7B,kBAAkBC,QAAQpB,SAAS,gBAAgB,EAAEQ;gBACrD,iBAAiBY,QAAQpB,SAAS,eAAe,EAAEQ;gBACnD,kBAAkBa,YAAYrB,SAAS,gBAAgB,EAAEO;gBACzD,iBAAiBc,YAAYrB,SAAS,eAAe,EAAEO;YAC3D;QACJ;QAEA,MAAMe,QAA2B;YAC7B,QAAQ,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,EAAE;YACzC/B;YACAe;YACA,SAASrB,MAAM,OAAO;YACtB,WAAWmC,QAAQpB,SAAS,SAAS,EAAEQ;YACvC,YAAYY,QAAQpB,SAAS,UAAU,EAAE;YACzC,SAASoB,QAAQpB,SAAS,OAAO,EAAEQ;YACnC,WAAWY,QAAQpB,SAAS,SAAS,EAAE;YACvC,YAAYoB,QAAQpB,SAAS,UAAU,EAAE;YACzC,WAAWqB,YAAYrB,SAAS,SAAS,EAAEO;YAC3C,YAAYc,YAAYrB,SAAS,UAAU,EAAE;YAC7C,SAASqB,YAAYrB,SAAS,OAAO,EAAEO;YACvC,WAAWc,YAAYrB,SAAS,SAAS,EAAE;YAC3C,YAAYqB,YAAYrB,SAAS,UAAU,EAAE;YAC7C,GAAGmB,8BAA8B;YACjC,mBAAmBC,QAAQpB,SAAS,iBAAiB,EAAEQ;YACvD,oBAAoBY,QAAQpB,SAAS,kBAAkB,EAAE;YACzD,iBAAiBoB,QAAQpB,SAAS,eAAe,EAAEQ;YACnD,mBAAmBY,QAAQpB,SAAS,iBAAiB,EAAE;YACvD,oBAAoBoB,QAAQpB,SAAS,kBAAkB,EAAE;YACzD,mBAAmBqB,YAAYrB,SAAS,iBAAiB,EAAEO;YAC3D,oBAAoBc,YAAYrB,SAAS,kBAAkB,EAAE;YAC7D,iBAAiBqB,YAAYrB,SAAS,eAAe,EAAEO;YACvD,mBAAmBc,YAAYrB,SAAS,iBAAiB,EAAE;YAC3D,oBAAoBqB,YAAYrB,SAAS,kBAAkB,EAAE;YAC7D,GAAGkB,iCAAiC;YACpCzB;YACAiB;YACAO;YACAb;YACA,UAAU;gBACN,UACIJ,SAAS,QAAQ,EAAE,YAAYA,SAAS,eAAe,EAAE,YAAYuB;YAC7E;YACA,QAAQC,UAAU;gBACd,OAAOxB;YACX;YACA,MACIU,WAAWE,mBACL;gBACInB;YACJ,IACA;YACV,qBAAqB;YACrB,WAAWgC,aAAa;gBAAE,WAAWzB,SAAS,SAAS;YAAC;QAC5D;QAEA,IAAIU,WAAWC,cACX;YAAA,IAAID,WAAWE,kBAAkB;gBAC7B,MAAMC,aAAa,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;oBACvD5B;oBACAqC;oBACA,IAAI;gBACR;gBACA,IAAI,CAACT,YACD,MAAM,IAAIC,mBAAmB,CAAC,6BAA6B,EAAEQ,MAAM,OAAO,CAAC,EAAE,CAAC;YAEtF,OAAO,IAAIZ,WAAWK,oBAAoB;gBACtC,MAAMC,eAAe,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;oBACzD/B;oBACAqC;oBACA,IAAI;gBACR;gBACA,IAAI,CAACN,cACD,MAAM,IAAIF,mBAAmB,CAAC,6BAA6B,EAAEQ,MAAM,OAAO,CAAC,EAAE,CAAC;YAEtF;QAAA;QAGJ,OAAO;YACHA;YACA,OAAO;gBACH,GAAGtB,QAAQ;gBACX,QAAQ0B,gBAAgBtB;YAC5B;QACJ;IACJ;AACJ;AAEO,MAAMuB,gDAAyBC,qBAAqB;IACvD,aAAaC;IACb,gBAAgBlC;IAChB,cAAc;QAACmC;QAAYC;QAAiBC;QAAeC;KAAc;AAC7E"}
|
|
1
|
+
{"version":3,"file":"features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.js","sources":["../../../../../src/features/contentEntry/entryDataFactories/CreateEntryDataFactory/CreateEntryDataFactory.ts"],"sourcesContent":["import { createImplementation } from \"@webiny/feature/api\";\nimport {\n CreateEntryDataFactory as FactoryAbstraction,\n type ICreateEntryDataFactory,\n type ICreateEntryDataResponse\n} from \"./abstractions.js\";\nimport { AccessControl, CmsContext } from \"~/features/shared/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport type {\n CmsEntry,\n CmsEntryValues,\n CmsModel,\n CmsModelField,\n CreateCmsEntryInput,\n CreateCmsEntryOptionsInput\n} from \"~/types/index.js\";\nimport { getDate } from \"~/utils/date.js\";\nimport { ROOT_FOLDER } from \"~/constants.js\";\nimport WebinyError from \"@webiny/error\";\nimport { validateModelEntryDataOrThrow } from \"~/crud/contentEntry/entryDataValidation.js\";\nimport { referenceFieldsMapping } from \"~/crud/contentEntry/referenceFieldsMapping.js\";\nimport { createIdentifier, mdbid } from \"@webiny/utils\";\nimport { STATUS_DRAFT, STATUS_PUBLISHED, STATUS_UNPUBLISHED } from \"../statuses.js\";\nimport { getIdentity } from \"~/utils/identity.js\";\nimport { NotAuthorizedError } from \"~/utils/errors.js\";\nimport { getSystem } from \"../system.js\";\nimport { getExpiresAt } from \"../expiresAt.js\";\nimport { ModelToAstConverter } from \"~/features/contentModel/ModelToAstConverter/abstractions.js\";\nimport { ensureItemIds } from \"../../ensureItemIds.js\";\n\ntype DefaultValue = boolean | number | string | null;\n\nconst convertDefaultValue = (field: CmsModelField, value: DefaultValue): DefaultValue => {\n switch (field.type) {\n case \"boolean\":\n return Boolean(value);\n case \"number\":\n return Number(value);\n default:\n return value;\n }\n};\n\nconst getDefaultValue = (field: CmsModelField): (DefaultValue | DefaultValue[]) | undefined => {\n const { settings, list } = field;\n if (settings && settings.defaultValue !== undefined) {\n return convertDefaultValue(field, settings.defaultValue);\n }\n const { predefinedValues } = field;\n if (\n !predefinedValues ||\n !predefinedValues.enabled ||\n Array.isArray(predefinedValues.values) === false\n ) {\n return undefined;\n }\n if (!list) {\n const selectedValue = predefinedValues.values.find(value => {\n return !!value.selected;\n });\n if (selectedValue) {\n return convertDefaultValue(field, selectedValue.value);\n }\n return undefined;\n }\n return predefinedValues.values\n .filter(({ selected }) => !!selected)\n .map(({ value }) => {\n return convertDefaultValue(field, value);\n });\n};\n\nconst cleanInputValues = <TValues extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n input: TValues\n) => {\n return model.fields.reduce<TValues>((acc, field) => {\n if (!field.fieldId) {\n throw new WebinyError(\"Field does not have an fieldId.\", \"MISSING_FIELD_ID\", {\n field\n });\n }\n const key = field.fieldId as keyof TValues;\n const value = input[key] as TValues[keyof TValues];\n acc[key] = value === undefined ? (getDefaultValue(field) as TValues[keyof TValues]) : value;\n return acc;\n }, {} as TValues);\n};\n\nconst createEntryId = (input: CreateCmsEntryInput) => {\n let entryId = mdbid();\n if (input.id) {\n if (input.id.match(/^([a-zA-Z0-9])([a-zA-Z0-9-]+)([a-zA-Z0-9])$/) === null) {\n throw new WebinyError(\n \"The provided ID is not valid. It must be a string which can be A-Z, a-z, 0-9, - and it cannot start or end with a -.\",\n \"INVALID_ID\",\n {\n id: input.id\n }\n );\n }\n entryId = input.id;\n }\n const version = 1;\n return {\n entryId,\n version,\n id: createIdentifier({\n id: entryId,\n version\n })\n };\n};\n\nclass CreateEntryDataFactoryImpl implements ICreateEntryDataFactory {\n public constructor(\n private readonly cmsContext: CmsContext.Interface,\n private readonly identityContext: IdentityContext.Interface,\n private readonly tenantContext: TenantContext.Interface,\n private readonly accessControl: AccessControl.Interface,\n private readonly modelToAstConverter: ModelToAstConverter.Interface\n ) {}\n\n public async create<TValues extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n rawInput: CreateCmsEntryInput<TValues>,\n options?: CreateCmsEntryOptionsInput\n ): Promise<ICreateEntryDataResponse<TValues>> {\n const initialValues = cleanInputValues<TValues>(model, rawInput.values || ({} as TValues));\n\n const modelAst = this.modelToAstConverter.toAst(model);\n await ensureItemIds(modelAst, initialValues);\n\n await validateModelEntryDataOrThrow({\n context: this.cmsContext,\n model,\n values: initialValues,\n skipValidation: options?.skipValidation\n });\n\n const values = await referenceFieldsMapping<TValues>({\n context: this.cmsContext,\n model,\n values: initialValues,\n validateEntries: true\n });\n\n const { id, entryId, version } = createEntryId(rawInput);\n\n const currentIdentity = this.identityContext.getIdentity();\n const currentDateTime = new Date();\n\n const status = rawInput.status || STATUS_DRAFT;\n if (status !== STATUS_DRAFT) {\n if (status === STATUS_PUBLISHED) {\n const canPublish = await this.accessControl.canAccessEntry({ model, pw: \"p\" });\n if (!canPublish) {\n throw new NotAuthorizedError(\n `Not allowed to access \"${model.modelId}\" entries.`\n );\n }\n } else if (status === STATUS_UNPUBLISHED) {\n const canUnpublish = await this.accessControl.canAccessEntry({ model, pw: \"u\" });\n if (!canUnpublish) {\n throw new NotAuthorizedError(\n `Not allowed to access \"${model.modelId}\" entries.`\n );\n }\n }\n }\n\n const locked = status !== STATUS_DRAFT;\n\n let revisionLevelPublishingMetaFields: Pick<\n CmsEntry,\n | \"revisionFirstPublishedOn\"\n | \"revisionLastPublishedOn\"\n | \"revisionFirstPublishedBy\"\n | \"revisionLastPublishedBy\"\n > = {\n revisionFirstPublishedOn: null,\n revisionLastPublishedOn: null,\n revisionFirstPublishedBy: null,\n revisionLastPublishedBy: null\n };\n\n let entryLevelPublishingMetaFields: Pick<\n CmsEntry,\n \"firstPublishedOn\" | \"lastPublishedOn\" | \"firstPublishedBy\" | \"lastPublishedBy\"\n > = {\n firstPublishedOn: null,\n lastPublishedOn: null,\n firstPublishedBy: null,\n lastPublishedBy: null\n };\n\n if (status === STATUS_PUBLISHED) {\n revisionLevelPublishingMetaFields = {\n revisionFirstPublishedOn: getDate(\n rawInput.revisionFirstPublishedOn,\n currentDateTime\n ),\n revisionLastPublishedOn: getDate(rawInput.revisionLastPublishedOn, currentDateTime),\n revisionFirstPublishedBy: getIdentity(\n rawInput.revisionFirstPublishedBy,\n currentIdentity\n ),\n revisionLastPublishedBy: getIdentity(\n rawInput.revisionLastPublishedBy,\n currentIdentity\n )\n };\n\n entryLevelPublishingMetaFields = {\n firstPublishedOn: getDate(rawInput.firstPublishedOn, currentDateTime),\n lastPublishedOn: getDate(rawInput.lastPublishedOn, currentDateTime),\n firstPublishedBy: getIdentity(rawInput.firstPublishedBy, currentIdentity),\n lastPublishedBy: getIdentity(rawInput.lastPublishedBy, currentIdentity)\n };\n }\n\n const entry: CmsEntry<TValues> = {\n tenant: this.tenantContext.getTenant().id,\n entryId,\n id,\n modelId: model.modelId,\n createdOn: getDate(rawInput.createdOn, currentDateTime),\n modifiedOn: getDate(rawInput.modifiedOn, null),\n savedOn: getDate(rawInput.savedOn, currentDateTime),\n deletedOn: getDate(rawInput.deletedOn, null),\n restoredOn: getDate(rawInput.restoredOn, null),\n createdBy: getIdentity(rawInput.createdBy, currentIdentity)!,\n modifiedBy: getIdentity(rawInput.modifiedBy, null),\n savedBy: getIdentity(rawInput.savedBy, currentIdentity)!,\n deletedBy: getIdentity(rawInput.deletedBy, null),\n restoredBy: getIdentity(rawInput.restoredBy, null),\n ...entryLevelPublishingMetaFields,\n revisionCreatedOn: getDate(rawInput.revisionCreatedOn, currentDateTime),\n revisionModifiedOn: getDate(rawInput.revisionModifiedOn, null),\n revisionSavedOn: getDate(rawInput.revisionSavedOn, currentDateTime),\n revisionDeletedOn: getDate(rawInput.revisionDeletedOn, null),\n revisionRestoredOn: getDate(rawInput.revisionRestoredOn, null),\n revisionCreatedBy: getIdentity(rawInput.revisionCreatedBy, currentIdentity)!,\n revisionModifiedBy: getIdentity(rawInput.revisionModifiedBy, null),\n revisionSavedBy: getIdentity(rawInput.revisionSavedBy, currentIdentity)!,\n revisionDeletedBy: getIdentity(rawInput.revisionDeletedBy, null),\n revisionRestoredBy: getIdentity(rawInput.revisionRestoredBy, null),\n ...revisionLevelPublishingMetaFields,\n version,\n status,\n locked,\n values,\n location: {\n folderId:\n rawInput.location?.folderId || rawInput.wbyAco_location?.folderId || ROOT_FOLDER\n },\n system: getSystem({\n input: rawInput\n }),\n live:\n status === STATUS_PUBLISHED\n ? {\n version\n }\n : null,\n revisionDescription: \"\",\n expiresAt: getExpiresAt({ expiresAt: rawInput.expiresAt })\n };\n\n if (status !== STATUS_DRAFT) {\n if (status === STATUS_PUBLISHED) {\n const canPublish = await this.accessControl.canAccessEntry({\n model,\n entry,\n pw: \"p\"\n });\n if (!canPublish) {\n throw new NotAuthorizedError(`Not allowed to access entry \"${entry.entryId}\".`);\n }\n } else if (status === STATUS_UNPUBLISHED) {\n const canUnpublish = await this.accessControl.canAccessEntry({\n model,\n entry,\n pw: \"u\"\n });\n if (!canUnpublish) {\n throw new NotAuthorizedError(`Not allowed to access entry \"${entry.entryId}\".`);\n }\n }\n }\n\n return {\n entry,\n input: {\n ...rawInput,\n values: structuredClone(values)\n }\n };\n }\n}\n\nexport const CreateEntryDataFactory = createImplementation({\n abstraction: FactoryAbstraction,\n implementation: CreateEntryDataFactoryImpl,\n dependencies: [CmsContext, IdentityContext, TenantContext, AccessControl, ModelToAstConverter]\n});\n"],"names":["convertDefaultValue","field","value","Boolean","Number","getDefaultValue","settings","list","undefined","predefinedValues","Array","selectedValue","selected","cleanInputValues","model","input","acc","WebinyError","key","createEntryId","entryId","mdbid","version","createIdentifier","CreateEntryDataFactoryImpl","cmsContext","identityContext","tenantContext","accessControl","modelToAstConverter","rawInput","options","initialValues","modelAst","ensureItemIds","validateModelEntryDataOrThrow","values","referenceFieldsMapping","id","currentIdentity","currentDateTime","Date","status","STATUS_DRAFT","STATUS_PUBLISHED","canPublish","NotAuthorizedError","STATUS_UNPUBLISHED","canUnpublish","locked","revisionLevelPublishingMetaFields","entryLevelPublishingMetaFields","getDate","getIdentity","entry","ROOT_FOLDER","getSystem","getExpiresAt","structuredClone","CreateEntryDataFactory","createImplementation","FactoryAbstraction","CmsContext","IdentityContext","TenantContext","AccessControl","ModelToAstConverter"],"mappings":"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"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { type ICreateEntryRevisionFromDataFactory, type ICreateEntryRevisionFromDataResponse } from "./abstractions.js";
|
|
2
2
|
import { AccessControl, CmsContext } from "../../../../features/shared/abstractions.js";
|
|
3
|
-
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
4
3
|
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
5
4
|
import type { CmsEntry, CmsEntryValues, CmsModel, CreateCmsEntryInput, CreateCmsEntryOptionsInput } from "../../../../types/index.js";
|
|
5
|
+
import { ModelToAstConverter } from "../../../../features/contentModel/ModelToAstConverter/abstractions.js";
|
|
6
6
|
declare class CreateEntryRevisionFromDataFactoryImpl implements ICreateEntryRevisionFromDataFactory {
|
|
7
7
|
private readonly cmsContext;
|
|
8
8
|
private readonly identityContext;
|
|
9
|
-
private readonly tenantContext;
|
|
10
9
|
private readonly accessControl;
|
|
11
|
-
|
|
10
|
+
private readonly modelToAstConverter;
|
|
11
|
+
constructor(cmsContext: CmsContext.Interface, identityContext: IdentityContext.Interface, accessControl: AccessControl.Interface, modelToAstConverter: ModelToAstConverter.Interface);
|
|
12
12
|
create<TValues extends CmsEntryValues = CmsEntryValues>(sourceId: string, model: CmsModel, rawInput: CreateCmsEntryInput<TValues>, originalEntry: CmsEntry<TValues>, latestStorageEntry: CmsEntry<TValues>, options?: CreateCmsEntryOptionsInput): Promise<ICreateEntryRevisionFromDataResponse<TValues>>;
|
|
13
13
|
}
|
|
14
14
|
export declare const CreateEntryRevisionFromDataFactory: import("@webiny/di").Implementation<typeof CreateEntryRevisionFromDataFactoryImpl>;
|