Rocky_Mountain_Vending/convex/products.ts

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