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
12 changes: 9 additions & 3 deletions controllers/ArtistsProController/getArtistsProHandler.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,26 @@
import { Request, Response } from "express";
import { getAllEnterpriseAccounts } from "@/lib/enterprise/getAllEnterpriseAccounts";
import { getSubscriberAccountEmails } from "@/lib/stripe/getSubscriberAccountEmails";

/**
* Handles GET requests for artists list
* Returns enterprise emails
* Returns enterprise emails and account emails from active subscriptions
*/
export const getArtistsProHandler = async (
req: Request,
res: Response
): Promise<void> => {
try {
const allEnterpriseEmails = await getAllEnterpriseAccounts();
const [allEnterpriseEmails, subscriptionAccountEmails] = await Promise.all([
getAllEnterpriseAccounts(),
getSubscriberAccountEmails(),
]);

const artists = [...allEnterpriseEmails, ...subscriptionAccountEmails];

res.status(200).json({
status: "success",
artists: allEnterpriseEmails,
artists,
});
} catch (error) {
console.error("[ERROR] Error in getArtistsProHandler:", error);
Expand Down
2 changes: 1 addition & 1 deletion controllers/SubscriptionsController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ export const getSubscriptionsHandler = async (
}

// Get account emails to check if any belong to enterprise domain
const accountEmails = await getAccountEmails({ account_id: accountId });
const accountEmails = await getAccountEmails({ account_ids: [accountId] });

if (!accountEmails || accountEmails.length === 0) {
res.status(404).json({
Expand Down
14 changes: 7 additions & 7 deletions lib/enterprise/getAllEnterpriseAccounts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@ type AccountEmail = Tables<"account_emails">;
* @returns Array of account emails from enterprise domains
*/
export const getAllEnterpriseAccounts = async (): Promise<AccountEmail[]> => {
const allEnterpriseEmails: AccountEmail[] = [];
// Query for each enterprise domain using queryEmail parameter in parallel
const emailPromises = Array.from(ENTERPRISE_DOMAINS).map((domain) =>
getAccountEmails({ queryEmail: `@${domain}` })
);

// Query for each enterprise domain using queryEmail parameter
for (const domain of ENTERPRISE_DOMAINS) {
const emails = await getAccountEmails({ queryEmail: `@${domain}` });
allEnterpriseEmails.push(...emails);
}
const emailArrays = await Promise.all(emailPromises);

return allEnterpriseEmails;
// Flatten the array of arrays into a single array
return emailArrays.flat();
};
9 changes: 7 additions & 2 deletions lib/stripe/getActiveSubscriptions.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import stripeClient from "./client";
import Stripe from "stripe";

export const getActiveSubscriptions = async (accountId: string) => {
export const getActiveSubscriptions = async (accountId?: string) => {
try {
const subscriptions = await stripeClient.subscriptions.list({
limit: 100,
Expand All @@ -10,11 +10,16 @@ export const getActiveSubscriptions = async (accountId: string) => {
},
});

// Return all active subscriptions if no accountId provided
if (!accountId) {
return subscriptions?.data || [];
}

// Filter by accountId if provided
const activeSubscriptions = subscriptions?.data?.filter(
(subscription: Stripe.Subscription) =>
subscription.metadata?.accountId === accountId
);

return activeSubscriptions || [];
} catch (error) {
console.error("Error fetching subscriptions:", error);
Expand Down
31 changes: 31 additions & 0 deletions lib/stripe/getSubscriberAccountEmails.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { getActiveSubscriptions } from "./getActiveSubscriptions";
import { getAccountEmails } from "@/lib/supabase/account_emails/getAccountEmails";
import Stripe from "stripe";
import { Tables } from "@/types/database.types";

type AccountEmail = Tables<"account_emails">;

/**
* Gets account emails for all active subscriptions
* Extracts accountIds from subscription metadata and fetches corresponding account emails
* @returns Array of account emails from active subscriptions
*/
export const getSubscriberAccountEmails = async (): Promise<AccountEmail[]> => {
const activeSubscriptions = await getActiveSubscriptions();

// Extract accountIds from subscription metadata
const accountIds = activeSubscriptions
.map(
(subscription: Stripe.Subscription) => subscription.metadata?.accountId
)
.filter((accountId: string | undefined): accountId is string =>
Boolean(accountId)
);

// Get account emails for subscriptions with accountIds
if (accountIds.length === 0) {
return [];
}

return await getAccountEmails({ account_ids: accountIds });
};
6 changes: 3 additions & 3 deletions lib/supabase/account_emails/getAccountEmails.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { Tables } from "../../../types/database.types";
type AccountEmail = Tables<"account_emails">;

type GetAccountEmailsParams = {
account_id?: string;
account_ids?: string[];
queryEmail?: string;
};

Expand All @@ -17,8 +17,8 @@ export const getAccountEmails = async (
let query = serverClient.from("account_emails").select("*");

// Add filters based on provided parameters
if (params.account_id) {
query = query.eq("account_id", params.account_id);
if (params.account_ids && params.account_ids.length > 0) {
query = query.in("account_id", params.account_ids);
}

if (params.queryEmail) {
Expand Down