Files
xarticleaudio/convex/state.ts

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,
};
},
});