Files
crawler-plugin/admin-frontend-vue/src/pages/shop/shop-key-api.ts
T

68 lines
2.8 KiB
TypeScript

/** 店铺密钥列表加载与新增适配(任务 82/84):GET/POST /api/admin/shop-keys + 归一与解析。 */
import { http } from '@/api/http'
import { unwrap } from '@/api/envelope'
import { parseShopKeyPage, toShopKeyItem } from './shop-key-model.ts'
import {
normalizeKeyListParams,
toKeyPageQuery,
type ShopKeyItem,
type ShopKeyListParams,
type ShopKeyPageResult,
} from './shop-dto.ts'
import {
toShopKeyCreateRequest,
validateShopKeyForm,
type ShopKeyFormValues,
} from './shop-key-form-model.ts'
export const SHOP_KEYS_ENDPOINT = '/api/admin/shop-keys'
export async function fetchShopKeyList(params: Partial<ShopKeyListParams> = {}): Promise<ShopKeyPageResult> {
const normalized = normalizeKeyListParams(params)
const { data } = await http.get<unknown>(SHOP_KEYS_ENDPOINT, { params: toKeyPageQuery(normalized) })
return parseShopKeyPage(data)
}
/** 提交新增店铺密钥:先校验(失败抛首条错误不发请求),再 POST,解析返回的新记录。 */
export async function submitCreateShopKey(form: ShopKeyFormValues): Promise<ShopKeyItem> {
const { valid, errors } = validateShopKeyForm(form)
if (!valid) {
throw new Error(Object.values(errors)[0] || '店铺密钥表单校验未通过')
}
const { data } = await http.post<unknown>(SHOP_KEYS_ENDPOINT, toShopKeyCreateRequest(form))
const item = toShopKeyItem(unwrap<unknown>(data))
if (!item) {
throw new Error('新增店铺密钥响应异常:未返回有效记录')
}
return item
}
/** 提交更新店铺密钥:编辑沿用原令牌/账号,更新体字段与新增一致;PUT /api/admin/shop-keys/{id}。 */
export async function updateShopKey(id: number, form: ShopKeyFormValues): Promise<ShopKeyItem> {
const { valid, errors } = validateShopKeyForm(form)
if (!valid) {
throw new Error(Object.values(errors)[0] || '店铺密钥表单校验未通过')
}
const { data } = await http.put<unknown>(`${SHOP_KEYS_ENDPOINT}/${id}`, toShopKeyCreateRequest(form))
const item = toShopKeyItem(unwrap<unknown>(data))
if (!item) {
throw new Error('更新店铺密钥响应异常:未返回有效记录')
}
return item
}
/** 删除店铺密钥:DELETE /api/admin/shop-keys/{id};成功后由调用方按目标页刷新。 */
export async function deleteShopKey(id: number): Promise<void> {
await http.delete<unknown>(`${SHOP_KEYS_ENDPOINT}/${id}`)
}
/** 手动检测 IP 白名单:POST /api/admin/shop-keys/{id}/check-whitelist;返回更新后的记录。 */
export async function checkShopKeyWhitelist(id: number): Promise<ShopKeyItem> {
const { data } = await http.post<unknown>(`${SHOP_KEYS_ENDPOINT}/${id}/check-whitelist`)
const item = toShopKeyItem(unwrap<unknown>(data))
if (!item) {
throw new Error('白名单检测响应异常:未返回有效记录')
}
return item
}