Files
Gabriel Brown 2dfa97ee4f
Build and Push Next App / quality (push) Failing after 48s
Build and Push Next App / build-next (push) Has been skipped
Add agent workflows & stuff
2026-06-21 21:15:15 -05:00

59 lines
1.6 KiB
TypeScript

import { ConvexError, v } from 'convex/values';
import { mutation, query } from './_generated/server';
import {
getOwnedSpoon,
getRequiredUserId,
optionalText,
requireText,
} from './model';
export const listForSpoon = query({
args: { spoonId: v.id('spoons') },
handler: async (ctx, { spoonId }) => {
const ownerId = await getRequiredUserId(ctx);
await getOwnedSpoon(ctx, spoonId, ownerId);
return await ctx.db
.query('spoonRemotes')
.withIndex('by_spoon', (q) => q.eq('spoonId', spoonId))
.order('asc')
.collect();
},
});
export const create = mutation({
args: {
spoonId: v.id('spoons'),
label: v.string(),
url: v.string(),
remoteName: v.optional(v.string()),
},
handler: async (ctx, args) => {
const ownerId = await getRequiredUserId(ctx);
await getOwnedSpoon(ctx, args.spoonId, ownerId);
const now = Date.now();
return await ctx.db.insert('spoonRemotes', {
spoonId: args.spoonId,
ownerId,
label: requireText(args.label, 'Remote label'),
url: requireText(args.url, 'Remote URL'),
remoteName: optionalText(args.remoteName),
createdAt: now,
updatedAt: now,
});
},
});
export const remove = mutation({
args: { remoteId: v.id('spoonRemotes') },
handler: async (ctx, { remoteId }) => {
const ownerId = await getRequiredUserId(ctx);
const remote = await ctx.db.get(remoteId);
if (remote?.ownerId !== ownerId) {
throw new ConvexError('Remote not found.');
}
await ctx.db.delete(remoteId);
return { success: true };
},
});