diff options
Diffstat (limited to 'Program.cs')
| -rw-r--r-- | Program.cs | 71 |
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(); + } +} |
