// handlers/queue-events.ts
interface ConsumerAdmittedData {
consumerId: string;
experienceId: string;
distributionId: string;
admissionToken: string;
admittedAt: string;
expiresAt: string;
position: number;
waitTimeSeconds: number;
}
async function handleConsumerAdmitted(data: ConsumerAdmittedData) {
const { consumerId, experienceId, distributionId, admissionToken, expiresAt } = data;
// Store admission record
await db.insert(admissions).values({
consumerId,
experienceId,
distributionId,
token: admissionToken,
expiresAt: new Date(expiresAt),
status: "active",
});
// Get consumer contact info
const consumer = await db.query.consumers.findFirst({
where: eq(consumers.id, consumerId),
});
// Send notification
if (consumer?.email) {
await sendEmail({
to: consumer.email,
subject: "You're in! Complete your purchase",
template: "admission-granted",
data: {
expiresAt: new Date(expiresAt).toLocaleString(),
checkoutUrl: `https://your-store.com/checkout?token=${admissionToken}`,
},
});
}
// Track analytics
await analytics.track("admission_granted", {
consumerId,
experienceId,
waitTime: data.waitTimeSeconds,
});
}
interface AdmissionCompletedData {
consumerId: string;
experienceId: string;
distributionId: string;
orderId?: string;
completedAt: string;
}
async function handleAdmissionCompleted(data: AdmissionCompletedData) {
const { consumerId, experienceId, orderId, completedAt } = data;
// Update admission status
await db
.update(admissions)
.set({
status: "completed",
completedAt: new Date(completedAt),
orderId,
})
.where(and(eq(admissions.consumerId, consumerId), eq(admissions.experienceId, experienceId)));
// Track conversion
await analytics.track("admission_converted", {
consumerId,
experienceId,
orderId,
});
}
interface AdmissionExpiredData {
consumerId: string;
experienceId: string;
distributionId: string;
expiredAt: string;
}
async function handleAdmissionExpired(data: AdmissionExpiredData) {
const { consumerId, experienceId, expiredAt } = data;
// Update admission status
await db
.update(admissions)
.set({
status: "expired",
expiredAt: new Date(expiredAt),
})
.where(and(eq(admissions.consumerId, consumerId), eq(admissions.experienceId, experienceId)));
// Release any reserved inventory
await releaseReservations(consumerId, experienceId);
// Track abandonment
await analytics.track("admission_expired", {
consumerId,
experienceId,
});
}