예제 #1
0
        public async Task <IActionResult> UploadFiles(int userId, [FromForm] FileDescriptionDto fileDescriptionDto)
        {
            var  file         = fileDescriptionDto?.File;
            bool isTranffered = false;

            if (file?.Length > 0)
            {
                try
                {
                    var fileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.ToString().Trim('"');

                    fileDescriptionDto.FileName    = fileDescriptionDto.Description = fileName;
                    fileDescriptionDto.ContentType = file.ContentType;
                    isTranffered = await file.SaveAsAsync(Path.Combine(_options.Value.ServerUploadFolder, fileName));
                }
                catch (Exception ex) when(ex.InnerException is TimeoutException)
                {
                    // [To Do] implement retry mechanism if fails to send the stream
                    //file.RetrySaveAsync(SD.Retry)
                }
                // getting User
                if (isTranffered)
                {
                    var userFromRepo = await _repository.GetUser(userId);

                    if (userFromRepo == null)
                    {
                        return(BadRequest());
                    }

                    var fileDesc = _mapper.Map <FileDescription>(fileDescriptionDto);

                    userFromRepo.FileDescriptions.Add(fileDesc);

                    if (await _repository.SaveAll())
                    {
                        var fileForRerurn = _mapper.Map <FileDescriptionForResultDto>(fileDesc);
                        return(CreatedAtRoute("GetFileDesc", new { userId = fileDesc.UserId, id = fileDesc.Id }, fileForRerurn));
                    }
                }
            }


            return(BadRequest("failed while saving the file"));
        }
예제 #2
0
        public async Task <ActionResult> UploadCsv(int userId, [FromForm] FileDescriptionDto fileDescriptionDto)
        {
            List <AnonymousUser> anonymousUsers = new List <AnonymousUser>();
            var  serviceDbContext = HttpContext.RequestServices.GetRequiredService <ApplicationDbContext>();
            long fileSize         = 0;

            using (var transaction = serviceDbContext.Database.BeginTransaction())
            {
                try
                {
                    using (var fileStream = fileDescriptionDto.File.OpenReadStream())
                        using (var reader = new StreamReader(fileStream, Encoding.Default))
                            using (var csv = new CsvReader(reader, System.Globalization.CultureInfo.CurrentCulture))
                            {
                                //getting filename and contentType
                                var fileName = ContentDispositionHeaderValue.Parse(fileDescriptionDto.File?.ContentDisposition).FileName.ToString().Trim('"');
                                fileDescriptionDto.FileName    = fileDescriptionDto.Description = fileName;
                                fileDescriptionDto.ContentType = fileDescriptionDto.File?.ContentType;
                                fileSize = fileDescriptionDto.File.Length;
                                //mapping csv file to class table schema
                                csv.Configuration.RegisterClassMap <UserDtoCsvMap>();
                                var records = csv.GetRecords <AnonymousUser>().ToList();

                                //adding import file
                                var userFromRepo = await _repository.GetUser(userId);

                                var importFileMap = _mapper.Map <ImportFileDescription>(fileDescriptionDto);
                                userFromRepo.ImportFileDescriptions.Add(importFileMap);

                                if (await _repository.SaveAll())
                                {
                                    //import file processing...
                                    var importedFiledescFromRepo = await _repository.GetImportedFileDescription(importFileMap.Id);

                                    foreach (var record in records)
                                    {
                                        record.ImportFileDescription = importedFiledescFromRepo;
                                    }
                                    anonymousUsers = records;
                                    _repository.AddFileRange <AnonymousUser>(records, fileSize);
                                    if (await _repository.SaveAll())
                                    {
                                        var fileForReturn = _mapper.Map <FileDescriptionForResultDto>(importedFiledescFromRepo);
                                        await transaction.CommitAsync();

                                        return(CreatedAtRoute("GetFileDesc", new { userId = importedFiledescFromRepo.UserId, id = importedFiledescFromRepo.Id }, fileForReturn));
                                    }
                                }
                            }
                }
                catch (Exception ex) when(ex.Message.Equals("The operation has timed out."))
                {
                    // [To Do]implement retry mechanism if fails to send the stream
                    var retryResult = await RetryHelper.RetryOnExceptionAsync(SD.Retry, TimeSpan.FromSeconds(10), async() =>
                    {
                        return(await SaveRetry(anonymousUsers));
                    });

                    if (retryResult)
                    {
                        await transaction.CommitAsync();

                        return(Ok("data has been imported via retry mechanism"));
                    }

                    await transaction.RollbackAsync();

                    return(BadRequest(ex.Message));
                }
                await transaction.RollbackAsync();
            }

            return(BadRequest("Error occured while dumping the data into data base"));
        }
예제 #3
0
 /// <summary>
 /// Create new file description instance.
 /// </summary>
 /// <param name="dto">File description dto.</param>
 public FileDescription(FileDescriptionDto dto)
     : this(dto.Id, dto.Size, dto.Name)
 {
 }