Advertisement
Guest User

Untitled

a guest
Sep 19th, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.40 KB | None | 0 0
  1. using Microsoft.Rest;
  2. using Orchestrator.Exporter.Models;
  3. using Orchestrator.Web.Client;
  4. using Orchestrator.Web.Client.Models;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Threading.Tasks;
  9.  
  10. namespace Orchestrator.Exporter
  11. {
  12.     public partial class OrchestratorImporter
  13.     {
  14.         private readonly List<string> _folderPostPermissions = new List<string>
  15.         {
  16.             PermissionsConstants.FoldersView,
  17.             PermissionsConstants.FoldersCreate,
  18.             PermissionsConstants.FoldersEdit
  19.         };
  20.  
  21.         private async Task PostFoldersWithPermissionsAsync(System.Threading.CancellationToken ct)
  22.         {
  23.             await ExecuteWithPermissionsAsync(
  24.                 () => PostFoldersAsync(ct), _folderPostPermissions);
  25.         }
  26.  
  27.         private async Task PostFoldersAsync(System.Threading.CancellationToken ct)
  28.         {
  29.             if (Model.Units == null)
  30.             {
  31.                 return;
  32.             }
  33.  
  34.             var foldersImport = GetListOfFoldersFromModel();
  35.  
  36.             var folderLevels = GroupByLevels(foldersImport);
  37.  
  38.             var foldersDtoLevels = MapListOfListsOfExtendedFolders(folderLevels);
  39.  
  40.             var folderDtoNames = foldersImport.ToDictionary(f => f.Id.Value, f => f.DisplayName);
  41.  
  42.             for(int level = 0; level < foldersDtoLevels.Count(); ++level)
  43.             {
  44.                 var folderLevel = foldersDtoLevels[level];
  45.  
  46.                 if(level != 0)
  47.                 {
  48.                     var parents = foldersDtoLevels[level - 1];
  49.  
  50.                     UpdateParentsIds(folderDtoNames, folderLevel, parents);
  51.                 }
  52.  
  53.                 await PostFoldersLevelAsync(folderLevel, ct);
  54.  
  55.                 var extendedFoldersExport = await GetFoldersWithPermissionsAsync(ImportPageSize, ct);
  56.  
  57.                 var newFolders = extendedFoldersExport.Select(folder => MapExtendedFolder(folder)).ToList();
  58.  
  59.                 UpdateFoldersIds(folderLevel, newFolders);
  60.             }
  61.  
  62.             var foldersExport = foldersDtoLevels.SelectMany(folder => folder).ToList();
  63.  
  64.             UpdateFoldersIds(foldersImport, foldersExport);
  65.  
  66.             await AssignUserToFolders(foldersImport, ct);
  67.         }
  68.  
  69.         private FolderDto MapExtendedFolder(ExtendedFolderDto folder)
  70.         {
  71.             return new FolderDto
  72.             {
  73.                 Id = folder.Id,
  74.                 DisplayName = folder.DisplayName,
  75.                 Description = folder.Description,
  76.                 FullyQualifiedName = folder.FullyQualifiedName,
  77.                 ParentId = folder.ParentId,
  78.                 PermissionModel = (FolderDtoPermissionModel?)folder.PermissionModel,
  79.                 ProvisionType = (FolderDtoProvisionType?)folder.ProvisionType,
  80.             };
  81.         }
  82.  
  83.         private List<List<FolderDto>> MapListOfListsOfExtendedFolders(List<List<ExtendedFolderDto>> extendedFolderDtos)
  84.         {
  85.             return extendedFolderDtos.Select(folderLevel => folderLevel.Select(folder => MapExtendedFolder(folder)).ToList())
  86.                 .ToList();
  87.         }
  88.  
  89.         private List<ExtendedFolderDto> GetListOfFoldersFromModel()
  90.         {
  91.             return Model.Units.Where(folder => folder is FolderModel)
  92.                 .Select(folder => ((FolderModel)folder).Entity)
  93.                 .ToList();
  94.         }
  95.  
  96.         private List<List<ExtendedFolderDto>> GroupByLevels(List<ExtendedFolderDto> folders)
  97.         {
  98.             return folders
  99.                 .GroupBy(folder => folder.Level.Value)
  100.                 .Select(folderGroup => folderGroup.ToList())
  101.                 .ToList();
  102.  
  103.         }
  104.  
  105.         private void UpdateParentsIds(Dictionary<long, string> folderDtoNames, List<FolderDto> folders, List<FolderDto> parents)
  106.         {
  107.             var parentNewIds = parents.ToDictionary(f => f.DisplayName, f => f.Id.Value);
  108.  
  109.             foreach (var folder in folders)
  110.             {
  111.                 long? id = folder.ParentId;
  112.  
  113.                 if (id != null)
  114.                 {
  115.                     var parentName = folderDtoNames[id.Value];
  116.                     var parentNewId = parentNewIds[parentName];
  117.                     folder.Id = parentNewId;
  118.                 }
  119.             }
  120.         }
  121.  
  122.         private async Task PostFoldersLevelAsync(List<FolderDto> folderLevel, System.Threading.CancellationToken ct)
  123.         {
  124.             await PostAllAsync(
  125.                     (folder) => ExecuteRequestAsync(
  126.                         () => Api.Folders.PostAsync(folder), ct),
  127.                 folderLevel, ImportPageSize);
  128.         }
  129.  
  130.         private async Task AssignUserToFolders(List<ExtendedFolderDto> folders, System.Threading.CancellationToken ct)
  131.         {
  132.             var currentUser = await ExecuteRequestAsync(() => Api.Users.GetCurrentUserAsync(), ct);
  133.  
  134.             var folderRoles = folders.Select(folder => new FolderRolesDto(folder.Id)).ToList();
  135.  
  136.             var usersIds = new List<long?> { currentUser.Id, };
  137.  
  138.             await PostAllAsync((folderRole) => ExecuteRequestAsync(() =>
  139.                 Api.Folders.AssignUsersAsync(new AssignUsersActionParameters(
  140.                     new UserAssignmentsDto(usersIds, new List<FolderRolesDto> { folderRole }))), ct), folderRoles, ImportPageSize);
  141.         }
  142.  
  143.         private void UpdateFoldersIds(List<FolderDto> foldersImport, List<FolderDto> extendendFolders)
  144.         {
  145.             if(foldersImport == null || extendendFolders == null)
  146.             {
  147.                 return;
  148.             }
  149.  
  150.             var foldersIds = extendendFolders.ToDictionary(f => f.DisplayName, f => f.Id);
  151.  
  152.             foreach (var folder in foldersImport)
  153.             {
  154.                 if (foldersIds.TryGetValue(folder.DisplayName, out var folderId))
  155.                 {
  156.                     folder.Id = folderId;
  157.                 }
  158.             }
  159.  
  160.         }
  161.  
  162.         private void UpdateFoldersIds(List<ExtendedFolderDto> foldersImport, List<FolderDto> extendendFolders)
  163.         {
  164.             if (foldersImport == null || extendendFolders == null)
  165.             {
  166.                 return;
  167.             }
  168.  
  169.             var foldersIds = extendendFolders.ToDictionary(f => f.DisplayName, f => f.Id);
  170.  
  171.             foreach (var folder in foldersImport)
  172.             {
  173.                 if (foldersIds.TryGetValue(folder.DisplayName, out var folderId))
  174.                 {
  175.                     folder.Id = folderId;
  176.                 }
  177.             }
  178.  
  179.         }
  180.     }
  181. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement