Skip to content

Commit 488b07d

Browse files
Messaging unenrolled partners (dubinc#3098)
Co-authored-by: Steven Tey <stevensteel97@gmail.com>
1 parent 2d0b924 commit 488b07d

19 files changed

Lines changed: 467 additions & 279 deletions

File tree

apps/web/app/(ee)/api/cron/messages/notify-partner/route.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ export async function POST(req: Request) {
5151
createdAt: {
5252
gt: subDays(new Date(), 3), // sent in the last 3 days
5353
},
54-
type: "direct", // only notify for direct messages
5554
senderPartnerId: null, // not sent by the partner
5655
readInApp: null, // unread messages only
5756
readInEmail: null, // unread messages only

apps/web/app/(ee)/api/messages/route.ts

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -21,56 +21,56 @@ export const GET = withWorkspace(
2121

2222
const messagesLimit = messagesLimitArg ?? (partnerId ? undefined : 10);
2323

24-
const programEnrollments = await prisma.programEnrollment.findMany({
25-
where: {
26-
programId,
27-
...(partnerId
28-
? { partnerId }
29-
: {
30-
partner: {
31-
messages: {
32-
some: {
33-
programId,
34-
},
35-
},
36-
},
37-
}),
38-
},
39-
take: 1000, // TODO: add pagination later
40-
include: {
41-
partner: {
42-
include: {
24+
const partners = await prisma.partner.findMany({
25+
where: partnerId
26+
? {
27+
id: partnerId,
28+
// Partner is either discoverable, enrolled in the program, or already has a message with the program
29+
OR: [
30+
{ discoverableAt: { not: null } },
31+
{ programs: { some: { programId } } },
32+
{ messages: { some: { programId } } },
33+
],
34+
}
35+
: {
36+
// Partner has messages with the program
4337
messages: {
44-
where: {
38+
some: {
4539
programId,
4640
},
47-
include: {
48-
senderPartner: true,
49-
senderUser: true,
50-
},
51-
orderBy: {
52-
[sortBy]: sortOrder,
53-
},
54-
take: messagesLimit,
5541
},
5642
},
43+
take: 1000, // TODO: add pagination later
44+
include: {
45+
messages: {
46+
where: {
47+
programId,
48+
},
49+
include: {
50+
senderPartner: true,
51+
senderUser: true,
52+
},
53+
orderBy: {
54+
[sortBy]: sortOrder,
55+
},
56+
take: messagesLimit,
5757
},
5858
},
5959
});
6060

6161
return NextResponse.json(
6262
PartnerMessagesSchema.parse(
63-
programEnrollments
63+
partners
6464
// Sort by most recent message
6565
.sort((a, b) =>
6666
sortOrder === "desc"
67-
? (b.partner.messages?.[0]?.[sortBy]?.getTime() ?? 0) -
68-
(a.partner.messages?.[0]?.[sortBy]?.getTime() ?? 0)
69-
: (a.partner.messages?.[0]?.[sortBy]?.getTime() ?? 0) -
70-
(b.partner.messages?.[0]?.[sortBy]?.getTime() ?? 0),
67+
? (b.messages?.[0]?.[sortBy]?.getTime() ?? 0) -
68+
(a.messages?.[0]?.[sortBy]?.getTime() ?? 0)
69+
: (a.messages?.[0]?.[sortBy]?.getTime() ?? 0) -
70+
(b.messages?.[0]?.[sortBy]?.getTime() ?? 0),
7171
)
7272
// Map to {partner, messages}
73-
.map(({ partner: { messages, ...partner } }) => ({
73+
.map(({ messages, ...partner }) => ({
7474
partner,
7575
messages,
7676
})),

apps/web/app/(ee)/api/partner-profile/messages/route.ts

Lines changed: 72 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -17,55 +17,96 @@ export const GET = withPartnerProfile(async ({ partner, searchParams }) => {
1717

1818
const messagesLimit = messagesLimitArg ?? (programSlug ? undefined : 10);
1919

20-
const programEnrollments = await prisma.programEnrollment.findMany({
20+
const programs = await prisma.program.findMany({
2121
where: {
22-
partnerId: partner.id,
23-
program: {
24-
...(programSlug
25-
? { slug: programSlug }
26-
: {
27-
messages: {
28-
some: {
29-
partnerId: partner.id,
22+
// Partner is not banned from the program
23+
partners: {
24+
none: {
25+
partnerId: partner.id,
26+
status: "banned",
27+
},
28+
},
29+
30+
...(programSlug
31+
? {
32+
slug: programSlug,
33+
OR: [
34+
// Partner is enrolled in the program
35+
// in this case, return messages regardless of messaging enabled status which is passed to the UI
36+
{
37+
partners: {
38+
some: {
39+
partnerId: partner.id,
40+
},
3041
},
3142
},
32-
}),
33-
},
43+
{
44+
// Partner has received a direct message from the program
45+
messages: {
46+
some: {
47+
partnerId: partner.id,
48+
senderPartnerId: null, // Sent by the program
49+
},
50+
},
51+
},
52+
],
53+
}
54+
: {
55+
OR: [
56+
// Program has messaging enabled and partner has 1+ messages with the program
57+
{
58+
messagingEnabledAt: {
59+
not: null,
60+
},
61+
messages: {
62+
some: {
63+
partnerId: partner.id,
64+
},
65+
},
66+
},
67+
68+
// Partner has received a direct message from the program
69+
{
70+
messages: {
71+
some: {
72+
partnerId: partner.id,
73+
senderPartnerId: null, // Sent by the program
74+
},
75+
},
76+
},
77+
],
78+
}),
3479
},
3580
include: {
36-
program: {
81+
messages: {
82+
where: {
83+
partnerId: partner.id,
84+
},
3785
include: {
38-
messages: {
39-
where: {
40-
partnerId: partner.id,
41-
},
42-
include: {
43-
senderPartner: true,
44-
senderUser: true,
45-
},
46-
orderBy: {
47-
[sortBy]: sortOrder,
48-
},
49-
take: messagesLimit,
50-
},
86+
senderPartner: true,
87+
senderUser: true,
88+
},
89+
orderBy: {
90+
[sortBy]: sortOrder,
5191
},
92+
take: messagesLimit,
5293
},
5394
},
5495
});
5596

5697
return NextResponse.json(
5798
ProgramMessagesSchema.parse(
58-
programEnrollments
99+
programs
59100
// Sort by most recent message
60101
.sort((a, b) =>
61102
sortOrder === "desc"
62-
? (b.program.messages?.[0]?.[sortBy]?.getTime() ?? 0) -
63-
(a.program.messages?.[0]?.[sortBy]?.getTime() ?? 0)
64-
: (a.program.messages?.[0]?.[sortBy]?.getTime() ?? 0) -
65-
(b.program.messages?.[0]?.[sortBy]?.getTime() ?? 0),
103+
? (b.messages?.[0]?.[sortBy]?.getTime() ?? 0) -
104+
(a.messages?.[0]?.[sortBy]?.getTime() ?? 0)
105+
: (a.messages?.[0]?.[sortBy]?.getTime() ?? 0) -
106+
(b.messages?.[0]?.[sortBy]?.getTime() ?? 0),
66107
)
67108
// Map to {program, messages}
68-
.map(({ program: { messages, ...program } }) => ({
109+
.map(({ messages, ...program }) => ({
69110
program,
70111
messages,
71112
})),

0 commit comments

Comments
 (0)