public async Task <FileResult> Handle(ExportLocaleStringList request, CancellationToken cancellationToken) { if (request == null) { throw new ArgumentNullException(nameof(request)); } request.PageSize = Paging.MaxPageSize; // disable paging var searchResult = await _repository.Search(request, cancellationToken); var data = searchResult.Rows.OrderBy(x => x.Locale).ThenBy(x => x.Module).ThenBy(x => x.Key); var lists = new List <LocaleStringList>(); foreach (var localeGroup in data.GroupBy(x => x.Locale)) { var locale = new LocaleStringList { Locale = localeGroup.Key, Modules = new List <LocaleModuleStringList>() }; foreach (var moduleGroup in localeGroup.GroupBy(x => x.Module)) { locale.Modules.Add(new LocaleModuleStringList { Module = moduleGroup.Key, Items = moduleGroup.ToList() }); } lists.Add(locale); } return(new FileResult { ContentType = "application/json", FileName = $"locale-strings-{request.Locale}-{request.Module}-{DateTime.Now.ToString("u").Replace(':', '-').Replace(' ', '-')}.json", Stream = await _serializer.Serialize(lists, cancellationToken) }); }
public async Task <IList <LocaleStringList> > Deserialize(Stream json, CancellationToken cancellationToken) { var options = new JsonSerializerOptions { AllowTrailingCommas = true }; var value = await JsonSerializer .DeserializeAsync <Dictionary <string, Dictionary <string, Dictionary <string, string> > > >(json, options, cancellationToken); var result = new List <LocaleStringList>(); foreach (var(locale, modules) in value) { var item = new LocaleStringList { Locale = locale, Modules = new List <LocaleModuleStringList>() }; foreach (var(module, items) in modules) { item.Modules.Add(new LocaleModuleStringList { Module = module, Items = items.Select(x => new LocaleString { Key = x.Key, Value = x.Value }).ToList() }); } result.Add(item); } return(result); }