wip: doctor/cli/docs/api to vector db consolidation; api hardening for descriptions, tenant, and scopes; migrations and conversions of all DALs to EF v10

This commit is contained in:
master
2026-02-23 15:30:50 +02:00
parent bd8fee6ed8
commit e746577380
1424 changed files with 81225 additions and 25251 deletions

View File

@@ -2,6 +2,8 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Routing;
using StellaOps.Auth.ServerIntegration.Tenancy;
using StellaOps.Notifier.WebService.Constants;
using StellaOps.Notifier.WebService.Extensions;
using StellaOps.Notifier.Worker.Fallback;
using StellaOps.Notify.Models;
@@ -20,7 +22,9 @@ public static class FallbackEndpoints
{
var group = endpoints.MapGroup("/api/v2/fallback")
.WithTags("Fallback")
.WithOpenApi();
.WithOpenApi()
.RequireAuthorization(NotifierPolicies.NotifyViewer)
.RequireTenant();
// Get fallback statistics
group.MapGet("/statistics", async (
@@ -51,7 +55,8 @@ public static class FallbackEndpoints
});
})
.WithName("GetFallbackStatistics")
.WithSummary("Gets fallback handling statistics for a tenant");
.WithSummary("Gets fallback handling statistics for a tenant")
.WithDescription("Returns aggregate delivery statistics for the tenant including primary success rate, fallback attempt count, fallback success rate, and per-channel failure breakdown over the specified window.");
// Get fallback chain for a channel
group.MapGet("/chains/{channelType}", async (
@@ -73,7 +78,8 @@ public static class FallbackEndpoints
});
})
.WithName("GetFallbackChain")
.WithSummary("Gets the fallback chain for a channel type");
.WithSummary("Gets the fallback chain for a channel type")
.WithDescription("Returns the ordered list of fallback channel types that will be tried when the primary channel fails. If no custom chain is configured, the system default is returned.");
// Set fallback chain for a channel
group.MapPut("/chains/{channelType}", async (
@@ -102,7 +108,9 @@ public static class FallbackEndpoints
});
})
.WithName("SetFallbackChain")
.WithSummary("Sets a custom fallback chain for a channel type");
.WithSummary("Sets a custom fallback chain for a channel type")
.WithDescription("Creates or replaces the fallback chain for a primary channel type. The chain must reference valid channel types; invalid entries are silently filtered out.")
.RequireAuthorization(NotifierPolicies.NotifyOperator);
// Test fallback resolution
group.MapPost("/test", async (
@@ -150,7 +158,9 @@ public static class FallbackEndpoints
});
})
.WithName("TestFallback")
.WithSummary("Tests fallback resolution without affecting real deliveries");
.WithSummary("Tests fallback resolution without affecting real deliveries")
.WithDescription("Simulates a channel failure for the specified channel type and returns which fallback channel would be selected next. The simulated delivery state is cleaned up after the test.")
.RequireAuthorization(NotifierPolicies.NotifyOperator);
// Clear delivery state
group.MapDelete("/deliveries/{deliveryId}", async (
@@ -166,7 +176,9 @@ public static class FallbackEndpoints
return Results.Ok(new { message = $"Delivery state for '{deliveryId}' cleared" });
})
.WithName("ClearDeliveryFallbackState")
.WithSummary("Clears fallback state for a specific delivery");
.WithSummary("Clears fallback state for a specific delivery")
.WithDescription("Removes all in-memory fallback tracking state for a delivery ID. Use this to reset a stuck delivery that has exhausted its fallback chain without entering a terminal status.")
.RequireAuthorization(NotifierPolicies.NotifyOperator);
return group;
}