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());
        }