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
8 changes: 8 additions & 0 deletions apps/web/app/(ee)/api/cron/campaigns/broadcast/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,14 @@ export async function POST(req: Request) {
in: campaignGroupIds,
},
}),
...(campaign.programId === "prog_1K0QHV7MP3PR05CJSCF5VN93X" && {
partner: {
country: "US",
email: {
endsWith: ".edu",
},
},
}),
},
select: {
id: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -250,22 +250,22 @@ export const POST = withCron(async ({ rawBody }) => {
return {
partner,
previousMonth: {
earnings: _previousMonthEarnings?._sum.earnings ?? 0,
clicks: _previousMonthAnalytics?.clicks ?? 0,
leads: _previousMonthAnalytics?.leads ?? 0,
sales: _previousMonthAnalytics?.sales ?? 0,
earnings: _previousMonthEarnings?._sum.earnings ?? 0,
},
currentMonth: {
earnings: _currentMonthEarnings?._sum.earnings ?? 0,
clicks: _currentMonthAnalytics?.clicks ?? 0,
leads: _currentMonthAnalytics?.leads ?? 0,
sales: _currentMonthAnalytics?.sales ?? 0,
earnings: _currentMonthEarnings?._sum.earnings ?? 0,
},
lifetime: {
earnings: _lifetimeEarnings?._sum.earnings ?? 0,
clicks: _lifetimeAnalytics?.clicks ?? 0,
leads: _lifetimeAnalytics?.leads ?? 0,
sales: _lifetimeAnalytics?.sales ?? 0,
earnings: _lifetimeEarnings?._sum.earnings ?? 0,
},
};
});
Expand All @@ -274,14 +274,14 @@ export const POST = withCron(async ({ rawBody }) => {
summary.map((s) => ({
partner: s.partner.email,
program: program.name,
currentEarnings: s.currentMonth.earnings,
currentClicks: s.currentMonth.clicks,
currentLeads: s.currentMonth.leads,
currentSales: s.currentMonth.sales,
currentEarnings: s.currentMonth.earnings,
lifetimeEarnings: s.lifetime.earnings,
lifetimeClicks: s.lifetime.clicks,
lifetimeLeads: s.lifetime.leads,
lifetimeSales: s.lifetime.sales,
lifetimeEarnings: s.lifetime.earnings,
})),
);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import useWorkspace from "@/lib/swr/use-workspace";
import { EnrolledPartnerProps, PartnerPlatformProps } from "@/lib/types";
import { useBulkApprovePartnersModal } from "@/ui/modals/bulk-approve-partners-modal";
import { useBulkRejectPartnersModal } from "@/ui/modals/bulk-reject-partners-modal";
import { useApprovePartnerApplicationModal } from "@/ui/modals/approve-partner-application-modal";
import { useRejectPartnerApplicationModal } from "@/ui/modals/reject-partner-application-modal";
import { GroupColorCircle } from "@/ui/partners/groups/group-color-circle";
import { PartnerApplicationSheet } from "@/ui/partners/partner-application-sheet";
Expand All @@ -30,7 +31,7 @@ import {
useRouterStuff,
useTable,
} from "@dub/ui";
import { Dots, Users, UserXmark } from "@dub/ui/icons";
import { Dots, UserCheck, Users, UserXmark } from "@dub/ui/icons";
import { COUNTRIES, fetcher, formatDate } from "@dub/utils";
import { Row } from "@tanstack/react-table";
import { Command } from "cmdk";
Expand Down Expand Up @@ -512,6 +513,17 @@ function RowMenuButton({
}) {
const [isOpen, setIsOpen] = useState(false);

const {
ApprovePartnerApplicationModal,
setShowApprovePartnerApplicationModal,
} = useApprovePartnerApplicationModal({
partner: row.original,
groupId: row.original.groupId,
onConfirm: async () => {
await mutatePrefix(["/api/partners", "/api/partners/count"]);
},
});

const {
RejectPartnerApplicationModal,
setShowRejectPartnerApplicationModal,
Expand All @@ -524,13 +536,24 @@ function RowMenuButton({

return (
<>
{ApprovePartnerApplicationModal}
{RejectPartnerApplicationModal}
<Popover
openPopover={isOpen}
setOpenPopover={setIsOpen}
content={
<Command tabIndex={0} loop className="focus:outline-none">
<Command.List className="flex w-screen flex-col gap-1 p-1.5 text-sm focus-visible:outline-none sm:w-auto sm:min-w-[200px]">
<MenuItem
as={Command.Item}
icon={UserCheck}
onSelect={() => {
setIsOpen(false);
setShowApprovePartnerApplicationModal(true);
}}
>
Approve application
</MenuItem>
<MenuItem
as={Command.Item}
icon={UserXmark}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
"use server";

import { recordAuditLog } from "@/lib/api/audit-logs/record-audit-log";
import { reportFraudToNetwork } from "@/lib/api/fraud/report-fraud-to-network";
import { resolveFraudGroups } from "@/lib/api/fraud/resolve-fraud-groups";
import { getDefaultProgramIdOrThrow } from "@/lib/api/programs/get-default-program-id-or-throw";
import { bulkRejectPartnersSchema } from "@/lib/zod/schemas/partners";
Expand All @@ -16,7 +15,7 @@ export const bulkRejectPartnerApplicationsAction = authActionClient
.inputSchema(bulkRejectPartnersSchema)
.action(async ({ parsedInput, ctx }) => {
const { workspace, user } = ctx;
const { partnerIds, reportFraud } = parsedInput;
const { partnerIds } = parsedInput;

throwIfNoPermission({
role: workspace.role,
Expand Down Expand Up @@ -71,10 +70,6 @@ export const bulkRejectPartnerApplicationsAction = authActionClient
"Resolved automatically because the partner application was rejected.",
});

const rejectedPartnerIds = [
...new Set(programEnrollments.map((pe) => pe.partner.id)),
];

waitUntil(
(async () => {
await Promise.allSettled([
Expand All @@ -94,13 +89,6 @@ export const bulkRejectPartnerApplicationsAction = authActionClient
],
})),
),

reportFraud && rejectedPartnerIds.length > 0
? reportFraudToNetwork({
programId,
partnerIds: rejectedPartnerIds,
})
: Promise.resolve(),
]);
})(),
);
Expand Down
10 changes: 1 addition & 9 deletions apps/web/lib/actions/partners/reject-partner-application.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
"use server";

import { recordAuditLog } from "@/lib/api/audit-logs/record-audit-log";
import { reportFraudToNetwork } from "@/lib/api/fraud/report-fraud-to-network";
import { resolveFraudGroups } from "@/lib/api/fraud/resolve-fraud-groups";
import { getDefaultProgramIdOrThrow } from "@/lib/api/programs/get-default-program-id-or-throw";
import { rejectPartnerSchema } from "@/lib/zod/schemas/partners";
Expand All @@ -16,7 +15,7 @@ export const rejectPartnerApplicationAction = authActionClient
.inputSchema(rejectPartnerSchema)
.action(async ({ parsedInput, ctx }) => {
const { workspace, user } = ctx;
const { partnerId, reportFraud } = parsedInput;
const { partnerId } = parsedInput;

throwIfNoPermission({
role: workspace.role,
Expand Down Expand Up @@ -84,13 +83,6 @@ export const rejectPartnerApplicationAction = authActionClient
resolutionReason:
"Resolved automatically because the partner application was rejected.",
}),

reportFraud
? reportFraudToNetwork({
programId,
partnerIds: [partnerId],
})
: Promise.resolve(),
]);
})(),
);
Expand Down
9 changes: 0 additions & 9 deletions apps/web/lib/api/fraud/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,6 @@ export const FRAUD_RULES: FraudRuleInfo[] = [
},

// Partner rules
{
type: "partnerFraudReport",
name: "Fraud report",
description:
"This partner was rejected from another program due to suspected fraud during their application.",
scope: "partner",
severity: "high",
configurable: true,
},
{
type: "partnerCrossProgramBan",
name: "Cross-program ban",
Expand Down
1 change: 0 additions & 1 deletion apps/web/lib/api/fraud/execute-fraud-rule.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ const FRAUD_RULES_REGISTRY: Record<
referralSourceBanned: checkReferralSourceBanned,
paidTrafficDetected: checkPaidTrafficDetected,
partnerCrossProgramBan: defineFraudRuleStub("partnerCrossProgramBan"),
partnerFraudReport: defineFraudRuleStub("partnerFraudReport"),
partnerDuplicatePayoutMethod: defineFraudRuleStub(
"partnerDuplicatePayoutMethod",
),
Expand Down
69 changes: 0 additions & 69 deletions apps/web/lib/api/fraud/report-fraud-to-network.ts

This file was deleted.

3 changes: 0 additions & 3 deletions apps/web/lib/api/fraud/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,6 @@ function getIdentityFieldsForFraudEvent({
return {
sourceProgramId,
};

case "partnerFraudReport":
return {};
}
}

Expand Down
6 changes: 3 additions & 3 deletions apps/web/lib/api/partners/notify-partner-commission.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import {
Project,
User,
} from "@dub/prisma/client";
import { chunk } from "@dub/utils";
import { chunk, currencyFormatter } from "@dub/utils";

// Send email to partner and program owners when a commission is created
export async function notifyPartnerCommission({
Expand Down Expand Up @@ -136,7 +136,7 @@ export async function notifyPartnerCommission({
...partnerEmailsToNotify.map(
(email) =>
({
subject: "You just made a commission via Dub Partners!",
subject: `You've made a ${currencyFormatter(commission.earnings)} commission from ${program.name}`,
variant: "notifications",
to: email,
replyTo: program.supportEmail || "noreply",
Expand All @@ -151,7 +151,7 @@ export async function notifyPartnerCommission({
? workspaceUsers.map(
({ user }) =>
({
subject: `New customer referred by ${partner.name}`,
subject: `New ${currencyFormatter(commission.amount)} sale referred by ${partner.name}`,
variant: "notifications",
to: user.email!,
react: NewSaleAlertProgramOwner({
Expand Down
7 changes: 7 additions & 0 deletions apps/web/lib/is-generic-email.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ const GENERIC_EMAIL_DOMAINS = [
"mac.com",
"msn.com",
"live.com",
"live.dk",
"web.de",
"protonmail.com",
"proton.me",
Expand All @@ -29,8 +30,14 @@ const GENERIC_EMAIL_DOMAINS = [
"naver.com",
"yeah.net",
"example.com",
"wp.pl",
"seznam.cz",
"myyahoo.com",
"mail.com",
"mail.ru",
"email.cz",
"email.de",
"t-online.de",
];

const GENERIC_EMAIL_DOMAIN_PREFIXES = [
Expand Down
3 changes: 0 additions & 3 deletions apps/web/lib/zod/schemas/fraud.ts
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,6 @@ export const updateFraudRuleSettingsSchema = z.object({
customerEmailSuspiciousDomain: toggleOnlyFraudRuleSchema,
partnerCrossProgramBan: toggleOnlyFraudRuleSchema,
partnerDuplicatePayoutMethod: toggleOnlyFraudRuleSchema,
partnerFraudReport: toggleOnlyFraudRuleSchema,
});

const baseFraudEventSchema = z.object({
Expand Down Expand Up @@ -322,6 +321,4 @@ export const fraudEventSchemas = {
}),

partnerDuplicatePayoutMethod: baseFraudEventSchema,

partnerFraudReport: baseFraudEventSchema,
};
14 changes: 0 additions & 14 deletions apps/web/lib/zod/schemas/partners.ts
Original file line number Diff line number Diff line change
Expand Up @@ -847,13 +847,6 @@ export const bulkApprovePartnersSchema = z.object({
export const rejectPartnerSchema = z.object({
workspaceId: z.string(),
partnerId: z.string(),
reportFraud: z
.boolean()
.optional()
.default(false)
.describe(
"Whether to report this partner for suspected fraud to help keep the network safe.",
),
});

export const bulkRejectPartnersSchema = z.object({
Expand All @@ -863,13 +856,6 @@ export const bulkRejectPartnersSchema = z.object({
.max(100)
.min(1)
.transform((v) => [...new Set(v)]),
reportFraud: z
.boolean()
.optional()
.default(false)
.describe(
"Whether to report these partners for suspected fraud to help keep the network safe.",
),
});

export const retrievePartnerLinksSchema = partnerIdTenantIdSchema;
Expand Down
Loading
Loading