Create loggedCalls.router
This commit is contained in:
@@ -20,7 +20,7 @@ import Link from "next/link";
|
|||||||
import { type RouterOutputs } from "~/utils/api";
|
import { type RouterOutputs } from "~/utils/api";
|
||||||
import { FormattedJson } from "./FormattedJson";
|
import { FormattedJson } from "./FormattedJson";
|
||||||
|
|
||||||
type LoggedCall = RouterOutputs["dashboard"]["loggedCalls"]["calls"][0];
|
type LoggedCall = RouterOutputs["loggedCalls"]["list"]["calls"][0];
|
||||||
|
|
||||||
export const TableHeader = () => (
|
export const TableHeader = () => (
|
||||||
<Thead>
|
<Thead>
|
||||||
|
|||||||
@@ -3,19 +3,10 @@ import { Text, VStack, Breadcrumb, BreadcrumbItem } from "@chakra-ui/react";
|
|||||||
import AppShell from "~/components/nav/AppShell";
|
import AppShell from "~/components/nav/AppShell";
|
||||||
import PageHeaderContainer from "~/components/nav/PageHeaderContainer";
|
import PageHeaderContainer from "~/components/nav/PageHeaderContainer";
|
||||||
import ProjectBreadcrumbContents from "~/components/nav/ProjectBreadcrumbContents";
|
import ProjectBreadcrumbContents from "~/components/nav/ProjectBreadcrumbContents";
|
||||||
import { useSelectedProject } from "~/utils/hooks";
|
|
||||||
import { api } from "~/utils/api";
|
|
||||||
import LoggedCallTable from "~/components/requestLogs/LoggedCallsTable";
|
import LoggedCallTable from "~/components/requestLogs/LoggedCallsTable";
|
||||||
import LoggedCallsPaginator from "~/components/requestLogs/LoggedCallsPaginator";
|
import LoggedCallsPaginator from "~/components/requestLogs/LoggedCallsPaginator";
|
||||||
|
|
||||||
export default function LoggedCalls() {
|
export default function LoggedCalls() {
|
||||||
const { data: selectedProject } = useSelectedProject();
|
|
||||||
|
|
||||||
const stats = api.dashboard.stats.useQuery(
|
|
||||||
{ projectId: selectedProject?.id ?? "" },
|
|
||||||
{ enabled: !!selectedProject },
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<AppShell title="Request Logs" requireAuth>
|
<AppShell title="Request Logs" requireAuth>
|
||||||
<PageHeaderContainer>
|
<PageHeaderContainer>
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import { datasetEntries } from "./routers/datasetEntries.router";
|
|||||||
import { externalApiRouter } from "./routers/externalApi.router";
|
import { externalApiRouter } from "./routers/externalApi.router";
|
||||||
import { projectsRouter } from "./routers/projects.router";
|
import { projectsRouter } from "./routers/projects.router";
|
||||||
import { dashboardRouter } from "./routers/dashboard.router";
|
import { dashboardRouter } from "./routers/dashboard.router";
|
||||||
|
import { loggedCallsRouter } from "./routers/loggedCalls.router";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is the primary router for your server.
|
* This is the primary router for your server.
|
||||||
@@ -29,6 +30,7 @@ export const appRouter = createTRPCRouter({
|
|||||||
datasetEntries: datasetEntries,
|
datasetEntries: datasetEntries,
|
||||||
projects: projectsRouter,
|
projects: projectsRouter,
|
||||||
dashboard: dashboardRouter,
|
dashboard: dashboardRouter,
|
||||||
|
loggedCalls: loggedCallsRouter,
|
||||||
externalApi: externalApiRouter,
|
externalApi: externalApiRouter,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import { sql } from "kysely";
|
import { sql } from "kysely";
|
||||||
import { z } from "zod";
|
import { z } from "zod";
|
||||||
import { createTRPCRouter, publicProcedure } from "~/server/api/trpc";
|
import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc";
|
||||||
import { kysely, prisma } from "~/server/db";
|
import { kysely } from "~/server/db";
|
||||||
import { requireCanViewProject } from "~/utils/accessControl";
|
import { requireCanViewProject } from "~/utils/accessControl";
|
||||||
import dayjs from "~/utils/dayjs";
|
import dayjs from "~/utils/dayjs";
|
||||||
|
|
||||||
export const dashboardRouter = createTRPCRouter({
|
export const dashboardRouter = createTRPCRouter({
|
||||||
stats: publicProcedure
|
stats: protectedProcedure
|
||||||
.input(
|
.input(
|
||||||
z.object({
|
z.object({
|
||||||
// TODO: actually take startDate into account
|
// TODO: actually take startDate into account
|
||||||
@@ -105,28 +105,4 @@ export const dashboardRouter = createTRPCRouter({
|
|||||||
|
|
||||||
return { periods: backfilledPeriods, totals, errors: namedErrors };
|
return { periods: backfilledPeriods, totals, errors: namedErrors };
|
||||||
}),
|
}),
|
||||||
|
|
||||||
// TODO useInfiniteQuery
|
|
||||||
// https://discord.com/channels/966627436387266600/1122258443886153758/1122258443886153758
|
|
||||||
loggedCalls: publicProcedure
|
|
||||||
.input(z.object({ projectId: z.string(), page: z.number(), pageSize: z.number() }))
|
|
||||||
.query(async ({ input, ctx }) => {
|
|
||||||
const { projectId, page, pageSize } = input;
|
|
||||||
|
|
||||||
await requireCanViewProject(projectId, ctx);
|
|
||||||
|
|
||||||
const calls = await prisma.loggedCall.findMany({
|
|
||||||
where: { projectId },
|
|
||||||
orderBy: { requestedAt: "desc" },
|
|
||||||
include: { tags: true, modelResponse: true },
|
|
||||||
skip: (page - 1) * pageSize,
|
|
||||||
take: pageSize,
|
|
||||||
});
|
|
||||||
|
|
||||||
const count = await prisma.loggedCall.count({
|
|
||||||
where: { projectId },
|
|
||||||
});
|
|
||||||
|
|
||||||
return { count, calls };
|
|
||||||
}),
|
|
||||||
});
|
});
|
||||||
|
|||||||
28
app/src/server/api/routers/loggedCalls.router.ts
Normal file
28
app/src/server/api/routers/loggedCalls.router.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import { z } from "zod";
|
||||||
|
import { createTRPCRouter, protectedProcedure } from "~/server/api/trpc";
|
||||||
|
import { prisma } from "~/server/db";
|
||||||
|
import { requireCanViewProject } from "~/utils/accessControl";
|
||||||
|
|
||||||
|
export const loggedCallsRouter = createTRPCRouter({
|
||||||
|
list: protectedProcedure
|
||||||
|
.input(z.object({ projectId: z.string(), page: z.number(), pageSize: z.number() }))
|
||||||
|
.query(async ({ input, ctx }) => {
|
||||||
|
const { projectId, page, pageSize } = input;
|
||||||
|
|
||||||
|
await requireCanViewProject(projectId, ctx);
|
||||||
|
|
||||||
|
const calls = await prisma.loggedCall.findMany({
|
||||||
|
where: { projectId },
|
||||||
|
orderBy: { requestedAt: "desc" },
|
||||||
|
include: { tags: true, modelResponse: true },
|
||||||
|
skip: (page - 1) * pageSize,
|
||||||
|
take: pageSize,
|
||||||
|
});
|
||||||
|
|
||||||
|
const count = await prisma.loggedCall.count({
|
||||||
|
where: { projectId },
|
||||||
|
});
|
||||||
|
|
||||||
|
return { count, calls };
|
||||||
|
}),
|
||||||
|
});
|
||||||
@@ -180,7 +180,7 @@ export const useLoggedCalls = () => {
|
|||||||
const selectedProjectId = useAppStore((state) => state.selectedProjectId);
|
const selectedProjectId = useAppStore((state) => state.selectedProjectId);
|
||||||
const { page, pageSize } = usePageParams();
|
const { page, pageSize } = usePageParams();
|
||||||
|
|
||||||
return api.dashboard.loggedCalls.useQuery(
|
return api.loggedCalls.list.useQuery(
|
||||||
{ projectId: selectedProjectId ?? "", page, pageSize },
|
{ projectId: selectedProjectId ?? "", page, pageSize },
|
||||||
{ enabled: !!selectedProjectId },
|
{ enabled: !!selectedProjectId },
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user