60 lines
1.3 KiB
TypeScript
60 lines
1.3 KiB
TypeScript
import { mutation, query } from "./_generated/server";
|
|
import { v } from "convex/values";
|
|
import { syncFromEngineSnapshot } from "./domain";
|
|
|
|
export const getLatestSnapshot = query({
|
|
args: {},
|
|
handler: async (ctx) => {
|
|
const latest = await ctx.db
|
|
.query("state_snapshots")
|
|
.order("desc")
|
|
.first();
|
|
|
|
return latest
|
|
? {
|
|
snapshot: latest.snapshot,
|
|
updatedAt: latest.updatedAt,
|
|
}
|
|
: null;
|
|
},
|
|
});
|
|
|
|
export const saveSnapshot = mutation({
|
|
args: {
|
|
snapshot: v.any(),
|
|
updatedAt: v.string(),
|
|
syncToDomain: v.optional(v.boolean()),
|
|
},
|
|
handler: async (ctx, args) => {
|
|
const latest = await ctx.db
|
|
.query("state_snapshots")
|
|
.order("desc")
|
|
.first();
|
|
|
|
const shouldSync = Boolean(args.syncToDomain);
|
|
const syncSummary = shouldSync
|
|
? await syncFromEngineSnapshot(ctx, args.snapshot)
|
|
: null;
|
|
|
|
if (latest) {
|
|
await ctx.db.patch(latest._id, {
|
|
snapshot: args.snapshot,
|
|
updatedAt: args.updatedAt,
|
|
});
|
|
return {
|
|
snapshotId: latest._id,
|
|
syncSummary,
|
|
};
|
|
}
|
|
|
|
const snapshotId = await ctx.db.insert("state_snapshots", {
|
|
snapshot: args.snapshot,
|
|
updatedAt: args.updatedAt,
|
|
});
|
|
return {
|
|
snapshotId,
|
|
syncSummary,
|
|
};
|
|
},
|
|
});
|