/* Copyright (C) 2023-2026 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import z from 'zod' import { createFileRoute, redirect } from '@tanstack/react-router' import { UsageLogs } from '@/features/usage-logs' import { isUsageLogsSectionId, USAGE_LOGS_DEFAULT_SECTION, } from '@/features/usage-logs/section-registry' const logTypeValues = ['0', '1', '2', '3', '4', '5', '6'] as const const logTypeSearchSchema = z .preprocess( (value) => { if (value == null || value === '') return undefined return Array.isArray(value) ? value : [value] }, z.array(z.enum(logTypeValues)).optional() ) .catch([]) const usageLogsSearchSchema = z.object({ page: z.number().optional().catch(1), pageSize: z.number().optional().catch(undefined), type: logTypeSearchSchema.optional(), filter: z.string().optional().catch(''), model: z.string().optional().catch(''), token: z.string().optional().catch(''), channel: z.string().optional().catch(''), group: z.string().optional().catch(''), username: z.string().optional().catch(''), requestId: z.string().optional().catch(''), upstreamRequestId: z.string().optional().catch(''), startTime: z.number().optional(), endTime: z.number().optional(), }) export const Route = createFileRoute('/_authenticated/usage-logs/$section')({ beforeLoad: ({ params, search }) => { if (!isUsageLogsSectionId(params.section)) { throw redirect({ to: '/usage-logs/$section', params: { section: USAGE_LOGS_DEFAULT_SECTION }, }) } // type 仅 common 使用,非 common 时清掉 URL 里的 type const hasTypeSearch = Array.isArray(search?.type) ? search.type.length > 0 : search?.type != null && search.type !== '' if (params.section !== 'common' && hasTypeSearch) { throw redirect({ to: '/usage-logs/$section', params: { section: params.section }, search: { ...search, type: undefined }, replace: true, }) } }, validateSearch: usageLogsSearchSchema, component: UsageLogs, })