import { http, buildQuery } from '../http' import type { PageData } from '@/types' export interface LogSourceAccess { userId: number; labels: Record } export interface LogPolicyGroup { id: number; name: string; sourceId: number; labels: Record; userIds: number[]; createdAt?: string; updatedAt?: string } export interface LogSource { id: number; name: string; targetType: 'url' | 'cluster-svc'; clusterID?: number namespace: string; service: string; port: number; url: string authType: string; basicUser: string; hasBasicPass?: boolean headers?: Record; headerNames?: string[]; skipTLSVerify?: boolean; hasBearerToken?: boolean isDefault: boolean; managed?: boolean; access?: LogSourceAccess[] } export interface LogEntry { timestamp: string; timestampNs: string; level: string; message: string; labels: Record } export interface HistogramBucket { timestamp: string; count: number } export interface LogResult { entries: LogEntry[]; hasMore: boolean; nextCursor: string } export interface LogQuery { sourceId: number; query: string; start: number; end: number; limit?: number; direction?: 'backward' | 'forward'; cursor?: string } export const logsApi = { sources: () => http.get>('/logs/sources'), createSource: (source: Partial & { basicPass?: string; bearerToken?: string }) => http.post('/logs/sources', source), updateSource: (id: number, data: Partial) => http.put(`/logs/sources/${id}`, data), deleteSource: (id: number) => http.delete(`/logs/sources/${id}`), testSource: (data: Partial) => http.post<{ success: boolean; message: string }>('/logs/sources/test', data), query: (data: LogQuery) => http.post('/logs/query', data, { timeout: 125000 }), context: (data: { sourceId: number; timestampNs: string; labels: Record }) => http.post<{ before: LogEntry[]; after: LogEntry[] }>('/logs/context', data), histogram: (data: LogQuery) => http.post>>('/logs/histogram', data, { timeout: 125000 }), labels: (sourceId: number, start?: number, end?: number) => http.get(`/logs/labels${buildQuery({ sourceId, start, end } as { page?: number; pageSize?: number })}`), labelValues: (sourceId: number, name: string, query = '', start?: number, end?: number) => http.get(`/logs/label/${encodeURIComponent(name)}/values${buildQuery({ sourceId, query, start, end } as { page?: number; pageSize?: number })}`), policyGroups: () => http.get('/logs/policy-groups'), createPolicyGroup: (data: Omit) => http.post('/logs/policy-groups', data), updatePolicyGroup: (id: number, data: Omit) => http.put(`/logs/policy-groups/${id}`, data), deletePolicyGroup: (id: number) => http.delete(`/logs/policy-groups/${id}`), }