Files
sbd2-frontend/src/lib/api/services/admin.ts
JSC 43b03e61bd
Some checks failed
Frontend CI / lint (push) Failing after 1m57s
Frontend CI / build (push) Has been skipped
feat: add user role selection to EditUserData in UsersPage
2025-09-13 22:39:04 +02:00

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()