using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using TEAMModelOS.Model.Core.Models; using TEAMModelOS.Model.Syllabus.Dtos; using TEAMModelOS.Model.Syllabus.Models; using TEAMModelOS.SDK.Context.Exception; using TEAMModelOS.SDK.Helper.Common.CollectionHelper; using TEAMModelOS.SDK.Helper.Common.JsonHelper; using TEAMModelOS.SDK.Module.AzureTable.Interfaces; using TEAMModelOS.Service.Syllabus.Interfaces; namespace TEAMModelOS.Service.Syllabus.Implements { public class SyllabusService : ISyllabusService { private IAzureTableDBRepository _azureTableDBRepository; private IHttpContextAccessor _httpContextAccessor; public SyllabusService(IAzureTableDBRepository azureTableDBRepository , IHttpContextAccessor httpContextAccessor) { _azureTableDBRepository = azureTableDBRepository; _httpContextAccessor = httpContextAccessor; } public async Task> SaveOrUpdateAll(List trees) { List nodes = new List(); TreeToList(trees, nodes); List nods = MessagePackHelper.JsonToObject>(MessagePackHelper.ObjectToJson(nodes)); await _azureTableDBRepository.SaveOrUpdateAll(nods); List treess = ListToTree(nods); return treess; // return Task.Factory.StartNew(() => { return treess; }); } public List TreeToList(List trees, List nodes) { nodes.AddRange(MessagePackHelper.JsonToObject>(MessagePackHelper.ObjectToJson(trees))); foreach (SyllabusTree tree in trees) { if (null != tree.Children && tree.Children.Count > 0) { TreeToList(tree.Children, nodes); } } return nodes; } private List ListToTree(List noes) { List list = MessagePackHelper.JsonToObject>(MessagePackHelper.ObjectToJson(noes)); var lookup = list.ToDictionary(n => n.RowKey, n => n); return GetChild(list, lookup); } public List GetChild(List list ,Dictionary dict) { List trees = new List(); foreach (SyllabusTree node in list) { bool flag= dict.TryGetValue(node.Pid, out SyllabusTree syllabus); if (flag && syllabus != null) { syllabus.Children.Add(node); } else { trees.Add(node); } } return trees; } public async Task SaveOrUpdate(SyllabusNode node ) { return await _azureTableDBRepository.SaveOrUpdate(node); } } }