public async Task ImportExcelProducer(IFormFile excel, CancellationToken cancellationToken) { if (excel.Length > 10000) { throw new ImportExcelException("Файл не может быть больше 10 000 байт"); } var supportedExcelFiles = new[] { "xls", "xlsx" }; var fileExt = System.IO.Path.GetExtension(excel.FileName).Substring(1); if (!supportedExcelFiles.Contains(fileExt)) { throw new ImportExcelException("Данный формат файла не поддерживается, загрузите excel файл"); } var excelFileStream = excel.OpenReadStream(); var userId = await _identityService.GetCurrentUserId(cancellationToken); var domainUser = await _userRepository.FindById(userId, cancellationToken); if (!domainUser.IsCorporation) { throw new HaveNoRightException($"У пользователя с id {userId} нет прав массово загружать объявления"); } var importExcelEndpoint = await _sendEndpointProvider.GetSendEndpoint(new Uri("queue:import_excel")); using (IExcelDataReader excelReader = ExcelReaderFactory.CreateReader(excelFileStream)) { DataSet excelFileData = excelReader.AsDataSet(new ExcelDataSetConfiguration { ConfigureDataTable = _ => new ExcelDataTableConfiguration { UseHeaderRow = true } }); DataRowCollection excelRows = excelFileData.Tables[0].Rows; foreach (DataRow row in excelRows) { var message = new ImportExcelMessage { Title = row.ItemArray[0].ToString(), Description = row.ItemArray[1].ToString(), Price = Convert.ToDecimal(row.ItemArray[2].ToString()), CategoryId = Convert.ToInt32(row.ItemArray[3].ToString()), Location = Convert.ToString(row.ItemArray[4].ToString()), GetLat = Convert.ToDecimal(row.ItemArray[5].ToString()), GeoLon = Convert.ToDecimal(row.ItemArray[6].ToString()), OwnerId = userId }; await importExcelEndpoint.Send(message, cancellationToken); } } }
public async Task CreateByExcelConsumer(ImportExcelMessage message, CancellationToken cancellationToken) { var advertisement = new Domain.Advertisement { Title = message.Title, Description = message.Description, Price = message.Price, OwnerId = message.OwnerId, CategoryId = message.CategoryId, CreatedDate = DateTime.UtcNow, Location = message.Location, GeoLat = message.GetLat, GeoLon = message.GeoLon, Status = Domain.Advertisement.Statuses.Created }; await _repository.Save(advertisement, cancellationToken); }