diff --git a/common/user.ts b/common/user.ts index 6eed3bdb..80f4110e 100644 --- a/common/user.ts +++ b/common/user.ts @@ -45,6 +45,7 @@ export const STARTING_BALANCE = ENV_CONFIG.startingBalance ?? 1000 // for sus users, i.e. multiple sign ups for same person export const SUS_STARTING_BALANCE = ENV_CONFIG.startingBalance ?? 10 export const REFERRAL_AMOUNT = 500 + export type PrivateUser = { id: string // same as User.id username: string // denormalized from User @@ -54,6 +55,7 @@ export type PrivateUser = { unsubscribedFromCommentEmails?: boolean unsubscribedFromAnswerEmails?: boolean unsubscribedFromGenericEmails?: boolean + manaBonusEmailSent?: boolean initialDeviceToken?: string initialIpAddress?: string apiKey?: string diff --git a/functions/src/create-user.ts b/functions/src/create-user.ts index 9996b63e..29bfcc0c 100644 --- a/functions/src/create-user.ts +++ b/functions/src/create-user.ts @@ -1,5 +1,7 @@ import * as admin from 'firebase-admin' import { z } from 'zod' +import { uniq } from 'lodash' + import { MANIFOLD_AVATAR_URL, MANIFOLD_USERNAME, @@ -14,7 +16,7 @@ import { cleanDisplayName, cleanUsername, } from '../../common/util/clean-username' -import { sendOneWeekBonusEmail, sendWelcomeEmail } from './emails' +import { sendWelcomeEmail } from './emails' import { isWhitelisted } from '../../common/envs/constants' import { CATEGORIES_GROUP_SLUG_POSTFIX, @@ -24,7 +26,6 @@ import { import { track } from './analytics' import { APIError, newEndpoint, validate } from './api' import { Group, NEW_USER_GROUP_SLUGS } from '../../common/group' -import { uniq } from 'lodash' import { DEV_HOUSE_LIQUIDITY_PROVIDER_ID, HOUSE_LIQUIDITY_PROVIDER_ID, @@ -97,7 +98,6 @@ export const createuser = newEndpoint(opts, async (req, auth) => { await addUserToDefaultGroups(user) await sendWelcomeEmail(user, privateUser) - await sendOneWeekBonusEmail(user, privateUser) await track(auth.uid, 'create user', { username }, { ip: req.ip }) return user diff --git a/functions/src/emails.ts b/functions/src/emails.ts index 7b764500..affb2b0d 100644 --- a/functions/src/emails.ts +++ b/functions/src/emails.ts @@ -1,5 +1,3 @@ -import * as dayjs from 'dayjs' - import { DOMAIN } from '../../common/envs/constants' import { Answer } from '../../common/answer' import { Bet } from '../../common/bet' @@ -184,11 +182,9 @@ export const sendOneWeekBonusEmail = async ( const emailType = 'generic' const unsubscribeLink = `${UNSUBSCRIBE_ENDPOINT}?id=${userId}&type=${emailType}` - const oneWeek = dayjs().add(1, 'week').toString() - await sendTemplateEmail( privateUser.email, - 'Manifold one week anniversary gift', + 'Manifold Markets one week anniversary gift', 'one-week', { name: firstName, @@ -197,7 +193,6 @@ export const sendOneWeekBonusEmail = async ( }, { from: 'David from Manifold ', - 'o:deliverytime': oneWeek, } ) } diff --git a/functions/src/index.ts b/functions/src/index.ts index 3055f8dc..4a3db4c1 100644 --- a/functions/src/index.ts +++ b/functions/src/index.ts @@ -41,3 +41,4 @@ export * from './create-group' export * from './resolve-market' export * from './unsubscribe' export * from './stripe' +export * from './mana-bonus-email' \ No newline at end of file diff --git a/functions/src/mana-bonus-email.ts b/functions/src/mana-bonus-email.ts new file mode 100644 index 00000000..29a7e6e0 --- /dev/null +++ b/functions/src/mana-bonus-email.ts @@ -0,0 +1,42 @@ +import * as functions from 'firebase-functions' +import * as admin from 'firebase-admin' +import * as dayjs from 'dayjs' + +import { getPrivateUser } from './utils' +import { sendOneWeekBonusEmail } from './emails' +import { User } from 'common/user' + +export const manabonusemail = functions + .runWith({ secrets: ['MAILGUN_KEY'] }) + .pubsub.schedule('0 9 * * 1-7') + .onRun(async () => { + await sendOneWeekEmails() + }) + +const firestore = admin.firestore() + +async function sendOneWeekEmails() { + const oneWeekAgo = dayjs().subtract(1, 'week').valueOf() + const twoWeekAgo = dayjs().subtract(2, 'weeks').valueOf() + + const userDocs = await firestore + .collection('users') + .where('createdTime', '<=', oneWeekAgo) + .get() + + for (const user of userDocs.docs.map((d) => d.data() as User)) { + if (user.createdTime < twoWeekAgo) continue + + const privateUser = await getPrivateUser(user.id) + if (!privateUser || privateUser.manaBonusEmailSent) continue + + await firestore + .collection('private-users') + .doc(user.id) + .update({ manaBonusEmailSent: true }) + + console.log('sending m$ bonus email to', user.username) + await sendOneWeekBonusEmail(user, privateUser) + return + } +}