import { defineRateLimits } from 'convex-helpers/server/rateLimit';
import { ConvexError, v } from 'convex/values';
import { mutation } from './_generated/server';
const SECOND = 1000; // ms
const MINUTE = 60 * SECOND;
const HOUR = 60 * MINUTE;
const { rateLimit, checkRateLimit, resetRateLimit } = defineRateLimits({
newsletterSignUpRateLimit: { kind: 'fixed window', rate: 3, period: HOUR },
});
export const addEmail = mutation({
args: {
email: v.string(),
subscriptionDate: v.string(),
isActive: v.boolean(),
},
handler: async (ctx, args) => {
// Make sure the rate limit is not exceeded
// const { ok, retryAt } = await rateLimit(ctx, {
// name: 'newsletterSignUpRateLimit',
// });
// if (!ok) return { retryAt };
// Check if email already exists, if so, return error, else insert
const existingEmail = await ctx.db
.query('newsletters')
.withIndex('by_email', (q) => q.eq('email', args.email))
.first();
if (existingEmail) {
throw new ConvexError('Email already exists');
}
return await ctx.db.insert('newsletters', {
email: args.email,
subscriptionDate: args.subscriptionDate,
isActive: args.isActive,
});
},
});
import { defineRateLimits } from 'convex-helpers/server/rateLimit';
import { ConvexError, v } from 'convex/values';
import { mutation } from './_generated/server';
const SECOND = 1000; // ms
const MINUTE = 60 * SECOND;
const HOUR = 60 * MINUTE;
const { rateLimit, checkRateLimit, resetRateLimit } = defineRateLimits({
newsletterSignUpRateLimit: { kind: 'fixed window', rate: 3, period: HOUR },
});
export const addEmail = mutation({
args: {
email: v.string(),
subscriptionDate: v.string(),
isActive: v.boolean(),
},
handler: async (ctx, args) => {
// Make sure the rate limit is not exceeded
// const { ok, retryAt } = await rateLimit(ctx, {
// name: 'newsletterSignUpRateLimit',
// });
// if (!ok) return { retryAt };
// Check if email already exists, if so, return error, else insert
const existingEmail = await ctx.db
.query('newsletters')
.withIndex('by_email', (q) => q.eq('email', args.email))
.first();
if (existingEmail) {
throw new ConvexError('Email already exists');
}
return await ctx.db.insert('newsletters', {
email: args.email,
subscriptionDate: args.subscriptionDate,
isActive: args.isActive,
});
},
});