84 lines
2.5 KiB
C#
84 lines
2.5 KiB
C#
using LehrerApp.Core.Models;
|
|
using LiteDB;
|
|
|
|
namespace LehrerApp.Api;
|
|
|
|
/// <summary>Unverschlüsselte Serverdaten, die der Server zur Abfrage standortbezogener öffentlicher
|
|
/// Wetterdaten benötigt. Bewusst getrennt vom clientseitig verschlüsselten EventStore.</summary>
|
|
public sealed class SchoolWeatherStore : IDisposable
|
|
{
|
|
private readonly LiteDatabase _db;
|
|
|
|
public SchoolWeatherStore(string dataPath)
|
|
{
|
|
Directory.CreateDirectory(dataPath);
|
|
_db = new LiteDatabase(Path.Combine(dataPath, "school-weather.db"));
|
|
}
|
|
|
|
private ILiteCollection<LocationEntry> Locations
|
|
{
|
|
get
|
|
{
|
|
var col = _db.GetCollection<LocationEntry>("locations");
|
|
col.EnsureIndex(x => x.UserId, unique: true);
|
|
return col;
|
|
}
|
|
}
|
|
|
|
private ILiteCollection<WeatherEntry> Weather
|
|
{
|
|
get
|
|
{
|
|
var col = _db.GetCollection<WeatherEntry>("weather");
|
|
col.EnsureIndex(x => x.UserId, unique: true);
|
|
return col;
|
|
}
|
|
}
|
|
|
|
public SchoolLocationProfile? GetLocation(string userId) =>
|
|
Locations.FindOne(x => x.UserId == userId)?.Profile;
|
|
|
|
public void SaveLocation(string userId, SchoolLocationProfile profile)
|
|
{
|
|
var existing = Locations.FindOne(x => x.UserId == userId);
|
|
Locations.Upsert(new LocationEntry
|
|
{
|
|
Id = existing?.Id ?? ObjectId.NewObjectId(),
|
|
UserId = userId,
|
|
Profile = profile,
|
|
});
|
|
// Ein geänderter Standort darf niemals den Wetterstand des alten Orts liefern.
|
|
Weather.DeleteMany(x => x.UserId == userId);
|
|
}
|
|
|
|
public WeatherSnapshot? GetWeather(string userId) =>
|
|
Weather.FindOne(x => x.UserId == userId)?.Snapshot;
|
|
|
|
public void SaveWeather(string userId, WeatherSnapshot snapshot)
|
|
{
|
|
var existing = Weather.FindOne(x => x.UserId == userId);
|
|
Weather.Upsert(new WeatherEntry
|
|
{
|
|
Id = existing?.Id ?? ObjectId.NewObjectId(),
|
|
UserId = userId,
|
|
Snapshot = snapshot,
|
|
});
|
|
}
|
|
|
|
public void Dispose() => _db.Dispose();
|
|
|
|
private sealed class LocationEntry
|
|
{
|
|
public ObjectId Id { get; set; } = ObjectId.NewObjectId();
|
|
public string UserId { get; set; } = "";
|
|
public SchoolLocationProfile Profile { get; set; } = new();
|
|
}
|
|
|
|
private sealed class WeatherEntry
|
|
{
|
|
public ObjectId Id { get; set; } = ObjectId.NewObjectId();
|
|
public string UserId { get; set; } = "";
|
|
public WeatherSnapshot Snapshot { get; set; } = new();
|
|
}
|
|
}
|