fix: analytics and deprecated warning

This commit is contained in:
2026-01-21 13:58:34 -05:00
parent 7b60494d6d
commit 955c856a85
9 changed files with 95 additions and 55 deletions

View File

@@ -5,7 +5,6 @@ import {
getAnalyticsSummary,
getPathAnalytics,
cleanupOldAnalytics,
logVisit,
getPerformanceStats,
enrichAnalyticsEntry
} from "~/server/analytics";
@@ -13,6 +12,26 @@ import { ConnectionFactory } from "~/server/database";
import { v4 as uuid } from "uuid";
import { getRequestIP } from "vinxi/http";
/** Safely get a header value from either Fetch API Headers or Node.js IncomingHttpHeaders */
function getHeader(
headers: Record<string, string | string[] | undefined> | Headers | undefined,
name: string
): string | undefined {
if (!headers) return undefined;
// Check if it's a Fetch API Headers object (has .get method)
if (typeof (headers as Headers).get === "function") {
return (headers as Headers).get(name) || undefined;
}
// Otherwise treat as Node.js IncomingHttpHeaders (plain object)
const value = (headers as Record<string, string | string[] | undefined>)[
name.toLowerCase()
];
if (Array.isArray(value)) return value[0];
return value;
}
export const analyticsRouter = createTRPCRouter({
logPerformance: publicProcedure
.input(
@@ -71,14 +90,12 @@ export const analyticsRouter = createTRPCRouter({
} else {
const req = ctx.event.nativeEvent.node?.req || ctx.event.nativeEvent;
const userAgent =
req.headers?.["user-agent"] ||
ctx.event.request?.headers?.get("user-agent") ||
undefined;
getHeader(req.headers, "user-agent") ||
getHeader(ctx.event.request?.headers, "user-agent");
const referrer =
req.headers?.referer ||
req.headers?.referrer ||
ctx.event.request?.headers?.get("referer") ||
undefined;
getHeader(req.headers, "referer") ||
getHeader(req.headers, "referrer") ||
getHeader(ctx.event.request?.headers, "referer");
const ipAddress = getRequestIP(ctx.event.nativeEvent) || undefined;
const enriched = enrichAnalyticsEntry({
userId: ctx.userId,

View File

@@ -1,5 +1,5 @@
import { describe, it, expect, vi } from "vitest";
import { appRouter } from "~/server/api/root";
import { createCallerFactory, appRouter } from "~/server/api/root";
import { createTRPCContext } from "~/server/api/utils";
vi.mock("~/server/apple-notification", () => ({
@@ -17,9 +17,10 @@ vi.mock("~/server/apple-notification-store", () => ({
describe("apple notification router", () => {
it("verifies and stores notifications", async () => {
const caller = appRouter.createCaller(
await createTRPCContext({ nativeEvent: { node: { req: {} } } } as any)
);
const ctx = await createTRPCContext({
nativeEvent: { node: { req: {} } }
} as any);
const caller = createCallerFactory(ctx);
const result = await caller.appleNotifications.verifyAndStore.mutate({
signedPayload: "test"

View File

@@ -1,5 +1,5 @@
import { describe, it, expect, vi } from "vitest";
import { appRouter } from "~/server/api/root";
import { createCallerFactory } from "~/server/api/root";
import { createTRPCContext } from "~/server/api/utils";
// Mock the S3 client and getSignedUrl function
@@ -33,9 +33,8 @@ process.env.VITE_DOWNLOAD_BUCKET_STRING = "test-bucket";
describe("downloads router", () => {
it("should return a signed URL for valid asset names", async () => {
const caller = appRouter.createCaller(
await createTRPCContext({ nativeEvent: {} } as any)
);
const ctx = await createTRPCContext({ nativeEvent: {} } as any);
const caller = createCallerFactory(ctx);
const result = await caller.downloads.getDownloadUrl.query({
asset_name: "lineage"
@@ -46,9 +45,8 @@ describe("downloads router", () => {
});
it("should throw NOT_FOUND for invalid asset names", async () => {
const caller = appRouter.createCaller(
await createTRPCContext({ nativeEvent: {} } as any)
);
const ctx = await createTRPCContext({ nativeEvent: {} } as any);
const caller = createCallerFactory(ctx);
try {
await caller.downloads.getDownloadUrl.query({