Example #1
0
        public async Task ExportUserDataAsync(string timeStamp)
        {
            //分区的PartionKey,序列化处理本分区的数据
            var partionId    = this._serviceContext.PartitionId.ToString("N");
            var userDataFile = new UserDataFileDto()
            {
                Timestamp   = timeStamp,
                PartitionId = partionId
            };
            var users = await this._userDomainService.GetAllUsersAsync();

            var mappedUsers = new List <UserItemDto>();

            foreach (var user in users)
            {
                var item = _mapper.Map <UserItemDto>(user);
                item.Password = user.GetHashedPassword();
                mappedUsers.Add(item);
            }
            using (var ms = new MemoryStream())
                using (var tw = new StreamWriter(ms, Encoding.UTF8))
                    using (var csv = new CsvWriter(tw))
                    {
                        csv.Configuration.RegisterClassMap <CsvUserItemDtoMapper>();
                        csv.WriteRecords(mappedUsers);
                        tw.Flush();
                        ms.Position = 0;
                        await _userDataStorageService.SaveUserDataAsync(userDataFile, ms);
                    }

            ServiceEventSource.Current.Message("用户数据导出:导出数据文件{0}.csv,用户数量:{1}", userDataFile.FileName, mappedUsers.Count);
        }
Example #2
0
        public async Task <IActionResult> ImportUserData()
        {
            var files = this.HttpContext.Request.Form.Files;

            foreach (var file in files)
            {
                if (!file.IsCSVFile())
                {
                    return(Json(false, null, "上传文件中存在非.csv结尾的文件,请重新选择上传"));
                }
            }
            var tasks = new List <Task>();

            foreach (var file in files)
            {
                var item    = new UserDataFileDto();
                var splited = Path.GetFileNameWithoutExtension(file.FileName).Split("_");
                item.Timestamp   = splited[0];
                item.PartitionId = splited[1];
                tasks.Add(this.ImportUserDataAsync(item, file.OpenReadStream()));
            }
            //这里要进行并行进行
            await Task.WhenAll(tasks);

            return(Json(true, null, "上传成功"));
        }
Example #3
0
 /// <summary>
 /// 序列化.csv文件的内容
 /// </summary>
 /// <param name="file"></param>
 /// <param name="stream"></param>
 /// <returns></returns>
 private async Task <IEnumerable <UserItemDto> > ImportCsvUserDataAsync(UserDataFileDto file, Stream stream)
 {
     using (TextReader tr = new StreamReader(stream))
     {
         try
         {
             var csv = new CsvReader(tr);
             csv.Configuration.RegisterClassMap <CsvUserItemDtoMapper>();
             var result      = csv.GetRecords <UserItemDto>().ToList();
             var resultCount = result?.LongCount() ?? 0;
             ServiceEventSource.Current.Message("用户数据导入(解析阶段):" + "导入用户数据文件{0}.csv,用户数量:{1}", file.FileName, resultCount);
             return(await Task.FromResult(_mapper.Map <IEnumerable <UserItemDto> >(result)));
         }
         catch (Exception e)
         {
             ServiceEventSource.Current.Message("用户数据导入(解析阶段)发生错误:" + "导入用户数据文件{0},错误信息:{1}", file.FileName, e.ToString());
             return(null);
         }
     }
 }
Example #4
0
        public async Task SaveUserDataAsync(UserDataFileDto file, Stream stream)
        {
            if (file == null)
            {
                throw new ArgumentNullException(nameof(file));
            }

            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }

            if (_minioOption == null)
            {
                throw new Exception("Minio配置为空!");
            }

            var bucketOperations = this.GetBucketOperations();
            var objectOperations = this.GetObjectOperations();

            try
            {
                if (!bukeNameExist)
                {
                    if (!await bucketOperations.BucketExistsAsync(bucketName))
                    {
                        await bucketOperations.MakeBucketAsync(bucketName);

                        bukeNameExist = true;
                    }
                }
                await objectOperations.PutObjectAsync(bucketName, file.FileName + ".csv", stream, stream.Length);

                ServiceEventSource.Current.Message("用户数据上传到Minio完成:{0}", file.FileName);
            }
            catch (Exception e)
            {
                ServiceEventSource.Current.Message("用户数据上传到Minio失败:{0},原因:", e.ToString());
            }
        }
        public async Task SaveUserDataAsyncTest_Correct()
        {
            var service = new MockMinioUserDataStorageService(this.Minioption);
            var file    = new UserDataFileDto()
            {
                PartitionId = "12345",
                Timestamp   = "12345"
            };
            var Memorystream = new MemoryStream(Encoding.UTF8.GetBytes("测试数据"));
            await service.SaveUserDataAsync(file, Memorystream);

            //Act:
            var mockObject = service.MoqObject;
            var mockBucket = service.MoqBucket;

            mockBucket.Verify(u => u.BucketExistsAsync(It.Is <string>(x => x == "userexported"), It.IsAny <CancellationToken>()), Times.Once);
            mockBucket.Verify(u => u.MakeBucketAsync(It.Is <string>(x => x == "userexported"), It.IsAny <string>(),
                                                     It.IsAny <CancellationToken>()), Times.Once);
            mockObject.Verify(u => u.PutObjectAsync(It.Is <string>(x => x == "userexported"), It.IsAny <string>(),
                                                    It.IsAny <Stream>(), It.IsAny <long>(), It.IsAny <string>(), It.IsAny <Dictionary <string, string> >(),
                                                    It.IsAny <ServerSideEncryption>(),
                                                    It.IsAny <CancellationToken>()), Times.Once);
        }
Example #6
0
        public async Task ImportUserDataAsync(UserDataFileDto file, Stream stream)
        {
            var userItems = await this.ImportCsvUserDataAsync(file, stream);

            foreach (var item in userItems)
            {
                var(user, appService) = await _userAppServiceClient.FindByUserIdAsync(item.Id.ToString());

                if (user != null)
                {
                    continue;
                }
                var result = await _userAppServiceClient.CreateUserAsync(item, true);

                if (result != null)
                {
                    ServiceEventSource.Current.Message("用户数据还原:用户Id:{0}", result.Id.ToString("N"));
                }
                else
                {
                    ServiceEventSource.Current.Message("用户数据还原失败:用户Id:{0}", item.Id.ToString("N"));
                }
            }
        }