70 lines
2.3 KiB
TypeScript
70 lines
2.3 KiB
TypeScript
import { mutation, query } from "./_generated/server";
|
|
import { v } from "convex/values";
|
|
import { getAuthUserId } from "@convex-dev/auth/server";
|
|
|
|
export const getProjects = query({
|
|
args: {},
|
|
handler: async (ctx) => {
|
|
const userId = await getAuthUserId(ctx);
|
|
if (!userId) return [];
|
|
return await ctx.db
|
|
.query("projects")
|
|
.withIndex("by_owner", (q) => q.eq("userId", userId))
|
|
.collect();
|
|
},
|
|
});
|
|
|
|
export const getDefaultProject = query({
|
|
args: {},
|
|
handler: async (ctx) => {
|
|
const userId = await getAuthUserId(ctx);
|
|
if (!userId) return null;
|
|
return await ctx.db
|
|
.query("projects")
|
|
.filter((q) => q.and(q.eq(q.field("userId"), userId), q.eq(q.field("isDefault"), true)))
|
|
.first();
|
|
},
|
|
});
|
|
|
|
export const createProject = mutation({
|
|
args: { name: v.string(), isDefault: v.boolean() },
|
|
handler: async (ctx, args) => {
|
|
const userId = await getAuthUserId(ctx);
|
|
if (!userId) throw new Error("Unauthorized");
|
|
|
|
// If setting as default, unset other defaults? For now assume handled by UI or logic
|
|
// Actually simplicity: just create.
|
|
|
|
return await ctx.db.insert("projects", {
|
|
userId,
|
|
name: args.name,
|
|
isDefault: args.isDefault,
|
|
dorkingConfig: { selectedSourceIds: [] },
|
|
});
|
|
},
|
|
});
|
|
|
|
export const toggleDataSourceConfig = mutation({
|
|
args: { projectId: v.id("projects"), sourceId: v.id("dataSources"), selected: v.boolean() },
|
|
handler: async (ctx, args) => {
|
|
const userId = await getAuthUserId(ctx);
|
|
if (!userId) throw new Error("Unauthorized");
|
|
|
|
const project = await ctx.db.get(args.projectId);
|
|
if (!project || project.userId !== userId) throw new Error("Project not found or unauthorized");
|
|
|
|
let newSelectedIds = project.dorkingConfig.selectedSourceIds;
|
|
if (args.selected) {
|
|
if (!newSelectedIds.includes(args.sourceId)) {
|
|
newSelectedIds.push(args.sourceId);
|
|
}
|
|
} else {
|
|
newSelectedIds = newSelectedIds.filter((id) => id !== args.sourceId);
|
|
}
|
|
|
|
await ctx.db.patch(args.projectId, {
|
|
dorkingConfig: { selectedSourceIds: newSelectedIds },
|
|
});
|
|
},
|
|
});
|