From fe00bede476ce71a5f9d25d8cae771448d1f9fe8 Mon Sep 17 00:00:00 2001 From: Timo Knuth Date: Fri, 3 Apr 2026 00:31:20 +0200 Subject: [PATCH] Migration --- .gitignore | 9 ++++--- Dockerfile | 25 +++++++++++-------- docker/entrypoint.sh | 8 ++++++ .../migration.sql | 4 +++ .../migration.sql | 3 +++ .../(main)/api/cron/retention-emails/route.ts | 4 +-- 6 files changed, 36 insertions(+), 17 deletions(-) create mode 100644 docker/entrypoint.sh create mode 100644 prisma/migrations/20260402120000_add_retention_email_fields/migration.sql create mode 100644 prisma/migrations/20260403110000_add_thirty_day_nudge_field/migration.sql diff --git a/.gitignore b/.gitignore index 073c16c..014188c 100644 --- a/.gitignore +++ b/.gitignore @@ -38,10 +38,11 @@ next-env.d.ts # prisma # /prisma/migrations/ # Now tracked in Git for deployment -# docker -docker-compose.override.yml -*.sql -/backups/ +# docker +docker-compose.override.yml +*.sql +!prisma/migrations/**/*.sql +/backups/ # logs logs diff --git a/Dockerfile b/Dockerfile index 89f9a89..736569d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -51,14 +51,17 @@ ENV NEXT_TELEMETRY_DISABLED=1 RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs -COPY --from=builder /app/node_modules ./node_modules -COPY --from=builder /app/prisma ./prisma -COPY --from=builder /app/.next/standalone ./ -COPY --from=builder /app/.next/static ./.next/static -COPY --from=builder /app/public ./public - -USER nextjs - -EXPOSE 3000 - -CMD ["node", "server.js"] \ No newline at end of file +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/prisma ./prisma +COPY --from=builder /app/.next/standalone ./ +COPY --from=builder /app/.next/static ./.next/static +COPY --from=builder /app/public ./public +COPY --from=builder /app/docker/entrypoint.sh ./docker/entrypoint.sh + +RUN chmod +x ./docker/entrypoint.sh + +USER nextjs + +EXPOSE 3000 + +CMD ["./docker/entrypoint.sh"] diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh new file mode 100644 index 0000000..2e8863a --- /dev/null +++ b/docker/entrypoint.sh @@ -0,0 +1,8 @@ +#!/bin/sh +set -eu + +echo "Applying Prisma migrations..." +npx prisma migrate deploy + +echo "Starting application..." +exec node server.js diff --git a/prisma/migrations/20260402120000_add_retention_email_fields/migration.sql b/prisma/migrations/20260402120000_add_retention_email_fields/migration.sql new file mode 100644 index 0000000..e3a2256 --- /dev/null +++ b/prisma/migrations/20260402120000_add_retention_email_fields/migration.sql @@ -0,0 +1,4 @@ +-- AlterTable +ALTER TABLE "User" +ADD COLUMN "activationNudgeSentAt" TIMESTAMP(3), +ADD COLUMN "upgradeNudgeSentAt" TIMESTAMP(3); diff --git a/prisma/migrations/20260403110000_add_thirty_day_nudge_field/migration.sql b/prisma/migrations/20260403110000_add_thirty_day_nudge_field/migration.sql new file mode 100644 index 0000000..e581e30 --- /dev/null +++ b/prisma/migrations/20260403110000_add_thirty_day_nudge_field/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "User" +ADD COLUMN "thirtyDayNudgeSentAt" TIMESTAMP(3); diff --git a/src/app/(main)/api/cron/retention-emails/route.ts b/src/app/(main)/api/cron/retention-emails/route.ts index 67d3faf..fd82498 100644 --- a/src/app/(main)/api/cron/retention-emails/route.ts +++ b/src/app/(main)/api/cron/retention-emails/route.ts @@ -78,7 +78,7 @@ export async function GET(request: NextRequest) { } // Day-30: signed up > 30 days ago, has ≥1 QR code, still FREE, hasn't received this email yet - const thirtyDayCandidates = await (db.user as any).findMany({ + const thirtyDayCandidates = await db.user.findMany({ where: { createdAt: { lt: thirtyDaysAgo }, thirtyDayNudgeSentAt: null, @@ -93,7 +93,7 @@ export async function GET(request: NextRequest) { if (user._count.qrCodes > 0 && user.email) { try { await sendThirtyDayNudgeEmail(user.email, user.name ?? 'there', user._count.qrCodes); - await (db.user as any).update({ + await db.user.update({ where: { id: user.id }, data: { thirtyDayNudgeSentAt: now }, });