diff --git a/opensaas-sh/app_diff/schema.prisma.diff b/opensaas-sh/app_diff/schema.prisma.diff index 2774a35..0d9e0e1 100644 --- a/opensaas-sh/app_diff/schema.prisma.diff +++ b/opensaas-sh/app_diff/schema.prisma.diff @@ -15,4 +15,4 @@ + stripeId String? @unique subscriptionStatus String? // 'active', 'cancel_at_period_end', 'past_due', 'deleted' subscriptionPlan String? // 'hobby', 'pro' - sendNewsletter Boolean @default(false) + datePaid DateTime? diff --git a/opensaas-sh/app_diff/src/server/scripts/dbSeeds.ts.diff b/opensaas-sh/app_diff/src/server/scripts/dbSeeds.ts.diff index 35507c3..6fddec5 100644 --- a/opensaas-sh/app_diff/src/server/scripts/dbSeeds.ts.diff +++ b/opensaas-sh/app_diff/src/server/scripts/dbSeeds.ts.diff @@ -1,7 +1,7 @@ --- template/app/src/server/scripts/dbSeeds.ts +++ opensaas-sh/app/src/server/scripts/dbSeeds.ts -@@ -38,9 +38,11 @@ - sendNewsletter: false, +@@ -36,9 +36,11 @@ + isAdmin: false, credits, subscriptionStatus, - lemonSqueezyCustomerPortalUrl: null, diff --git a/opensaas-sh/blog/src/content/docs/start/guided-tour.md b/opensaas-sh/blog/src/content/docs/start/guided-tour.md index b0bea0b..6f6d7d4 100644 --- a/opensaas-sh/blog/src/content/docs/start/guided-tour.md +++ b/opensaas-sh/blog/src/content/docs/start/guided-tour.md @@ -70,7 +70,6 @@ If you are using an older version of the OpenSaaS template with Wasp `v0.13.x` o │   ├── file-upload/ # Logic for uploading files to S3. │   ├── landing-page # Landing page related code │   ├── messages # Logic for app user messages. -│   ├── newsletter/ # Logic for scheduled recurring newsletter sending. │   ├── payment/ # Logic for handling payments and webhooks. │   ├── server/ # Scripts, shared server utils, and other server-specific code (NodeJS). │   ├── shared/ # Shared constants and util functions. diff --git a/template/app/main.wasp b/template/app/main.wasp index 5dfed47..f416a5d 100644 --- a/template/app/main.wasp +++ b/template/app/main.wasp @@ -326,16 +326,3 @@ page AdminMessagesPage { component: import AdminMessages from "@src/messages/MessagesPage" } //#endregion - -//#region Newsletter -job sendNewsletter { - executor: PgBoss, - perform: { - fn: import { checkAndQueueNewsletterEmails } from "@src/newsletter/sendNewsletter" - }, - schedule: { - cron: "0 7 * * 1" // at 7:00 am every Monday - }, - entities: [User] -} -//#endregion \ No newline at end of file diff --git a/template/app/schema.prisma b/template/app/schema.prisma index 1da9b4a..eda4671 100644 --- a/template/app/schema.prisma +++ b/template/app/schema.prisma @@ -19,7 +19,6 @@ model User { lemonSqueezyCustomerPortalUrl String? // You can delete this if you're not using Lemon Squeezy as your payments processor. subscriptionStatus String? // 'active', 'cancel_at_period_end', 'past_due', 'deleted' subscriptionPlan String? // 'hobby', 'pro' - sendNewsletter Boolean @default(false) datePaid DateTime? credits Int @default(3) diff --git a/template/app/src/newsletter/sendNewsletter.ts b/template/app/src/newsletter/sendNewsletter.ts deleted file mode 100644 index e09fc8b..0000000 --- a/template/app/src/newsletter/sendNewsletter.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { type SendNewsletter } from 'wasp/server/jobs'; - -import { type User } from 'wasp/entities'; -import { emailSender } from 'wasp/server/email'; -import { type Email } from 'wasp/server/email/core/types'; // TODO fix after it gets fixed in wasp :) - -const emailToSend: Email = { - to: '', - subject: 'The SaaS App Newsletter', - text: 'Hey There! \n\nThis is just a newsletter that sends automatically via cron jobs', - html: ` - - - SaaS App Newsletter - - -

Hey There!

- -

This is just a newsletter that sends automatically via cron jobs

- - `, -}; - -// you could use this function to send newsletters, expiration notices, etc. -export const checkAndQueueNewsletterEmails: SendNewsletter = async (_args, context) => { - // e.g. you could send an offer email 2 weeks before their subscription expires - const currentDate = new Date(); - const twoWeeksFromNow = new Date(currentDate.getTime() + 14 * 24 * 60 * 60 * 1000); - - const users = (await context.entities.User.findMany({ - where: { - datePaid: { - equals: twoWeeksFromNow, - }, - sendNewsletter: true, - }, - })) as User[]; - - if (users.length === 0) { - return; - } - await Promise.allSettled( - users.map(async (user) => { - if (user.email) { - try { - emailToSend.to = user.email; - await emailSender.send(emailToSend); - } catch (error) { - console.error('Error sending notice to user: ', user.id, error); - } - } - }) - ); -}; diff --git a/template/app/src/server/scripts/dbSeeds.ts b/template/app/src/server/scripts/dbSeeds.ts index 1287adf..8ba5d75 100644 --- a/template/app/src/server/scripts/dbSeeds.ts +++ b/template/app/src/server/scripts/dbSeeds.ts @@ -35,7 +35,6 @@ function generateMockUserData(): MockUserData { username: faker.internet.userName({ firstName, lastName }), createdAt, isAdmin: false, - sendNewsletter: false, credits, subscriptionStatus, lemonSqueezyCustomerPortalUrl: null,