aboutsummaryrefslogtreecommitdiff
path: root/Program.cs
blob: ba53ccb7a0c2be3a3913a01de397564054e4dff5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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();
    }
}