Fix issues with possible null providerId

This commit is contained in:
Owen
2026-08-13 11:04:11 -04:00
parent a2f5d830d6
commit e92bb9043b
3 changed files with 33 additions and 9 deletions
+11 -2
View File
@@ -208,7 +208,14 @@ async function enrichWithDetails(
type: aiProviders.type type: aiProviders.type
}) })
.from(aiProviders) .from(aiProviders)
.where(inArray(aiProviders.providerId, providerIds)); .where(
inArray(
aiProviders.providerId,
providerIds.filter(
(id): id is number => id !== null && id !== undefined
)
)
);
for (const p of providerDetails) { for (const p of providerDetails) {
providerMap.set(p.providerId, { name: p.name, type: p.type }); providerMap.set(p.providerId, { name: p.name, type: p.type });
@@ -336,7 +343,9 @@ async function enrichWithDetails(
} }
return logs.map((log) => { return logs.map((log) => {
const provider = providerMap.get(log.providerId); const provider = log.providerId
? providerMap.get(log.providerId)
: null;
let resourceId = log.resourceId; let resourceId = log.resourceId;
let resourceName: string | null = null; let resourceName: string | null = null;
@@ -93,9 +93,17 @@ async function query(data: Q) {
const nameMap = new Map<number, string | null>(); const nameMap = new Map<number, string | null>();
if (providerIds.length > 0) { if (providerIds.length > 0) {
const providerDetails = await db const providerDetails = await db
.select({ providerId: aiProviders.providerId, name: aiProviders.name }) .select({
providerId: aiProviders.providerId,
name: aiProviders.name
})
.from(aiProviders) .from(aiProviders)
.where(inArray(aiProviders.providerId, providerIds)); .where(
inArray(
aiProviders.providerId,
providerIds.filter((id): id is number => id !== null)
)
);
for (const p of providerDetails) { for (const p of providerDetails) {
nameMap.set(p.providerId, p.name); nameMap.set(p.providerId, p.name);
} }
@@ -103,7 +111,7 @@ async function query(data: Q) {
const topProviders = topProvidersRaw.map((r) => ({ const topProviders = topProvidersRaw.map((r) => ({
providerId: r.providerId, providerId: r.providerId,
name: nameMap.get(r.providerId) ?? null, name: r.providerId ? (nameMap.get(r.providerId) ?? null) : null,
requests: r.requests, requests: r.requests,
totalTokens: r.totalTokens, totalTokens: r.totalTokens,
costUsd: r.costUsd costUsd: r.costUsd
@@ -119,7 +127,8 @@ async function query(data: Q) {
registry.registerPath({ registry.registerPath({
method: "get", method: "get",
path: "/org/{orgId}/logs/ai/usage/providers", path: "/org/{orgId}/logs/ai/usage/providers",
description: "Query the AI usage analytics provider breakdown for an organization", description:
"Query the AI usage analytics provider breakdown for an organization",
tags: [OpenAPITags.Logs], tags: [OpenAPITags.Logs],
request: { request: {
query: aiUsageAnalyticsFiltersQuery, query: aiUsageAnalyticsFiltersQuery,
@@ -154,14 +163,20 @@ export async function queryAiUsageProviders(
const parsedQuery = aiUsageAnalyticsFiltersQuery.safeParse(req.query); const parsedQuery = aiUsageAnalyticsFiltersQuery.safeParse(req.query);
if (!parsedQuery.success) { if (!parsedQuery.success) {
return next( return next(
createHttpError(HttpCode.BAD_REQUEST, fromError(parsedQuery.error)) createHttpError(
HttpCode.BAD_REQUEST,
fromError(parsedQuery.error)
)
); );
} }
const parsedParams = aiUsageAnalyticsParams.safeParse(req.params); const parsedParams = aiUsageAnalyticsParams.safeParse(req.params);
if (!parsedParams.success) { if (!parsedParams.success) {
return next( return next(
createHttpError(HttpCode.BAD_REQUEST, fromError(parsedParams.error)) createHttpError(
HttpCode.BAD_REQUEST,
fromError(parsedParams.error)
)
); );
} }
+1 -1
View File
@@ -99,7 +99,7 @@ export type QueryAiSessionLogResponse = {
id: number; id: number;
sessionId: string; sessionId: string;
orgId: string | null; orgId: string | null;
providerId: number; providerId: number | null;
providerName: string | null; providerName: string | null;
providerType: string | null; providerType: string | null;
capability: string; capability: string;