From 2465a90305d3d145a21abeef5ea6f460bc20759c Mon Sep 17 00:00:00 2001 From: Dan Cojocaru Date: Tue, 27 Dec 2022 18:28:42 +0200 Subject: [PATCH] Add station aliases to database --- server/Models/Database/StationAlias.cs | 17 +++++++ server/Services/Implementations/Database.cs | 51 +++++++++++++++------ 2 files changed, 53 insertions(+), 15 deletions(-) create mode 100644 server/Models/Database/StationAlias.cs diff --git a/server/Models/Database/StationAlias.cs b/server/Models/Database/StationAlias.cs new file mode 100644 index 0000000..71593a4 --- /dev/null +++ b/server/Models/Database/StationAlias.cs @@ -0,0 +1,17 @@ +using System.Text.Json.Serialization; +using MongoDB.Bson; +using MongoDB.Bson.Serialization.Attributes; + +namespace Server.Models.Database; + +public record StationAlias( + [property: BsonId] + [property: BsonRepresentation(BsonType.ObjectId)] + [property: JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)] + string? Id, + string Name, + [property: BsonRepresentation(BsonType.ObjectId)] + string? ListingId +) { + public StationAlias() : this(null, "", null) { } +} diff --git a/server/Services/Implementations/Database.cs b/server/Services/Implementations/Database.cs index 0756620..737c206 100644 --- a/server/Services/Implementations/Database.cs +++ b/server/Services/Implementations/Database.cs @@ -33,9 +33,10 @@ public class Database : Server.Services.Interfaces.IDatabase { "{ $addFields: { stoppedAtCount: { $size: \"$stoppedAtBy\" } } }", "{ $sort: { stoppedAtCount: -1 } }", "{ $unset: \"stoppedAtCount\" }" - )) + )) .ToList(); public IReadOnlyList Trains => trainListingsCollection.FindSync(_ => true).ToList(); + public IReadOnlyList StationAliases => stationAliasCollection.FindSync(_ => true).ToList(); private static readonly string DbDir = Environment.GetEnvironmentVariable("DB_DIR") ?? Path.Join(Environment.CurrentDirectory, "db"); private static readonly string DbFile = Path.Join(DbDir, "db.json"); @@ -46,6 +47,7 @@ public class Database : Server.Services.Interfaces.IDatabase { private readonly IMongoCollection dbRecordCollection; private readonly IMongoCollection trainListingsCollection; private readonly IMongoCollection stationListingsCollection; + private readonly IMongoCollection stationAliasCollection; private readonly AsyncThrottle throttle; private readonly Dictionary trainObjectIds = new(); @@ -62,8 +64,11 @@ public class Database : Server.Services.Interfaces.IDatabase { dbRecordCollection = db.GetCollection("db"); trainListingsCollection = db.GetCollection("trainListings"); stationListingsCollection = db.GetCollection("stationListings"); + stationAliasCollection = db.GetCollection("stationAliases"); Migration(); + + Task.Run(async () => await Initialize()); } private void Migration() { @@ -170,6 +175,13 @@ public class Database : Server.Services.Interfaces.IDatabase { } } + private async Task Initialize() { + await foreach (var entry in await stationAliasCollection.FindAsync(_ => true)) { + if (entry?.ListingId is null) continue; + stationObjectIds.Add(entry.Name, entry.ListingId); + } + } + private readonly SemaphoreSlim insertTrainLock = new (1, 1); public async Task FoundTrain(string rank, string number, string company) { number = string.Join("", number.TakeWhile(c => c is >= '0' and <= '9')); @@ -226,7 +238,16 @@ public class Database : Server.Services.Interfaces.IDatabase { } ); if (update.IsAcknowledged && update.ModifiedCount > 0) { - stationObjectIds[name] = update.UpsertedId.AsObjectId.ToString(); + var listingId = update.UpsertedId.AsObjectId.ToString(); + stationObjectIds[name] = listingId; + await stationAliasCollection.UpdateOneAsync( + Builders.Filter.Eq("name", name), + Builders.Update.Combine( + Builders.Update.SetOnInsert("name", name), + Builders.Update.SetOnInsert("listingId", listingId) + ), + new UpdateOptions { IsUpsert = true } + ); } } finally { @@ -312,9 +333,9 @@ public class Database : Server.Services.Interfaces.IDatabase { var trainNumber = await FoundTrain(trainData.Rank, trainData.Number, trainData.Operator); await FoundTrainAtStations( trainData.Groups - .SelectMany(g => g.Stations) - .Select(trainStop => trainStop.Name) - .Distinct(), + .SelectMany(g => g.Stations) + .Select(trainStop => trainStop.Name) + .Distinct(), trainNumber ); } @@ -341,16 +362,16 @@ public class Database : Server.Services.Interfaces.IDatabase { } } - public async Task OnItineraries(IReadOnlyList itineraries) { - foreach (var itinerary in itineraries) { - foreach (var train in itinerary.Trains) { - await FoundTrainAtStations( - train.IntermediateStops.Concat(new[] { train.From, train.To }), - train.TrainNumber - ); - } - } - } + public async Task OnItineraries(IReadOnlyList itineraries) { + foreach (var itinerary in itineraries) { + foreach (var train in itinerary.Trains) { + await FoundTrainAtStations( + train.IntermediateStops.Concat(new[] { train.From, train.To }), + train.TrainNumber + ); + } + } + } } public record DbRecord(