Thanks to visit codestin.com
Credit goes to github.com

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
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { generatePartnerLink } from "@/lib/api/partners/generate-partner-link";
import { qstash } from "@/lib/cron";
import { verifyQstashSignature } from "@/lib/cron/verify-qstash";
import { WorkspaceProps } from "@/lib/types";
import { MAX_DEFAULT_PARTNER_LINKS } from "@/lib/zod/schemas/groups";
import { MAX_DEFAULT_LINKS_PER_GROUP } from "@/lib/zod/schemas/groups";
import { prisma } from "@dub/prisma";
import { APP_DOMAIN_WITH_NGROK, isFulfilled, log } from "@dub/utils";
import { z } from "zod";
Expand Down Expand Up @@ -86,7 +86,7 @@ export async function POST(req: Request) {
orderBy: {
createdAt: "asc",
},
take: MAX_DEFAULT_PARTNER_LINKS, // there can only be up to MAX_DEFAULT_PARTNER_LINKS default links per group
take: MAX_DEFAULT_LINKS_PER_GROUP, // there can only be up to MAX_DEFAULT_LINKS_PER_GROUP default links per group
},
},
}),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { withWorkspace } from "@/lib/auth";
import { qstash } from "@/lib/cron";
import {
createOrUpdateDefaultLinkSchema,
MAX_DEFAULT_PARTNER_LINKS,
MAX_DEFAULT_LINKS_PER_GROUP,
PartnerGroupDefaultLinkSchema,
} from "@/lib/zod/schemas/groups";
import { prisma } from "@dub/prisma";
Expand Down Expand Up @@ -90,10 +90,10 @@ export const POST = withWorkspace(
},
});

