aboutsummaryrefslogtreecommitdiff
path: root/Program.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Program.cs')
-rw-r--r--Program.cs71
1 files changed, 71 insertions, 0 deletions
diff --git a/Program.cs b/Program.cs
new file mode 100644
index 0000000..ba53ccb
--- /dev/null
+++ b/Program.cs
@@ -0,0 +1,71 @@
+using Microsoft.EntityFrameworkCore;
+using System.Text.Json.Serialization;
+
+namespace PagerParser;
+
+public class Program {
+ public static void Main(string[] args) {
+ var builder = WebApplication.CreateBuilder(args);
+
+ builder.Services.AddDbContext<PagerContext>();
+
+ // This is necessary if we don't want enum values sent as integers in JSON objects
+ builder.Services.AddControllers().AddJsonOptions(o => {
+ var converter = new JsonStringEnumConverter();
+ o.JsonSerializerOptions.Converters.Add(converter);
+ });
+
+ builder.Services.AddCors();
+
+ // Add our custom services
+ builder.Services.AddSingleton<IPagerMessageParserService, PagerMessageParserService>();
+ builder.Services.AddHostedService<PagerFetchService>();
+
+ var app = builder.Build();
+
+ // Create a temporary scope so that we can access services during startup
+ using var scope = app.Services.CreateScope();
+ var config = scope.ServiceProvider.GetRequiredService<IConfiguration>();
+ var parser = scope.ServiceProvider.GetRequiredService<IPagerMessageParserService>();
+
+ // Ensure the database is created and the correct schema is used
+ // If we did update the database schema, attempt to re-parse all
+ // messages.
+ using var db = scope.ServiceProvider.GetRequiredService<PagerContext>();
+ var needsMigration = db.Database.GetPendingMigrations().Any();
+ db.Database.Migrate();
+
+ if(config.GetValue<bool>("PagerParser:ReparseAllOnStartup")) {
+ db.ParsedPagerMessages.RemoveRange(
+ db.ParsedPagerMessages.ToArray());
+ db.SaveChanges();
+ foreach(var message in db.PagerMessages) {
+ message.ParsedMessage = parser.TryParse(message.Message);
+ if(message.ParsedMessage is not null)
+ message.ParsedMessage.GpsPosition =
+ PositionCalculator.GetGpsPosition(message.ParsedMessage);
+ }
+ db.SaveChanges();
+ } else if(config.GetValue<bool>("PagerParser:ReparseFailedOnStartup")) {
+ foreach(var message in db.PagerMessages.Where(m => m.ParsedMessage == null)) {
+ message.ParsedMessage = parser.TryParse(message.Message);
+ if(message.ParsedMessage is not null)
+ if(message.ParsedMessage.GpsPosition is null)
+ message.ParsedMessage.GpsPosition =
+ PositionCalculator.GetGpsPosition(message.ParsedMessage);
+ }
+ db.SaveChanges();
+ }
+
+ // Start the server
+ app.UseCors(p => p
+ .AllowAnyOrigin()
+ .AllowAnyMethod()
+ .AllowAnyHeader());
+ app.UseHttpsRedirection();
+ app.UseHsts();
+ app.UseStaticFiles();
+ app.MapControllers();
+ app.Run();
+ }
+}