feat(push): add service-owned firebase channels and delivery

Add push contracts, provider delivery and channel diagnostics. Link email channels to services and document migration and validation.

Ref: IT-1074
This commit is contained in:
2026-10-24 12:31:35 +03:00
parent b30dba93e8
commit 1631786ce2
105 changed files with 3838 additions and 147 deletions
@@ -32,8 +32,8 @@ internal sealed class DevelopmentDataSeeder
if (string.IsNullOrWhiteSpace(serviceName))
throw new InvalidOperationException("Development seed service name is not configured.");
await SeedMailpitChannelAsync(serviceName, cancellationToken);
await SeedServiceAsync(serviceName, cancellationToken);
var serviceId = await SeedServiceAsync(serviceName, cancellationToken);
await SeedMailpitChannelAsync(serviceId, serviceName, cancellationToken);
foreach (EmailTemplate template in CreateTemplates(serviceName))
{
@@ -55,22 +55,23 @@ internal sealed class DevelopmentDataSeeder
}
}
private async Task SeedServiceAsync(string serviceName, CancellationToken ct)
private async Task<Guid> SeedServiceAsync(string serviceName, CancellationToken ct)
{
var services = await _services.GetAllAsync(ct);
var service = services.SingleOrDefault(s => s.Name == serviceName);
if (service?.Languages.Any(l => l.Code == DefaultLanguageCode) == true)
return;
return service.Id;
var isNew = service is null;
service ??= new NotificationServiceInfo { Name = serviceName };
service.Languages = [..service.Languages, new ServiceLanguageInfo { Code = DefaultLanguageCode }];
await _services.SaveAsync(service, isNew, ct);
return service.Id;
}
private async Task SeedMailpitChannelAsync(string serviceName, CancellationToken cancellationToken)
private async Task SeedMailpitChannelAsync(Guid serviceId, string serviceName, CancellationToken cancellationToken)
{
IReadOnlyList<EmailChannel> existingChannels = await _channels.GetByServiceAsync(
serviceName, cancellationToken);
serviceId, cancellationToken);
if (existingChannels.Count > 0)
{
@@ -82,7 +83,7 @@ internal sealed class DevelopmentDataSeeder
var channel = new EmailChannel
{
ServiceName = serviceName,
ServiceId = serviceId,
Priority = 1,
EmailChannelType = EmailChannelType.Smtp,
Settings = new SmtpChannelSettings