Skip to content
Closed
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

This file was deleted.

This file was deleted.

54 changes: 21 additions & 33 deletions apps/web/lib/actions/partners/onboard-partner.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
"use server";

import { createId } from "@/lib/api/utils";
import { createDotsUser } from "@/lib/dots/create-dots-user";
import { sendVerificationToken } from "@/lib/dots/send-verification-token";
import { userIsInBeta } from "@/lib/edge-config";
import { completeProgramApplications } from "@/lib/partners/complete-program-applications";
import { storage } from "@/lib/storage";
import { createConnectedAccount } from "@/lib/stripe/create-connected-account";
import { onboardPartnerSchema } from "@/lib/zod/schemas/partners";
import { prisma } from "@dub/prisma";
import { COUNTRY_PHONE_CODES, nanoid } from "@dub/utils";
Expand All @@ -30,51 +29,46 @@ export const onboardPartnerAction = authUserActionClient
const { name, email, image, country, phoneNumber, description } =
parsedInput;

// Create the Dots user with DOTS_DEFAULT_APP_ID
const [firstName, lastName] = name.split(" ");
const countryCode = COUNTRY_PHONE_CODES[country] || null;

if (!countryCode) {
throw new Error("Invalid country code.");
if (!COUNTRY_PHONE_CODES[country]) {
throw new Error("Invalid country code or country not supported.");
}

const dotsUserInfo = {
firstName,
lastName: lastName || firstName.slice(0, 1), // Dots requires a last name
// Create the Stripe connected account for the partner
const connectedAccount = await createConnectedAccount({
name,
email,
countryCode: countryCode.toString(),
country,
phoneNumber,
};

const dotsUser = await createDotsUser({
userInfo: dotsUserInfo,
});

const partnerExists = await prisma.partner.findUnique({
where: {
dotsUserId: dotsUser.id,
},
});
// TODO:
// This needs testing. Not sure how Stripe handle this

if (partnerExists) {
throw new Error("This phone number is already in use.");
}
// const partnerExists = await prisma.partner.findUnique({
// where: {
// stripeConnectId: connectedAccount.id,
// },
// });

// if (partnerExists) {
// throw new Error("This phone number is already in use.");
// }

const partnerId = createId({ prefix: "pn_" });

const imageUrl = await storage
.upload(`partners/${partnerId}/image_${nanoid(7)}`, image)
.then(({ url }) => url);

const [partner, _] = await Promise.all([
await Promise.all([
prisma.partner.create({
data: {
id: partnerId,
name,
email,
country,
bio: description,
dotsUserId: dotsUser.id,
stripeConnectId: connectedAccount.id,
image: imageUrl,
users: {
create: {
Expand All @@ -84,6 +78,7 @@ export const onboardPartnerAction = authUserActionClient
},
},
}),

prisma.user.update({
where: {
id: user.id,
Expand All @@ -92,15 +87,8 @@ export const onboardPartnerAction = authUserActionClient
defaultPartnerId: partnerId,
},
}),
sendVerificationToken({
dotsUserId: dotsUser.id,
}),
]);

// Complete any outstanding program applications
waitUntil(completeProgramApplications(user.id));

return {
partnerId: partner.id,
};
});
23 changes: 0 additions & 23 deletions apps/web/lib/actions/partners/resend-verification-code.ts

This file was deleted.

30 changes: 0 additions & 30 deletions apps/web/lib/actions/partners/verify-partner.ts

This file was deleted.

2 changes: 1 addition & 1 deletion apps/web/lib/api/workspaces.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import { deleteDomainAndLinks } from "@/lib/api/domains";
import { storage } from "@/lib/storage";
import { cancelSubscription } from "@/lib/stripe";
import { recordLink } from "@/lib/tinybird";
import { WorkspaceProps } from "@/lib/types";
import { formatRedisLink, redis } from "@/lib/upstash";
Expand All @@ -12,6 +11,7 @@ import {
R2_URL,
} from "@dub/utils";
import { waitUntil } from "@vercel/functions";
import { cancelSubscription } from "../stripe/cancel-subscription";

export async function deleteWorkspace(
workspace: Pick<WorkspaceProps, "id" | "slug" | "logo" | "stripeId">,
Expand Down
16 changes: 10 additions & 6 deletions apps/web/lib/middleware/partners.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ const UNAUTHENTICATED_PATHS = [
"/apply",
];

const PARTNER_REDIRECTS = {
"/settings/payouts": "/settings/wallet",
};
// const PARTNER_REDIRECTS = {
// "/settings/payouts": "/settings/wallet",
// };

export default async function PartnersMiddleware(req: NextRequest) {
const { path, fullPath } = parse(req);
Expand Down Expand Up @@ -45,9 +45,13 @@ export default async function PartnersMiddleware(req: NextRequest) {
return NextResponse.redirect(new URL("/onboarding", req.url));
} else if (path === "/" || path.startsWith("/pn_")) {
return NextResponse.redirect(new URL("/programs", req.url));
} else if (PARTNER_REDIRECTS[path]) {
return NextResponse.redirect(new URL(PARTNER_REDIRECTS[path], req.url));
} else if (["/login", "/register"].some((p) => path.startsWith(p))) {
}

// else if (PARTNER_REDIRECTS[path]) {
// return NextResponse.redirect(new URL(PARTNER_REDIRECTS[path], req.url));
// }

else if (["/login", "/register"].some((p) => path.startsWith(p))) {
return NextResponse.redirect(new URL("/", req.url)); // Redirect authenticated users to dashboard
}
}
Expand Down
23 changes: 23 additions & 0 deletions apps/web/lib/stripe/cancel-subscription.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { stripe } from ".";

export async function cancelSubscription(customer?: string) {
if (!customer) return;

try {
const subscriptionId = await stripe.subscriptions
.list({
customer,
})
.then((res) => res.data[0].id);

return await stripe.subscriptions.update(subscriptionId, {
cancel_at_period_end: true,
cancellation_details: {
comment: "Customer deleted their Dub workspace.",
},
});
} catch (error) {
console.log("Error cancelling Stripe subscription", error);
return;
}
}
Loading
Loading