From b2941bda0dc6cdc61287d13a06cf38999d70fda7 Mon Sep 17 00:00:00 2001 From: keyan Date: Fri, 5 Jul 2024 19:31:50 -0500 Subject: [PATCH 1/4] capture/store data for new referral scheme --- api/resolvers/rewards.js | 6 ++ api/ssrApollo.js | 63 +++++++++++++++ middleware.js | 81 ++++++++++++++++--- .../migration.sql | 33 ++++++++ prisma/schema.prisma | 27 +++++++ 5 files changed, 197 insertions(+), 13 deletions(-) create mode 100644 prisma/migrations/20240706000412_one_day_referrals/migration.sql diff --git a/api/resolvers/rewards.js b/api/resolvers/rewards.js index bc407b156..f861ac4cb 100644 --- a/api/resolvers/rewards.js +++ b/api/resolvers/rewards.js @@ -157,6 +157,12 @@ export default { SELECT date_trunc('day', (now() AT TIME ZONE 'America/Chicago')) AT TIME ZONE 'America/Chicago' as from, (date_trunc('day', (now() AT TIME ZONE 'America/Chicago')) AT TIME ZONE 'America/Chicago') + interval '1 day - 1 second' as to` return await topUsers(parent, { when: 'custom', to: new Date(to).getTime().toString(), from: new Date(from).getTime().toString(), limit: 100 }, { models, ...context }) + }, + total: async (parent, args, { models }) => { + if (!parent.total) { + return 0 + } + return parent.total } }, Mutation: { diff --git a/api/ssrApollo.js b/api/ssrApollo.js index 8eeba5e1e..5b1ce9a9d 100644 --- a/api/ssrApollo.js +++ b/api/ssrApollo.js @@ -54,6 +54,67 @@ export default async function getSSRApolloClient ({ req, res, me = null }) { return client } +function oneDayReferral (request, { me }) { + if (!me) return + const refHeader = request.headers['x-stacker-news-referrer'] + if (!refHeader) return + + const referrers = refHeader.split('; ').filter(Boolean) + for (const referrer of referrers) { + let prismaPromise, getData + + if (referrer.startsWith('item-')) { + prismaPromise = models.item.findUnique({ where: { id: parseInt(referrer.slice(5)) } }) + getData = item => ({ + referrerId: item.userId, + refereeId: parseInt(me.id), + type: 'ITEM', + typeId: String(item.id) + }) + } else if (referrer.startsWith('profile-')) { + prismaPromise = models.user.findUnique({ where: { name: referrer.slice(8) } }) + getData = user => ({ + referrerId: user.id, + refereeId: parseInt(me.id), + type: 'PROFILE', + typeId: String(user.id) + }) + } else if (referrer.startsWith('territory-')) { + prismaPromise = models.sub.findUnique({ where: { name: referrer.slice(10) } }) + getData = sub => ({ + referrerId: sub.userId, + refereeId: parseInt(me.id), + type: 'TERRITORY', + typeId: sub.name + }) + } else if (referrer.startsWith('comment-')) { + prismaPromise = models.item.findUnique({ where: { id: parseInt(referrer.slice(7)) } }) + getData = item => ({ + referrerId: item.userId, + refereeId: parseInt(me.id), + type: 'COMMENT', + typeId: String(item.id) + }) + } else { + prismaPromise = models.user.findUnique({ where: { name: referrer } }) + getData = user => ({ + referrerId: user.id, + refereeId: parseInt(me.id), + type: 'REFERRAL', + typeId: String(user.id) + }) + } + + prismaPromise?.then(ref => { + if (ref && getData) { + models.oneDayReferral.create({ + data: getData(ref) + }).catch(console.error) + } + }).catch(console.error) + } +} + /** * Takes a query and variables and returns a getServerSideProps function * @@ -124,6 +185,8 @@ export function getGetServerSideProps ( } } + oneDayReferral(req, { me }) + return { props: { ...props, diff --git a/middleware.js b/middleware.js index 0a5eb1a29..2b2cb2c83 100644 --- a/middleware.js +++ b/middleware.js @@ -1,23 +1,78 @@ -import { NextResponse } from 'next/server' +import { NextResponse, URLPattern } from 'next/server' -const referrerRegex = /(\/.*)?\/r\/([\w_]+)/ +const referrerPattern = new URLPattern({ pathname: ':pathname(*)/r/:referrer([\\w_]+)' }) +const itemPattern = new URLPattern({ pathname: '/items/:id(\\d+)' }) +const profilePattern = new URLPattern({ pathname: '/:name([\\w_]+){/:type(\\w+)}?' }) +const territoryPattern = new URLPattern({ pathname: '/~:name([\\w_]+){/*}?' }) + +// key for /r/... link referrers +const SN_REFERRER = 'sn_referrer' +// we use this to hold /r/... referrers through the redirect +const SN_REFERRER_NONCE = 'sn_referrer_nonce' +// key for item, comment, profile, or territory referrals +const SN_REFERRER_CONTENT = 'sn_referrer_content' + +// we store the referrers in cookies for a future signup event +// we pass the referrers in the request headers so we can use them in referral rewards for logged in stackers function referrerMiddleware (request) { - const m = referrerRegex.exec(request.nextUrl.pathname) + const response = NextResponse.next() - const url = new URL(m[1] || '/', request.url) - url.search = request.nextUrl.search - url.hash = request.nextUrl.hash + if (referrerPattern.test(request.url)) { + const { pathname, referrer } = referrerPattern.exec(request.url).pathname.groups - const resp = NextResponse.redirect(url) - resp.cookies.set('sn_referrer', m[2]) - return resp + const url = new URL(pathname || '/', request.url) + url.search = request.nextUrl.search + url.hash = request.nextUrl.hash + + const response = NextResponse.redirect(url) + response.cookies.set(SN_REFERRER, referrer) + // only keep the referrer nonce for one page load + response.cookies.set(SN_REFERRER_NONCE, referrer, { maxAge: 1 }) + return response + } + + let contentReferrer + if (itemPattern.test(request.url)) { + if (request.nextUrl.searchParams.has('commentId')) { + contentReferrer = `comment-${request.nextUrl.searchParams.get('commentId')}` + } else { + const { id } = itemPattern.exec(request.url).pathname.groups + contentReferrer = `item-${id}` + } + } else if (profilePattern.test(request.url)) { + const { name } = profilePattern.exec(request.url).pathname.groups + contentReferrer = `profile-${name}` + } else if (territoryPattern.test(request.url)) { + const { name } = territoryPattern.exec(request.url).pathname.groups + contentReferrer = `territory-${name}` + } + + const referrers = [request.cookies.get(SN_REFERRER_NONCE)?.value] + if (contentReferrer) { + response.cookies.set(SN_REFERRER_CONTENT, contentReferrer) + referrers.push(contentReferrer) + // if we don't already have a normal referrer, give them the content referrer as one + if (!request.cookies.has(SN_REFERRER)) { + response.cookies.set(SN_REFERRER, contentReferrer) + } + } + + // pass the referrers to SSR in the request headers + const filtered = referrers.filter(Boolean) + const requestHeaders = new Headers(request.headers) + if (filtered.length) { + requestHeaders.set('x-stacker-news-referrer', filtered.join('; ')) + } + + return NextResponse.next({ + request: { + headers: requestHeaders + } + }) } export function middleware (request) { - let resp = NextResponse.next() - if (referrerRegex.test(request.nextUrl.pathname)) { - resp = referrerMiddleware(request) - } + const resp = referrerMiddleware(request) const isDev = process.env.NODE_ENV === 'development' diff --git a/prisma/migrations/20240706000412_one_day_referrals/migration.sql b/prisma/migrations/20240706000412_one_day_referrals/migration.sql new file mode 100644 index 000000000..9a13480eb --- /dev/null +++ b/prisma/migrations/20240706000412_one_day_referrals/migration.sql @@ -0,0 +1,33 @@ +-- CreateEnum +CREATE TYPE "OneDayReferralType" AS ENUM ('REFERRAL', 'ITEM', 'COMMENT', 'PROFILE', 'TERRITORY'); + +-- CreateTable +CREATE TABLE "OneDayReferral" ( + "id" SERIAL NOT NULL, + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "referrerId" INTEGER NOT NULL, + "refereeId" INTEGER NOT NULL, + "type" "OneDayReferralType" NOT NULL, + "typeId" TEXT NOT NULL, + + CONSTRAINT "OneDayReferral_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE INDEX "OneDayReferral_created_at_idx" ON "OneDayReferral"("created_at"); + +-- CreateIndex +CREATE INDEX "OneDayReferral_referrerId_idx" ON "OneDayReferral"("referrerId"); + +-- CreateIndex +CREATE INDEX "OneDayReferral_refereeId_idx" ON "OneDayReferral"("refereeId"); + +-- CreateIndex +CREATE INDEX "OneDayReferral_type_typeId_idx" ON "OneDayReferral"("type", "typeId"); + +-- AddForeignKey +ALTER TABLE "OneDayReferral" ADD CONSTRAINT "OneDayReferral_referrerId_fkey" FOREIGN KEY ("referrerId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "OneDayReferral" ADD CONSTRAINT "OneDayReferral_refereeId_fkey" FOREIGN KEY ("refereeId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index c561e055a..b4b647686 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -127,6 +127,8 @@ model User { Reminder Reminder[] PollBlindVote PollBlindVote[] ItemUserAgg ItemUserAgg[] + oneDayReferrals OneDayReferral[] @relation("OneDayReferral_referrer") + oneDayReferrees OneDayReferral[] @relation("OneDayReferral_referrees") @@index([photoId]) @@index([createdAt], map: "users.created_at_index") @@ -134,6 +136,31 @@ model User { @@map("users") } +enum OneDayReferralType { + REFERRAL + ITEM + COMMENT + PROFILE + TERRITORY +} + +model OneDayReferral { + id Int @id @default(autoincrement()) + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @default(now()) @updatedAt @map("updated_at") + referrerId Int + refereeId Int + referrer User @relation("OneDayReferral_referrer", fields: [referrerId], references: [id], onDelete: Cascade) + referee User @relation("OneDayReferral_referrees", fields: [refereeId], references: [id], onDelete: Cascade) + type OneDayReferralType + typeId String + + @@index([createdAt]) + @@index([referrerId]) + @@index([refereeId]) + @@index([type, typeId]) +} + enum WalletType { LIGHTNING_ADDRESS LND From 576352d7bb1bc4baab25cb5fbbce5c71684546ed Mon Sep 17 00:00:00 2001 From: keyan Date: Sat, 6 Jul 2024 17:16:02 -0500 Subject: [PATCH 2/4] simplify signup/forever referral rules --- middleware.js | 17 ++++++++++------- pages/api/auth/[...nextauth].js | 22 ++++++++++++++++++---- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/middleware.js b/middleware.js index 2b2cb2c83..dc13be5ec 100644 --- a/middleware.js +++ b/middleware.js @@ -9,8 +9,6 @@ const territoryPattern = new URLPattern({ pathname: '/~:name([\\w_]+){/*}?' }) const SN_REFERRER = 'sn_referrer' // we use this to hold /r/... referrers through the redirect const SN_REFERRER_NONCE = 'sn_referrer_nonce' -// key for item, comment, profile, or territory referrals -const SN_REFERRER_CONTENT = 'sn_referrer_content' // we store the referrers in cookies for a future signup event // we pass the referrers in the request headers so we can use them in referral rewards for logged in stackers @@ -25,8 +23,14 @@ function referrerMiddleware (request) { url.hash = request.nextUrl.hash const response = NextResponse.redirect(url) - response.cookies.set(SN_REFERRER, referrer) - // only keep the referrer nonce for one page load + // explicit referrers are set for a day and can only be overriden by other explicit + // referrers. Content referrers do not override explicit referrers because + // explicit referees might click around before signing up. + response.cookies.set(SN_REFERRER, referrer, { maxAge: 60 * 60 * 24 }) + // store the explicit referrer for one page load + // this allows us to attribute both explicit and implicit referrers after the redirect + // e.g. items//r/ links should attribute both the item op and the referrer + // without this the /r/ would be lost on redirect response.cookies.set(SN_REFERRER_NONCE, referrer, { maxAge: 1 }) return response } @@ -49,11 +53,10 @@ function referrerMiddleware (request) { const referrers = [request.cookies.get(SN_REFERRER_NONCE)?.value] if (contentReferrer) { - response.cookies.set(SN_REFERRER_CONTENT, contentReferrer) referrers.push(contentReferrer) - // if we don't already have a normal referrer, give them the content referrer as one + // if we don't already have an explicit referrer, give them the content referrer as one if (!request.cookies.has(SN_REFERRER)) { - response.cookies.set(SN_REFERRER, contentReferrer) + response.cookies.set(SN_REFERRER, contentReferrer, { maxAge: 60 * 60 * 24 }) } } diff --git a/pages/api/auth/[...nextauth].js b/pages/api/auth/[...nextauth].js index f0193bfe9..0557fcd69 100644 --- a/pages/api/auth/[...nextauth].js +++ b/pages/api/auth/[...nextauth].js @@ -36,6 +36,20 @@ function getEventCallbacks () { } } +async function getReferrerId (referrer) { + if (referrer.startsWith('item-')) { + return (await prisma.item.findUnique({ where: { id: parseInt(referrer.slice(5)) } }))?.userId + } else if (referrer.startsWith('profile-')) { + return (await prisma.user.findUnique({ where: { name: referrer.slice(8) } }))?.id + } else if (referrer.startsWith('territory-')) { + return (await prisma.sub.findUnique({ where: { name: referrer.slice(10) } }))?.userId + } else if (referrer.startsWith('comment-')) { + return (await prisma.item.findUnique({ where: { id: parseInt(referrer.slice(7)) } }))?.userId + } else { + return (await prisma.user.findUnique({ where: { name: referrer } }))?.id + } +} + /** @returns {Partial} */ function getCallbacks (req) { return { @@ -57,10 +71,10 @@ function getCallbacks (req) { // isNewUser doesn't work for nostr/lightning auth because we create the user before nextauth can // this means users can update their referrer if they don't have one, which is fine if (req.cookies.sn_referrer && user?.id) { - const referrer = await prisma.user.findUnique({ where: { name: req.cookies.sn_referrer } }) - if (referrer && referrer.id !== Number(user.id)) { - await prisma.user.updateMany({ where: { id: user.id, referrerId: null }, data: { referrerId: referrer.id } }) - notifyReferral(referrer.id) + const referrerId = await getReferrerId(req.cookies.sn_referrer) + if (referrerId) { + await prisma.user.updateMany({ where: { id: user.id, referrerId: null }, data: { referrerId } }) + notifyReferral(referrerId) } } } From 5800520e72b4aedacc6907a37ebe4a2840b022f4 Mon Sep 17 00:00:00 2001 From: keyan Date: Sat, 6 Jul 2024 18:11:08 -0500 Subject: [PATCH 3/4] no self-referrals and other fixes --- api/ssrApollo.js | 9 +++++---- middleware.js | 26 +++++++++++--------------- pages/api/auth/[...nextauth].js | 26 +++++++++++++++----------- 3 files changed, 31 insertions(+), 30 deletions(-) diff --git a/api/ssrApollo.js b/api/ssrApollo.js index 5b1ce9a9d..eea4eda64 100644 --- a/api/ssrApollo.js +++ b/api/ssrApollo.js @@ -88,7 +88,7 @@ function oneDayReferral (request, { me }) { typeId: sub.name }) } else if (referrer.startsWith('comment-')) { - prismaPromise = models.item.findUnique({ where: { id: parseInt(referrer.slice(7)) } }) + prismaPromise = models.item.findUnique({ where: { id: parseInt(referrer.slice(8)) } }) getData = item => ({ referrerId: item.userId, refereeId: parseInt(me.id), @@ -107,9 +107,10 @@ function oneDayReferral (request, { me }) { prismaPromise?.then(ref => { if (ref && getData) { - models.oneDayReferral.create({ - data: getData(ref) - }).catch(console.error) + const data = getData(ref) + // can't refer yourself + if (data.refereeId === data.referrerId) return + models.oneDayReferral.create({ data }).catch(console.error) } }).catch(console.error) } diff --git a/middleware.js b/middleware.js index dc13be5ec..3626b5d48 100644 --- a/middleware.js +++ b/middleware.js @@ -13,8 +13,6 @@ const SN_REFERRER_NONCE = 'sn_referrer_nonce' // we store the referrers in cookies for a future signup event // we pass the referrers in the request headers so we can use them in referral rewards for logged in stackers function referrerMiddleware (request) { - const response = NextResponse.next() - if (referrerPattern.test(request.url)) { const { pathname, referrer } = referrerPattern.exec(request.url).pathname.groups @@ -51,27 +49,25 @@ function referrerMiddleware (request) { contentReferrer = `territory-${name}` } - const referrers = [request.cookies.get(SN_REFERRER_NONCE)?.value] - if (contentReferrer) { - referrers.push(contentReferrer) - // if we don't already have an explicit referrer, give them the content referrer as one - if (!request.cookies.has(SN_REFERRER)) { - response.cookies.set(SN_REFERRER, contentReferrer, { maxAge: 60 * 60 * 24 }) - } - } - // pass the referrers to SSR in the request headers - const filtered = referrers.filter(Boolean) const requestHeaders = new Headers(request.headers) - if (filtered.length) { - requestHeaders.set('x-stacker-news-referrer', filtered.join('; ')) + const referrers = [request.cookies.get(SN_REFERRER_NONCE)?.value, contentReferrer].filter(Boolean) + if (referrers.length) { + requestHeaders.set('x-stacker-news-referrer', referrers.join('; ')) } - return NextResponse.next({ + const response = NextResponse.next({ request: { headers: requestHeaders } }) + + // if we don't already have an explicit referrer, give them the content referrer as one + if (!request.cookies.has(SN_REFERRER) && contentReferrer) { + response.cookies.set(SN_REFERRER, contentReferrer, { maxAge: 60 * 60 * 24 }) + } + + return response } export function middleware (request) { diff --git a/pages/api/auth/[...nextauth].js b/pages/api/auth/[...nextauth].js index 0557fcd69..73e0dbb82 100644 --- a/pages/api/auth/[...nextauth].js +++ b/pages/api/auth/[...nextauth].js @@ -37,16 +37,20 @@ function getEventCallbacks () { } async function getReferrerId (referrer) { - if (referrer.startsWith('item-')) { - return (await prisma.item.findUnique({ where: { id: parseInt(referrer.slice(5)) } }))?.userId - } else if (referrer.startsWith('profile-')) { - return (await prisma.user.findUnique({ where: { name: referrer.slice(8) } }))?.id - } else if (referrer.startsWith('territory-')) { - return (await prisma.sub.findUnique({ where: { name: referrer.slice(10) } }))?.userId - } else if (referrer.startsWith('comment-')) { - return (await prisma.item.findUnique({ where: { id: parseInt(referrer.slice(7)) } }))?.userId - } else { - return (await prisma.user.findUnique({ where: { name: referrer } }))?.id + try { + if (referrer.startsWith('item-')) { + return (await prisma.item.findUnique({ where: { id: parseInt(referrer.slice(5)) } }))?.userId + } else if (referrer.startsWith('profile-')) { + return (await prisma.user.findUnique({ where: { name: referrer.slice(8) } }))?.id + } else if (referrer.startsWith('territory-')) { + return (await prisma.sub.findUnique({ where: { name: referrer.slice(10) } }))?.userId + } else if (referrer.startsWith('comment-')) { + return (await prisma.item.findUnique({ where: { id: parseInt(referrer.slice(8)) } }))?.userId + } else { + return (await prisma.user.findUnique({ where: { name: referrer } }))?.id + } + } catch (error) { + console.error('error getting referrer id', error) } } @@ -72,7 +76,7 @@ function getCallbacks (req) { // this means users can update their referrer if they don't have one, which is fine if (req.cookies.sn_referrer && user?.id) { const referrerId = await getReferrerId(req.cookies.sn_referrer) - if (referrerId) { + if (referrerId && referrerId !== parseInt(user?.id)) { await prisma.user.updateMany({ where: { id: user.id, referrerId: null }, data: { referrerId } }) notifyReferral(referrerId) } From 970caa9668291f0ead0ec9027b5e2dbe45b5931e Mon Sep 17 00:00:00 2001 From: keyan Date: Sun, 7 Jul 2024 11:10:33 -0500 Subject: [PATCH 4/4] better post/comment distinction and support /items/1/related --- api/ssrApollo.js | 10 +--------- middleware.js | 11 +++++------ pages/api/auth/[...nextauth].js | 2 -- .../20240706000412_one_day_referrals/migration.sql | 2 +- prisma/schema.prisma | 2 +- 5 files changed, 8 insertions(+), 19 deletions(-) diff --git a/api/ssrApollo.js b/api/ssrApollo.js index eea4eda64..c583be8bb 100644 --- a/api/ssrApollo.js +++ b/api/ssrApollo.js @@ -68,7 +68,7 @@ function oneDayReferral (request, { me }) { getData = item => ({ referrerId: item.userId, refereeId: parseInt(me.id), - type: 'ITEM', + type: item.parentId ? 'COMMENT' : 'POST', typeId: String(item.id) }) } else if (referrer.startsWith('profile-')) { @@ -87,14 +87,6 @@ function oneDayReferral (request, { me }) { type: 'TERRITORY', typeId: sub.name }) - } else if (referrer.startsWith('comment-')) { - prismaPromise = models.item.findUnique({ where: { id: parseInt(referrer.slice(8)) } }) - getData = item => ({ - referrerId: item.userId, - refereeId: parseInt(me.id), - type: 'COMMENT', - typeId: String(item.id) - }) } else { prismaPromise = models.user.findUnique({ where: { name: referrer } }) getData = user => ({ diff --git a/middleware.js b/middleware.js index 3626b5d48..0659e365c 100644 --- a/middleware.js +++ b/middleware.js @@ -1,7 +1,7 @@ import { NextResponse, URLPattern } from 'next/server' const referrerPattern = new URLPattern({ pathname: ':pathname(*)/r/:referrer([\\w_]+)' }) -const itemPattern = new URLPattern({ pathname: '/items/:id(\\d+)' }) +const itemPattern = new URLPattern({ pathname: '/items/:id(\\d+){/:other(\\w+)}?' }) const profilePattern = new URLPattern({ pathname: '/:name([\\w_]+){/:type(\\w+)}?' }) const territoryPattern = new URLPattern({ pathname: '/~:name([\\w_]+){/*}?' }) @@ -35,12 +35,11 @@ function referrerMiddleware (request) { let contentReferrer if (itemPattern.test(request.url)) { - if (request.nextUrl.searchParams.has('commentId')) { - contentReferrer = `comment-${request.nextUrl.searchParams.get('commentId')}` - } else { - const { id } = itemPattern.exec(request.url).pathname.groups - contentReferrer = `item-${id}` + let id = request.nextUrl.searchParams.get('commentId') + if (!id) { + ({ id } = itemPattern.exec(request.url).pathname.groups) } + contentReferrer = `item-${id}` } else if (profilePattern.test(request.url)) { const { name } = profilePattern.exec(request.url).pathname.groups contentReferrer = `profile-${name}` diff --git a/pages/api/auth/[...nextauth].js b/pages/api/auth/[...nextauth].js index 73e0dbb82..ad0677520 100644 --- a/pages/api/auth/[...nextauth].js +++ b/pages/api/auth/[...nextauth].js @@ -44,8 +44,6 @@ async function getReferrerId (referrer) { return (await prisma.user.findUnique({ where: { name: referrer.slice(8) } }))?.id } else if (referrer.startsWith('territory-')) { return (await prisma.sub.findUnique({ where: { name: referrer.slice(10) } }))?.userId - } else if (referrer.startsWith('comment-')) { - return (await prisma.item.findUnique({ where: { id: parseInt(referrer.slice(8)) } }))?.userId } else { return (await prisma.user.findUnique({ where: { name: referrer } }))?.id } diff --git a/prisma/migrations/20240706000412_one_day_referrals/migration.sql b/prisma/migrations/20240706000412_one_day_referrals/migration.sql index 9a13480eb..3525131f9 100644 --- a/prisma/migrations/20240706000412_one_day_referrals/migration.sql +++ b/prisma/migrations/20240706000412_one_day_referrals/migration.sql @@ -1,5 +1,5 @@ -- CreateEnum -CREATE TYPE "OneDayReferralType" AS ENUM ('REFERRAL', 'ITEM', 'COMMENT', 'PROFILE', 'TERRITORY'); +CREATE TYPE "OneDayReferralType" AS ENUM ('REFERRAL', 'POST', 'COMMENT', 'PROFILE', 'TERRITORY'); -- CreateTable CREATE TABLE "OneDayReferral" ( diff --git a/prisma/schema.prisma b/prisma/schema.prisma index b4b647686..a0f1834f5 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -138,7 +138,7 @@ model User { enum OneDayReferralType { REFERRAL - ITEM + POST COMMENT PROFILE TERRITORY