@@ -91,7 +91,14 @@ export async function upsertMailingLists(
9191
9292 const rows = await qx . select (
9393 `
94- WITH upserted_list AS (
94+ WITH existing AS (
95+ SELECT id, "deletedAt"
96+ FROM mailinglist.lists
97+ WHERE "sourceUrl" IN (
98+ SELECT v."sourceUrl" FROM json_to_recordset($(lists)::json) AS v(name text, "sourceUrl" text)
99+ )
100+ ),
101+ upserted_list AS (
95102 INSERT INTO mailinglist.lists (id, name, "sourceUrl", "segmentId", "integrationId", "createdAt", "updatedAt")
96103 SELECT uuid_generate_v4(), v.name, v."sourceUrl", $(segmentId)::uuid, $(integrationId)::uuid, NOW(), NOW()
97104 FROM json_to_recordset($(lists)::json) AS v(name text, "sourceUrl" text)
@@ -103,6 +110,20 @@ export async function upsertMailingLists(
103110 "updatedAt" = NOW()
104111 RETURNING id
105112 ),
113+ -- A previously soft-deleted list being re-onboarded must not resume from
114+ -- its old owner's checkpoint, so reset processing state on reactivation.
115+ reset_processing AS (
116+ UPDATE mailinglist."listProcessing" lp
117+ SET state = 'pending',
118+ "lastProcessedHeads" = '{}'::jsonb,
119+ "lockedAt" = NULL,
120+ "lastProcessedAt" = NULL,
121+ "updatedAt" = NOW()
122+ FROM upserted_list ul
123+ JOIN existing e ON e.id = ul.id
124+ WHERE lp."listId" = ul.id
125+ AND e."deletedAt" IS NOT NULL
126+ ),
106127 seed_processing AS (
107128 INSERT INTO mailinglist."listProcessing" ("listId", state, priority, "lastProcessedHeads", "createdAt", "updatedAt")
108129 SELECT id, 'pending', 2, '{}'::jsonb, NOW(), NOW()
0 commit comments