feat: connect explore datasets to backend

This commit is contained in:
2026-07-23 15:07:35 +08:00
parent 0ca2898ac0
commit 26dd3004a1
14 changed files with 1445 additions and 196 deletions

View File

@@ -0,0 +1,105 @@
import { apiRequest, type ApiSession } from './client'
export type DatasetSourceKind = 'manual' | 'link' | 'rss'
export type DatasetSourceDTO = {
id: string
name: string
kind: DatasetSourceKind
url: string
description: string
enabled: boolean
lastSyncedAt: string | null
itemCount: number
createdAt: string
updatedAt: string
}
export type DatasetItemDTO = {
id: string
sourceId: string
title: string
summary: string
content: string
url: string
status: 'unread' | 'read' | 'archived'
starred: boolean
publishedAt: string | null
createdAt: string
updatedAt: string
}
export type DatasetCronDTO = {
id: string
sourceId: string
schedule: string
status: string
enabled: boolean
nextRunAt: string | null
lastRunAt: string | null
lastResult: string
createdAt: string
updatedAt: string
}
export type DatasetSourceInput = {
name: string
kind: DatasetSourceKind
url: string
description: string
enabled: boolean
}
export type DatasetItemUpdate = {
status: DatasetItemDTO['status']
starred: boolean
}
export function listDatasetSources(session: ApiSession, signal?: AbortSignal) {
return apiRequest<DatasetSourceDTO[]>('/api/v1/dataset-sources', { token: session.token, signal })
}
export function createDatasetSource(session: ApiSession, input: DatasetSourceInput) {
return apiRequest<DatasetSourceDTO>('/api/v1/dataset-sources', {
method: 'POST',
token: session.token,
body: input,
})
}
export function updateDatasetSource(session: ApiSession, sourceId: string, input: DatasetSourceInput) {
return apiRequest<DatasetSourceDTO>(`/api/v1/dataset-sources/${sourceId}`, {
method: 'PATCH',
token: session.token,
body: input,
})
}
export function deleteDatasetSource(session: ApiSession, sourceId: string) {
return apiRequest<void>(`/api/v1/dataset-sources/${sourceId}`, {
method: 'DELETE',
token: session.token,
responseType: 'void',
})
}
export function listDatasetItems(session: ApiSession, sourceId?: string, signal?: AbortSignal) {
const query = sourceId ? `?sourceId=${encodeURIComponent(sourceId)}` : ''
return apiRequest<DatasetItemDTO[]>(`/api/v1/dataset-items${query}`, { token: session.token, signal })
}
export function updateDatasetItem(session: ApiSession, itemId: string, input: DatasetItemUpdate) {
return apiRequest<DatasetItemDTO>(`/api/v1/dataset-items/${itemId}`, {
method: 'PATCH',
token: session.token,
body: input,
})
}
export function queueDatasetSync(session: ApiSession) {
return apiRequest<DatasetCronDTO[]>('/api/v1/dataset-crons/sync', {
method: 'POST',
token: session.token,
body: {},
})
}