Skip to content

Commit 6f13159

Browse files
authored
Merge pull request #2113 from dubinc/fix-reward-import
fix reward import
2 parents 002b4e0 + 01e0867 commit 6f13159

File tree

5 files changed

+115
-117
lines changed

5 files changed

+115
-117
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { NextResponse } from "next/server";
2+
import { campaigns } from "../campaigns";
3+
4+
export async function GET(
5+
request: Request,
6+
{ params }: { params: { campaignId: string } },
7+
) {
8+
const { campaignId } = params;
9+
10+
const campaign = campaigns.find((c) => c.id === campaignId);
11+
12+
return NextResponse.json(campaign);
13+
}

apps/web/app/api/mock/rewardful/campaigns/[campaign]/route.ts

-35
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
export const campaigns = [
2+
{
3+
id: "ceaef6d9-767e-49aa-a6ab-46c02aa79604",
4+
created_at: "2021-11-24T06:31:06.672Z",
5+
updated_at: "2022-02-22T23:17:55.119Z",
6+
name: "Campaign 1",
7+
url: "https://rewardful.com/",
8+
private: false,
9+
private_tokens: false,
10+
commission_amount_cents: null,
11+
commission_amount_currency: null,
12+
minimum_payout_cents: 0,
13+
max_commission_period_months: 12,
14+
max_commissions: null,
15+
days_before_referrals_expire: 30,
16+
days_until_commissions_are_due: 30,
17+
affiliate_dashboard_text: "",
18+
custom_reward_description: "",
19+
welcome_text: "",
20+
customers_visible_to_affiliates: false,
21+
sale_description_visible_to_affiliates: true,
22+
parameter_type: "query",
23+
stripe_coupon_id: "jo45MTj3",
24+
default: false,
25+
reward_type: "percent",
26+
commission_percent: 30.0,
27+
minimum_payout_currency: "USD",
28+
visitors: 150,
29+
leads: 39,
30+
conversions: 7,
31+
affiliates: 12,
32+
},
33+
{
34+
id: "ceaef6d9-767e-49aa-a6ab-46c02aa79605",
35+
created_at: "2021-11-24T06:31:06.672Z",
36+
updated_at: "2022-02-22T23:17:55.119Z",
37+
name: "Campaign 2",
38+
url: "https://rewardful.com/",
39+
private: false,
40+
private_tokens: false,
41+
commission_amount_cents: 5000, // $50.00
42+
commission_amount_currency: "USD",
43+
minimum_payout_cents: 0,
44+
max_commission_period_months: 24,
45+
max_commissions: null,
46+
days_before_referrals_expire: 30,
47+
days_until_commissions_are_due: 30,
48+
affiliate_dashboard_text: "",
49+
custom_reward_description: "",
50+
welcome_text: "",
51+
customers_visible_to_affiliates: false,
52+
sale_description_visible_to_affiliates: true,
53+
parameter_type: "query",
54+
stripe_coupon_id: "jo45MTj3",
55+
default: false,
56+
reward_type: "amount",
57+
commission_percent: null,
58+
minimum_payout_currency: "USD",
59+
visitors: 150,
60+
leads: 39,
61+
conversions: 7,
62+
affiliates: 12,
63+
},
64+
];

apps/web/app/api/mock/rewardful/campaigns/route.ts

+1-65
Original file line numberDiff line numberDiff line change
@@ -1,71 +1,7 @@
11
import { NextResponse } from "next/server";
2+
import { campaigns } from "./campaigns";
23

