refactor(web): 拆 lib/api.ts 789→109 barrel + lib/api/ 8域文件(纯搬移零逻辑)
- lib/api/{core,auth,chat,sessions,personas,admin,adminChannels,adminSystem}.ts
- api.ts 改纯 barrel 显式 re-export(export type for types, isolatedModules); 导出名 77→77, 36处导入点零改动
- 代码行多重集比对一致(仅 request/limitQuery 各加一 export 供兄弟模块); 每文件≤500/函数≤80
- 前端 build 绿(165 modules)
This commit is contained in:
1 parent
153a9d6211
commit
4c3c98d5d4
9 files changed
+903
-779
No files matched your search
@@ -0,0 +1,86 @@
|
||||
import type { ChatMessage, Mode, SessionMeta } from "../types";
|
||||
import { request } from "./core";
|
||||
|
||||
/** One chat message as returned by GET /api/v1/sessions/{id}/messages. Mirrors
|
||||
* the `chat_messages` row; `mode`/`mood`/`image`/`thinking` are optional. */
|
||||
export interface MessageDto {
|
||||
id: string;
|
||||
sessionId: string;
|
||||
role: "user" | "assistant" | "system";
|
||||
content: string;
|
||||
mode?: Mode;
|
||||
mood?: string;
|
||||
image?: string;
|
||||
thinking?: string;
|
||||
/** Source-platform tag (design/16 §4.4): "web" or an IM channel platform. */
|
||||
platform?: string;
|
||||
/** Concrete client/device that produced the message (design/16 §4.5). */
|
||||
deviceId?: string;
|
||||
/** Sender display name of a third-party message (design/16 §4.6). Blank for the owner. */
|
||||
senderName?: string;
|
||||
createdAt: number;
|
||||
}
|
||||
|
||||
/** Map a wire message into a display ChatMessage (carrying its sessionId). */
|
||||
function toChatMessage(m: MessageDto): ChatMessage {
|
||||
return {
|
||||
id: m.id,
|
||||
sessionId: m.sessionId,
|
||||
role: m.role,
|
||||
content: m.content,
|
||||
mode: m.mode,
|
||||
mood: m.mood,
|
||||
image: m.image,
|
||||
thinking: m.thinking,
|
||||
platform: m.platform,
|
||||
deviceId: m.deviceId,
|
||||
senderName: m.senderName,
|
||||
createdAt: m.createdAt,
|
||||
};
|
||||
}
|
||||
|
||||
/** GET /api/v1/sessions — the main + secondary sessions for this web account. */
|
||||
export function fetchSessions(): Promise<SessionMeta[]> {
|
||||
return request<SessionMeta[]>("/sessions");
|
||||
}
|
||||
|
||||
/** POST /api/v1/sessions — creates a new secondary session. */
|
||||
export function createSubSession(title?: string): Promise<SessionMeta> {
|
||||
return request<SessionMeta>("/sessions", {
|
||||
method: "POST",
|
||||
body: JSON.stringify(title ? { title } : {}),
|
||||
});
|
||||
}
|
||||
|
||||
/** GET /api/v1/sessions/{id}/messages?before=&limit=&platform= — hot-paginated
|
||||
* history, optionally filtered to one source platform (design/16 §4.4). The wire
|
||||
* returns newest-first, but callers render chronologically (oldest first), so we
|
||||
* reverse here: page 1 is the most recent `limit` messages in display order, and
|
||||
* `before` (the oldest message's createdAt) walks upward. The Web client omits
|
||||
* `platform` for the full shared main session; an IM adapter passes its own
|
||||
* platform to see only its lane. */
|
||||
export async function fetchMessages(
|
||||
sessionId: string,
|
||||
before?: number,
|
||||
limit = 50,
|
||||
platform?: string
|
||||
): Promise<ChatMessage[]> {
|
||||
const qs = new URLSearchParams();
|
||||
qs.set("limit", String(limit));
|
||||
if (before !== undefined) qs.set("before", String(before));
|
||||
if (platform) qs.set("platform", platform);
|
||||
const list = await request<MessageDto[]>(
|
||||
`/sessions/${encodeURIComponent(sessionId)}/messages?${qs.toString()}`
|
||||
);
|
||||
return list.map(toChatMessage).reverse();
|
||||
}
|
||||
|
||||
/** DELETE /api/v1/sessions/{id} — removes a secondary session (and its messages). */
|
||||
export function deleteSession(
|
||||
sessionId: string
|
||||
): Promise<{ id: string; deleted: true }> {
|
||||
return request<{ id: string; deleted: true }>(
|
||||
`/sessions/${encodeURIComponent(sessionId)}`,
|
||||
{ method: "DELETE" }
|
||||
);
|
||||
}
|
||||
Reference in new issue
Block a user