fix: Reentry into segment not working after exit

This commit is contained in:
Dries Augustyns
2026-01-03 11:40:27 +01:00
parent ee00eb3481
commit 4dce71a1fe
+29 -1
View File
@@ -356,14 +356,42 @@ export class SegmentService {
for (let i = 0; i < toAdd.length; i += ADD_BATCH_SIZE) { for (let i = 0; i < toAdd.length; i += ADD_BATCH_SIZE) {
const batch = toAdd.slice(i, i + ADD_BATCH_SIZE); const batch = toAdd.slice(i, i + ADD_BATCH_SIZE);
// Check which contacts already have a membership record (inactive)
const existingMemberships = await prisma.segmentMembership.findMany({
where: {
segmentId,
contactId: {in: batch},
},
select: {contactId: true},
});
const existingContactIds = new Set(existingMemberships.map(m => m.contactId));
const newEntries = batch.filter(id => !existingContactIds.has(id));
const reEntries = batch.filter(id => existingContactIds.has(id));
if (newEntries.length > 0) {
await prisma.segmentMembership.createMany({ await prisma.segmentMembership.createMany({
data: batch.map(contactId => ({ data: newEntries.map(contactId => ({
segmentId, segmentId,
contactId, contactId,
enteredAt: new Date(), enteredAt: new Date(),
})), })),
skipDuplicates: true, skipDuplicates: true,
}); });
}
if (reEntries.length > 0) {
await prisma.segmentMembership.updateMany({
where: {
segmentId,
contactId: {in: reEntries},
},
data: {
exitedAt: null,
enteredAt: new Date(),
},
});
}
// Create segment-specific entry events for each contact in the batch // Create segment-specific entry events for each contact in the batch
for (const contactId of batch) { for (const contactId of batch) {