Files
mnote/wolai-frontend/convex/recents.ts
T
2026-01-17 10:12:53 +08:00

50 lines
1.6 KiB
TypeScript

import { mutation, query } from "./_generated/server";
import { v } from "convex/values";
export const listByWorkspace = query({
args: { userId: v.string(), workspaceId: v.string(), limit: v.optional(v.number()) },
handler: async (ctx, args) => {
const rows = await ctx.db
.query("user_recent_pages")
.withIndex("by_user_workspace", (q) => q.eq("user_id", args.userId).eq("workspace_id", args.workspaceId))
.collect();
const sorted = rows.sort((a, b) => (b.last_accessed_at ?? "").localeCompare(a.last_accessed_at ?? ""));
const limit = Math.max(0, Math.min(args.limit ?? 10, 50));
return sorted.slice(0, limit).map((r) => ({
user_id: r.user_id,
workspace_id: r.workspace_id,
document_id: r.document_id,
last_accessed_at: r.last_accessed_at,
}));
},
});
export const upsert = mutation({
args: { userId: v.string(), workspaceId: v.string(), documentId: v.string(), lastAccessedAt: v.string() },
handler: async (ctx, args) => {
const existing = await ctx.db
.query("user_recent_pages")
.withIndex("by_user_document", (q) => q.eq("user_id", args.userId).eq("document_id", args.documentId))
.first();
if (existing) {
await ctx.db.patch(existing._id, {
workspace_id: args.workspaceId,
last_accessed_at: args.lastAccessedAt,
});
return { ok: true, updated: true };
}
await ctx.db.insert("user_recent_pages", {
user_id: args.userId,
workspace_id: args.workspaceId,
document_id: args.documentId,
last_accessed_at: args.lastAccessedAt,
});
return { ok: true, updated: false };
},
});