Перенос старых расширений сателлитов на новый механизм сателлитов
Перенос старых расширений сателлитов на новый механизм сателлитов¶
Чтобы перенести старые расширения сателлитов на новые нужно сделать следующее:
-
Обновить тип карточки сателлита, указав в нем новую секцию.
-
Перенести данные о связи основной карточки с сателлитом в секцию
Satellites
через SQL запрос или миграцию схемы данных. Запрос будет выглядеть примерно следующим образом:INSERT INTO [Satellites] ([ID], [MainCardID], [TypeID]) SELECT [ID], [MainCardID], '12345678-1234-1234-1234-123456789012' -- идентификатор типа карточки сателлита FROM [OldSatelliteSection] WITH(NOLOCK) -- секция, в которой раньше хранилась связь основной карточки с карточкой сателлита
-
Создать новый дескриптор сателлита и обработчик сателлита с соответствующими настройками. Настройки зависят от настроек в старых расширениях сателлита и то, от какого класса идет наследование.
-
Создать обработчик сателлита, в который перенести логику старых расширений.
-
Сделать расширение, которое позволит поддержать импорт/восстановление из корзины карточек со старыми сателлитами.
Старые расширения для сателлитов разделялись на 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
}
}