Перейти к содержанию

Перенос старых расширений сателлитов на новый механизм сателлитов

Перенос старых расширений сателлитов на новый механизм сателлитов

Чтобы перенести старые расширения сателлитов на новые нужно сделать следующее:

  1. Обновить тип карточки сателлита, указав в нем новую секцию.

  2. Перенести данные о связи основной карточки с сателлитом в секцию Satellites через SQL запрос или миграцию схемы данных. Запрос будет выглядеть примерно следующим образом:

    INSERT INTO [Satellites] ([ID], [MainCardID], [TypeID]) SELECT [ID], [MainCardID], '12345678-1234-1234-1234-123456789012' -- идентификатор типа карточки сателлита FROM [OldSatelliteSection] WITH(NOLOCK) -- секция, в которой раньше хранилась связь основной карточки с карточкой сателлита

  3. Создать новый дескриптор сателлита и обработчик сателлита с соответствующими настройками. Настройки зависят от настроек в старых расширениях сателлита и то, от какого класса идет наследование.

  4. Создать обработчик сателлита, в который перенести логику старых расширений.

  5. Сделать расширение, которое позволит поддержать импорт/восстановление из корзины карточек со старыми сателлитами.

Старые расширения для сателлитов разделялись на 2 основные категории: CardSatellite...Extension и TaskSatellite...Extension. В следующих разделах рассмотрим перенос логики из расширений в отдельности для каждой из категорий.

Перенос расширений CardSatelliteExtension

Если для расширений сателлита использовались данные расширения в качестве базовых классов расширений, то в дескрипторе сателлита можно сразу устанавливать следующим свойствам значение true при его создании:

  • IsSingleton - для данных сателлитов не предполагалась возможность использовать одновременно несколько сателлитов одного типа.

  • IgnoreStoreExtensions - данные расширения не имели никакой особой логики при сохранении.

  • IgnoreGetPrepare - данные расширения не имели никакой особой логики при загрузке.

Следующие методы и свойства из расширений переносятся в соответствующие методы в обработчике сателлита и свойства в дескрипторе типа сателлита:

  • Для всех расширений, метод IsMainCardTypeAsync переносится в аналогичный метод IsMainCardTypeAsync в обработчике. В расширениях эти методы должны были реализовать одинаковую логику, иначе данные расширения работали бы некорректно.

  • Расширение CardSatelliteGetExtension, свойство AllowRequestsFromClient - переносится в свойство AllowGetFromClient в дескрипторе сателлита.

Если расширения имеют свою особенную логику в стандартных методах расширений (таких как BeforeRequest, AfterRequest и другие), то, в зависимости от реализованной логики работы данных методов, их нужно переносить в отдельные расширения соответствующего типа (CardGetExtension, CardDeleteExtension и т.д.) или в методы обработчика в соответствии с логикой (PrepareSatelliteForBackupAsync, PrepareSatelliteForDeleteAsync и т.д.).

Перенос расширений TaskSatelliteExtension

Если для расширений сателлита использовались данные расширения в качестве базовых классов расширений, то в дескрипторе сателлита можно сразу устанавливать следующим свойствам значение true при его создании:

  • IsSingleton - для данных сателлитов не предполагалась возможность использовать одновременно несколько сателлитов одного типа.

  • IsDeferredStore - сателлиты данного типа всегда создавались отложено.

  • IsTaskSatellite - данные сателлиты всегда были связаны с заданием.

  • LoadMainCardFiles - данные сателлиты по умолчанию всегда загружали вместе с собой файлы основной карточки.

  • AllowGetFromClient - данные сателлиты всегда были доступны для загрузки с клиента.

