98 lines
2.4 KiB
TypeScript
98 lines
2.4 KiB
TypeScript
|
|
// Typed endpoint wrappers for the M5b browse experience.
|
||
|
|
//
|
||
|
|
// Mirrors the FastAPI routes in yunke-server/app/api/routers/. Each wrapper
|
||
|
|
// drops `undefined`/empty params so the query string only carries set filters
|
||
|
|
// (the backend treats missing as "no filter").
|
||
|
|
import { getJson } from './client'
|
||
|
|
import type {
|
||
|
|
Channel,
|
||
|
|
Customer,
|
||
|
|
Department,
|
||
|
|
Message,
|
||
|
|
Page,
|
||
|
|
Staff,
|
||
|
|
} from './types'
|
||
|
|
|
||
|
|
/** Drop entries whose value is `undefined`, `null`, or `''`. */
|
||
|
|
function clean(params: Record<string, unknown>): Record<string, unknown> {
|
||
|
|
const out: Record<string, unknown> = {}
|
||
|
|
for (const [k, v] of Object.entries(params)) {
|
||
|
|
if (v === undefined || v === null || v === '') continue
|
||
|
|
out[k] = v
|
||
|
|
}
|
||
|
|
return out
|
||
|
|
}
|
||
|
|
|
||
|
|
export interface CustomerQuery {
|
||
|
|
channel?: Channel | 'all'
|
||
|
|
page?: number
|
||
|
|
page_size?: number
|
||
|
|
owner_account_id?: string
|
||
|
|
department_id?: string
|
||
|
|
}
|
||
|
|
|
||
|
|
export function getCustomers(query: CustomerQuery = {}): Promise<Page<Customer>> {
|
||
|
|
return getJson<Page<Customer>>(
|
||
|
|
'/customers',
|
||
|
|
clean({
|
||
|
|
page: query.page ?? 1,
|
||
|
|
page_size: query.page_size ?? 20,
|
||
|
|
channel: query.channel === 'all' ? undefined : query.channel,
|
||
|
|
owner_account_id: query.owner_account_id,
|
||
|
|
department_id: query.department_id,
|
||
|
|
}),
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
export interface MessageQuery {
|
||
|
|
channel?: Channel
|
||
|
|
owner_account_id: string
|
||
|
|
talker_id?: string
|
||
|
|
room_id?: string
|
||
|
|
start?: number
|
||
|
|
end?: number
|
||
|
|
page?: number
|
||
|
|
page_size?: number
|
||
|
|
}
|
||
|
|
|
||
|
|
export function getMessages(query: MessageQuery): Promise<Page<Message>> {
|
||
|
|
return getJson<Page<Message>>(
|
||
|
|
'/messages',
|
||
|
|
clean({
|
||
|
|
channel: query.channel,
|
||
|
|
owner_account_id: query.owner_account_id,
|
||
|
|
talker_id: query.talker_id,
|
||
|
|
room_id: query.room_id,
|
||
|
|
start: query.start,
|
||
|
|
end: query.end,
|
||
|
|
page: query.page ?? 1,
|
||
|
|
page_size: query.page_size ?? 50,
|
||
|
|
}),
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
export function getDepartments(): Promise<Department[]> {
|
||
|
|
return getJson<Department[]>('/departments')
|
||
|
|
}
|
||
|
|
|
||
|
|
export interface StaffQuery {
|
||
|
|
department_id?: string
|
||
|
|
is_on_job?: boolean
|
||
|
|
page?: number
|
||
|
|
page_size?: number
|
||
|
|
}
|
||
|
|
|
||
|
|
export function getStaff(query: StaffQuery = {}): Promise<Page<Staff>> {
|
||
|
|
return getJson<Page<Staff>>(
|
||
|
|
'/staff',
|
||
|
|
clean({
|
||
|
|
department_id: query.department_id,
|
||
|
|
is_on_job: query.is_on_job,
|
||
|
|
page: query.page ?? 1,
|
||
|
|
page_size: query.page_size ?? 20,
|
||
|
|
}),
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
export type { Channel, Customer, Department, Message, Page, Staff }
|