Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 46 additions & 3 deletions WabiSabiMonitor.ApplicationCore/AnalysisStoreManager.cs
Original file line number Diff line number Diff line change
@@ -1,24 +1,27 @@
using Newtonsoft.Json;
using WabiSabiMonitor.ApplicationCore.Data;
using WabiSabiMonitor.ApplicationCore.Interfaces;
using WabiSabiMonitor.ApplicationCore.Utils.Bases;
using WabiSabiMonitor.ApplicationCore.Utils.Helpers;
using WabiSabiMonitor.ApplicationCore.Utils.Logging;
using WabiSabiMonitor.ApplicationCore.Utils.WabiSabi.Models.Serialization;
using static WabiSabiMonitor.ApplicationCore.Data.Analyzer;

namespace WabiSabiMonitor.ApplicationCore
{
public class AnalysisStoreManager : PeriodicRunner
{
private static readonly string _directoryPath = Path.Combine(EnvironmentHelpers.GetDataDir(Path.Combine("WabiSabiMonitor", "DataStore", "Analysis")));

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Moved variable to readonly field.

private readonly IAnalyzer _analyzer;
private readonly IRoundsDataFilter _roundsDataFilter;
private DateTime _lastDate;
private Dictionary<DateTime, Analyzer.Analysis> Analysis { get; } = new();
private Dictionary<DateTime, Analysis> Analysis { get; }

public AnalysisStoreManager(IAnalyzer analyzer, IRoundsDataFilter roundsDataFilter, TimeSpan period) : base(period)
{
_analyzer = analyzer;
_roundsDataFilter = roundsDataFilter;
_lastDate = DateTime.UtcNow;
Analysis = LoadFromFile();
}

protected override async Task ActionAsync(CancellationToken cancel)
Expand All @@ -37,8 +40,10 @@ protected override async Task ActionAsync(CancellationToken cancel)

if (now.Date != _lastDate.Date)
{
IoHelpers.EnsureDirectoryExists(_directoryPath);

Comment on lines +43 to +44

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a sanity check.

// Save the last 24 hours data to file at the end of the day.
var path = Path.Combine(EnvironmentHelpers.GetDataDir(Path.Combine("WabiSabiMonitor", "DataStore", "Analysis")), $"Analysis_{_lastDate:yyyy-MM-dd}.json");
var path = Path.Combine(_directoryPath, $"Analysis_{_lastDate:yyyy-MM-dd}.json");

// Compute a new Analysis object for these ones to have exactly the adequate rounds.
var lastDayRounds = _roundsDataFilter.GetRoundsFinishedInInterval(startTime, now.Date);
Expand All @@ -61,5 +66,43 @@ private void CleanupOldAnalysisData(DateTime now)
Analysis.Remove(data);
}
}

private static Dictionary<DateTime, Analysis> LoadFromFile()
{
if (!Directory.Exists(_directoryPath))
{
return new();
}

var analyses = new Dictionary<DateTime, Analysis>();
var dataFiles = Directory.EnumerateFiles(_directoryPath);

// Get Analysis from the past 15 days. Start with 1 as there supposed to be no daily analisys yet for UtcNow.
for (int days = 1; days <= 15; days++)
{
var date = DateTime.UtcNow.Subtract(TimeSpan.FromDays(days));
var dateString = date.ToString("yyyy-MM-dd");
var file = dataFiles.SingleOrDefault(filename => filename.Contains(dateString));
if (file == null) continue;
var data = ReadFromFile(file);
if (data == null) continue;
analyses.Add(date, data);
}
return analyses;
}

public static Analysis? ReadFromFile(string path)
{
try
{
var json = File.ReadAllText(path);
return JsonConvert.DeserializeObject<Analysis>(json);
}
catch (Exception exc)
{
Logger.LogError($"Error while reading Analysis from file {path}.", exc);
}
return null;
}
}
}