FRE-709: Document duplicate recovery wake - FRE-635 already recovered via FRE-708
This commit is contained in:
75
server/trpc/beta-router.ts
Normal file
75
server/trpc/beta-router.ts
Normal file
@@ -0,0 +1,75 @@
|
||||
import { publicProcedure } from './router';
|
||||
import { z } from 'zod';
|
||||
import { eq } from 'drizzle-orm';
|
||||
import { waitlistSignups, waitlistEvents } from '../../src/db/schema';
|
||||
|
||||
export const betaRouter = {
|
||||
signup: publicProcedure
|
||||
.input(z.object({
|
||||
name: z.string().min(1).max(200),
|
||||
email: z.string().email(),
|
||||
primaryRole: z.string().max(100),
|
||||
scriptsWritten: z.string().max(50).optional(),
|
||||
currentSoftware: z.string().max(100).optional(),
|
||||
softwareLove: z.string().max(2000).optional(),
|
||||
softwareFrustrate: z.string().max(2000).optional(),
|
||||
hoursPerWeek: z.string().max(50).optional(),
|
||||
willingFeedback: z.string().max(100).optional(),
|
||||
joinDiscord: z.string().max(100).optional(),
|
||||
discordUsername: z.string().max(100).optional(),
|
||||
excitedFeatures: z.array(z.string()).optional(),
|
||||
heardAbout: z.string().max(100).optional(),
|
||||
additionalInfo: z.string().max(2000).optional(),
|
||||
}))
|
||||
.mutation(async ({ input, ctx }) => {
|
||||
const existingRows = await ctx.db!.select()
|
||||
.from(waitlistSignups)
|
||||
.where(eq(waitlistSignups.email, input.email.toLowerCase()));
|
||||
const existing = existingRows[0];
|
||||
|
||||
if (existing) {
|
||||
return { success: true, alreadyApplied: true, id: existing.id };
|
||||
}
|
||||
|
||||
const betaData = {
|
||||
primaryRole: input.primaryRole,
|
||||
scriptsWritten: input.scriptsWritten,
|
||||
currentSoftware: input.currentSoftware,
|
||||
softwareLove: input.softwareLove,
|
||||
softwareFrustrate: input.softwareFrustrate,
|
||||
hoursPerWeek: input.hoursPerWeek,
|
||||
willingFeedback: input.willingFeedback,
|
||||
joinDiscord: input.joinDiscord,
|
||||
discordUsername: input.discordUsername,
|
||||
excitedFeatures: input.excitedFeatures?.join(', ') || '',
|
||||
heardAbout: input.heardAbout,
|
||||
additionalInfo: input.additionalInfo,
|
||||
};
|
||||
|
||||
const metadata: Record<string, unknown> = {
|
||||
isBetaApplication: true,
|
||||
...betaData,
|
||||
};
|
||||
|
||||
const result = await ctx.db!.insert(waitlistSignups)
|
||||
.values({
|
||||
email: input.email.toLowerCase(),
|
||||
name: input.name,
|
||||
source: 'beta',
|
||||
status: 'beta-pending',
|
||||
metadata: JSON.stringify(metadata),
|
||||
})
|
||||
.returning();
|
||||
|
||||
const signup = result[0];
|
||||
|
||||
await ctx.db!.insert(waitlistEvents)
|
||||
.values({
|
||||
signupId: signup!.id,
|
||||
eventType: 'beta-application',
|
||||
eventData: JSON.stringify(betaData),
|
||||
});
|
||||
|
||||
return { success: true, alreadyApplied: false, id: signup!.id };
|
||||
}),
|
||||
};
|
||||
@@ -3,6 +3,7 @@ import { projectRouter } from './project-router';
|
||||
import { revisionsRouter } from './revisions-router';
|
||||
import { scriptsRouter } from './scripts-router';
|
||||
import { waitlistRouter } from './waitlist-router';
|
||||
import { betaRouter } from './beta-router';
|
||||
import type { TRPCContext } from './types';
|
||||
import type { TRPCError } from '@trpc/server';
|
||||
import { t } from './router';
|
||||
@@ -13,6 +14,7 @@ export const appRouter = t.router({
|
||||
revisions: revisionsRouter,
|
||||
scripts: scriptsRouter,
|
||||
waitlist: waitlistRouter,
|
||||
beta: betaRouter,
|
||||
} as const);
|
||||
|
||||
export type AppRouter = typeof appRouter;
|
||||
|
||||
Reference in New Issue
Block a user