Merge branch 'main' into email-view

This commit is contained in:
Dries Augustyns
2025-08-22 14:48:54 +02:00
committed by GitHub
4 changed files with 150 additions and 32 deletions
+48 -29
View File
@@ -33,8 +33,8 @@ export class ProjectService {
emails: { select: { createdAt: true } }, emails: { select: { createdAt: true } },
}, },
orderBy: [{ createdAt: "desc" }], orderBy: [{ createdAt: "desc" }],
take: 20, take: 100,
skip: (page - 1) * 20, skip: (page - 1) * 100,
}); });
}); });
}, },
@@ -145,41 +145,60 @@ export class ProjectService {
const itemsPerPage = 10; const itemsPerPage = 10;
const skip = (page - 1) * itemsPerPage; const skip = (page - 1) * itemsPerPage;
const triggers = await prisma.trigger.findMany({ const [triggers, emails] = await Promise.all([
where: { contact: { projectId: id } }, prisma.trigger.findMany({
include: { where: {
contact: { contact: {
select: { projectId: id
id: true, }
email: true, },
select: {
id: true,
createdAt: true,
contact: {
select: {
id: true,
email: true,
},
},
event: {
select: {
name: true,
},
}, },
}, },
event: { orderBy: {createdAt: 'desc'},
select: { take: itemsPerPage,
name: true, skip,
}),
prisma.email.findMany({
where: {
contact: {
projectId: id
}
},
select: {
id: true,
createdAt: true,
messageId: true,
status: true,
contact: {
select: {
id: true,
email: true,
},
}, },
}, },
}, orderBy: {createdAt: 'desc'},
orderBy: { createdAt: "desc" }, take: itemsPerPage,
}); skip,
}),
const emails = await prisma.email.findMany({ ]);
where: { contact: { projectId: id } },
include: {
contact: {
select: {
id: true,
email: true,
},
},
},
orderBy: { createdAt: "desc" },
});
const combined = [...triggers, ...emails]; const combined = [...triggers, ...emails];
combined.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime()); combined.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
return combined.slice(skip, skip + itemsPerPage); return combined.slice(0, itemsPerPage);
} }
public static usage(id: string) { public static usage(id: string) {
@@ -237,8 +237,8 @@ export default function Index() {
<nav className="flex items-center justify-between py-3" aria-label="Pagination"> <nav className="flex items-center justify-between py-3" aria-label="Pagination">
<div className="hidden sm:block"> <div className="hidden sm:block">
<p className="text-sm text-neutral-700"> <p className="text-sm text-neutral-700">
Showing <span className="font-medium">{(page - 1) * 20}</span> to{" "} Showing <span className="font-medium">{(page - 1) * 100}</span> to{" "}
<span className="font-medium">{page * 20}</span> of <span className="font-medium">{filtered.length}</span>{" "} <span className="font-medium">{page * 100}</span> of <span className="font-medium">{contacts.count}</span>{" "}
contacts contacts
</p> </p>
</div> </div>
@@ -0,0 +1,74 @@
-- CreateIndex
CREATE INDEX "actions_projectId_idx" ON "actions"("projectId");
-- CreateIndex
CREATE INDEX "actions_templateId_idx" ON "actions"("templateId");
-- CreateIndex
CREATE INDEX "clicks_createdAt_idx" ON "clicks"("createdAt");
-- CreateIndex
CREATE INDEX "clicks_link_idx" ON "clicks"("link");
-- CreateIndex
CREATE INDEX "clicks_emailId_idx" ON "clicks"("emailId");
-- CreateIndex
CREATE INDEX "contacts_projectId_createdAt_idx" ON "contacts"("projectId", "createdAt");
-- CreateIndex
CREATE INDEX "contacts_email_idx" ON "contacts"("email");
-- CreateIndex
CREATE INDEX "contacts_createdAt_idx" ON "contacts"("createdAt");
-- CreateIndex
CREATE INDEX "emails_projectId_idx" ON "emails"("projectId");
-- CreateIndex
CREATE INDEX "emails_actionId_idx" ON "emails"("actionId");
-- CreateIndex
CREATE INDEX "emails_campaignId_idx" ON "emails"("campaignId");
-- CreateIndex
CREATE INDEX "emails_contactId_idx" ON "emails"("contactId");
-- CreateIndex
CREATE INDEX "emails_createdAt_idx" ON "emails"("createdAt");
-- CreateIndex
CREATE INDEX "events_projectId_idx" ON "events"("projectId");
-- CreateIndex
CREATE INDEX "events_templateId_idx" ON "events"("templateId");
-- CreateIndex
CREATE INDEX "events_campaignId_idx" ON "events"("campaignId");
-- CreateIndex
CREATE INDEX "tasks_actionId_idx" ON "tasks"("actionId");
-- CreateIndex
CREATE INDEX "tasks_campaignId_idx" ON "tasks"("campaignId");
-- CreateIndex
CREATE INDEX "tasks_contactId_idx" ON "tasks"("contactId");
-- CreateIndex
CREATE INDEX "tasks_createdAt_idx" ON "tasks"("createdAt");
-- CreateIndex
CREATE INDEX "tasks_runBy_idx" ON "tasks"("runBy");
-- CreateIndex
CREATE INDEX "triggers_contactId_idx" ON "triggers"("contactId");
-- CreateIndex
CREATE INDEX "triggers_eventId_idx" ON "triggers"("eventId");
-- CreateIndex
CREATE INDEX "triggers_actionId_idx" ON "triggers"("actionId");
-- CreateIndex
CREATE INDEX "triggers_createdAt_idx" ON "triggers"("createdAt");
+26 -1
View File
@@ -99,6 +99,9 @@ model Event {
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
@@index(fields: [projectId, templateId, campaignId]) @@index(fields: [projectId, templateId, campaignId])
@@index([projectId])
@@index([templateId])
@@index([campaignId])
@@map("events") @@map("events")
} }
@@ -155,6 +158,8 @@ model Action {
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
@@index(fields: [projectId, templateId]) @@index(fields: [projectId, templateId])
@@index([projectId])
@@index([templateId])
@@map("actions") @@map("actions")
} }
@@ -203,6 +208,10 @@ model Trigger {
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
@@index(fields: [contactId, eventId, actionId, createdAt]) @@index(fields: [contactId, eventId, actionId, createdAt])
@@index([contactId])
@@index([eventId])
@@index([actionId])
@@index([createdAt])
@@map("triggers") @@map("triggers")
} }
@@ -227,7 +236,10 @@ model Contact {
createdAt DateTime @default(now()) createdAt DateTime @default(now())
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
@@index(fields: [projectId]) @@index(fields: [projectId, createdAt])
@@index([projectId])
@@index([email])
@@index([createdAt])
@@map("contacts") @@map("contacts")
} }
@@ -259,6 +271,11 @@ model Email {
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
@@index(fields: [projectId, actionId, campaignId, contactId, createdAt]) @@index(fields: [projectId, actionId, campaignId, contactId, createdAt])
@@index([projectId])
@@index([actionId])
@@index([campaignId])
@@index([contactId])
@@index([createdAt])
@@map("emails") @@map("emails")
} }
@@ -276,6 +293,9 @@ model Click {
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
@@index([emailId, createdAt]) @@index([emailId, createdAt])
@@index([createdAt])
@@index([link])
@@index([emailId])
@@map("clicks") @@map("clicks")
} }
@@ -300,6 +320,11 @@ model Task {
updatedAt DateTime @updatedAt updatedAt DateTime @updatedAt
@@index([runBy, createdAt]) @@index([runBy, createdAt])
@@index([actionId])
@@index([campaignId])
@@index([contactId])
@@index([createdAt])
@@index([runBy])
@@map("tasks") @@map("tasks")
} }