public async Task <IResult <IReadOnlyCollection <byte> > > HandleAsync(GetHeatMapCommand command) { var validationResult = await IsValidAsync(command); if (validationResult.HasFailed()) { return(validationResult.Map <IReadOnlyCollection <byte> >()); } var userId = command.UserId ?? command.CurrentUserId; var gamesCount = await _dataContext.Users.Where(x => x.Id == userId).Select(x => x.Games).CountAsync(); var existingActualHeatMap = await _dataContext.GeneratedHeatMaps .AsNoTracking() .FirstOrDefaultAsync(x => x.UserId == userId && x.GeneratedAt > DateTime.Now.AddDays(-1)); if (existingActualHeatMap != null && existingActualHeatMap.GamesCount == gamesCount) { return(existingActualHeatMap.HeatMap.ToList().ToSuccessfulResult()); } PythonScriptRunner.RunScript("PythonScripts/heatmap.py", userId.ToString()); var fileInfo = new FileInfo("heatplot.png"); var data = new byte[fileInfo.Length]; await using (var fs = fileInfo.OpenRead()) { fs.Read(data, 0, data.Length); } fileInfo.Delete(); _dataContext.GeneratedHeatMaps.Add(new GeneratedHeatmap { HeatMap = data, UserId = userId, GeneratedAt = DateTime.Now, GamesCount = gamesCount }); await _dataContext.SaveChangesAsync(); return(data.ToList().ToSuccessfulResult()); }
private Task <IResult> IsValidAsync(GetHeatMapCommand query) { _validator.ValidateUserIds(query.CurrentUserId, query.UserId); return(_validator.ValidateAsync()); }