diff --git a/src/services/subscription/subscription-router.test.ts b/src/services/subscription/subscription-router.test.ts index 61705212..d54958cf 100644 --- a/src/services/subscription/subscription-router.test.ts +++ b/src/services/subscription/subscription-router.test.ts @@ -256,6 +256,45 @@ describe("POST /subscription/send-email/single", () => { }); }); +describe("GET /subscription/lists", () => { + it("should return an empty array when no subscriptions exist", async () => { + const response = await getAsAdmin("/subscription/lists").expect( + StatusCodes.OK + ); + expect(response.body).toEqual([]); + }); + + it("should return unique mailing lists", async () => { + await SupabaseDB.SUBSCRIPTIONS.insert([ + { userId: USER_ID_1, mailingList: VALID_mailingList }, + { userId: USER_ID_2, mailingList: VALID_mailingList }, // duplicate mailing list + { userId: USER_ID_1, mailingList: "newsletter" }, + ]).throwOnError(); + + const response = await getAsAdmin("/subscription/lists").expect( + StatusCodes.OK + ); + + expect(response.body).toHaveLength(2); + expect(response.body).toEqual( + expect.arrayContaining([VALID_mailingList, "newsletter"]) + ); + }); + + it("should return a single unique mailing list when all subscriptions are for the same list", async () => { + await SupabaseDB.SUBSCRIPTIONS.insert([ + { userId: USER_ID_1, mailingList: VALID_mailingList }, + { userId: USER_ID_2, mailingList: VALID_mailingList }, + ]).throwOnError(); + + const response = await getAsAdmin("/subscription/lists").expect( + StatusCodes.OK + ); + + expect(response.body).toEqual([VALID_mailingList]); + }); +}); + describe("GET /subscription/:mailingList", () => { it("should return the list of subscribers for an existing mailing list", async () => { const emails = ["user1@test.com", "user2@test.com"]; diff --git a/src/services/subscription/subscription-router.ts b/src/services/subscription/subscription-router.ts index 2b01755e..fcc7fd1d 100644 --- a/src/services/subscription/subscription-router.ts +++ b/src/services/subscription/subscription-router.ts @@ -68,6 +68,21 @@ subscriptionRouter.get( } ); +subscriptionRouter.get( + "/lists", + RoleChecker([Role.Enum.ADMIN]), + async (req, res) => { + const { data: subscriptions } = + await SupabaseDB.SUBSCRIPTIONS.select("mailingList").throwOnError(); + + const uniqueMailingLists = [ + ...new Set(subscriptions?.map((sub) => sub.mailingList) || []), + ]; + + return res.status(StatusCodes.OK).json(uniqueMailingLists); + } +); + // Send an email to a mailing list // API body: {String} mailingList The list to send the email to, {String} subject The subject line of the email, {String} htmlBody The HTML content of the email. subscriptionRouter.post(