perf: filter Memos syncs at the API

This commit is contained in:
2026-07-19 05:08:55 +08:00
parent c6f8e9fff9
commit a2b3ca8924
+2 -1
View File
@@ -15,8 +15,9 @@ export async function getMemosIdentity(baseUrl: string, token: string) {
export function memoUrl(baseUrl: string, memoName: string) { const id = memoName.split("/").at(-1); return id ? `${baseUrl.replace(/\/$/, "")}/m/${encodeURIComponent(id)}` : null; } export function memoUrl(baseUrl: string, memoName: string) { const id = memoName.split("/").at(-1); return id ? `${baseUrl.replace(/\/$/, "")}/m/${encodeURIComponent(id)}` : null; }
export async function listMemos(baseUrl: string, token: string, rules: MemosSyncRules = {}) { export async function listMemos(baseUrl: string, token: string, rules: MemosSyncRules = {}) {
const all: MemosMemo[] = []; let pageToken = ""; const all: MemosMemo[] = []; let pageToken = "";
do { const res = await request(`${base(baseUrl)}/memos?pageSize=100${pageToken ? `&pageToken=${encodeURIComponent(pageToken)}` : ""}`, token); const data = await res.json(); all.push(...(data.memos || [])); pageToken = data.nextPageToken || ""; } while (pageToken);
const tags = rules.tags?.filter(Boolean) || []; const mode = rules.attachmentMode || "all"; const tags = rules.tags?.filter(Boolean) || []; const mode = rules.attachmentMode || "all";
const quote = (value: string) => JSON.stringify(value); const filters = [rules.creator && `creator == ${quote(rules.creator)}`, `visibility == "PUBLIC"`, ...tags.map((tag) => `tags.exists(t, t == ${quote(tag)})`)].filter(Boolean).join(" && ");
do { const params = new URLSearchParams({ pageSize: "100" }); if (pageToken) params.set("pageToken", pageToken); if (filters) params.set("filter", filters); const res = await request(`${base(baseUrl)}/memos?${params}`, token); const data = await res.json(); all.push(...(data.memos || [])); pageToken = data.nextPageToken || ""; } while (pageToken);
return all.filter((memo) => { return all.filter((memo) => {
if (memo.visibility !== "PUBLIC") return false; if (memo.visibility !== "PUBLIC") return false;
if (rules.creator && memo.creator !== rules.creator) return false; if (rules.creator && memo.creator !== rules.creator) return false;