Files
live-hub-py/web/frontend/src/api/accounts.ts
T

130 lines
5.5 KiB
TypeScript

import api from './client';
import type {
AccountExchangeRecords,
AccountEventPage,
AccountItem,
AccountBulkSelection,
AccountBulkTagRequest,
AccountExportRequest,
AccountOverview,
AssignmentsSummary,
BasicSummary,
BatchAssignRequest,
MessageCountResponse,
MessageDeletedResponse,
MessageResponse,
PageParams,
PaginatedResponse,
} from './types';
export const accountApi = {
list: (params?: { assigned_only?: boolean; tag?: string; has_cookie?: boolean; include_sensitive?: boolean }) =>
api.get<AccountItem[], AccountItem[]>('/accounts', { params }),
listPaged: (
params: PageParams & {
assigned_only?: boolean;
assign_status?: string;
assigned_user_id?: number;
tag?: string;
has_cookie?: boolean;
include_sensitive?: boolean;
status?: string;
ck_status?: string;
failure_kind?: string;
bind_status?: string;
high_value_filter?: string;
min_points?: number;
max_points?: number;
min_gold?: number;
max_gold?: number;
elite_opened?: boolean;
esports_opened?: boolean;
role_bind_status?: string;
sort?: 'username' | 'status' | 'bind' | 'points' | 'high_value' | 'exchange' | 'tag';
order?: 'asc' | 'desc';
},
) =>
api.get<PaginatedResponse<AccountItem>, PaginatedResponse<AccountItem>>('/accounts', { params }),
// 按当前筛选条件返回全部账号 ID(不受分页限制),供「按账号名批量选号」使用
listIds: (
params?: {
search?: string;
assigned_only?: boolean;
assign_status?: string;
assigned_user_id?: number;
tag?: string;
has_cookie?: boolean;
status?: string;
ck_status?: string;
failure_kind?: string;
bind_status?: string;
high_value_filter?: string;
min_points?: number;
max_points?: number;
min_gold?: number;
max_gold?: number;
elite_opened?: boolean;
esports_opened?: boolean;
role_bind_status?: string;
account_names?: string;
},
) =>
api.get<
{ account_ids: number[]; usernames: string[]; total: number },
{ account_ids: number[]; usernames: string[]; total: number }
>('/accounts/ids', { params }),
export: (data: AccountExportRequest) =>
api.post('/accounts/export', data, { responseType: 'blob' }),
summary: () => api.get<BasicSummary, BasicSummary>('/accounts/summary'),
import: (text: string, tag?: string) =>
api.post<MessageCountResponse, MessageCountResponse>('/accounts/import', { text, tag: tag || '' }),
assign: (id: number, assigned_to: number | null) =>
api.put<MessageResponse, MessageResponse>(`/accounts/${id}/assign`, { assigned_to }),
batchAssign: (account_ids: number[], assigned_to: number | null) =>
api.post<MessageCountResponse, MessageCountResponse>('/accounts/batch-assign', { account_ids, assigned_to }),
// 同一接口的选择集版本:可带筛选条件(all_matching),供「按筛选全选」分配
batchAssignSelection: (data: BatchAssignRequest) =>
api.post<MessageCountResponse, MessageCountResponse>('/accounts/batch-assign', data),
assignmentsSummary: () =>
api.get<AssignmentsSummary, AssignmentsSummary>('/accounts/assignments/summary'),
setRemark: (id: number, remark: string) =>
api.put<MessageResponse, MessageResponse>(`/accounts/${id}/remark`, { remark }),
setTag: (id: number, tag: string) =>
api.put<MessageResponse, MessageResponse>(`/accounts/${id}/tag`, { tag }),
batchTag: (account_ids: number[], tag: string) =>
api.put<MessageCountResponse, MessageCountResponse>('/accounts/batch-tag', { account_ids, tag }),
batchTagSelection: (data: AccountBulkTagRequest) =>
api.put<MessageCountResponse, MessageCountResponse>('/accounts/batch-tag-selection', data),
listTags: () => api.get<string[], string[]>('/accounts/tags/list'),
delete: (id: number) => api.delete<MessageResponse, MessageResponse>(`/accounts/${id}`),
batchDelete: (account_ids: number[]) =>
api.delete<MessageDeletedResponse, MessageDeletedResponse>('/accounts/batch/delete', { params: { account_ids: account_ids.join(',') } }),
batchDeleteSelection: (data: AccountBulkSelection) =>
api.post<MessageDeletedResponse, MessageDeletedResponse>('/accounts/batch-delete', data),
// 生命周期:disabled / archived / auto(恢复自动推导)
setLifecycle: (id: number, status: string, reason = '') =>
api.put<MessageResponse, MessageResponse>(`/accounts/${id}/lifecycle`, { status, reason }),
// 自动化开关:false = 账号可用但自动化不碰它
setAutomation: (id: number, auto_managed: boolean) =>
api.put<MessageResponse, MessageResponse>(`/accounts/${id}/automation`, { auto_managed }),
// 详情页:状态卡 + 统计
overview: (id: number) => api.get<AccountOverview, AccountOverview>(`/accounts/${id}/overview`),
// 三个作用域的**官方**兑换记录(点列表那一格时按需拉取,不进列表响应)
exchangeRecords: (id: number) =>
api.get<AccountExchangeRecords, AccountExchangeRecords>(`/accounts/${id}/exchange-records`),
// 时间线(倒序分页),event_type 为空表示全部
events: (
id: number,
params: { page?: number; page_size?: number; event_type?: string; category?: string },
) =>
api.get<AccountEventPage, AccountEventPage>(`/accounts/${id}/events`, {
params: {
page: 1,
page_size: 50,
...params,
event_type: params.event_type || '',
category: params.category || '',
},
}),
};