import apiClient from './client'; import type { ActivationConfig, AdminUser, PipelineReadiness, RecommendationConfig, SystemSetting, TickerUniverse, TickerUniverseBootstrapResult, TickerUniverseSetting, } from '../lib/types'; // Users export function listUsers() { return apiClient.get('admin/users').then((r) => r.data); } export function createUser(data: { username: string; password: string; role: string; has_access: boolean; }) { return apiClient.post('admin/users', data).then((r) => r.data); } export function updateAccess(userId: number, hasAccess: boolean) { return apiClient .put<{ message: string }>(`admin/users/${userId}/access`, { has_access: hasAccess, }) .then((r) => r.data); } export function resetPassword(userId: number, password: string) { return apiClient .put<{ message: string }>(`admin/users/${userId}/password`, { password }) .then((r) => r.data); } // Settings export function listSettings() { return apiClient .get('admin/settings') .then((r) => r.data); } export function updateSetting(key: string, value: string) { return apiClient .put<{ message: string }>(`admin/settings/${key}`, { value }) .then((r) => r.data); } export function updateRegistration(enabled: boolean) { return apiClient .put<{ message: string }>('admin/settings/registration', { enabled }) .then((r) => r.data); } export function getRecommendationSettings() { return apiClient .get('admin/settings/recommendations') .then((r) => r.data); } export function updateRecommendationSettings(payload: Partial) { return apiClient .put('admin/settings/recommendations', payload) .then((r) => r.data); } export function getActivationSettings() { return apiClient .get('admin/settings/activation') .then((r) => r.data); } export function updateActivationSettings(payload: Partial) { return apiClient .put('admin/settings/activation', payload) .then((r) => r.data); } export function getTickerUniverseSetting() { return apiClient .get('admin/settings/ticker-universe') .then((r) => r.data); } export function updateTickerUniverseSetting(universe: TickerUniverse) { return apiClient .put('admin/settings/ticker-universe', { universe }) .then((r) => r.data); } export function bootstrapTickers(universe: TickerUniverse, pruneMissing: boolean) { return apiClient .post('admin/tickers/bootstrap', null, { params: { universe, prune_missing: pruneMissing, }, }) .then((r) => r.data); } // Jobs export interface JobStatus { name: string; label: string; enabled: boolean; next_run_at: string | null; registered: boolean; running?: boolean; runtime_status?: string | null; runtime_processed?: number | null; runtime_total?: number | null; runtime_progress_pct?: number | null; runtime_current_ticker?: string | null; runtime_started_at?: string | null; runtime_finished_at?: string | null; runtime_message?: string | null; } export interface TriggerJobResponse { job: string; status: 'triggered' | 'busy' | 'blocked' | 'not_found'; message: string; } export function listJobs() { return apiClient.get('admin/jobs').then((r) => r.data); } export function getPipelineReadiness() { return apiClient.get('admin/pipeline/readiness').then((r) => r.data); } export function toggleJob(jobName: string, enabled: boolean) { return apiClient .put<{ message: string }>(`admin/jobs/${jobName}/toggle`, { enabled }) .then((r) => r.data); } export function triggerJob(jobName: string) { return apiClient .post(`admin/jobs/${jobName}/trigger`) .then((r) => r.data); } // Data cleanup export function cleanupData(olderThanDays: number) { return apiClient .post<{ message: string }>('admin/data/cleanup', { older_than_days: olderThanDays, }) .then((r) => r.data); }