aboutsummaryrefslogtreecommitdiff
path: root/src/Enmarcha.Backend/Data/Models
diff options
context:
space:
mode:
authorAriel Costas Guerrero <ariel@costas.dev>2026-04-02 12:38:10 +0200
committerAriel Costas Guerrero <ariel@costas.dev>2026-04-02 12:45:33 +0200
commit1b4f4a674ac533c0b51260ba35ab91dd2cf9486d (patch)
tree9fdaf418bef86c51737bcf203483089c9e2b908b /src/Enmarcha.Backend/Data/Models
parent749e04d6fc2304bb29920db297d1fa4d73b57648 (diff)
Basic push notification system for service alerts
Co-authored-by: Copilot <copilot@github.com>
Diffstat (limited to 'src/Enmarcha.Backend/Data/Models')
-rw-r--r--src/Enmarcha.Backend/Data/Models/AlertSelector.cs3
-rw-r--r--src/Enmarcha.Backend/Data/Models/PushSubscription.cs20
-rw-r--r--src/Enmarcha.Backend/Data/Models/ServiceAlert.cs9
3 files changed, 31 insertions, 1 deletions
diff --git a/src/Enmarcha.Backend/Data/Models/AlertSelector.cs b/src/Enmarcha.Backend/Data/Models/AlertSelector.cs
index 34b2de3..e2b01f1 100644
--- a/src/Enmarcha.Backend/Data/Models/AlertSelector.cs
+++ b/src/Enmarcha.Backend/Data/Models/AlertSelector.cs
@@ -13,7 +13,8 @@ public class AlertSelector
public static AlertSelector FromStop(string feedId, string stopId) => new() { Raw = $"stop#{feedId}:{stopId}" };
public static AlertSelector FromRoute(string feedId, string routeId) => new() { Raw = $"route#{feedId}:{routeId}" };
- public static AlertSelector FromAgency(string feedId) => new() { Raw = $"agency#{feedId}" };
+ /// <param name="agencyGtfsId">Full GTFS agency id in the form <c>feedId:agencyId</c> (e.g. <c>vitrasa:1</c>).</param>
+ public static AlertSelector FromAgency(string agencyGtfsId) => new() { Raw = $"agency#{agencyGtfsId}" };
public override string ToString() => Raw;
}
diff --git a/src/Enmarcha.Backend/Data/Models/PushSubscription.cs b/src/Enmarcha.Backend/Data/Models/PushSubscription.cs
new file mode 100644
index 0000000..c72c40f
--- /dev/null
+++ b/src/Enmarcha.Backend/Data/Models/PushSubscription.cs
@@ -0,0 +1,20 @@
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Enmarcha.Backend.Data.Models;
+
+[Table("push_subscriptions")]
+public class PushSubscription
+{
+ public Guid Id { get; set; }
+
+ /// <summary>Push endpoint URL provided by the browser's push service.</summary>
+ public string Endpoint { get; set; } = string.Empty;
+
+ /// <summary>P-256 DH public key for payload encryption (base64url).</summary>
+ [Column("p256dh_key")] public string P256DhKey { get; set; } = string.Empty;
+
+ /// <summary>Auth secret for payload encryption (base64url).</summary>
+ [Column("auth_key")] public string AuthKey { get; set; } = string.Empty;
+
+ [Column("created_at")] public DateTime CreatedAt { get; set; }
+}
diff --git a/src/Enmarcha.Backend/Data/Models/ServiceAlert.cs b/src/Enmarcha.Backend/Data/Models/ServiceAlert.cs
index 5f80e3c..39cf3fa 100644
--- a/src/Enmarcha.Backend/Data/Models/ServiceAlert.cs
+++ b/src/Enmarcha.Backend/Data/Models/ServiceAlert.cs
@@ -24,6 +24,15 @@ public class ServiceAlert
[Column("event_end_date")] public DateTime EventEndDate { get; set; }
[Column("hidden_date")] public DateTime HiddenDate { get; set; }
+ /// <summary>Incremented each time a push notification is sent for this alert.</summary>
+ public int Version { get; set; } = 1;
+
+ /// <summary>Set when a push notification was sent for the PreNotice phase.</summary>
+ [Column("pre_notice_notified_at")] public DateTime? PreNoticeNotifiedAt { get; set; }
+
+ /// <summary>Set when a push notification was sent for the Active phase.</summary>
+ [Column("active_notified_at")] public DateTime? ActiveNotifiedAt { get; set; }
+
public AlertPhase GetPhase(DateTime? now = null)
{
now ??= DateTime.UtcNow;