Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ export async function POST(req: Request) {
createdAt: {
gt: subDays(new Date(), 3), // sent in the last 3 days
},
type: "direct", // only notify for direct messages
senderPartnerId: null, // not sent by the partner
readInApp: null, // unread messages only
readInEmail: null, // unread messages only
Expand Down
68 changes: 34 additions & 34 deletions apps/web/app/(ee)/api/messages/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,56 +21,56 @@ export const GET = withWorkspace(

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

const programEnrollments = await prisma.programEnrollment.findMany({
where: {
programId,
...(partnerId
? { partnerId }
: {
partner: {
messages: {
some: {
programId,
},
},
},
}),
},
take: 1000, // TODO: add pagination later
include: {
partner: {
include: {
const partners = await prisma.partner.findMany({
where: partnerId
? {
id: partnerId,
// Partner is either discoverable, enrolled in the program, or already has a message with the program
OR: [
{ discoverableAt: { not: null } },
{ programs: { some: { programId } } },
{ messages: { some: { programId } } },
],
}
: {
// Partner has messages with the program
messages: {
where: {
some: {
programId,
},
include: {
senderPartner: true,
senderUser: true,
},
orderBy: {
[sortBy]: sortOrder,
},
take: messagesLimit,
},
},
take: 1000, // TODO: add pagination later
include: {
messages: {
where: {
programId,
},
include: {
senderPartner: true,
senderUser: true,
},
orderBy: {
[sortBy]: sortOrder,
},
take: messagesLimit,
},
},
});

return NextResponse.json(
PartnerMessagesSchema.parse(
programEnrollments
partners
// Sort by most recent message
.sort((a, b) =>
sortOrder === "desc"
? (b.partner.messages?.[0]?.[sortBy]?.getTime() ?? 0) -
(a.partner.messages?.[0]?.[sortBy]?.getTime() ?? 0)
: (a.partner.messages?.[0]?.[sortBy]?.getTime() ?? 0) -
(b.partner.messages?.[0]?.[sortBy]?.getTime() ?? 0),
? (b.messages?.[0]?.[sortBy]?.getTime() ?? 0) -
(a.messages?.[0]?.[sortBy]?.getTime() ?? 0)
: (a.messages?.[0]?.[sortBy]?.getTime() ?? 0) -
(b.messages?.[0]?.[sortBy]?.getTime() ?? 0),
)
// Map to {partner, messages}
.map(({ partner: { messages, ...partner } }) => ({
.map(({ messages, ...partner }) => ({
partner,
messages,
})),
Expand Down
103 changes: 72 additions & 31 deletions apps/web/app/(ee)/api/partner-profile/messages/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,55 +17,96 @@ export const GET = withPartnerProfile(async ({ partner, searchParams }) => {

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

const programEnrollments = await prisma.programEnrollment.findMany({
const programs = await prisma.program.findMany({
where: {
partnerId: partner.id,
program: {
...(programSlug
? { slug: programSlug }
: {
messages: {
some: {
partnerId: partner.id,
// Partner is not banned from the program
partners: {
none: {
partnerId: partner.id,
status: "banned",
},
},

...(programSlug
? {
slug: programSlug,
OR: [
// Partner is enrolled in the program
// in this case, return messages regardless of messaging enabled status which is passed to the UI
{
partners: {
some: {
partnerId: partner.id,
},
},
},
}),
},
{
// Partner has received a direct message from the program
messages: {
some: {
partnerId: partner.id,
senderPartnerId: null, // Sent by the program
},
},
},
],
}
: {
OR: [
// Program has messaging enabled and partner has 1+ messages with the program
{
messagingEnabledAt: {
not: null,
},
messages: {
some: {
partnerId: partner.id,
},
},
},

// Partner has received a direct message from the program
{
messages: {
some: {
partnerId: partner.id,
senderPartnerId: null, // Sent by the program
},
},
},
],
}),
},
include: {
program: {
messages: {
where: {
partnerId: partner.id,
},
include: {
messages: {
where: {
partnerId: partner.id,
},
include: {
senderPartner: true,
senderUser: true,
},
orderBy: {
[sortBy]: sortOrder,
},
take: messagesLimit,
},
senderPartner: true,
senderUser: true,
},
orderBy: {
[sortBy]: sortOrder,
},
take: messagesLimit,
},
},
});

return NextResponse.json(
ProgramMessagesSchema.parse(
programEnrollments
programs
// Sort by most recent message
.sort((a, b) =>
sortOrder === "desc"
? (b.program.messages?.[0]?.[sortBy]?.getTime() ?? 0) -
(a.program.messages?.[0]?.[sortBy]?.getTime() ?? 0)
: (a.program.messages?.[0]?.[sortBy]?.getTime() ?? 0) -
(b.program.messages?.[0]?.[sortBy]?.getTime() ?? 0),
? (b.messages?.[0]?.[sortBy]?.getTime() ?? 0) -
(a.messages?.[0]?.[sortBy]?.getTime() ?? 0)
: (a.messages?.[0]?.[sortBy]?.getTime() ?? 0) -
(b.messages?.[0]?.[sortBy]?.getTime() ?? 0),
)
// Map to {program, messages}
.map(({ program: { messages, ...program } }) => ({
.map(({ messages, ...program }) => ({
program,
messages,
})),
Expand Down
Loading