import { ADMIN_BASE, request } from "./client"; import type { AnalyticsSummary, Consumer, ConsumerCreate, ConsumerUpdate, EventCreate, EventFilters, EventListResponse, EventRecord, EventUpdate, ParseJob, ParseJobCreate, ParseJobUpdate, TimelinePoint, TopItem, VpnSettings, VpnSettingsUpdate, } from "../types/admin"; function buildQuery(params: Record): string { const search = new URLSearchParams(); for (const [key, value] of Object.entries(params)) { if (value !== undefined && value !== "") { search.set(key, String(value)); } } const qs = search.toString(); return qs ? `?${qs}` : ""; } export function fetchJobs(): Promise { return request("/jobs", undefined, ADMIN_BASE); } export function createJob(payload: ParseJobCreate): Promise { return request( "/jobs", { method: "POST", body: JSON.stringify(payload) }, ADMIN_BASE, ); } export function retryJob(jobId: number): Promise { return request( `/jobs/${jobId}/retry`, { method: "POST" }, ADMIN_BASE, ); } export function updateJob(jobId: number, payload: ParseJobUpdate): Promise { return request( `/jobs/${jobId}`, { method: "PATCH", body: JSON.stringify(payload) }, ADMIN_BASE, ); } export function deleteJob(jobId: number): Promise { return request( `/jobs/${jobId}`, { method: "DELETE" }, ADMIN_BASE, ); } export function fetchEvents(filters: EventFilters = {}): Promise { return request( `/events${buildQuery(filters as Record)}`, undefined, ADMIN_BASE, ); } export function createEvent(payload: EventCreate): Promise { return request( "/events", { method: "POST", body: JSON.stringify(payload) }, ADMIN_BASE, ); } export function updateEvent(id: number, payload: EventUpdate): Promise { return request( `/events/${id}`, { method: "PATCH", body: JSON.stringify(payload) }, ADMIN_BASE, ); } export function deleteEvent(id: number): Promise { return request(`/events/${id}`, { method: "DELETE" }, ADMIN_BASE); } export function fetchConsumers(): Promise { return request("/consumers", undefined, ADMIN_BASE); } export function createConsumer(payload: ConsumerCreate): Promise { return request( "/consumers", { method: "POST", body: JSON.stringify(payload) }, ADMIN_BASE, ); } export function updateConsumer(id: number, payload: ConsumerUpdate): Promise { return request( `/consumers/${id}`, { method: "PATCH", body: JSON.stringify(payload) }, ADMIN_BASE, ); } export function rotateConsumerKey(id: number): Promise { return request( `/consumers/${id}/rotate-key`, { method: "POST" }, ADMIN_BASE, ); } export function fetchAnalyticsSummary(): Promise { return request("/analytics/summary", undefined, ADMIN_BASE); } export function fetchAnalyticsTimeline(days = 30): Promise { return request( `/analytics/timeline${buildQuery({ days })}`, undefined, ADMIN_BASE, ); } export function fetchTopLocalities(limit = 10): Promise { return request( `/analytics/top-localities${buildQuery({ limit })}`, undefined, ADMIN_BASE, ); } export function fetchTopRegions(limit = 10): Promise { return request( `/analytics/top-regions${buildQuery({ limit })}`, undefined, ADMIN_BASE, ); } export async function testDistribution(apiKey: string, limit = 5): Promise { const response = await fetch(`/api/v1/events?limit=${limit}`, { headers: { Authorization: `Bearer ${apiKey}` }, }); if (!response.ok) { const message = await response.text(); throw new Error(message || `Ошибка запроса: ${response.status}`); } return response.json() as Promise; } export function fetchVpnSettings(): Promise { return request("/vpn", undefined, ADMIN_BASE); } export function updateVpnSettings(payload: VpnSettingsUpdate): Promise { return request( "/vpn", { method: "PUT", body: JSON.stringify(payload) }, ADMIN_BASE, ); }