Initial commit: Next.js rewrite of Super Bowl Squares app
Full rewrite of the legacy PHP/MySQL app using Next.js 14, PostgreSQL, Prisma, NextAuth, Tailwind CSS, and WebSocket-based live chat/grid updates. Deployed via Docker Compose with a custom Node.js server for WebSocket support. Fix chat display names by passing userId from the NextAuth session over WebSocket instead of attempting to read the HttpOnly session cookie (which is inaccessible to JavaScript). Server now looks up the user's first name from the database using the userId. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+118
@@ -0,0 +1,118 @@
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
async function main() {
|
||||
// Seed 100 squares (positions "00" through "99")
|
||||
const squares = [];
|
||||
for (let row = 0; row < 10; row++) {
|
||||
for (let col = 0; col < 10; col++) {
|
||||
const position = `${row}${col}`;
|
||||
squares.push({ position });
|
||||
}
|
||||
}
|
||||
|
||||
for (const square of squares) {
|
||||
await prisma.square.upsert({
|
||||
where: { position: square.position },
|
||||
update: {},
|
||||
create: square,
|
||||
});
|
||||
}
|
||||
|
||||
// Seed default game settings
|
||||
await prisma.gameSettings.upsert({
|
||||
where: { id: 'singleton' },
|
||||
update: {},
|
||||
create: {
|
||||
id: 'singleton',
|
||||
title: 'Super Bowl Squares',
|
||||
commissioner: 'Commissioner',
|
||||
eventName: 'Super Bowl',
|
||||
betAmount: 10,
|
||||
winFirstPct: 20,
|
||||
winSecondPct: 20,
|
||||
winThirdPct: 20,
|
||||
winFinalPct: 30,
|
||||
donationPct: 10,
|
||||
graceHours: 48,
|
||||
},
|
||||
});
|
||||
|
||||
// Seed default score row
|
||||
await prisma.score.upsert({
|
||||
where: { id: 'singleton' },
|
||||
update: {},
|
||||
create: { id: 'singleton' },
|
||||
});
|
||||
|
||||
// Seed default email settings
|
||||
await prisma.emailSettings.upsert({
|
||||
where: { id: 'singleton' },
|
||||
update: {},
|
||||
create: { id: 'singleton' },
|
||||
});
|
||||
|
||||
// Seed default email templates
|
||||
const templates = [
|
||||
{
|
||||
name: 'welcome',
|
||||
subject: 'Welcome to {{eventName}}!',
|
||||
body: 'Hi {{name}},\n\nWelcome to {{eventName}} Squares!\n\nYour account has been created successfully.\n\nUsername: {{email}}\n\nYou can log in and view the game board at:\n{{gameUrl}}/login\n\nThanks for joining!\n{{commissioner}}',
|
||||
},
|
||||
{
|
||||
name: 'square_confirmation',
|
||||
subject: 'Square Purchase Confirmation - {{eventName}}',
|
||||
body: 'Hi {{name}},\n\nThank you for purchasing squares for {{eventName}}!\n\nSquare(s): {{squares}}\nAmount Due: ${{amountDue}}\n\nPlease submit payment within {{graceHours}} hours to keep your squares.\n\nPayment Instructions:\n{{paymentInstructions}}\n\nPayment Methods:\n{{paymentMethods}}\n\nView your squares at: {{gameUrl}}\n\nThanks,\n{{commissioner}}',
|
||||
},
|
||||
{
|
||||
name: 'square_confirmed',
|
||||
subject: 'Payment Confirmed - {{eventName}}',
|
||||
body: 'Hi {{name}},\n\nGreat news! Your payment has been confirmed for {{eventName}}.\n\nSquare(s): {{squares}}\n\nYour squares are now locked in. View the game board at:\n{{gameUrl}}\n\nGood luck!\n{{commissioner}}',
|
||||
},
|
||||
{
|
||||
name: 'square_released',
|
||||
subject: 'Square Released - {{eventName}}',
|
||||
body: 'Hi {{name}},\n\nYour square(s) for {{eventName}} have been released.\n\nSquare(s): {{squares}}\n\nIf you believe this is an error, please contact the commissioner.\n\nView the game board at: {{gameUrl}}\n\n{{commissioner}}',
|
||||
},
|
||||
{
|
||||
name: 'payment_reminder',
|
||||
subject: 'Payment Reminder - {{eventName}}',
|
||||
body: 'Hi {{name}},\n\nThis is a friendly reminder that your payment for {{eventName}} is due soon!\n\nSquare(s): {{squares}}\nAmount Due: ${{amountDue}}\n\nYour grace period expires in approximately 2 hours. After that, your squares may be released.\n\nPayment Instructions:\n{{paymentInstructions}}\n\nPayment Methods:\n{{paymentMethods}}\n\nView your squares at: {{gameUrl}}\n\nThanks,\n{{commissioner}}',
|
||||
},
|
||||
{
|
||||
name: 'winner_notification',
|
||||
subject: 'Congratulations! You won {{quarter}} - {{eventName}}',
|
||||
body: 'Hi {{name}},\n\nCongratulations! You are the winner of the {{quarter}} quarter!\n\nSquare: {{square}}\nScore: {{nfcTeam}} {{nfcScore}} - {{afcTeam}} {{afcScore}}\nPrize: ${{prize}}\n\nThanks,\n{{commissioner}}',
|
||||
},
|
||||
{
|
||||
name: 'numbers_assigned',
|
||||
subject: 'Numbers Have Been Assigned - {{eventName}}',
|
||||
body: 'Hi {{name}},\n\nThe random numbers have been assigned for {{eventName}}!\n\nVisit the game board to see your numbers and check your squares:\n{{gameUrl}}\n\nGood luck!\n{{commissioner}}',
|
||||
},
|
||||
{
|
||||
name: 'game_results',
|
||||
subject: 'Final Results - {{eventName}}',
|
||||
body: 'Hi {{name}},\n\nThe game is over! Here are the final results for {{eventName}}:\n\nWinners:\n{{winners}}\n\nCongratulations to all the winners!\n\nThank you for participating in this year\'s Super Bowl Squares. We hope you had a great time!\n\nView the final board at: {{gameUrl}}\n\n{{commissioner}}',
|
||||
},
|
||||
];
|
||||
|
||||
for (const template of templates) {
|
||||
await prisma.emailTemplate.upsert({
|
||||
where: { name: template.name },
|
||||
update: {},
|
||||
create: template,
|
||||
});
|
||||
}
|
||||
|
||||
console.log('Seed completed successfully');
|
||||
}
|
||||
|
||||
main()
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
process.exit(1);
|
||||
})
|
||||
.finally(async () => {
|
||||
await prisma.$disconnect();
|
||||
});
|
||||
Reference in New Issue
Block a user