124 lines
3 KiB
TypeScript
124 lines
3 KiB
TypeScript
// @ts-nocheck
|
|
import { mutation, query } from "./_generated/server";
|
|
import { v } from "convex/values";
|
|
|
|
const productArgs = {
|
|
id: v.optional(v.id("products")),
|
|
name: v.string(),
|
|
description: v.optional(v.string()),
|
|
price: v.number(),
|
|
currency: v.string(),
|
|
images: v.array(v.string()),
|
|
metadata: v.optional(v.record(v.string(), v.string())),
|
|
stripeProductId: v.optional(v.string()),
|
|
stripePriceId: v.optional(v.string()),
|
|
active: v.boolean(),
|
|
featured: v.optional(v.boolean()),
|
|
};
|
|
|
|
export const listActive = query({
|
|
args: {},
|
|
handler: async (ctx) => {
|
|
return await ctx.db
|
|
.query("products")
|
|
.withIndex("by_active", (q) => q.eq("active", true))
|
|
.collect();
|
|
},
|
|
});
|
|
|
|
export const listAdmin = query({
|
|
args: {
|
|
search: v.optional(v.string()),
|
|
},
|
|
handler: async (ctx, args) => {
|
|
const products = await ctx.db.query("products").collect();
|
|
const search = args.search?.trim().toLowerCase();
|
|
if (!search) {
|
|
return products.sort((a, b) => a.name.localeCompare(b.name));
|
|
}
|
|
return products
|
|
.filter((product) => {
|
|
return (
|
|
product.name.toLowerCase().includes(search) ||
|
|
product.description?.toLowerCase().includes(search)
|
|
);
|
|
})
|
|
.sort((a, b) => a.name.localeCompare(b.name));
|
|
},
|
|
});
|
|
|
|
export const getById = query({
|
|
args: {
|
|
id: v.id("products"),
|
|
},
|
|
handler: async (ctx, args) => {
|
|
return await ctx.db.get(args.id);
|
|
},
|
|
});
|
|
|
|
export const upsert = mutation({
|
|
args: productArgs,
|
|
handler: async (ctx, args) => {
|
|
const now = Date.now();
|
|
if (args.id) {
|
|
await ctx.db.patch(args.id, {
|
|
name: args.name,
|
|
description: args.description,
|
|
price: args.price,
|
|
currency: args.currency,
|
|
images: args.images,
|
|
metadata: args.metadata,
|
|
stripeProductId: args.stripeProductId,
|
|
stripePriceId: args.stripePriceId,
|
|
active: args.active,
|
|
featured: args.featured,
|
|
updatedAt: now,
|
|
});
|
|
return await ctx.db.get(args.id);
|
|
}
|
|
|
|
const id = await ctx.db.insert("products", {
|
|
name: args.name,
|
|
description: args.description,
|
|
price: args.price,
|
|
currency: args.currency,
|
|
images: args.images,
|
|
metadata: args.metadata,
|
|
stripeProductId: args.stripeProductId,
|
|
stripePriceId: args.stripePriceId,
|
|
active: args.active,
|
|
featured: args.featured,
|
|
createdAt: now,
|
|
updatedAt: now,
|
|
});
|
|
return await ctx.db.get(id);
|
|
},
|
|
});
|
|
|
|
export const deactivate = mutation({
|
|
args: {
|
|
id: v.id("products"),
|
|
},
|
|
handler: async (ctx, args) => {
|
|
await ctx.db.patch(args.id, {
|
|
active: false,
|
|
updatedAt: Date.now(),
|
|
});
|
|
return await ctx.db.get(args.id);
|
|
},
|
|
});
|
|
|
|
export const bulkDeactivate = mutation({
|
|
args: {
|
|
ids: v.array(v.id("products")),
|
|
},
|
|
handler: async (ctx, args) => {
|
|
const now = Date.now();
|
|
const results = [];
|
|
for (const id of args.ids) {
|
|
await ctx.db.patch(id, { active: false, updatedAt: now });
|
|
results.push(await ctx.db.get(id));
|
|
}
|
|
return results;
|
|
},
|
|
});
|