From df16e6a3e83bfc0b6cc639704e02140a67f87fc6 Mon Sep 17 00:00:00 2001 From: Cody Rodgers Date: Mon, 11 Nov 2024 13:11:44 -0500 Subject: [PATCH] V10.4.X-1.0 (#28) * Update the videos/playlists pull pipelines to automatically refresh the search index to prevent a race condition (#14) Co-authored-by: Cody Rodgers * v10.1.X-3.6 (#18) * V10.2.0.3 (#16) * Fixed broken DXF configuration content for labels/folders * Add more error handling to the folder and labels property value readers * Fix bug preventing new labels from being synced * Remove automatic re-indexing from the videos/playlists pipeline --------- Co-authored-by: Cody Rodgers * Add missing embed media buttons * Reorganize DEF files * Update the DEF GET pipelines to have better error handling and removed broken SetFolderSettings code * Update the DEF resolve pipelines to have better error handling * Updated the UPDATE DEF pipelines to have better logging and error handling * Update playlist/video pipelines to accuratly reflect video name changes made outside of Sitecore * Fix bug preventing deleted Brightcove items from being deleted in Sitecore * Fix broken standard values for experience items * Update the Brightcove services to trim account ids/secrets * Update logging levels on video/player pipelines * Update all pipelines to handle name changes * Update sitecore package creation script to include patching instructions * Update the pull pipelines to support creating items in languages other an "en" * Update all template fields to be shared * Update the push pipelines to support creating items in languages other than "en" * Update the folder/labels value readers to have better error handling * Add support for embedding medai links again. It was removed as part of the upgrade but returned on client request * Update the resolve asset item pipeline step to rename resolved items if the name has been changed since creation * Fix the brightcove settings config so it loads both html editor scripts correctly * Update sitecore package creation script --------- Co-authored-by: Cody Rodgers * V10.2.X-5 (#22) * Update the videos/playlists pull pipelines to automatically refresh the search index to prevent a race condition (#14) Co-authored-by: Cody Rodgers * v10.1.X-3.6 (#18) * V10.2.0.3 (#16) * Fixed broken DXF configuration content for labels/folders * Add more error handling to the folder and labels property value readers * Fix bug preventing new labels from being synced * Remove automatic re-indexing from the videos/playlists pipeline --------- Co-authored-by: Cody Rodgers * Add missing embed media buttons * Reorganize DEF files * Update the DEF GET pipelines to have better error handling and removed broken SetFolderSettings code * Update the DEF resolve pipelines to have better error handling * Updated the UPDATE DEF pipelines to have better logging and error handling * Update playlist/video pipelines to accuratly reflect video name changes made outside of Sitecore * Fix bug preventing deleted Brightcove items from being deleted in Sitecore * Fix broken standard values for experience items * Update the Brightcove services to trim account ids/secrets * Update logging levels on video/player pipelines * Update all pipelines to handle name changes * Update sitecore package creation script to include patching instructions * Update the pull pipelines to support creating items in languages other an "en" * Update all template fields to be shared * Update the push pipelines to support creating items in languages other than "en" * Update the folder/labels value readers to have better error handling * Add support for embedding medai links again. It was removed as part of the upgrade but returned on client request * Update the resolve asset item pipeline step to rename resolved items if the name has been changed since creation * Fix the brightcove settings config so it loads both html editor scripts correctly * Update sitecore package creation script --------- Co-authored-by: Cody Rodgers * Fix bug which prevents the user from embedding media in the Siteocre RTE in certain scenarios * Add support for syncing video scheduling/status information * Reserialize content * Add some help text to the new scheduling fields --------- Co-authored-by: Cody Rodgers * v10.1.X-37 (#21) * Fix bug which prevents the user from embedding media in the Siteocre RTE in certain scenarios * Add support for syncing video scheduling/status information * Reserialize content * Add some help text to the new scheduling fields --------- Co-authored-by: Cody Rodgers * Update the embed generator to include an optional alt-text field for iframe accessibility support * Update all Brightcove templates/items to be unpublishable to prevent unnecessary performance hits * Update the pull pipeline processors to use the ItemModelRepository and cleanup unnecessary DB requests * Update the pull pipelines to set and use a new global last sync timestamp * Update the push pipelines to use the new last sync time * Update the video push pipeline to suppor the new last sync time field * Update the value reader/writers to include consistent exception handling * Update playlist/video page size to 1000 * Update the resolve asset item pipeline to dedup content items * Add the new clean pipeline batch * Add retry logic to the brightcove service * Fix loadPlayer script * Content Updates * Update the package/library references to target version 10.4 and add default web.config * Fix build errors and web.config * Fix various bugs --------- Co-authored-by: Cody Rodgers --- Brightcove.Core/Brightcove.Core.csproj | 1 + .../EmbedGenerator/Models/EmbedModel.cs | 2 + Brightcove.Core/Models/Experience.cs | 5 +- Brightcove.Core/Models/Video.cs | 3 + .../Services/BrightcoveHttpClient.cs | 1 + Brightcove.Core/Services/BrightcoveService.cs | 38 +- .../Brightcove.DataExchangeFramework.csproj | 167 +++- .../ApplyMappingPipelineStepConverter.cs | 19 + .../ReadAssetItemsPipelineStepConverter.cs | 8 +- .../ResolveAssetItemPipelineStepConverter.cs | 15 +- .../PipelineStep/SyncPipelineStepConverter.cs | 44 + .../UpdateAssetItemPipelineStepConverter.cs | 19 + .../UpdateVideoPipelineStepConverter.cs | 81 ++ .../UpdatePipelineStepConverter.cs | 0 .../Converters/WebApiEndpointConverter.cs | 9 +- .../Helpers/BrightcoveSyncSettingsHelper.cs | 45 + .../Helpers/IItemModelRepositoryHelper.cs | 38 + .../Helpers/ItemUpdater.cs | 45 - .../Lib/Sitecore.DataExchange.DataAccess.dll | Bin 65568 -> 65488 bytes .../Lib/Sitecore.DataExchange.Local.dll | Bin 98848 -> 98768 bytes ...tecore.DataExchange.Providers.Sc.Local.dll | Bin 18464 -> 18384 bytes .../Sitecore.DataExchange.Providers.Sc.dll | Bin 50720 -> 50128 bytes .../Lib/Sitecore.DataExchange.dll | Bin 226848 -> 226768 bytes .../ApplyMappingPipelineStepProcessor.cs | 139 +++ .../Processors/BasePipelineStepProcessor.cs | 33 +- ...PipelineStepWithWebApiEndpointProcessor.cs | 81 +- .../GetExperiencesPipelineStepProcessor.cs | 22 +- .../Get/GetFoldersPipelineStepProcessor.cs | 28 +- .../Get/GetLabelsPipelineStepProcessor.cs | 28 +- .../Get/GetPlayListsPipelineStepProcessor.cs | 31 +- .../Get/GetPlayersPipelineStepProcessor.cs | 27 +- .../Get/GetVideosPipelineStepProcessor.cs | 30 +- .../ReadAssetItemsPipelineStepProcessor.cs | 55 +- .../ResolveAssetItemPipelineStepProcessor.cs | 80 +- ...ResolveFolderModelPipelineStepProcessor.cs | 56 +- .../ResolveLabelModelPipelineStepProcessor.cs | 64 +- ...solvePlayListModelPipelineStepProcessor.cs | 57 +- ...ResolvePlayerModelPipelineStepProcessor.cs | 69 -- .../ResolveVideoModelPipelineStepProcessor.cs | 55 +- .../Sync/FinishSyncPipelineStepProcessor.cs | 43 + .../Sync/ResetSyncPipelineStepProcessor.cs | 37 + .../Sync/StartSyncPipelineStepProcessor.cs | 44 + .../Sync/VerifySyncPipelineStepProcessor.cs | 45 + .../UpdateAssetItemPipelineStepProcessor.cs | 43 + .../UpdateFolderModelPipelineStepProcessor.cs | 78 +- .../UpdateLabelModelPipelineStepProcessor.cs | 84 +- .../UpdatePlayerModelPipelineStepProcessor.cs | 86 -- ...pdatePlaylistModelPipelineStepProcessor.cs | 80 +- .../UpdateVideoItemPipelineStepProcessor.cs | 117 +++ .../Update/UpdateVideoItemProcessor.cs | 134 --- .../UpdateVideoModelPipelineStepProcessor.cs | 202 ++-- .../Settings/BrightcoveSyncSettings.cs | 21 + .../Settings/ResolveAssetItemSettings.cs | 7 +- .../Settings/WebApiSettings.cs | 1 - .../ChainedPropertyValueReader.cs | 43 +- .../CsvStringPropertyValueReader.cs | 43 +- .../DateTimePropertyValueReader.cs | 35 +- .../ValueReaders/FolderPropertyValueReader.cs | 6 +- .../ValueReaders/LabelsPropertyValueReader.cs | 6 +- .../ValueReaders/NullableEnumValueReader.cs | 20 +- .../StringDictionaryPropertyValueReader.cs | 45 +- .../VideoIdsPropertyValueReader.cs | 5 +- .../ChainedPropertyValueWriter.cs | 9 +- .../ValueWriters/LabelsPropertyValueWriter.cs | 2 +- .../VideoIdsPropertyValueWriter.cs | 26 +- Brightcove.DataExchangeFramework/app.config | 8 + .../packages.config | 37 +- Brightcove.Web/Brightcove.Web.csproj | 508 ++++++---- .../EmbedGenerator/SitecoreEmbedGenerator.cs | 60 +- .../Models/EmbedRenderingParameters.cs | 14 + Brightcove.Web/UI/Wizards/EmbedMediaWizard.cs | 32 +- Brightcove.Web/Web.config | 887 +++++++++--------- Brightcove.Web/packages.config | 161 ++-- .../Web/Brightcove/js/loadPlayer.js | 2 +- .../Brightcove.MediaLibrary/Brightcove.yml | 4 + .../BrightcoveAccount/_name/Experiences.yml | 18 +- .../BrightcoveAccount/_name/Folders.yml | 11 +- .../BrightcoveAccount/_name/Labels.yml | 11 +- .../BrightcoveAccount/_name/Players.yml | 25 +- .../BrightcoveAccount/_name/Playlists.yml | 14 +- .../BrightcoveAccount/_name/Videos.yml | 14 +- .../Apply Asset Model Source Mappi.yml | 2 +- .../Apply Playlist Model Source Ma.yml | 2 +- .../Apply Asset Model Source Mappi.yml | 5 +- .../Apply Experience Model Source_.yml | 2 +- .../LastSyncTime Property Mapping.yml | 26 - .../Apply Asset Model Source Mappi.yml | 2 +- .../Apply Player Model Source Mapp.yml | 28 - .../LastSyncTime Property Mapping.yml | 30 - .../Apply Asset Item Source Mappin.yml | 2 +- .../Apply Playlist Item Source Map.yml | 2 +- .../Apply Folder Model Source Mapp.yml | 2 +- .../Apply Asset Item Source Mappin.yml | 28 - .../Apply Player Item Source Mappi.yml | 28 - .../LastSyncTime Property.yml | 22 - .../LastSyncTime Property.yml | 22 - .../LastSyncTime Property.yml | 22 - .../Last Synchronization Time Fiel.yml | 22 - .../Folder Item Fields/LastSyncTime Field.yml | 22 - ...ine Batch.yml => Clean Pipeline Batch.yml} | 28 +- ...tch.yml => Pull Latest Pipeline Batch.yml} | 10 +- ...tch.yml => Push Latest Pipeline Batch.yml} | 21 +- .../_name/Pipelines/Clean Pipelines.yml | 18 + .../Clean Folders Pipeline.yml | 22 + .../Read Folder Items.yml | 34 + .../Resolve Folder Models.yml | 33 + .../Select Languages Pipeline Step.yml | 26 + .../Clean Labels Pipeline.yml} | 6 +- .../Read Label Items.yml} | 8 +- .../Resolve Label Models.yml} | 8 +- .../Select Languages Pipeline Step.yml | 8 +- .../Clean Playlists Pipeline.yml | 18 + .../Read Playlist Items.yml | 31 + .../Resolve Playlist Models.yml | 26 + .../Select Languages Pipeline Step.yml | 26 + .../Clean Pipelines/Clean Videos Pipeline.yml | 18 + .../Read Video Items.yml | 37 + .../Resolve Video Models.yml | 30 + .../Select Languages Pipeline Step.yml | 26 + .../Push Videos Pipeline/Read Video Items.yml | 4 +- .../Subpipelines/Resolve Model Pipelines.yml | 18 + .../Resolve Folder Models Pipeline.yml | 22 + .../Resolve Folder Model.yml | 30 + .../Resolve Label Models Pipeline.yml} | 6 +- .../Resolve Label Model.yml | 27 + .../Resolve Playlist Models Pipeli.yml | 18 + .../Resolve Playlist Model.yml | 24 + .../Resolve Video Models Pipeline.yml | 23 + .../Resolve Video Model.yml | 26 + .../Resolve Experience Item.yml | 4 + .../Update Experience Item.yml | 2 +- .../Resolve Folder Item.yml | 4 + .../Update Folder Item.yml | 2 +- .../Resolve Label Item.yml | 4 + .../Update Label Item.yml | 2 +- .../Resolve Player Item.yml | 4 + .../Update Player Item.yml | 2 +- .../Resolve Playlist Item.yml | 4 + .../Update Playlist Item.yml | 2 +- .../Resolve Video Item.yml | 4 + .../Update Video Item.yml | 2 +- .../Resolve Player Model.yml | 21 - .../Update Player Model.yml | 27 - .../_name/Pipelines/Sync Pipelines.yml | 18 + .../Sync Pipelines/Finish Sync Pipeline.yml | 18 + .../Finish Sync Pipeline/Finish Sync.yml | 17 + .../Sync Pipelines/Reset Sync Pipeline.yml | 18 + .../Reset Sync Pipeline/Reset Sync.yml | 17 + .../Sync Pipelines/Start Sync Pipeline.yml | 18 + .../Start Sync Pipeline/Start Sync.yml | 17 + .../Sync Pipelines/Verify Sync Pipeline.yml | 18 + .../Verify Sync Pipeline/Verify Sync.yml | 17 + .../Name Property Mapping.yml | 4 + .../LastSyncTime Property.yml | 26 - .../Folder Property Mapping.yml | 30 - .../Labels Property Mapping.yml | 26 - .../Apply Label Item Source Mappin.yml | 2 +- .../LastModifiedDate Property Mapp.yml | 30 - .../Apply Label Model Source Mappi.yml | 2 +- .../LastModifiedDate Property Mapp.yml | 33 - .../Apply Mapping Pipeline Step.yml | 29 + .../__Standard Values.yml | 21 + .../Finish Sync Pipeline Step.yml | 25 + .../Finish Sync Pipeline Step/Settings.yml | 14 + .../Settings/EndpointFrom.yml | 24 + .../__Standard Values.yml | 25 + .../Reset Sync Pipeline Step.yml | 25 + .../Reset Sync Pipeline Step/Settings.yml | 14 + .../Settings/EndpointFrom.yml | 24 + .../__Standard Values.yml | 25 + .../Start Sync Pipeline Step.yml | 25 + .../Start Sync Pipeline Step/Settings.yml | 14 + .../Settings/EndpointFrom.yml | 24 + .../__Standard Values.yml | 25 + .../Update Asset Item Pipeline Ste.yml | 32 + .../__Standard Values.yml | 21 + .../__Standard Values.yml | 4 +- .../__Standard Values.yml | 2 +- .../Verify Sync Pipeline Step.yml | 25 + .../Verify Sync Pipeline Step/Settings.yml | 14 + .../Settings/EndpointFrom.yml | 24 + .../__Standard Values.yml | 25 + .../__Standard Values.yml | 4 + .../Brightcove Folder/__Standard Values.yml | 4 + .../Brightcove Media Library Folde.yml | 28 + .../__Standard Values.yml | 26 + .../__Standard Values.yml | 5 + .../Settings/IframeTitleCustomField.yml | 35 + .../Settings/IframeTitleFallbackField.yml | 35 + .../BrightcoveAccount/Synchronization.yml | 18 + .../Synchronization/LastSyncFinishTime.yml | 21 + .../Synchronization/LastSyncStartTime.yml} | 12 +- .../BrightcoveAccount/__Standard Values.yml | 4 + .../Synchronization/LastSyncTime.yml | 29 - .../BrightcovePlaylist/__Standard Values.yml | 4 + .../Brightcove/BrightcoveVideo.yml | 2 +- .../BrightcoveFolder.yml | 2 +- .../Brightcove Video Data/Labels.yml | 2 +- .../BrightcoveVideo/Scheduling/EndsAt.yml | 4 + .../BrightcoveVideo/Scheduling/StartsAt.yml | 4 + .../BrightcoveVideo/Scheduling/State.yml | 4 + .../BrightcoveVideo/__Standard Values.yml | 33 +- .../__Standard Values.yml | 6 +- .../__Standard Values.yml | 4 + 204 files changed, 4026 insertions(+), 2480 deletions(-) create mode 100644 Brightcove.DataExchangeFramework/Converters/PipelineStep/ApplyMappingPipelineStepConverter.cs create mode 100644 Brightcove.DataExchangeFramework/Converters/PipelineStep/SyncPipelineStepConverter.cs create mode 100644 Brightcove.DataExchangeFramework/Converters/PipelineStep/UpdateAssetItemPipelineStepConverter.cs create mode 100644 Brightcove.DataExchangeFramework/Converters/PipelineStep/UpdateVideoPipelineStepConverter.cs rename Brightcove.DataExchangeFramework/Converters/{PipelineStep => }/UpdatePipelineStepConverter.cs (100%) create mode 100644 Brightcove.DataExchangeFramework/Helpers/BrightcoveSyncSettingsHelper.cs create mode 100644 Brightcove.DataExchangeFramework/Helpers/IItemModelRepositoryHelper.cs create mode 100644 Brightcove.DataExchangeFramework/Processors/ApplyMappingPipelineStepProcessor.cs delete mode 100644 Brightcove.DataExchangeFramework/Processors/Resolve/ResolvePlayerModelPipelineStepProcessor.cs create mode 100644 Brightcove.DataExchangeFramework/Processors/Sync/FinishSyncPipelineStepProcessor.cs create mode 100644 Brightcove.DataExchangeFramework/Processors/Sync/ResetSyncPipelineStepProcessor.cs create mode 100644 Brightcove.DataExchangeFramework/Processors/Sync/StartSyncPipelineStepProcessor.cs create mode 100644 Brightcove.DataExchangeFramework/Processors/Sync/VerifySyncPipelineStepProcessor.cs create mode 100644 Brightcove.DataExchangeFramework/Processors/Update/UpdateAssetItemPipelineStepProcessor.cs delete mode 100644 Brightcove.DataExchangeFramework/Processors/Update/UpdatePlayerModelPipelineStepProcessor.cs create mode 100644 Brightcove.DataExchangeFramework/Processors/Update/UpdateVideoItemPipelineStepProcessor.cs delete mode 100644 Brightcove.DataExchangeFramework/Processors/Update/UpdateVideoItemProcessor.cs create mode 100644 Brightcove.DataExchangeFramework/Settings/BrightcoveSyncSettings.cs delete mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/38b6b14a-dc3b-489d-a599-50bbf205052f/LastSyncTime Property Mapping.yml delete mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/66c52e36-fb67-4007-9f8a-94b8a36f94f4/Apply Player Model Source Mapp.yml delete mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/6f7b8f33-05d9-4ef3-b5ee-83d9bdcdac16/LastSyncTime Property Mapping.yml delete mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/915f8c16-6e0f-4963-9452-75e501e8822a/Apply Asset Item Source Mappin.yml delete mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/915f8c16-6e0f-4963-9452-75e501e8822a/Apply Player Item Source Mappi.yml delete mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Data Access/Value Accessor Sets/Providers/Brightcove/Asset Model Properties/LastSyncTime Property.yml delete mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Data Access/Value Accessor Sets/Providers/Brightcove/Folder Model Properties/LastSyncTime Property.yml delete mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Data Access/Value Accessor Sets/Providers/Brightcove/Label Model Properties/LastSyncTime Property.yml delete mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Data Access/Value Accessor Sets/Providers/Sitecore/Asset Item Fields/Last Synchronization Time Fiel.yml delete mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Data Access/Value Accessor Sets/Providers/Sitecore/Folder Item Fields/LastSyncTime Field.yml rename Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipeline Batches/{Push Pipeline Batch.yml => Clean Pipeline Batch.yml} (56%) rename Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipeline Batches/{Pull Pipeline Batch.yml => Pull Latest Pipeline Batch.yml} (82%) rename Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipeline Batches/{Sync Pipeline Batch.yml => Push Latest Pipeline Batch.yml} (76%) create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Clean Pipelines.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Clean Pipelines/Clean Folders Pipeline.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Clean Pipelines/Clean Folders Pipeline/Read Folder Items.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Clean Pipelines/Clean Folders Pipeline/Resolve Folder Models.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Clean Pipelines/Clean Folders Pipeline/Select Languages Pipeline Step.yml rename Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/{Push Pipelines/Push Players Pipeline.yml => Clean Pipelines/Clean Labels Pipeline.yml} (74%) rename Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/{Push Pipelines/Push Players Pipeline/Read Player Items.yml => Clean Pipelines/Clean Labels Pipeline/Read Label Items.yml} (79%) rename Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/{Push Pipelines/Push Players Pipeline/Update Player Models.yml => Clean Pipelines/Clean Labels Pipeline/Resolve Label Models.yml} (73%) rename Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/{Push Pipelines/Push Players Pipeline => Clean Pipelines/Clean Labels Pipeline}/Select Languages Pipeline Step.yml (70%) create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Clean Pipelines/Clean Playlists Pipeline.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Clean Pipelines/Clean Playlists Pipeline/Read Playlist Items.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Clean Pipelines/Clean Playlists Pipeline/Resolve Playlist Models.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Clean Pipelines/Clean Playlists Pipeline/Select Languages Pipeline Step.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Clean Pipelines/Clean Videos Pipeline.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Clean Pipelines/Clean Videos Pipeline/Read Video Items.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Clean Pipelines/Clean Videos Pipeline/Resolve Video Models.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Clean Pipelines/Clean Videos Pipeline/Select Languages Pipeline Step.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Subpipelines/Resolve Model Pipelines.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Subpipelines/Resolve Model Pipelines/Resolve Folder Models Pipeline.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Subpipelines/Resolve Model Pipelines/Resolve Folder Models Pipeline/Resolve Folder Model.yml rename Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Subpipelines/{Update Model Pipelines/Update Player Models Pipeline.yml => Resolve Model Pipelines/Resolve Label Models Pipeline.yml} (71%) create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Subpipelines/Resolve Model Pipelines/Resolve Label Models Pipeline/Resolve Label Model.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Subpipelines/Resolve Model Pipelines/Resolve Playlist Models Pipeli.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Subpipelines/Resolve Model Pipelines/Resolve Playlist Models Pipeli/Resolve Playlist Model.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Subpipelines/Resolve Model Pipelines/Resolve Video Models Pipeline.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Subpipelines/Resolve Model Pipelines/Resolve Video Models Pipeline/Resolve Video Model.yml delete mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Subpipelines/Update Model Pipelines/Update Player Models Pipeline/Resolve Player Model.yml delete mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Subpipelines/Update Model Pipelines/Update Player Models Pipeline/Update Player Model.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Sync Pipelines.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Sync Pipelines/Finish Sync Pipeline.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Sync Pipelines/Finish Sync Pipeline/Finish Sync.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Sync Pipelines/Reset Sync Pipeline.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Sync Pipelines/Reset Sync Pipeline/Reset Sync.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Sync Pipelines/Start Sync Pipeline.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Sync Pipelines/Start Sync Pipeline/Start Sync.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Sync Pipelines/Verify Sync Pipeline.yml create mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Pipelines/Sync Pipelines/Verify Sync Pipeline/Verify Sync.yml delete mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Value Mapping Sets/Model Source Mapping Sets/Label Model Source Mapping Set/LastSyncTime Property.yml delete mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Value Mapping Sets/Model Source Mapping Sets/Video Model Source Mapping Set/Folder Property Mapping.yml delete mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/Brightcove Tenant/_name/Value Mapping Sets/Model Source Mapping Sets/Video Model Source Mapping Set/Labels Property Mapping.yml delete mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/b515fa0d-a5b2-4792-85f7-b415b091356d/LastModifiedDate Property Mapp.yml delete mode 100644 Serialization/Brightcove.Template.Branches.DataExchangeFramework.Framework.Branches/ef1e96bf-0500-4da4-a1ba-9ce1a318eda6/LastModifiedDate Property Mapp.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Apply Mapping Pipeline Step.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Apply Mapping Pipeline Step/__Standard Values.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Finish Sync Pipeline Step.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Finish Sync Pipeline Step/Settings.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Finish Sync Pipeline Step/Settings/EndpointFrom.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Finish Sync Pipeline Step/__Standard Values.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Reset Sync Pipeline Step.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Reset Sync Pipeline Step/Settings.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Reset Sync Pipeline Step/Settings/EndpointFrom.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Reset Sync Pipeline Step/__Standard Values.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Start Sync Pipeline Step.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Start Sync Pipeline Step/Settings.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Start Sync Pipeline Step/Settings/EndpointFrom.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Start Sync Pipeline Step/__Standard Values.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Update Asset Item Pipeline Ste.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Update Asset Item Pipeline Ste/__Standard Values.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Verify Sync Pipeline Step.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Verify Sync Pipeline Step/Settings.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Verify Sync Pipeline Step/Settings/EndpointFrom.yml create mode 100644 Serialization/Brightcove.Template.DataExchangeFramework/Brightcove/Pipeline Steps/Verify Sync Pipeline Step/__Standard Values.yml create mode 100644 Serialization/Brightcove.Template/Brightcove/Brightcove Media Library Folde.yml create mode 100644 Serialization/Brightcove.Template/Brightcove/Brightcove Media Library Folde/__Standard Values.yml create mode 100644 Serialization/Brightcove.Template/Brightcove/BrightcoveAccount/Settings/IframeTitleCustomField.yml create mode 100644 Serialization/Brightcove.Template/Brightcove/BrightcoveAccount/Settings/IframeTitleFallbackField.yml create mode 100644 Serialization/Brightcove.Template/Brightcove/BrightcoveAccount/Synchronization.yml create mode 100644 Serialization/Brightcove.Template/Brightcove/BrightcoveAccount/Synchronization/LastSyncFinishTime.yml rename Serialization/Brightcove.Template/Brightcove/{Brightcove Synchronization Met/Synchronization Metadata/LastSyncTime.yml => BrightcoveAccount/Synchronization/LastSyncStartTime.yml} (54%) delete mode 100644 Serialization/Brightcove.Template/Brightcove/BrightcoveMediaElement/Synchronization/LastSyncTime.yml diff --git a/Brightcove.Core/Brightcove.Core.csproj b/Brightcove.Core/Brightcove.Core.csproj index f64df6d3..39868e32 100644 --- a/Brightcove.Core/Brightcove.Core.csproj +++ b/Brightcove.Core/Brightcove.Core.csproj @@ -33,6 +33,7 @@ ..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll + False diff --git a/Brightcove.Core/EmbedGenerator/Models/EmbedModel.cs b/Brightcove.Core/EmbedGenerator/Models/EmbedModel.cs index 06b5e71d..cb69746e 100644 --- a/Brightcove.Core/EmbedGenerator/Models/EmbedModel.cs +++ b/Brightcove.Core/EmbedGenerator/Models/EmbedModel.cs @@ -30,6 +30,8 @@ public class EmbedModel public string Language { get; set; } = ""; + public string Title { get; set; } = ""; + public EmbedModel() { diff --git a/Brightcove.Core/Models/Experience.cs b/Brightcove.Core/Models/Experience.cs index 51e867f0..b03c6d13 100644 --- a/Brightcove.Core/Models/Experience.cs +++ b/Brightcove.Core/Models/Experience.cs @@ -10,9 +10,12 @@ namespace Brightcove.Core.Models /// public class Experience : Asset { - [JsonProperty("created_at", NullValueHandling = NullValueHandling.Ignore)] + [JsonProperty("createdAt", NullValueHandling = NullValueHandling.Ignore)] public DateTime CreationDate { get; set; } + [JsonProperty("updatedAt", NullValueHandling = NullValueHandling.Ignore)] + public new DateTime? LastModifiedDate { get; set; } + [JsonProperty("publishedUrl", NullValueHandling = NullValueHandling.Ignore)] public string Url { get; set; } diff --git a/Brightcove.Core/Models/Video.cs b/Brightcove.Core/Models/Video.cs index d1cad2f3..1288aa99 100644 --- a/Brightcove.Core/Models/Video.cs +++ b/Brightcove.Core/Models/Video.cs @@ -62,6 +62,9 @@ public class Video : Asset [JsonProperty("schedule", NullValueHandling = NullValueHandling.Ignore)] public VideoSchedule Schedule { get; set; } + [JsonProperty("variants", NullValueHandling = NullValueHandling.Ignore)] + public List Variants { get; set; } + public Video ShallowCopy() { return (Video)this.MemberwiseClone(); diff --git a/Brightcove.Core/Services/BrightcoveHttpClient.cs b/Brightcove.Core/Services/BrightcoveHttpClient.cs index eaba8421..833da3e4 100644 --- a/Brightcove.Core/Services/BrightcoveHttpClient.cs +++ b/Brightcove.Core/Services/BrightcoveHttpClient.cs @@ -14,6 +14,7 @@ public static class BrightcoveHttpClient static BrightcoveHttpClient() { Instance = new HttpClient(); + Instance.Timeout = TimeSpan.FromSeconds(30); } } } diff --git a/Brightcove.Core/Services/BrightcoveService.cs b/Brightcove.Core/Services/BrightcoveService.cs index 14b7f4f0..53c9ed8f 100644 --- a/Brightcove.Core/Services/BrightcoveService.cs +++ b/Brightcove.Core/Services/BrightcoveService.cs @@ -16,6 +16,9 @@ public class BrightcoveService { readonly static HttpClient client = BrightcoveHttpClient.Instance; + int retryMax = 3; + int retryAttempt = 0; + readonly string cmsBaseUrl = "https://cms.api.brightcove.com/v1/accounts"; readonly string ingestBaseUrl = "https://ingest.api.brightcove.com/v1/accounts"; readonly string playersBaseUrl = "https://players.api.brightcove.com/v1/accounts"; @@ -306,6 +309,7 @@ public Video UpdateVideo(Video video) Video newVideo = video.ShallowCopy(); newVideo.Id = null; newVideo.Images = null; + newVideo.Variants = null; string content = JsonConvert.SerializeObject(newVideo); @@ -519,12 +523,12 @@ public PlayerList GetPlayers() return players; } - public ExperienceList GetExperiences() + public ExperienceList GetExperiences(string query = "", string sort = "") { HttpRequestMessage request = new HttpRequestMessage(); request.Method = HttpMethod.Get; - request.RequestUri = new Uri($"{experienceBaseUrl}/{accountId}/experiences"); + request.RequestUri = new Uri($"{experienceBaseUrl}/{accountId}/experiences?query={query}&sort={sort}"); HttpResponseMessage response = SendRequest(request); @@ -719,12 +723,12 @@ public bool TryGetPlaylist(string playlistId, out PlayList playlist) return true; } - public int VideosCount() + public int VideosCount(string query = "") { HttpRequestMessage request = new HttpRequestMessage(); request.Method = HttpMethod.Get; - request.RequestUri = new Uri($"{cmsBaseUrl}/{accountId}/counts/videos"); + request.RequestUri = new Uri($"{cmsBaseUrl}/{accountId}/counts/videos?query={query}"); HttpResponseMessage response = SendRequest(request); Count count = JsonConvert.DeserializeObject(response.Content.ReadAsString()); @@ -747,16 +751,30 @@ public int PlayListsCount() private HttpResponseMessage SendRequest(HttpRequestMessage request) { - request.Headers.Authorization = authenticationService.CreateAuthenticationHeader(); + try + { + request.Headers.Authorization = authenticationService.CreateAuthenticationHeader(); - HttpResponseMessage response = client.Send(request); + HttpResponseMessage response = client.Send(request); - if (!response.IsSuccessStatusCode) - { - throw new HttpStatusException(request, response); + if (!response.IsSuccessStatusCode) + { + throw new HttpStatusException(request, response); + } + + return response; } + catch(Exception ex) + { + if(retryAttempt < retryMax) + { + retryAttempt++; + return SendRequest(request); + } - return response; + retryAttempt = 0; + throw ex; + } } } } diff --git a/Brightcove.DataExchangeFramework/Brightcove.DataExchangeFramework.csproj b/Brightcove.DataExchangeFramework/Brightcove.DataExchangeFramework.csproj index 031b80f5..ddbbac7e 100644 --- a/Brightcove.DataExchangeFramework/Brightcove.DataExchangeFramework.csproj +++ b/Brightcove.DataExchangeFramework/Brightcove.DataExchangeFramework.csproj @@ -39,15 +39,19 @@ ..\packages\SharpZipLib.1.3.2\lib\net45\ICSharpCode.SharpZipLib.dll + False ..\packages\IdentityModel.3.10.10\lib\net452\IdentityModel.dll + False ..\packages\Microsoft.AspNet.OData.7.5.9\lib\net45\Microsoft.AspNet.OData.dll + False ..\packages\Microsoft.Bcl.AsyncInterfaces.6.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll + False ..\packages\Microsoft.Configuration.ConfigurationBuilders.Base.1.0.2\lib\Net471\Microsoft.Configuration.ConfigurationBuilders.Base.dll @@ -59,42 +63,55 @@ ..\packages\Microsoft.Extensions.Configuration.6.0.1\lib\net461\Microsoft.Extensions.Configuration.dll + False ..\packages\Microsoft.Extensions.Configuration.Abstractions.6.0.0\lib\net461\Microsoft.Extensions.Configuration.Abstractions.dll + False ..\packages\Microsoft.Extensions.Configuration.Binder.6.0.0\lib\net461\Microsoft.Extensions.Configuration.Binder.dll + False ..\packages\Microsoft.Extensions.DependencyInjection.6.0.0\lib\net461\Microsoft.Extensions.DependencyInjection.dll + False ..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.6.0.0\lib\net461\Microsoft.Extensions.DependencyInjection.Abstractions.dll + False ..\packages\Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.6.0.0\lib\net461\Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.dll + False ..\packages\Microsoft.Extensions.FileProviders.Abstractions.6.0.0\lib\net461\Microsoft.Extensions.FileProviders.Abstractions.dll + False ..\packages\Microsoft.Extensions.FileProviders.Physical.6.0.0\lib\net461\Microsoft.Extensions.FileProviders.Physical.dll + False ..\packages\Microsoft.Extensions.FileSystemGlobbing.6.0.0\lib\net461\Microsoft.Extensions.FileSystemGlobbing.dll + False ..\packages\Microsoft.Extensions.Logging.6.0.0\lib\net461\Microsoft.Extensions.Logging.dll + False ..\packages\Microsoft.Extensions.Logging.Abstractions.6.0.1\lib\net461\Microsoft.Extensions.Logging.Abstractions.dll + False ..\packages\Microsoft.Extensions.Options.6.0.0\lib\net461\Microsoft.Extensions.Options.dll + False ..\packages\Microsoft.Extensions.Primitives.6.0.0\lib\net461\Microsoft.Extensions.Primitives.dll + False ..\packages\Microsoft.IdentityModel.JsonWebTokens.5.4.0\lib\net461\Microsoft.IdentityModel.JsonWebTokens.dll @@ -110,9 +127,11 @@ ..\packages\Microsoft.OData.Core.7.9.0\lib\net45\Microsoft.OData.Core.dll + False ..\packages\Microsoft.OData.Edm.7.9.0\lib\net45\Microsoft.OData.Edm.dll + False ..\packages\EnterpriseLibrary.Common.6.0.1304.0\lib\NET45\Microsoft.Practices.EnterpriseLibrary.Common.dll @@ -144,6 +163,7 @@ ..\packages\Microsoft.Spatial.7.9.0\lib\net45\Microsoft.Spatial.dll + False ..\packages\Microsoft.Web.Infrastructure.1.0.0.0\lib\net40\Microsoft.Web.Infrastructure.dll @@ -156,130 +176,172 @@ ..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll + False ..\packages\Polly.6.1.2\lib\netstandard2.0\Polly.dll + False - - ..\packages\protobuf-net.2.0.0.668\lib\net40\protobuf-net.dll + + ..\packages\protobuf-net.2.4.6\lib\net40\protobuf-net.dll False - - ..\packages\Sitecore.Buckets.10.3.0\lib\net48\Sitecore.Buckets.dll + + ..\packages\Sitecore.Buckets.10.4.0\lib\net48\Sitecore.Buckets.dll + False - - ..\packages\Sitecore.Client.10.3.0\lib\net48\Sitecore.Client.dll + + ..\packages\Sitecore.Client.10.4.0\lib\net48\Sitecore.Client.dll + False - - ..\packages\Sitecore.ContentSearch.10.3.0\lib\net48\Sitecore.ContentSearch.dll + + ..\packages\Sitecore.ContentSearch.10.4.0\lib\net48\Sitecore.ContentSearch.dll + False - - ..\packages\Sitecore.ContentSearch.Client.10.3.0\lib\net48\Sitecore.ContentSearch.Client.dll + + ..\packages\Sitecore.ContentSearch.Client.10.4.0\lib\net48\Sitecore.ContentSearch.Client.dll + False - - ..\packages\Sitecore.ContentSearch.Data.10.3.0\lib\net48\Sitecore.ContentSearch.Data.dll + + ..\packages\Sitecore.ContentSearch.Data.10.4.0\lib\net48\Sitecore.ContentSearch.Data.dll + False - - ..\packages\Sitecore.ContentSearch.Linq.10.3.0\lib\net48\Sitecore.ContentSearch.Linq.dll + + ..\packages\Sitecore.ContentSearch.Linq.10.4.0\lib\net48\Sitecore.ContentSearch.Linq.dll + False - - ..\packages\Sitecore.Data.ResourceItems.Abstractions.10.3.0\lib\netstandard2.0\Sitecore.Data.ResourceItems.Abstractions.dll + + ..\packages\Sitecore.Data.ResourceItems.Abstractions.10.4.0\lib\netstandard2.0\Sitecore.Data.ResourceItems.Abstractions.dll + False - - ..\packages\Sitecore.Data.ResourceItems.ProtobufNet.10.3.0\lib\netstandard2.0\Sitecore.Data.ResourceItems.ProtobufNet.dll + + ..\packages\Sitecore.Data.ResourceItems.ProtobufNet.10.4.0\lib\netstandard2.0\Sitecore.Data.ResourceItems.ProtobufNet.dll + False False Lib\Sitecore.DataExchange.dll + False False Lib\Sitecore.DataExchange.DataAccess.dll + False False Lib\Sitecore.DataExchange.Local.dll + False False Lib\Sitecore.DataExchange.Providers.Sc.dll + False False Lib\Sitecore.DataExchange.Providers.Sc.Local.dll + False ..\packages\Sitecore.Framework.Common.6.0.0\lib\netstandard2.0\Sitecore.Framework.Common.dll + False ..\packages\Sitecore.Framework.Common.Abstractions.6.0.0\lib\netstandard2.0\Sitecore.Framework.Common.Abstractions.dll + False ..\packages\Sitecore.Framework.Common.WildcardMatch.6.0.0\lib\netstandard2.0\Sitecore.Framework.Common.WildcardMatch.dll + False ..\packages\Sitecore.Framework.Conditions.6.0.0\lib\netstandard2.0\Sitecore.Framework.Conditions.dll + False ..\packages\Sitecore.Framework.Configuration.Abstractions.7.0.0\lib\netstandard2.0\Sitecore.Framework.Configuration.Abstractions.dll + False ..\packages\Sitecore.Framework.Data.Blobs.3.0.1\lib\netstandard2.0\Sitecore.Framework.Data.Blobs.dll + False ..\packages\Sitecore.Framework.Data.Blobs.Abstractions.3.0.1\lib\netstandard2.0\Sitecore.Framework.Data.Blobs.Abstractions.dll + False ..\packages\Sitecore.Framework.Rules.6.0.0\lib\netstandard2.0\Sitecore.Framework.Rules.dll + False ..\packages\Sitecore.Framework.Rules.Abstractions.6.0.0\lib\netstandard2.0\Sitecore.Framework.Rules.Abstractions.dll + False ..\packages\Sitecore.Framework.Rules.Api.6.0.0\lib\netstandard2.0\Sitecore.Framework.Rules.Api.dll + False ..\packages\Sitecore.Framework.Rules.Core.6.0.0\lib\netstandard2.0\Sitecore.Framework.Rules.Core.dll + False ..\packages\Sitecore.Framework.Rules.Model.6.0.0\lib\netstandard2.0\Sitecore.Framework.Rules.Model.dll + False ..\packages\Sitecore.Framework.Rules.Registry.6.0.0\lib\netstandard2.0\Sitecore.Framework.Rules.Registry.dll + False ..\packages\Sitecore.Framework.Rules.Serialization.6.0.0\lib\netstandard2.0\Sitecore.Framework.Rules.Serialization.dll + False - - ..\packages\Sitecore.Kernel.10.3.0\lib\net48\Sitecore.Kernel.dll + + ..\packages\Sitecore.Kernel.10.4.0\lib\net48\Sitecore.Kernel.dll + False - - ..\packages\Sitecore.Kernel.Portable.10.3.0\lib\netstandard2.0\Sitecore.Kernel.Portable.dll + + ..\packages\Sitecore.Kernel.Portable.10.4.0\lib\netstandard2.0\Sitecore.Kernel.Portable.dll + False - - ..\packages\Sitecore.Logging.10.3.0\lib\net48\Sitecore.Logging.dll + + ..\packages\Sitecore.Logging.10.4.0\lib\net48\Sitecore.Logging.dll + False - - ..\packages\Sitecore.Logging.Client.10.3.0\lib\net48\Sitecore.Logging.Client.dll + + ..\packages\Sitecore.Logging.Client.10.4.0\lib\net48\Sitecore.Logging.Client.dll + False - ..\packages\Sitecore.Nexus.Consumption.1.5.0\lib\netstandard2.0\Sitecore.Nexus.Consumption.dll + ..\packages\Sitecore.Nexus.Consumption.1.6.0\lib\netstandard2.0\Sitecore.Nexus.Consumption.dll + False ..\packages\Sitecore.Nexus.Licensing.2.0.6\lib\netstandard2.0\Sitecore.Nexus.Licensing.dll False - - ..\packages\Sitecore.Services.Core.10.3.0\lib\net48\Sitecore.Services.Core.dll + + ..\packages\Sitecore.Screenshots.10.4.0\lib\netstandard2.0\Sitecore.Screenshots.dll + False + + + ..\packages\Sitecore.Services.Core.10.4.0\lib\net48\Sitecore.Services.Core.dll + False - - ..\packages\Sitecore.Services.Infrastructure.10.3.0\lib\net48\Sitecore.Services.Infrastructure.dll + + ..\packages\Sitecore.Services.Infrastructure.10.4.0\lib\net48\Sitecore.Services.Infrastructure.dll + False - - ..\packages\Sitecore.Services.Infrastructure.Sitecore.10.3.0\lib\net48\Sitecore.Services.Infrastructure.Sitecore.dll + + ..\packages\Sitecore.Services.Infrastructure.Sitecore.10.4.0\lib\net48\Sitecore.Services.Infrastructure.Sitecore.dll + False - - ..\packages\Sitecore.Web.10.3.0\lib\net48\Sitecore.Web.dll + + ..\packages\Sitecore.Web.10.4.0\lib\net48\Sitecore.Web.dll + False @@ -302,6 +364,7 @@ ..\packages\System.Diagnostics.DiagnosticSource.6.0.0\lib\net461\System.Diagnostics.DiagnosticSource.dll + False @@ -315,7 +378,7 @@ ..\packages\System.IO.4.3.0\lib\net462\System.IO.dll True - True + False @@ -326,6 +389,7 @@ ..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll + False @@ -336,16 +400,18 @@ ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + False ..\packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll True - True + False ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + False @@ -359,17 +425,17 @@ ..\packages\System.Security.Cryptography.Algorithms.4.3.1\lib\net463\System.Security.Cryptography.Algorithms.dll True - True + False ..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll True - True + False ..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll True - True + False @@ -389,9 +455,11 @@ ..\packages\System.Text.Encodings.Web.6.0.0\lib\net461\System.Text.Encodings.Web.dll + False ..\packages\System.Text.Json.6.0.0\lib\net461\System.Text.Json.dll + False @@ -402,6 +470,7 @@ ..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll + False @@ -460,10 +529,13 @@ + + - + + @@ -475,6 +547,8 @@ + + @@ -489,18 +563,23 @@ - + + + + + + - - + + diff --git a/Brightcove.DataExchangeFramework/Converters/PipelineStep/ApplyMappingPipelineStepConverter.cs b/Brightcove.DataExchangeFramework/Converters/PipelineStep/ApplyMappingPipelineStepConverter.cs new file mode 100644 index 00000000..d4f5bb4c --- /dev/null +++ b/Brightcove.DataExchangeFramework/Converters/PipelineStep/ApplyMappingPipelineStepConverter.cs @@ -0,0 +1,19 @@ +using Brightcove.DataExchangeFramework.Settings; +using Sitecore.Data; +using Sitecore.Data.Items; +using Sitecore.DataExchange.ApplyMapping; +using Sitecore.DataExchange.Attributes; +using Sitecore.DataExchange.Models; +using Sitecore.DataExchange.Providers.Sc.Converters.PipelineSteps; +using Sitecore.DataExchange.Repositories; +using Sitecore.Services.Core.Model; +using System; + +namespace Brightcove.DataExchangeFramework.Converters +{ + [SupportedIds("{AB4AF4DF-D282-4CD1-8268-FA12A9E457A3}")] + public class ApplyMappingPipelineStepConverter : ApplyMappingStepConverter + { + public ApplyMappingPipelineStepConverter(IItemModelRepository repository) : base(repository) { } + } +} \ No newline at end of file diff --git a/Brightcove.DataExchangeFramework/Converters/PipelineStep/ReadAssetItemsPipelineStepConverter.cs b/Brightcove.DataExchangeFramework/Converters/PipelineStep/ReadAssetItemsPipelineStepConverter.cs index 7a25a228..b894ebce 100644 --- a/Brightcove.DataExchangeFramework/Converters/PipelineStep/ReadAssetItemsPipelineStepConverter.cs +++ b/Brightcove.DataExchangeFramework/Converters/PipelineStep/ReadAssetItemsPipelineStepConverter.cs @@ -31,12 +31,16 @@ protected override void AddPlugins(ItemModel source, PipelineStep pipelineStep) if (endpointId != null) { - Item endpointItem = Sitecore.Context.ContentDatabase.GetItem(new ID(endpointId)); + ItemModel endpointItem = ItemModelRepository.Get(endpointId); if(endpointItem != null) { - resolveAssetItemSettings.AcccountItemId = endpointItem["Account"]; + resolveAssetItemSettings.AcccountItemId = this.GetStringValue(endpointItem, "Account") ?? ""; resolveAssetItemSettings.RelativePath = this.GetStringValue(source, "RelativePath") ?? ""; + + Database database = Sitecore.Configuration.Factory.GetDatabase(ItemModelRepository.DatabaseName); + resolveAssetItemSettings.AccountItem = database.GetItem(resolveAssetItemSettings.AcccountItemId); + resolveAssetItemSettings.ParentItem = database.GetItem(resolveAssetItemSettings.AccountItem?.Paths?.Path + "/" + resolveAssetItemSettings.RelativePath); } } diff --git a/Brightcove.DataExchangeFramework/Converters/PipelineStep/ResolveAssetItemPipelineStepConverter.cs b/Brightcove.DataExchangeFramework/Converters/PipelineStep/ResolveAssetItemPipelineStepConverter.cs index ff11c4a6..fda30862 100644 --- a/Brightcove.DataExchangeFramework/Converters/PipelineStep/ResolveAssetItemPipelineStepConverter.cs +++ b/Brightcove.DataExchangeFramework/Converters/PipelineStep/ResolveAssetItemPipelineStepConverter.cs @@ -24,15 +24,26 @@ protected override void AddPlugins(ItemModel source, PipelineStep pipelineStep) if (endpointId != null) { - Item endpointItem = Sitecore.Context.ContentDatabase.GetItem(new ID(endpointId)); + ItemModel endpointItem = ItemModelRepository.Get(endpointId); if (endpointItem != null) { - resolveAssetItemSettings.AcccountItemId = endpointItem["Account"]; + resolveAssetItemSettings.AcccountItemId = this.GetStringValue(endpointItem, "Account") ?? ""; resolveAssetItemSettings.RelativePath = this.GetStringValue(source, "RelativePath") ?? ""; + + Database database = Sitecore.Configuration.Factory.GetDatabase(ItemModelRepository.DatabaseName); + resolveAssetItemSettings.AccountItem = database.GetItem(resolveAssetItemSettings.AcccountItemId); + resolveAssetItemSettings.ParentItem = database.GetItem(resolveAssetItemSettings.AccountItem?.Paths?.Path + "/" + resolveAssetItemSettings.RelativePath); } } + //We need to store the resolve asset item plugin in the global Sitecore.DataExchangeContext so it + //can be used in the VideoIdsPropertyValueReader + if (Sitecore.DataExchange.Context.GetPlugin() == null) + { + Sitecore.DataExchange.Context.Plugins.Add(resolveAssetItemSettings); + } + pipelineStep.AddPlugin(resolveAssetItemSettings); } } diff --git a/Brightcove.DataExchangeFramework/Converters/PipelineStep/SyncPipelineStepConverter.cs b/Brightcove.DataExchangeFramework/Converters/PipelineStep/SyncPipelineStepConverter.cs new file mode 100644 index 00000000..a08f4ec5 --- /dev/null +++ b/Brightcove.DataExchangeFramework/Converters/PipelineStep/SyncPipelineStepConverter.cs @@ -0,0 +1,44 @@ +using Brightcove.DataExchangeFramework.Settings; +using Sitecore.Data; +using Sitecore.Data.Items; +using Sitecore.DataExchange.Attributes; +using Sitecore.DataExchange.Converters.PipelineSteps; +using Sitecore.DataExchange.Models; +using Sitecore.DataExchange.Providers.Sc.Converters.PipelineSteps; +using Sitecore.DataExchange.Repositories; +using Sitecore.Services.Core.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Brightcove.DataExchangeFramework.Converters +{ + public class SyncPipelineStepConverter : BasePipelineStepConverter + { + public SyncPipelineStepConverter(IItemModelRepository repository) : base(repository) + { + + } + + protected override void AddPlugins(ItemModel source, PipelineStep pipelineStep) + { + Guid endpointId = this.GetGuidValue(source, "EndpointFrom"); + BrightcoveSyncSettings settings = new BrightcoveSyncSettings(); + + if (endpointId != null) + { + ItemModel endpointItem = ItemModelRepository.Get(endpointId); + + if(endpointItem != null) + { + string accountId = this.GetStringValue(endpointItem, "Account") ?? ""; + settings.AccountItem = ItemModelRepository.Get(accountId); + } + } + + pipelineStep.AddPlugin(settings); + } + } +} diff --git a/Brightcove.DataExchangeFramework/Converters/PipelineStep/UpdateAssetItemPipelineStepConverter.cs b/Brightcove.DataExchangeFramework/Converters/PipelineStep/UpdateAssetItemPipelineStepConverter.cs new file mode 100644 index 00000000..bbc2b023 --- /dev/null +++ b/Brightcove.DataExchangeFramework/Converters/PipelineStep/UpdateAssetItemPipelineStepConverter.cs @@ -0,0 +1,19 @@ +using Brightcove.DataExchangeFramework.Settings; +using Sitecore.Data; +using Sitecore.Data.Items; +using Sitecore.DataExchange.ApplyMapping; +using Sitecore.DataExchange.Attributes; +using Sitecore.DataExchange.Models; +using Sitecore.DataExchange.Providers.Sc.Converters.PipelineSteps; +using Sitecore.DataExchange.Repositories; +using Sitecore.Services.Core.Model; +using System; + +namespace Brightcove.DataExchangeFramework.Converters +{ + [SupportedIds("{F4AF37B2-F92D-4E49-A017-3D7489E23910}")] + public class UpdateAssetItemPipelineStepConverter : UpdateSitecoreItemStepConverter + { + public UpdateAssetItemPipelineStepConverter(IItemModelRepository repository) : base(repository) { } + } +} \ No newline at end of file diff --git a/Brightcove.DataExchangeFramework/Converters/PipelineStep/UpdateVideoPipelineStepConverter.cs b/Brightcove.DataExchangeFramework/Converters/PipelineStep/UpdateVideoPipelineStepConverter.cs new file mode 100644 index 00000000..a187cbe3 --- /dev/null +++ b/Brightcove.DataExchangeFramework/Converters/PipelineStep/UpdateVideoPipelineStepConverter.cs @@ -0,0 +1,81 @@ +using Brightcove.DataExchangeFramework.Settings; +using Sitecore.Data; +using Sitecore.Data.Items; +using Sitecore.DataExchange.Attributes; +using Sitecore.DataExchange.Converters.PipelineSteps; +using Sitecore.DataExchange.DataAccess; +using Sitecore.DataExchange.Models; +using Sitecore.DataExchange.Plugins; +using Sitecore.DataExchange.Providers.Sc.Converters.PipelineSteps; +using Sitecore.DataExchange.Repositories; +using Sitecore.Services.Core.Model; +using System; + +namespace Brightcove.DataExchangeFramework.Converters +{ + [SupportedIds("{D79A5F5C-9A5E-4B1C-B884-8E3B97CACA2D}", "{F598D123-2FE9-45D3-99E2-3E4B5063190A}")] + public class UpdateVideoPipelineStepConverter : BasePipelineStepConverter + { + public UpdateVideoPipelineStepConverter(IItemModelRepository repository) : base(repository) { } + + protected override void AddPlugins(ItemModel source, PipelineStep pipelineStep) + { + MappingSettings mappingSettings = new MappingSettings() + { + ModelMappingSets = this.ConvertReferencesToModels(source, "ModelMappingSets"), + VariantMappingSets = this.ConvertReferencesToModels(source, "VariantMappingSets"), + SourceObjectLocation = this.GetGuidValue(source, "SourceObjectLocation"), + TargetObjectLocation = this.GetGuidValue(source, "TargetObjectLocation") + }; + + pipelineStep.AddPlugin(mappingSettings); + + BrightcoveEndpointSettings endpointSettings = new BrightcoveEndpointSettings() + { + BrightcoveEndpoint = this.ConvertReferenceToModel(source, "BrightcoveEndpoint"), + SitecoreEndpoint = this.ConvertReferenceToModel(source, "SitecoreEndpoint") + }; + + pipelineStep.AddPlugin(endpointSettings); + + Guid endpointId = this.GetGuidValue(source, "BrightcoveEndpoint"); + + if(endpointId == null) + { + return; + } + + ItemModel endpointModel = ItemModelRepository.Get(endpointId); + + if(endpointModel == null) + { + return; + } + + Guid accountItemId = this.GetGuidValue(endpointModel, "Account"); + + if(accountItemId == null) + { + return; + } + + ItemModel accountItem = ItemModelRepository.Get(accountItemId); + + if(accountItem == null) + { + return; + } + + WebApiSettings webApiSettings = new WebApiSettings(); + + if (accountItem != null) + { + webApiSettings.AccountId = this.GetStringValue(accountItem, "AccountId") ?? ""; + webApiSettings.ClientId = this.GetStringValue(accountItem, "ClientId") ?? ""; + webApiSettings.ClientSecret = this.GetStringValue(accountItem, "ClientSecret") ?? ""; + } + + endpointSettings.BrightcoveEndpoint.AddPlugin(webApiSettings); + } + } +} \ No newline at end of file diff --git a/Brightcove.DataExchangeFramework/Converters/PipelineStep/UpdatePipelineStepConverter.cs b/Brightcove.DataExchangeFramework/Converters/UpdatePipelineStepConverter.cs similarity index 100% rename from Brightcove.DataExchangeFramework/Converters/PipelineStep/UpdatePipelineStepConverter.cs rename to Brightcove.DataExchangeFramework/Converters/UpdatePipelineStepConverter.cs diff --git a/Brightcove.DataExchangeFramework/Converters/WebApiEndpointConverter.cs b/Brightcove.DataExchangeFramework/Converters/WebApiEndpointConverter.cs index 2ef5114d..f69368dc 100644 --- a/Brightcove.DataExchangeFramework/Converters/WebApiEndpointConverter.cs +++ b/Brightcove.DataExchangeFramework/Converters/WebApiEndpointConverter.cs @@ -26,16 +26,15 @@ public WebApiEndpointConverter(IItemModelRepository repository) : base(repositor protected override void AddPlugins(ItemModel source, Endpoint endpoint) { Guid accountItemId = this.GetGuidValue(source, TemplateAccount); - Item accountItem = Sitecore.Context.ContentDatabase.GetItem(new ID(accountItemId)); + ItemModel accountItem = ItemModelRepository.Get(accountItemId); WebApiSettings accountSettings = new WebApiSettings(); if(accountItem != null) { - accountSettings.AccountId = accountItem["AccountId"]; - accountSettings.ClientId = accountItem["ClientId"]; - accountSettings.ClientSecret = accountItem["ClientSecret"]; - accountSettings.AccountItem = accountItem; + accountSettings.AccountId = this.GetStringValue(accountItem, "AccountId") ?? ""; + accountSettings.ClientId = this.GetStringValue(accountItem, "ClientId") ?? ""; + accountSettings.ClientSecret = this.GetStringValue(accountItem, "ClientSecret") ?? ""; } endpoint.AddPlugin(accountSettings); diff --git a/Brightcove.DataExchangeFramework/Helpers/BrightcoveSyncSettingsHelper.cs b/Brightcove.DataExchangeFramework/Helpers/BrightcoveSyncSettingsHelper.cs new file mode 100644 index 00000000..02c6bce4 --- /dev/null +++ b/Brightcove.DataExchangeFramework/Helpers/BrightcoveSyncSettingsHelper.cs @@ -0,0 +1,45 @@ +using Brightcove.Core.Exceptions; +using Brightcove.Core.Models; +using Brightcove.Core.Services; +using Brightcove.DataExchangeFramework.Settings; +using Sitecore.Data.Fields; +using Sitecore.Data.Items; +using Sitecore.DataExchange.Attributes; +using Sitecore.DataExchange.Contexts; +using Sitecore.DataExchange.DataAccess; +using Sitecore.DataExchange.Extensions; +using Sitecore.DataExchange.Models; +using Sitecore.DataExchange.Plugins; +using Sitecore.DataExchange.Processors.PipelineSteps; +using Sitecore.DataExchange.Repositories; +using Sitecore.Services.Core.Diagnostics; +using Sitecore.Services.Core.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using Brightcove.Core.Extensions; +using Sitecore.DataExchange.ApplyMapping; +using Sitecore.Data; + +namespace Brightcove.DataExchangeFramework.Helpers +{ + public static class BrightcoveSyncSettingsHelper + { + public static void SetErrorFlag(PipelineContext pipelineContext) + { + if (pipelineContext == null) + { + throw new ArgumentNullException(nameof(pipelineContext)); + } + + var settings = pipelineContext.GetCurrentPipelineBatch().GetPlugin(); + + if(settings == null || settings.ErrorFlag) + { + return; + } + + settings.ErrorFlag = true; + } + } +} diff --git a/Brightcove.DataExchangeFramework/Helpers/IItemModelRepositoryHelper.cs b/Brightcove.DataExchangeFramework/Helpers/IItemModelRepositoryHelper.cs new file mode 100644 index 00000000..5fc93245 --- /dev/null +++ b/Brightcove.DataExchangeFramework/Helpers/IItemModelRepositoryHelper.cs @@ -0,0 +1,38 @@ +using Brightcove.Core.Exceptions; +using Brightcove.Core.Models; +using Brightcove.Core.Services; +using Brightcove.DataExchangeFramework.Settings; +using Sitecore.Data.Fields; +using Sitecore.Data.Items; +using Sitecore.DataExchange.Attributes; +using Sitecore.DataExchange.Contexts; +using Sitecore.DataExchange.DataAccess; +using Sitecore.DataExchange.Extensions; +using Sitecore.DataExchange.Models; +using Sitecore.DataExchange.Plugins; +using Sitecore.DataExchange.Processors.PipelineSteps; +using Sitecore.DataExchange.Repositories; +using Sitecore.Services.Core.Diagnostics; +using Sitecore.Services.Core.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using Brightcove.Core.Extensions; +using Sitecore.DataExchange.ApplyMapping; +using Sitecore.Data; + +namespace Brightcove.DataExchangeFramework.Helpers +{ + public static class IItemModelRepositoryHelper + { + public static string GetIndexName(IItemModelRepository itemModelRepository) + { + if (itemModelRepository == null) + { + throw new ArgumentNullException(nameof(itemModelRepository)); + } + + return $"sitecore_{itemModelRepository.DatabaseName}_index"; + } + } +} diff --git a/Brightcove.DataExchangeFramework/Helpers/ItemUpdater.cs b/Brightcove.DataExchangeFramework/Helpers/ItemUpdater.cs index 93432616..d17a7cf3 100644 --- a/Brightcove.DataExchangeFramework/Helpers/ItemUpdater.cs +++ b/Brightcove.DataExchangeFramework/Helpers/ItemUpdater.cs @@ -76,50 +76,5 @@ private static void FixItemModel(ItemModel itemModel) itemModel[key] = (object)obj.ToString(); } } - - public static SyncStatus GetSyncStatus(ItemModel itemModel) - { - DateTime lastSyncTime = DateTime.MinValue; - DateTime modelLastModifiedTime = DateTime.MinValue; - DateTime itemLastModifiedTime = DateTime.MinValue; - - if (string.IsNullOrWhiteSpace((string)itemModel["LastSyncTime"])) - { - return SyncStatus.NewItem; - } - lastSyncTime = DateTime.Parse((string)itemModel["LastSyncTime"]); - - Item item = Sitecore.Context.ContentDatabase.GetItem(new ID(itemModel.GetItemId())); - - if (item != null) - { - itemLastModifiedTime = ((DateField)item.Fields["__Updated"]).DateTime; - } - - if (itemModel.ContainsKey("LastModifiedTime") && !string.IsNullOrWhiteSpace((string)itemModel["LastModifiedTime"])) - { - modelLastModifiedTime = DateTime.Parse((string)itemModel["LastModifiedTime"]); - } - - if (modelLastModifiedTime > lastSyncTime) - { - return SyncStatus.ModelNewer; - } - - if (itemLastModifiedTime > lastSyncTime) - { - return SyncStatus.ItemNewer; - } - - return SyncStatus.Unmodified; - } - } - - public enum SyncStatus - { - NewItem, - ModelNewer, - ItemNewer, - Unmodified } } diff --git a/Brightcove.DataExchangeFramework/Lib/Sitecore.DataExchange.DataAccess.dll b/Brightcove.DataExchangeFramework/Lib/Sitecore.DataExchange.DataAccess.dll index a54e5d4520e2f92d3d9eaf8f33091d38ed4ee418..fcf71a67c83ccf5baf3001850cfbad59bbe89c63 100644 GIT binary patch delta 2984 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 delta 3071 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 diff --git a/Brightcove.DataExchangeFramework/Lib/Sitecore.DataExchange.Local.dll b/Brightcove.DataExchangeFramework/Lib/Sitecore.DataExchange.Local.dll index e5cf578d56e3199b63b5396575aaa62b673b1497..f44001e549945b8f3a73b20fe95dc7584866809d 100644 GIT binary patch delta 3304 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 Wcb!h`c92M4EuXP~(ZrHNpnm~f2QaMw delta 3384 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 P+#n3XMBJRQKec}WTBk|I diff --git a/Brightcove.DataExchangeFramework/Lib/Sitecore.DataExchange.Providers.Sc.Local.dll b/Brightcove.DataExchangeFramework/Lib/Sitecore.DataExchange.Providers.Sc.Local.dll index 3b89da1d72daafe612c1d7b49e5966a8b0ba4d1f..9a23f21be31fdaddae469874cc318fffb2150875 100644 GIT binary patch delta 3122 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
  • 2+!i#_@VIc8qCGv`9jI}=Oi*P;xtC>Z{Yy)`a^m|8=H9Nm_}LVh zts+tH<2%nP?q}zTwsobJzSYt<#`DiN<(1bj)CE!V$^p^Ao29?)kG5wgxhi4wYo@+s zd6=EO%B_8)>Y{S($k1UY4u98_B>Q@N&oe^rbFX=kD%Wh|+s~ytlkYiH9KN^y*KN%y zTYNJ!X}J|G7A9ppycNvD(?ul-q97LJ(J&a0#KRk**guQp_i~L_L?KxS#E@{Xl&FMX zniCj=!9pO+1M#9##`1p@b_p2}D@gu^P5ufee@4a`dh2!`bdF^V2V>gYVh;!eX{?r# z*u|>GTR|%L{3rLED=$L|8@f1HzhnN-((lf0`f^}*O|-MwSCwUCm`p~Cw*^e2&@3#3 zTULFPTKyBig3bQAFeR`gU92`s<-$3l_p`Ux9~~S@;Pq<`SQOi9q|fnP<)PwvMff?O*;sLW-zDqVBY!() zU=Wd0xZ6`6aTsmBW9uyNV>zyskB^pVeNL$DNIAhb4(qD@ayr_8b9muOepG{rW;M(7 zoBK|ks*H@IbDuu+YVwunYHRSd0+mL$p4{NAt=u_nYTomu`JRRfT=uO!?uL~sgSl>g zwal|)QQMarV^8)m`tfXALZCT>iE^ub_$tDMqD~Gglp88S9BOu3{fe) MaZ$wUF8aFsJ0Ds2!2kdN diff --git a/Brightcove.DataExchangeFramework/Lib/Sitecore.DataExchange.Providers.Sc.dll b/Brightcove.DataExchangeFramework/Lib/Sitecore.DataExchange.Providers.Sc.dll index aacb7ef6f6a6995226c8cacc3a8c3ceea5698fb7..6e73b49062262e5ed94dd00ed371b2059eeb01b5 100644 GIT binary patch delta 3248 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 AiU0rr delta 3349 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 O4NhdM1mGrh0r)4AMP3mA diff --git a/Brightcove.DataExchangeFramework/Lib/Sitecore.DataExchange.dll b/Brightcove.DataExchangeFramework/Lib/Sitecore.DataExchange.dll index c5cf6da74119483dd5798f9033be3aeecb08f179..e4efaba618ff564188cc055c7f1c6c5a338eefd7 100644 GIT binary patch delta 4243 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 Z{O5L?fEV4x>#ttfW7O(logger.Error), pipelineContext, "Pipeline step processing will abort because the pipeline step is missing a plugin.", new string[1] + { + "plugin: " + typeof (MappingSettings).FullName + }); + } + else + { + IMappingSet mappingSet = mappingSettings.MappingSet; + if (mappingSet == null) + this.Log(new Action(logger.Error), pipelineContext, "Pipeline step processing will abort because the pipeline step has no mapping set assigned.", new string[2] + { + "plugin: " + typeof (MappingSettings).FullName, + "property: MappingSet" + }); + else if (mappingSet.Mappings == null) + { + this.Log(new Action(logger.Error), pipelineContext, "Pipeline step processing will abort because the pipeline step has no mappings assigned.", new string[2] + { + "plugin: " + typeof (MappingSettings).FullName, + "property: MappingSet" + }); + } + else + { + object sourceObject = this.GetSourceObject(mappingSettings, pipelineContext, logger); + if (sourceObject == null) + { + this.Log(new Action(logger.Error), pipelineContext, "Pipeline step processing will abort because no source object could be resolved from the pipeline context.", new string[1] + { + string.Format("source location: {0}", (object) mappingSettings.SourceObjectLocation) + }); + } + else + { + object targetObject = this.GetTargetObject(mappingSettings, pipelineContext, logger); + if (targetObject == null) + { + this.Log(new Action(logger.Error), pipelineContext, "Pipeline step processing will abort because no target object could be resolved from the pipeline context.", new string[1] + { + string.Format("target location: {0}", (object) mappingSettings.TargetObjectLocation) + }); + } + else + { + MappingContext mappingContext = new MappingContext() + { + Source = sourceObject, + Target = targetObject + }; + if (!mappingSet.Run(mappingContext)) + { + this.Log(new Action(logger.Error), pipelineContext, "Pipeline step processing will abort because mapping set failed.", new string[3] + { + string.Format("mappings that succeeded: {0}", (object) mappingContext.RunSuccess.Count), + string.Format("mappings that were not attempted: {0}", (object) mappingContext.RunIgnore.Count), + string.Format("mappings that failed: {0}", (object) mappingContext.RunFail.Count) + }); + this.Log(new Action(logger.Error), pipelineContext, "At least one required value mapping failed.", new string[2] + { + string.Format("mappings that failed: {0}", (object) mappingContext.RunFail.Count), + "value mapping ids: " + string.Join(",", mappingContext.RunFail.Select((Func) (x => x.Identifier)).ToArray()) + }); + + HandleError(pipelineContext); + } + else + { + if (mappingContext.RunFail.Any()) + { + this.Log(new Action(logger.Error), pipelineContext, "At least one value mapping failed.", new string[2] + { + string.Format("mappings that failed: {0}", (object) mappingContext.RunFail.Count), + "value mapping ids: " + string.Join(",", mappingContext.RunFail.Select((Func) (x => x.Identifier)).ToArray()) + }); + + HandleError(pipelineContext); + } + + pipelineContext.GetSynchronizationSettings().IsTargetDirty = this.IsTargetDirty(mappingContext, mappingSettings, pipelineContext, logger); + if (!this.ShouldRunMappingsAppliedActions(mappingContext, mappingSettings, pipelineContext, logger)) + return; + this.RunMappingsAppliedActions(mappingContext, mappingSettings, pipelineContext, logger); + } + } + } + } + } + } + catch(Exception ex) + { + logger.Error("Failed to apply mapping(s) because an unexpected error occured", ex); + HandleError(pipelineContext); + } + } + + protected void HandleError(PipelineContext pipelineContext) + { + BrightcoveSyncSettingsHelper.SetErrorFlag(pipelineContext); + pipelineContext.Finished = true; + pipelineContext.CriticalError = false; + } + } +} diff --git a/Brightcove.DataExchangeFramework/Processors/BasePipelineStepProcessor.cs b/Brightcove.DataExchangeFramework/Processors/BasePipelineStepProcessor.cs index f08fffaa..3f611489 100644 --- a/Brightcove.DataExchangeFramework/Processors/BasePipelineStepProcessor.cs +++ b/Brightcove.DataExchangeFramework/Processors/BasePipelineStepProcessor.cs @@ -1,5 +1,6 @@ using Brightcove.Core.Models; using Brightcove.Core.Services; +using Brightcove.DataExchangeFramework.Helpers; using Brightcove.DataExchangeFramework.Settings; using Sitecore.DataExchange; using Sitecore.DataExchange.Attributes; @@ -22,28 +23,34 @@ namespace Brightcove.DataExchangeFramework.Processors { public class BasePipelineStepProcessor : Sitecore.DataExchange.Processors.PipelineSteps.BasePipelineStepProcessor { + protected IItemModelRepository itemModelRepository { get; set; } + protected override void ProcessPipelineStep(PipelineStep pipelineStep = null, PipelineContext pipelineContext = null, ILogger logger = null) { - if (pipelineStep == null) - { - throw new ArgumentNullException(nameof(pipelineStep)); - } - if (pipelineContext == null) - { - throw new ArgumentNullException(nameof(pipelineContext)); - } - if (logger == null) - { - throw new ArgumentNullException(nameof(logger)); - } - try { + if (pipelineStep == null) + { + throw new ArgumentNullException(nameof(pipelineStep)); + } + if (pipelineContext == null) + { + throw new ArgumentNullException(nameof(pipelineContext)); + } + if (logger == null) + { + throw new ArgumentNullException(nameof(logger)); + } + + itemModelRepository = Sitecore.DataExchange.Context.ItemModelRepository; + ProcessPipelineStepInternal(pipelineStep, pipelineContext, logger); } catch(Exception ex) { LogFatal("An unexpected error occured running the internal pipeline step", ex); + BrightcoveSyncSettingsHelper.SetErrorFlag(pipelineContext); + pipelineContext.Finished = true; pipelineContext.CriticalError = false; } } diff --git a/Brightcove.DataExchangeFramework/Processors/BasePipelineStepWithWebApiEndpointProcessor.cs b/Brightcove.DataExchangeFramework/Processors/BasePipelineStepWithWebApiEndpointProcessor.cs index 224fdac4..f2f5e39e 100644 --- a/Brightcove.DataExchangeFramework/Processors/BasePipelineStepWithWebApiEndpointProcessor.cs +++ b/Brightcove.DataExchangeFramework/Processors/BasePipelineStepWithWebApiEndpointProcessor.cs @@ -1,5 +1,6 @@ using Brightcove.Core.Models; using Brightcove.Core.Services; +using Brightcove.DataExchangeFramework.Helpers; using Brightcove.DataExchangeFramework.Settings; using Sitecore.Data.Fields; using Sitecore.Data.Items; @@ -10,6 +11,7 @@ using Sitecore.DataExchange.Models; using Sitecore.DataExchange.Plugins; using Sitecore.DataExchange.Processors.PipelineSteps; +using Sitecore.DataExchange.Providers.Sc.Plugins; using Sitecore.DataExchange.Repositories; using Sitecore.SecurityModel; using Sitecore.Services.Core.Diagnostics; @@ -25,54 +27,71 @@ namespace Brightcove.DataExchangeFramework.Processors public class BasePipelineStepWithWebApiEndpointProcessor : BasePipelineStepProcessor { protected WebApiSettings WebApiSettings { get; set; } + protected Endpoint EndpointFrom { get; set; } + protected BrightcoveService service { get; set; } + protected override void ProcessPipelineStep(PipelineStep pipelineStep = null, PipelineContext pipelineContext = null, ILogger logger = null) { - if (pipelineStep == null) - { - throw new ArgumentNullException(nameof(pipelineStep)); - } - if (pipelineContext == null) - { - throw new ArgumentNullException(nameof(pipelineContext)); - } - if (logger == null) + try { - throw new ArgumentNullException(nameof(logger)); - } + if (pipelineStep == null) + { + throw new ArgumentNullException(nameof(pipelineStep)); + } + if (pipelineContext == null) + { + throw new ArgumentNullException(nameof(pipelineContext)); + } + if (logger == null) + { + throw new ArgumentNullException(nameof(logger)); + } - EndpointSettings endpointSettings = pipelineStep.GetEndpointSettings(); + EndpointSettings endpointSettings = pipelineStep.GetEndpointSettings(); - if (endpointSettings == null) - { - LogFatal("Pipeline step processing will abort because the pipeline step is missing endpoint settings."); - return; - } + if (endpointSettings == null) + { + LogFatal("Pipeline step processing will abort because the pipeline step is missing endpoint settings."); + BrightcoveSyncSettingsHelper.SetErrorFlag(pipelineContext); + pipelineContext.Finished = true; + pipelineContext.CriticalError = false; + return; + } - EndpointFrom = endpointSettings.EndpointFrom; + EndpointFrom = endpointSettings.EndpointFrom; - if (EndpointFrom == null) - { - LogFatal("Pipeline step processing will abort because the pipeline step is missing an endpoint to read from."); - return; - } + if (EndpointFrom == null) + { + LogFatal("Pipeline step processing will abort because the pipeline step is missing an endpoint to read from."); + BrightcoveSyncSettingsHelper.SetErrorFlag(pipelineContext); + pipelineContext.Finished = true; + pipelineContext.CriticalError = false; + return; + } - WebApiSettings = GetPluginOrFail(EndpointFrom); + WebApiSettings = GetPluginOrFail(EndpointFrom); - if(!WebApiSettings.Validate()) - { - LogFatal("Pipeline step processing will abort because the Brightcove web API settings are invalid: "+WebApiSettings.ValidationMessage); - return; - } + if (!WebApiSettings.Validate()) + { + LogFatal("Pipeline step processing will abort because the Brightcove web API settings are invalid: " + WebApiSettings.ValidationMessage); + BrightcoveSyncSettingsHelper.SetErrorFlag(pipelineContext); + pipelineContext.Finished = true; + pipelineContext.CriticalError = false; + return; + } + + itemModelRepository = Sitecore.DataExchange.Context.ItemModelRepository; + service = new BrightcoveService(WebApiSettings.AccountId, WebApiSettings.ClientId, WebApiSettings.ClientSecret); - try - { ProcessPipelineStepInternal(pipelineStep, pipelineContext, logger); } catch (Exception ex) { LogFatal("An unexpected error occured running the internal pipeline step", ex); + BrightcoveSyncSettingsHelper.SetErrorFlag(pipelineContext); + pipelineContext.Finished = true; pipelineContext.CriticalError = false; } } diff --git a/Brightcove.DataExchangeFramework/Processors/Get/GetExperiencesPipelineStepProcessor.cs b/Brightcove.DataExchangeFramework/Processors/Get/GetExperiencesPipelineStepProcessor.cs index 377b0fff..c903e3fe 100644 --- a/Brightcove.DataExchangeFramework/Processors/Get/GetExperiencesPipelineStepProcessor.cs +++ b/Brightcove.DataExchangeFramework/Processors/Get/GetExperiencesPipelineStepProcessor.cs @@ -1,8 +1,10 @@ using Brightcove.Core.Services; +using Brightcove.DataExchangeFramework.Helpers; using Brightcove.DataExchangeFramework.Settings; using Sitecore.Data.Fields; using Sitecore.Data.Items; using Sitecore.DataExchange.Contexts; +using Sitecore.DataExchange.Extensions; using Sitecore.DataExchange.Models; using Sitecore.DataExchange.Plugins; using Sitecore.SecurityModel; @@ -14,25 +16,15 @@ namespace Brightcove.DataExchangeFramework.Processors { class GetExperiencesPipelineStepProcessor : BasePipelineStepWithWebApiEndpointProcessor { - BrightcoveService service; - protected override void ProcessPipelineStepInternal(PipelineStep pipelineStep = null, PipelineContext pipelineContext = null, ILogger logger = null) { - try - { - service = new BrightcoveService(WebApiSettings.AccountId, WebApiSettings.ClientId, WebApiSettings.ClientSecret); - - var data = service.GetExperiences().Items; - var dataSettings = new IterableDataSettings(data); + DateTime lastSyncStartTime = GetPluginOrFail(pipelineContext.GetCurrentPipelineBatch()).LastSyncStartTime; - LogDebug("Read " + data.Count() + " experience model(s) from web API"); + var data = service.GetExperiences().Items.Where(e => e.LastModifiedDate > lastSyncStartTime); + LogInfo("Identified " + data.Count() + " experience model(s) that have been modified since last sync "+ lastSyncStartTime); - pipelineContext.AddPlugin(dataSettings); - } - catch (Exception ex) - { - LogError($"Failed to get the brightcove models because an unexpected error has occured", ex); - } + var dataSettings = new IterableDataSettings(data); + pipelineContext.AddPlugin(dataSettings); } } } diff --git a/Brightcove.DataExchangeFramework/Processors/Get/GetFoldersPipelineStepProcessor.cs b/Brightcove.DataExchangeFramework/Processors/Get/GetFoldersPipelineStepProcessor.cs index 89a73471..2446d330 100644 --- a/Brightcove.DataExchangeFramework/Processors/Get/GetFoldersPipelineStepProcessor.cs +++ b/Brightcove.DataExchangeFramework/Processors/Get/GetFoldersPipelineStepProcessor.cs @@ -1,9 +1,11 @@ using Brightcove.Core.Models; using Brightcove.Core.Services; +using Brightcove.DataExchangeFramework.Helpers; using Brightcove.DataExchangeFramework.Settings; using Sitecore.DataExchange.Attributes; using Sitecore.DataExchange.Contexts; using Sitecore.DataExchange.Converters.PipelineSteps; +using Sitecore.DataExchange.Extensions; using Sitecore.DataExchange.Models; using Sitecore.DataExchange.Plugins; using Sitecore.DataExchange.Processors.PipelineSteps; @@ -20,31 +22,15 @@ namespace Brightcove.DataExchangeFramework.Processors { public class GetFoldersPipelineStepProcessor : BasePipelineStepWithWebApiEndpointProcessor { - BrightcoveService service; - protected override void ProcessPipelineStepInternal(PipelineStep pipelineStep = null, PipelineContext pipelineContext = null, ILogger logger = null) { - try - { - service = new BrightcoveService(WebApiSettings.AccountId, WebApiSettings.ClientId, WebApiSettings.ClientSecret); - - var folders = service.GetFolders(); - - foreach (Folder folder in folders) - { - folder.LastSyncTime = DateTime.UtcNow; - } - - LogDebug("Read " + folders.Count() + " folder model(s) from web API"); + DateTime lastSyncStartTime = GetPluginOrFail(pipelineContext.GetCurrentPipelineBatch()).LastSyncStartTime; - var dataSettings = new IterableDataSettings(folders); + var folders = service.GetFolders().Where(f => f.UpdatedDate > lastSyncStartTime); + LogInfo("Identified " + folders.Count() + " folder model(s) that have been modified since last sync " + lastSyncStartTime); - pipelineContext.AddPlugin(dataSettings); - } - catch (Exception ex) - { - LogError($"Failed to get the brightcove models because an unexpected error has occured", ex); - } + var dataSettings = new IterableDataSettings(folders); + pipelineContext.AddPlugin(dataSettings); } } } diff --git a/Brightcove.DataExchangeFramework/Processors/Get/GetLabelsPipelineStepProcessor.cs b/Brightcove.DataExchangeFramework/Processors/Get/GetLabelsPipelineStepProcessor.cs index 23ad8534..4c8c0627 100644 --- a/Brightcove.DataExchangeFramework/Processors/Get/GetLabelsPipelineStepProcessor.cs +++ b/Brightcove.DataExchangeFramework/Processors/Get/GetLabelsPipelineStepProcessor.cs @@ -1,9 +1,11 @@ using Brightcove.Core.Models; using Brightcove.Core.Services; +using Brightcove.DataExchangeFramework.Helpers; using Brightcove.DataExchangeFramework.Settings; using Sitecore.DataExchange.Attributes; using Sitecore.DataExchange.Contexts; using Sitecore.DataExchange.Converters.PipelineSteps; +using Sitecore.DataExchange.Extensions; using Sitecore.DataExchange.Models; using Sitecore.DataExchange.Plugins; using Sitecore.DataExchange.Processors.PipelineSteps; @@ -20,31 +22,15 @@ namespace Brightcove.DataExchangeFramework.Processors { public class GetLabelsPipelineStepProcessor : BasePipelineStepWithWebApiEndpointProcessor { - BrightcoveService service; - protected override void ProcessPipelineStepInternal(PipelineStep pipelineStep = null, PipelineContext pipelineContext = null, ILogger logger = null) { - try - { - service = new BrightcoveService(WebApiSettings.AccountId, WebApiSettings.ClientId, WebApiSettings.ClientSecret); - - var labels = service.GetLabels(); - - foreach (Label label in labels) - { - label.LastSyncTime = DateTime.UtcNow; - } - - LogDebug("Read " + labels.Count() + " label model(s) from web API"); + //DateTime lastSyncStartTime = GetPluginOrFail(pipelineContext.GetCurrentPipelineBatch()).LastSyncStartTime; - var dataSettings = new IterableDataSettings(labels); + var labels = service.GetLabels(); + LogDebug("Identified " + labels.Count() + "label model(s)"); - pipelineContext.AddPlugin(dataSettings); - } - catch (Exception ex) - { - LogError($"Failed to get the brightcove models because an unexpected error has occured", ex); - } + var dataSettings = new IterableDataSettings(labels); + pipelineContext.AddPlugin(dataSettings); } } } diff --git a/Brightcove.DataExchangeFramework/Processors/Get/GetPlayListsPipelineStepProcessor.cs b/Brightcove.DataExchangeFramework/Processors/Get/GetPlayListsPipelineStepProcessor.cs index 8eaf67b7..9c2166bd 100644 --- a/Brightcove.DataExchangeFramework/Processors/Get/GetPlayListsPipelineStepProcessor.cs +++ b/Brightcove.DataExchangeFramework/Processors/Get/GetPlayListsPipelineStepProcessor.cs @@ -5,6 +5,7 @@ using Sitecore.Data.Items; using Sitecore.DataExchange.Attributes; using Sitecore.DataExchange.Contexts; +using Sitecore.DataExchange.Extensions; using Sitecore.DataExchange.Models; using Sitecore.DataExchange.Plugins; using Sitecore.DataExchange.Processors.PipelineSteps; @@ -20,38 +21,32 @@ namespace Brightcove.DataExchangeFramework.Processors { class GetPlayListsPipelineStepProcessor : BasePipelineStepWithWebApiEndpointProcessor { - BrightcoveService service; + DateTime lastSyncStartTime; int totalCount = 0; protected override void ProcessPipelineStepInternal(PipelineStep pipelineStep = null, PipelineContext pipelineContext = null, ILogger logger = null) { - try - { - service = new BrightcoveService(WebApiSettings.AccountId, WebApiSettings.ClientId, WebApiSettings.ClientSecret); - - totalCount = service.PlayListsCount(); - LogDebug("Read " + totalCount + " playlist model(s) from web API"); + lastSyncStartTime = GetPluginOrFail(pipelineContext.GetCurrentPipelineBatch()).LastSyncStartTime; + totalCount = service.PlayListsCount(); - var data = this.GetIterableData(WebApiSettings, pipelineStep); - var dataSettings = new IterableDataSettings(data); + var data = this.GetIterableData(WebApiSettings, pipelineStep); + var dataSettings = new IterableDataSettings(data); - pipelineContext.AddPlugin(dataSettings); - } - catch (Exception ex) - { - LogError($"Failed to get the brightcove models because an unexpected error has occured", ex); - } + pipelineContext.AddPlugin(dataSettings); } protected virtual IEnumerable GetIterableData(WebApiSettings settings, PipelineStep pipelineStep) { - int limit = 100; + IEnumerable playLists; + int limit = 1000; for (int offset = 0; offset < totalCount; offset += limit) { - foreach(PlayList playList in service.GetPlayLists(offset, limit)) + playLists = service.GetPlayLists(offset, limit).Where(p => p.LastModifiedDate > lastSyncStartTime); + LogInfo("Identified " + playLists.Count() + " playlist model(s) that have been modified since last sync " + lastSyncStartTime); + + foreach (PlayList playList in playLists) { - playList.LastSyncTime = DateTime.UtcNow; yield return playList; } } diff --git a/Brightcove.DataExchangeFramework/Processors/Get/GetPlayersPipelineStepProcessor.cs b/Brightcove.DataExchangeFramework/Processors/Get/GetPlayersPipelineStepProcessor.cs index 58e69a4e..794385ae 100644 --- a/Brightcove.DataExchangeFramework/Processors/Get/GetPlayersPipelineStepProcessor.cs +++ b/Brightcove.DataExchangeFramework/Processors/Get/GetPlayersPipelineStepProcessor.cs @@ -3,6 +3,7 @@ using Sitecore.Data.Fields; using Sitecore.Data.Items; using Sitecore.DataExchange.Contexts; +using Sitecore.DataExchange.Extensions; using Sitecore.DataExchange.Models; using Sitecore.DataExchange.Plugins; using Sitecore.SecurityModel; @@ -14,31 +15,15 @@ namespace Brightcove.DataExchangeFramework.Processors { class GetPlayersPipelineStepProcessor : BasePipelineStepWithWebApiEndpointProcessor { - BrightcoveService service; - protected override void ProcessPipelineStepInternal(PipelineStep pipelineStep = null, PipelineContext pipelineContext = null, ILogger logger = null) { - try - { - service = new BrightcoveService(WebApiSettings.AccountId, WebApiSettings.ClientId, WebApiSettings.ClientSecret); - - var data = service.GetPlayers().Items; - - foreach (var player in data) - { - player.LastSyncTime = DateTime.UtcNow; - } - - var dataSettings = new IterableDataSettings(data); + DateTime lastSyncStartTime = GetPluginOrFail(pipelineContext.GetCurrentPipelineBatch()).LastSyncStartTime; - LogDebug("Read " + data.Count() + " player model(s) from web API"); + var data = service.GetPlayers().Items.Where(p => p.Branches.Master.UpdatedAt > lastSyncStartTime); + LogInfo("Identified " + data.Count() + " player model(s) that have been modified since last sync " + lastSyncStartTime); - pipelineContext.AddPlugin(dataSettings); - } - catch (Exception ex) - { - LogError($"Failed to get the brightcove models because an unexpected error has occured", ex); - } + var dataSettings = new IterableDataSettings(data); + pipelineContext.AddPlugin(dataSettings); } } } diff --git a/Brightcove.DataExchangeFramework/Processors/Get/GetVideosPipelineStepProcessor.cs b/Brightcove.DataExchangeFramework/Processors/Get/GetVideosPipelineStepProcessor.cs index 152bf2a9..d166b9e4 100644 --- a/Brightcove.DataExchangeFramework/Processors/Get/GetVideosPipelineStepProcessor.cs +++ b/Brightcove.DataExchangeFramework/Processors/Get/GetVideosPipelineStepProcessor.cs @@ -6,6 +6,7 @@ using Sitecore.DataExchange.Attributes; using Sitecore.DataExchange.Contexts; using Sitecore.DataExchange.Converters.PipelineSteps; +using Sitecore.DataExchange.Extensions; using Sitecore.DataExchange.Models; using Sitecore.DataExchange.Plugins; using Sitecore.DataExchange.Processors.PipelineSteps; @@ -22,38 +23,35 @@ namespace Brightcove.DataExchangeFramework.Processors { public class GetVideosPipelineStepProcessor : BasePipelineStepWithWebApiEndpointProcessor { - BrightcoveService service; int totalCount = 0; + string query = ""; protected override void ProcessPipelineStepInternal(PipelineStep pipelineStep = null, PipelineContext pipelineContext = null, ILogger logger = null) { - try + BrightcoveSyncSettings syncSettings = GetPluginOrFail(pipelineContext.GetCurrentPipelineBatch()); + + if (syncSettings.LastSyncStartTime != DateTime.MinValue) { - service = new BrightcoveService(WebApiSettings.AccountId, WebApiSettings.ClientId, WebApiSettings.ClientSecret); + query = $"+updated_at:[{syncSettings.LastSyncStartTime.ToString("s", System.Globalization.CultureInfo.InvariantCulture)}Z TO *]"; + } - totalCount = service.VideosCount(); - LogDebug("Read " + totalCount + " video model(s) from web API"); + totalCount = service.VideosCount(query); + LogInfo("Identified " + totalCount + " video model(s) that have been modified since last sync "+ syncSettings.LastSyncStartTime); - var data = GetIterableData(pipelineStep); - var dataSettings = new IterableDataSettings(data); + var data = GetIterableData(pipelineStep); + var dataSettings = new IterableDataSettings(data); - pipelineContext.AddPlugin(dataSettings); - } - catch (Exception ex) - { - LogError($"Failed to get the brightcove models because an unexpected error has occured", ex); - } + pipelineContext.AddPlugin(dataSettings); } protected virtual IEnumerable