add targets and refactor endpoints

This commit is contained in:
miloschwartz
2026-07-31 17:36:04 -04:00
parent 573747c237
commit 28430dde74
31 changed files with 741 additions and 490 deletions
+24 -3
View File
@@ -11,6 +11,7 @@ export type AiProviderType =
export type AiProviderAuthType = "bearer";
export type AiBudgetUnit = "usd" | "tokens";
export type AiProviderRoutingMode = "url" | "target";
type AiProviderDefaults = {
upstreamUrl: string | null;
@@ -55,7 +56,13 @@ export const AI_PROVIDER_DEFAULTS: Record<
}
};
export function providerRequiresUpstreamUrl(type: AiProviderType): boolean {
export function providerRequiresUpstreamUrl(
type: AiProviderType,
routingMode: AiProviderRoutingMode = "url"
): boolean {
if (routingMode === "target") {
return false;
}
if (type === "custom") {
return true;
}
@@ -66,20 +73,34 @@ export function resolveAiProviderConfig(input: {
type: AiProviderType;
upstreamUrl: string | null;
authType: AiProviderAuthType | null;
routingMode?: AiProviderRoutingMode | null;
}): {
upstreamUrl: string | null;
authType: AiProviderAuthType | null;
routingMode: AiProviderRoutingMode;
} {
const routingMode = input.routingMode ?? "url";
if (routingMode === "target") {
return {
upstreamUrl: null,
authType: input.authType ?? "bearer",
routingMode
};
}
if (input.type === "custom") {
return {
upstreamUrl: input.upstreamUrl,
authType: input.authType
authType: input.authType,
routingMode
};
}
const defaults = AI_PROVIDER_DEFAULTS[input.type];
return {
upstreamUrl: input.upstreamUrl ?? defaults.upstreamUrl,
authType: input.authType ?? defaults.authType
authType: input.authType ?? defaults.authType,
routingMode
};
}
@@ -202,6 +202,10 @@ async function handleResource(
return;
}
if (!target.resourceId) {
return;
}
const [resource] = await trx
.select()
.from(resources)
@@ -227,9 +231,7 @@ async function handleResource(
let health = "healthy";
const allUnknown = monitoredTargets.length === 0;
const allHealthy = monitoredTargets.every(
(t) => t.hcHealth === "healthy"
);
const allHealthy = monitoredTargets.every((t) => t.hcHealth === "healthy");
const allUnhealthy = monitoredTargets.every(
(t) => t.hcHealth === "unhealthy"
);
+8 -1
View File
@@ -64,13 +64,20 @@ export async function performDeleteResources(
const targetsByResourceId = new Map<number, Target[]>();
for (const target of targetsToBeRemoved) {
if (target.resourceId == null) {
continue;
}
const existing = targetsByResourceId.get(target.resourceId) ?? [];
existing.push(target);
targetsByResourceId.set(target.resourceId, existing);
}
const targetIdToResourceId = new Map(
targetsToBeRemoved.map((target) => [target.targetId, target.resourceId])
targetsToBeRemoved.flatMap((target) =>
target.resourceId == null
? []
: [[target.targetId, target.resourceId] as const]
)
);
const healthChecksByResourceId = new Map<number, TargetHealthCheck[]>();
+5 -3
View File
@@ -1,4 +1,4 @@
import { and, eq, inArray, sql } from "drizzle-orm";
import { and, eq, inArray, isNotNull, sql } from "drizzle-orm";
import {
db,
resources,
@@ -33,9 +33,11 @@ export async function getResourceIdsForSite(
const rows = await trx
.selectDistinct({ resourceId: targets.resourceId })
.from(targets)
.where(eq(targets.siteId, siteId));
.where(and(eq(targets.siteId, siteId), isNotNull(targets.resourceId)));
return rows.map((row) => row.resourceId);
return rows
.map((row) => row.resourceId)
.filter((resourceId): resourceId is number => resourceId != null);
}
export async function getSiteResourceIdsForSite(