Следующие методы и свойства из расширений переносятся в соответствующие методы в обработчике сателлита и свойства в дескрипторе типа сателлита:

  • Для всех расширений, метод IsMainCardTypeAsync переносится в аналогичный метод IsMainCardTypeAsync в обработчике. В расширениях эти методы должны были реализовать одинаковую логику, иначе данные расширения работали бы некорректно.

  • Расширение TaskSatelliteGetExtension, логика работы свойств VirtualSatelliteSection и MainCardDigestInVirtualSatelliteSectionFieldName теперь реализуется в методе обработчика PrepareSatelliteForGetAsync при необходимости.

    Пример:

    string digest = context.Request.TryGetDigest(); satellite.Sections.GetOrAdd("WfTaskCardsVirtual").RawFields["MainCardDigest"] = digest;

  • Расширение TaskSatelliteGetExtension, метод SetupVirtualSatelliteAsync - переносится в метод PrepareSatelliteForCreateAsync в обработчике сателлита.

  • Расширение TaskSatelliteGetExtension, метод SetupSatelliteFileAsync - переносится в метод SetupSatelliteFileAsync в обработчике сателлита.

  • Расширение TaskSatelliteGetExtension, методы PrepareSatelliteAfterLoadingAndGetAdditionalInfoAsync и PrepareSatelliteWithMainCardInfoAsync - переносится в метод PrepareSatelliteForGetAsync в обработчике сателлита.

  • Расширение TaskSatelliteGetExtension, метод LoadExternalCardsWithFilesListAsync - переносится в метод GetExternalFileSourcesAsync в обработчике сателлита. Метод из обработчика возвращает пары значений ID карточки/ID типа карточки, поэтому при переносе логику метода следует доработать.

  • Расширение TaskSatelliteGetFileContentExtension, метод CheckAccessAsync - переносится в метод CheckFileAccessAsync в обработчике сателлита.

  • Расширение TaskSatelliteGetFileVersionsExtension, метод CheckAccessAsync - переносится в метод CheckFileVersionsAccessAsync в обработчике сателлита.

  • Расширение TaskSatellitePermissionsGetExtension, логика работы данного расширения при необходимости теперь реализуется в методе PrepareSatelliteForGetAsync. Пример подобного переноса можно посмотреть в обработчике WfTaskSatelliteHandler в методе PrepareSatelliteForGetAsync.

  • Расширение TaskSatelliteStoreExtension, метод PrepareMainCardFileToStoreAsync - переносится в метод PrepareMainCardFileToStoreAsync в обработчике сателлита.

Если расширения имеют свою особенную логику в стандартных методах расширений (таких как BeforeRequest, AfterRequest и другие), то, в зависимости от реализованной логики работы данных методов, их нужно переносить в отдельные расширения соответствующего типа (CardGetExtension, CardDeleteExtension и т.д.) или в методы обработчика в соответствии с логикой (PrepareSatelliteForBackupAsync, PrepareSatelliteForDeleteAsync и т.д.).

Расширения для импорта/восстановления старых сателлитов

Для того, чтобы поддержать импорт или восстановление из корзины карточек во старыми сателлитами, необходимо реализовать дополнительное расширение, которое перенесет необходимые данные из старых мест хранения сателлитов в новые и обновит данные в самих сателлитах.

Для этого достаточно сделать свое ICardRepairExtension расширение, которое будет наследоваться от шаблона расширения CardSatelliteTransferRepairExtension. Для корректной работы расширения в нем следует переопределить необходимые свойства и зарегистрировать как расширение для починки карточки (т.е. оно должно выполняться как на клиенте, так и на сервере).

Расширение CardSatelliteTransferRepairExtension имеет следующие свойства, которые можно переопределить:

  • StoreKey (обязательное) - имя ключа, по которому хранилась карточка сателлита или список карточек сателлитов в card.Info основной карточки.

  • SatelliteSectionName (обязательное) - имя секции, где хранились ссылки на основную карточку и задание (если сателлит относится к заданию) в карточке сателлита.

  • MainCardIDColumnName - имя колонки с ссылкой на основную карточку, к которой относится сателлит. По умолчанию имеет значение MainCardID.

  • IsTaskSatelite - определяет, относится ли данный тип сателлита к заданию или к карточке. По умолчанию имеет значение false.

  • TaskRowIDColumnName - имя колонки с ссылкой на задание, к которому относится сателлит. По умолчанию имеет значение TaskID.

Пример реализации расширения:

namespace Tessa.Extensions.Default.Shared.Workflow.Wf { public sealed class WfTaskSatelliteTransferRepairExtension : Tessa.Cards.Extensions.Templates.CardSatelliteTransferRepairExtension { #region Base Overrides

protected override bool IsTaskSatelite => true;

protected override string TaskRowIDColumnName => "TaskRowID";

protected override string StoreKey => WfHelper.TaskSatelliteListKey;

protected override string SatelliteSectionName => WfHelper.TaskSatelliteSection;

#endregion } }

Back to top