Добавить или заменить файл в карточке на сервере
Добавить или заменить файл в карточке на сервере¶
Допустим, требуется добавить файл в карточку, если он в ней отсутствует, или заменить содержимое файла. Ниже приведён код для плагина Chronos, который решает такую задачу (для серверных расширений код будет аналогичен).
var cardRepository = unityContainer.Resolve<ICardRepository>();
var fileManager = unityContainer.Resolve<ICardFileManager>();
var krTokenProvider = unityContainer.Resolve<IKrTokenProvider>();
Guid cardID = ... ;
// если тип карточки включён в типовое решение, то необходимо указать токен с правами
var token = krTokenProvider.CreateToken(cardID);
// загружаем карточку
var getRequest = new CardGetRequest { CardID = cardID };
token.Set(getRequest.Info);
var getResponse = await cardRepository.GetAsync(getRequest);
if (!getResponse.ValidationResult.IsSuccessful())
{
logger.LogResult(getResponse.ValidationResult);
return;
}
var card = getResponse.Card;
// добавляем или заменяем файл, а затем сохраняем карточку
await using (var container = await fileManager.CreateContainerAsync(card))
{
// ищем файл с именем "file.txt" среди всех приложенных файлов
var file = container.FileContainer.Files.FirstOrDefault(x => x.Name == "file.txt");
if (file == null)
{
// не нашли файл - добавляем его
await container.FileContainer
.BuildFile("file.txt")
.SetContent(...) // также есть методы SetContentText или SetContentReadOnly
.SetCategory("Категория файла") // необязательно
.AddWithNotificationAsync();
}
else
{
// файл уже есть, заменяем его
await file.ReplaceAsync(...); // также есть метод ReplaceText
}
// сохраняем карточку с файлами
var storeResponse = await container.StoreAsync((c, request) =>
{
// для типового решения надо указать токен с правами
token.Set(request.Card.Info);
});
}