mirror of
https://github.com/QuantumNous/new-api.git
synced 2026-09-06 17:46:23 +00:00
78 lines
2.7 KiB
TypeScript
Vendored
78 lines
2.7 KiB
TypeScript
Vendored
/*
|
|
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 <https://www.gnu.org/licenses/>.
|
|
|
|
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,
|
|
})
|