34
export async function GET() {
4-
const campaigns = [
5-
{
6-
id: "ceaef6d9-767e-49aa-a6ab-46c02aa79604",
7-
created_at: "2021-11-24T06:31:06.672Z",
8-
updated_at: "2022-02-22T23:17:55.119Z",
9-
name: "Campaign 1",
10-
url: "https://rewardful.com/",
11-
private: false,
12-
private_tokens: false,
13-
commission_amount_cents: null,
14-
commission_amount_currency: null,
15-
minimum_payout_cents: 0,
16-
max_commission_period_months: 12,
17-
max_commissions: null,
18-
days_before_referrals_expire: 30,
19-
days_until_commissions_are_due: 30,
20-
affiliate_dashboard_text: "",
21-
custom_reward_description: "",
22-
welcome_text: "",
23-
customers_visible_to_affiliates: false,
24-
sale_description_visible_to_affiliates: true,
25-
parameter_type: "query",
26-
stripe_coupon_id: "jo45MTj3",
27-
default: false,
28-
reward_type: "percent",
29-
commission_percent: 30.0,
30-
minimum_payout_currency: "USD",
31-
visitors: 150,
32-
leads: 39,
33-
conversions: 7,
34-
affiliates: 12,
35-
},
36-
{
37-
id: "ceaef6d9-767e-49aa-a6ab-46c02aa79605",
38-
created_at: "2021-11-24T06:31:06.672Z",
39-
updated_at: "2022-02-22T23:17:55.119Z",
40-
name: "Campaign 2",
41-
url: "https://rewardful.com/",
42-
private: false,
43-
private_tokens: false,
44-
commission_amount_cents: 5000, // $50.00
45-
commission_amount_currency: "USD",
46-
minimum_payout_cents: 0,
47-
max_commission_period_months: 24,
48-
max_commissions: null,
49-
days_before_referrals_expire: 30,
50-
days_until_commissions_are_due: 30,
51-
affiliate_dashboard_text: "",
52-
custom_reward_description: "",
53-
welcome_text: "",
54-
customers_visible_to_affiliates: false,
55-
sale_description_visible_to_affiliates: true,
56-
parameter_type: "query",
57-
stripe_coupon_id: "jo45MTj3",
58-
default: false,
59-
reward_type: "amount",
60-
commission_percent: null,
61-
minimum_payout_currency: "USD",
62-
visitors: 150,
63-
leads: 39,
64-
conversions: 7,
65-
affiliates: 12,
66-
},
67-
];
68-
695
return NextResponse.json({
706
data: campaigns,
717
});

apps/web/lib/rewardful/import-campaign.ts

+37-17
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { prisma } from "@dub/prisma";
2+
import { CommissionType, EventType } from "@dub/prisma/client";
23
import { createId } from "../api/create-id";
34
import { RewardfulApi } from "./api";
45
import { rewardfulImporter } from "./importer";
@@ -25,34 +26,53 @@ export async function importCampaign({ programId }: { programId: string }) {
2526
reward_type,
2627
} = campaign;
2728

28-
const reward = await prisma.reward.create({
29-
data: {
30-
id: createId({ prefix: "rw_" }),
31-
programId,
32-
event: "sale",
33-
maxDuration: max_commission_period_months,
34-
type: reward_type === "amount" ? "flat" : "percentage",
35-
amount:
36-
reward_type === "amount" ? commission_amount_cents : commission_percent,
37-
},
29+
const newReward = {
30+
programId,
31+
event: EventType.sale,
32+
maxDuration: max_commission_period_months,
33+
type:
34+
reward_type === "amount"
35+
? CommissionType.flat
36+
: CommissionType.percentage,
37+
amount:
38+
reward_type === "amount" ? commission_amount_cents : commission_percent,
39+
};
40+
41+
let rewardId: string | null = null;
42+
43+
const rewardFound = await prisma.reward.findFirst({
44+
where: newReward,
3845
});
3946

40-
if (!defaultRewardId) {
41-
await prisma.program.update({
42-
where: {
43-
id: programId,
44-
},
47+
if (!rewardFound) {
48+
const reward = await prisma.reward.create({
4549
data: {
46-
defaultRewardId: reward.id,
50+
id: createId({ prefix: "rw_" }),
51+
...newReward,
4752
},
4853
});
54+
55+
if (!defaultRewardId) {
56+
await prisma.program.update({
57+
where: {
58+
id: programId,
59+
},
60+
data: {
61+
defaultRewardId: reward.id,
62+
},
63+
});
64+
}
65+
66+
rewardId = reward.id;
67+
} else {
68+
rewardId = rewardFound.id;
4969
}
5070

5171
return await rewardfulImporter.queue({
5272
programId,
5373
// we will only need to assign rewardId to affiliates
5474
// if it's not the defaultRewardId of the program (there's already a defaultRewardId)
55-
...(defaultRewardId && { rewardId: reward.id }),
75+
...(defaultRewardId && { rewardId }),
5676
action: "import-affiliates",
5777
});
5878
}

0 commit comments

Comments
 (0)