168 lines
4.1 KiB
TypeScript
168 lines
4.1 KiB
TypeScript
import type { User } from '@/types/auth'
|
|
import { apiClient } from '../client'
|
|
|
|
export interface Plan {
|
|
id: number
|
|
code: string
|
|
name: string
|
|
description?: string
|
|
credits: number
|
|
max_credits: number
|
|
created_at: string
|
|
updated_at: string
|
|
}
|
|
|
|
export interface UserUpdate {
|
|
name?: string
|
|
plan_id?: number
|
|
credits?: number
|
|
is_active?: boolean
|
|
role?: 'user' | 'admin'
|
|
}
|
|
|
|
export interface MessageResponse {
|
|
message: string
|
|
}
|
|
|
|
export interface GetUsersParams {
|
|
page?: number
|
|
limit?: number
|
|
search?: string
|
|
sort_by?: string
|
|
sort_order?: string
|
|
status_filter?: string
|
|
}
|
|
|
|
export interface GetUsersResponse {
|
|
users: User[]
|
|
total: number
|
|
page: number
|
|
limit: number
|
|
total_pages: number
|
|
}
|
|
|
|
export interface ScanResults {
|
|
added: number
|
|
updated: number
|
|
deleted: number
|
|
skipped: number
|
|
duplicates: number
|
|
errors: string[]
|
|
files_added: string[]
|
|
files_updated: string[]
|
|
files_deleted: string[]
|
|
files_skipped: string[]
|
|
}
|
|
|
|
export interface NormalizationResults {
|
|
processed: number
|
|
normalized: number
|
|
skipped: number
|
|
errors: number
|
|
error_details: string[]
|
|
}
|
|
|
|
export interface ScanResponse {
|
|
message: string
|
|
results: ScanResults
|
|
}
|
|
|
|
export interface NormalizationResponse {
|
|
message: string
|
|
results: NormalizationResults
|
|
}
|
|
|
|
export class AdminService {
|
|
async listUsers(params?: GetUsersParams): Promise<GetUsersResponse> {
|
|
const searchParams = new URLSearchParams()
|
|
|
|
if (params?.page) {
|
|
searchParams.append('page', params.page.toString())
|
|
}
|
|
if (params?.limit) {
|
|
searchParams.append('limit', params.limit.toString())
|
|
}
|
|
if (params?.search) {
|
|
searchParams.append('search', params.search)
|
|
}
|
|
if (params?.sort_by) {
|
|
searchParams.append('sort_by', params.sort_by)
|
|
}
|
|
if (params?.sort_order) {
|
|
searchParams.append('sort_order', params.sort_order)
|
|
}
|
|
if (params?.status_filter) {
|
|
searchParams.append('status_filter', params.status_filter)
|
|
}
|
|
|
|
const url = searchParams.toString()
|
|
? `/api/v1/admin/users/?${searchParams.toString()}`
|
|
: '/api/v1/admin/users/'
|
|
return apiClient.get<GetUsersResponse>(url)
|
|
}
|
|
|
|
async getUser(userId: number): Promise<User> {
|
|
return apiClient.get<User>(`/api/v1/admin/users/${userId}`)
|
|
}
|
|
|
|
async updateUser(userId: number, data: UserUpdate): Promise<User> {
|
|
return apiClient.patch<User>(`/api/v1/admin/users/${userId}`, data)
|
|
}
|
|
|
|
async disableUser(userId: number): Promise<MessageResponse> {
|
|
return apiClient.post<MessageResponse>(
|
|
`/api/v1/admin/users/${userId}/disable`,
|
|
)
|
|
}
|
|
|
|
async enableUser(userId: number): Promise<MessageResponse> {
|
|
return apiClient.post<MessageResponse>(
|
|
`/api/v1/admin/users/${userId}/enable`,
|
|
)
|
|
}
|
|
|
|
async listPlans(): Promise<Plan[]> {
|
|
return apiClient.get<Plan[]>(`/api/v1/admin/users/plans/list`)
|
|
}
|
|
|
|
// Sound Management
|
|
async scanSounds(): Promise<ScanResponse> {
|
|
return apiClient.post<ScanResponse>(`/api/v1/admin/sounds/scan`)
|
|
}
|
|
|
|
async normalizeAllSounds(
|
|
force = false,
|
|
onePass?: boolean,
|
|
): Promise<NormalizationResponse> {
|
|
const params = new URLSearchParams()
|
|
if (force) params.append('force', 'true')
|
|
if (onePass !== undefined) params.append('one_pass', onePass.toString())
|
|
|
|
const queryString = params.toString()
|
|
const url = queryString
|
|
? `/api/v1/admin/sounds/normalize/all?${queryString}`
|
|
: `/api/v1/admin/sounds/normalize/all`
|
|
|
|
return apiClient.post<NormalizationResponse>(url)
|
|
}
|
|
|
|
async normalizeSoundsByType(
|
|
soundType: 'SDB' | 'TTS' | 'EXT',
|
|
force = false,
|
|
onePass?: boolean,
|
|
): Promise<NormalizationResponse> {
|
|
const params = new URLSearchParams()
|
|
if (force) params.append('force', 'true')
|
|
if (onePass !== undefined) params.append('one_pass', onePass.toString())
|
|
|
|
const queryString = params.toString()
|
|
const url = queryString
|
|
? `/api/v1/admin/sounds/normalize/type/${soundType}?${queryString}`
|
|
: `/api/v1/admin/sounds/normalize/type/${soundType}`
|
|
|
|
return apiClient.post<NormalizationResponse>(url)
|
|
}
|
|
}
|
|
|
|
export const adminService = new AdminService()
|