50 lines
1.6 KiB
TypeScript
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 };
|
|
},
|
|
});
|
|
|