/// <summary> /// This method is called for every Lambda invocation. This method takes in an S3 event object and can be used /// to respond to S3 notifications. /// </summary> /// <param name="evnt"></param> /// <param name="context"></param> /// <returns></returns> public async Task <string> FunctionHandler(S3Event evnt, ILambdaContext context) { var s3Event = evnt.Records?[0].S3; if (s3Event == null) { return(null); } try { RedisDataAgent agent = new RedisDataAgent(); string value = await agent.RightPopAsync("ExcelTask"); context.Logger.LogLine($"Parsing of {value} file is started."); S3 s3 = new S3(S3Client); StreamReader reader = await s3.ReadObjectDataAsync(value); CSVReader csvReader = new CSVReader(); List <CSVSaleDto> sales = csvReader.ReadDocument <CSVSaleDto>(reader); InsertMissingData(sales); LoadData(); List <Sale> salesEntity = new List <Sale>(); foreach (var item in sales.AsParallel()) { Sale newSale = BuildObject(item); salesEntity.Add(newSale); } await dbContext.AddRangeAsync(salesEntity); await dbContext.SaveChangesAsync(); await s3.DeleteFileASync(value); string returnValue = $"Parsing of {value} file is completed successfully!"; context.Logger.LogLine(returnValue); return(returnValue); } catch (Exception e) { context.Logger.LogLine(e.Message); context.Logger.LogLine(e.InnerException.Message); throw; } }