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();
}
}
|