65 lines
1.7 KiB
TypeScript
65 lines
1.7 KiB
TypeScript
import { getUser } from './auth';
|
|
import { apiRequest } from '../services/api-request';
|
|
import {
|
|
legacyWorksheet,
|
|
memberStats,
|
|
type MemberPage,
|
|
} from '../services/member-api';
|
|
import { generateUUID } from './uuid';
|
|
|
|
export interface DownloadLogRecord {
|
|
_id: string;
|
|
worksheetId: string;
|
|
exportId?: string | null;
|
|
createdAt: string;
|
|
worksheet?: {
|
|
_id: string;
|
|
title: string;
|
|
subtitle: string;
|
|
category: string;
|
|
subcategory: string;
|
|
path: string;
|
|
ageMin?: number;
|
|
ageMax?: number;
|
|
difficulty?: number;
|
|
previewImg: string;
|
|
} | null;
|
|
}
|
|
|
|
/** 一次成功保存沿用同一个 exportId,服务端保证记录及下载计数幂等。 */
|
|
export async function addDownloadLog(
|
|
worksheetId: string,
|
|
exportId = generateUUID(),
|
|
expectedUserId?: string,
|
|
): Promise<boolean> {
|
|
if (!worksheetId) return false;
|
|
try {
|
|
const user = await getUser();
|
|
if (expectedUserId && user.id !== expectedUserId) return false;
|
|
await apiRequest('/me/downloads', {
|
|
method: 'POST',
|
|
data: { worksheetId, exportId },
|
|
});
|
|
return true;
|
|
} catch {
|
|
return false;
|
|
}
|
|
}
|
|
export const DOWNLOAD_HISTORY_MAX = 30;
|
|
export async function getDownloadLogs(
|
|
page = 1,
|
|
pageSize = DOWNLOAD_HISTORY_MAX,
|
|
): Promise<DownloadLogRecord[]> {
|
|
const result = await apiRequest<MemberPage>('/me/downloads', {
|
|
data: { page, pageSize },
|
|
});
|
|
return result.items.map((row) => ({
|
|
...row,
|
|
_id: row.id,
|
|
worksheet: legacyWorksheet(row.worksheet),
|
|
}));
|
|
}
|
|
export async function getDownloadLogCount(): Promise<number> {
|
|
return (await memberStats()).downloadCount;
|
|
}
|