if (count >= MAX_DEFAULT_PARTNER_LINKS) {
if (count >= MAX_DEFAULT_LINKS_PER_GROUP) {
throw new DubApiError({
code: "bad_request",
message: `You can't create more than ${MAX_DEFAULT_PARTNER_LINKS} default links for a group.`,
message: `You can't create more than ${MAX_DEFAULT_LINKS_PER_GROUP} default links for a group.`,
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import useGroup from "@/lib/swr/use-group";
import usePartnerGroupDefaultLinks from "@/lib/swr/use-partner-group-default-links";
import useWorkspace from "@/lib/swr/use-workspace";
import { PartnerGroupDefaultLink } from "@/lib/types";
import { MAX_DEFAULT_PARTNER_LINKS } from "@/lib/zod/schemas/groups";
import { MAX_DEFAULT_LINKS_PER_GROUP } from "@/lib/zod/schemas/groups";
import { useConfirmModal } from "@/ui/modals/confirm-modal";
import { ThreeDots } from "@/ui/shared/icons";
import {
Expand All @@ -28,7 +28,7 @@ export function GroupDefaultLinks() {
usePartnerGroupDefaultLinks();

const hasReachedMaxLinks = defaultLinks
? defaultLinks.length >= MAX_DEFAULT_PARTNER_LINKS
? defaultLinks.length >= MAX_DEFAULT_LINKS_PER_GROUP
: false;

return (
Expand Down Expand Up @@ -97,7 +97,7 @@ function CreateDefaultLinkButton({
disabled={hasReachedMaxLinks || isLoadingGroup}
disabledTooltip={
hasReachedMaxLinks
? `You can only create up to ${MAX_DEFAULT_PARTNER_LINKS} default links.`
? `You can only create up to ${MAX_DEFAULT_LINKS_PER_GROUP} default links.`
: undefined
}
/>
Expand Down
14 changes: 12 additions & 2 deletions apps/web/lib/actions/partners/create-program.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,17 @@ import { getPlanCapabilities } from "@/lib/plan-capabilities";
import { isStored, storage } from "@/lib/storage";
import { PlanProps } from "@/lib/types";
import { redis } from "@/lib/upstash";
import { DEFAULT_PARTNER_GROUP } from "@/lib/zod/schemas/groups";
import {
DEFAULT_ADDITIONAL_PARTNER_LINKS,
DEFAULT_PARTNER_GROUP,
} from "@/lib/zod/schemas/groups";
import { programDataSchema } from "@/lib/zod/schemas/program-onboarding";
import { REWARD_EVENT_COLUMN_MAPPING } from "@/lib/zod/schemas/rewards";
import { sendEmail } from "@dub/email";
import ProgramInvite from "@dub/email/templates/program-invite";
import ProgramWelcome from "@dub/email/templates/program-welcome";
import { prisma } from "@dub/prisma";
import { nanoid, R2_URL } from "@dub/utils";
import { getDomainWithoutWWW, nanoid, R2_URL } from "@dub/utils";
import { Program, Project, User } from "@prisma/client";
import { waitUntil } from "@vercel/functions";
import { redirect } from "next/navigation";
Expand Down Expand Up @@ -150,6 +153,13 @@ export const createProgram = async ({
...(createdReward && {
[REWARD_EVENT_COLUMN_MAPPING[createdReward.event]]: createdReward.id,
}),
additionalLinks: [
{
domain: getDomainWithoutWWW(programData.url!)!,
validationMode: "domain",
},
],
maxPartnerLinks: DEFAULT_ADDITIONAL_PARTNER_LINKS,
partnerGroupDefaultLinks: {
create: {
id: createId({ prefix: "pgdl_" }),
Expand Down
10 changes: 9 additions & 1 deletion apps/web/lib/firstpromoter/import-campaigns.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { RESOURCE_COLORS } from "@/ui/colors";
import { prisma } from "@dub/prisma";
import { randomValue } from "@dub/utils";
import { getDomainWithoutWWW, randomValue } from "@dub/utils";
import slugify from "@sindresorhus/slugify";
import { createId } from "../api/create-id";
import { DEFAULT_ADDITIONAL_PARTNER_LINKS } from "../zod/schemas/groups";
import { FirstPromoterApi } from "./api";
import { firstPromoterImporter, MAX_BATCHES } from "./importer";
import { FirstPromoterImportPayload } from "./types";
Expand Down Expand Up @@ -64,6 +65,13 @@ export async function importCampaigns(payload: FirstPromoterImportPayload) {
slug: slugify(campaign.campaign.name),
name: campaign.campaign.name,
color: randomValue(RESOURCE_COLORS),
additionalLinks: [
{
domain: getDomainWithoutWWW(program.url!),
validationMode: "domain",
},
],
maxPartnerLinks: DEFAULT_ADDITIONAL_PARTNER_LINKS,
})),
skipDuplicates: true,
});
Expand Down
10 changes: 9 additions & 1 deletion apps/web/lib/partnerstack/import-groups.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { RESOURCE_COLORS } from "@/ui/colors";
import { prisma } from "@dub/prisma";
import { randomValue } from "@dub/utils";
import { getDomainWithoutWWW, randomValue } from "@dub/utils";
import { createId } from "../api/create-id";
import { DEFAULT_ADDITIONAL_PARTNER_LINKS } from "../zod/schemas/groups";
import { PartnerStackApi } from "./api";
import { partnerStackImporter } from "./importer";
import { PartnerStackImportPayload } from "./types";
Expand Down Expand Up @@ -55,6 +56,13 @@ export async function importGroups(payload: PartnerStackImportPayload) {
name: group.name,
slug: group.slug,
color: randomValue(RESOURCE_COLORS),
additionalLinks: [
{
domain: getDomainWithoutWWW(program.url),
validationMode: "domain",
},
],
maxPartnerLinks: DEFAULT_ADDITIONAL_PARTNER_LINKS,
partnerGroupDefaultLinks: {
create: {
id: createId({ prefix: "pgdl_" }),
Expand Down
10 changes: 9 additions & 1 deletion apps/web/lib/rewardful/import-campaigns.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { RESOURCE_COLORS } from "@/ui/colors";
import { prisma } from "@dub/prisma";
import { EventType, Prisma, RewardStructure } from "@dub/prisma/client";
import { randomValue } from "@dub/utils";
import { getDomainWithoutWWW, randomValue } from "@dub/utils";
import { differenceInSeconds } from "date-fns";
import { createId } from "../api/create-id";

import { serializeReward } from "../api/partners/serialize-reward";
import { getRewardAmount } from "../partners/get-reward-amount";
import { DEFAULT_ADDITIONAL_PARTNER_LINKS } from "../zod/schemas/groups";
import { RewardfulApi } from "./api";
import { rewardfulImporter } from "./importer";
import { RewardfulImportPayload } from "./types";
Expand Down Expand Up @@ -63,6 +64,13 @@ export async function importCampaigns(payload: RewardfulImportPayload) {
name: `(Rewardful) ${campaign.name}`,
slug: groupSlug,
color: randomValue(RESOURCE_COLORS),
additionalLinks: [
{
domain: getDomainWithoutWWW(program.url),
validationMode: "domain",
},
],
maxPartnerLinks: DEFAULT_ADDITIONAL_PARTNER_LINKS,
partnerGroupDefaultLinks: {
create: {
id: createId({ prefix: "pgdl_" }),
Expand Down
6 changes: 5 additions & 1 deletion apps/web/lib/zod/schemas/groups.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@ export const DEFAULT_PARTNER_GROUP = {
color: null,
} as const;

export const MAX_DEFAULT_PARTNER_LINKS = 5;
// max number of partnerGroupDefaultLinks per group
export const MAX_DEFAULT_LINKS_PER_GROUP = 5;

// for the maxPartnerLinks setting (alongside additionalLinks)
export const DEFAULT_ADDITIONAL_PARTNER_LINKS = 10;
export const MAX_ADDITIONAL_PARTNER_LINKS = 100;

export const GROUPS_MAX_PAGE_SIZE = 100;
Expand Down
7 changes: 5 additions & 2 deletions apps/web/tests/partner-groups/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ import {
GroupProps,
GroupWithProgramProps,
} from "@/lib/types";
import { GroupSchema } from "@/lib/zod/schemas/groups";
import {
DEFAULT_ADDITIONAL_PARTNER_LINKS,
GroupSchema,
} from "@/lib/zod/schemas/groups";
import { RESOURCE_COLORS } from "@/ui/colors";
import { randomValue } from "@dub/utils";
import slugify from "@sindresorhus/slugify";
Expand All @@ -20,7 +23,7 @@ const expectedGroup: Partial<GroupProps> = {
leadReward: null,
saleReward: null,
discount: null,
maxPartnerLinks: 10,
maxPartnerLinks: DEFAULT_ADDITIONAL_PARTNER_LINKS,
linkStructure: "short",
additionalLinks: expect.any(Array),
};
Expand Down
5 changes: 0 additions & 5 deletions packages/prisma/schema/program.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,6 @@ enum PartnerBannedReason {
brand_abuse
}

enum PartnerUrlValidationMode {
domain // domain match (e.g. if URL is example.com/path, example.com and example.com/another-path are allowed)
exact // exact match (e.g. if URL is example.com/path, only example.com/path is allowed)
}

model Program {
id String @id @default(cuid())
workspaceId String
Expand Down