@open-loyalty/mcp-server 1.0.3 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +180 -177
- package/dist/auth/provider.js +2 -14
- package/dist/auth/storage.js +22 -0
- package/dist/client/http.d.ts +5 -0
- package/dist/client/http.js +62 -3
- package/dist/config.d.ts +6 -5
- package/dist/config.js +15 -11
- package/dist/http.js +170 -65
- package/dist/instructions.d.ts +5 -0
- package/dist/instructions.js +420 -0
- package/dist/prompts/fan-engagement-setup.d.ts +107 -0
- package/dist/prompts/fan-engagement-setup.js +492 -0
- package/dist/server.d.ts +1 -1
- package/dist/server.js +68 -278
- package/dist/tools/achievement/handlers.d.ts +117 -0
- package/dist/tools/achievement/handlers.js +161 -0
- package/dist/tools/achievement/index.d.ts +479 -0
- package/dist/tools/achievement/index.js +74 -0
- package/dist/tools/achievement/schemas.d.ts +433 -0
- package/dist/tools/achievement/schemas.js +142 -0
- package/dist/tools/achievement.d.ts +155 -121
- package/dist/tools/achievement.js +82 -39
- package/dist/tools/admin.d.ts +18 -6
- package/dist/tools/admin.js +24 -12
- package/dist/tools/analytics.d.ts +29 -11
- package/dist/tools/analytics.js +58 -48
- package/dist/tools/apikey.d.ts +10 -3
- package/dist/tools/apikey.js +13 -6
- package/dist/tools/audit.d.ts +6 -2
- package/dist/tools/audit.js +8 -4
- package/dist/tools/badge.d.ts +14 -6
- package/dist/tools/badge.js +36 -27
- package/dist/tools/campaign/handlers.d.ts +42 -0
- package/dist/tools/campaign/handlers.js +223 -0
- package/dist/tools/campaign/index.d.ts +783 -0
- package/dist/tools/campaign/index.js +112 -0
- package/dist/tools/campaign/member-handlers.d.ts +60 -0
- package/dist/tools/campaign/member-handlers.js +159 -0
- package/dist/tools/campaign/schemas.d.ts +704 -0
- package/dist/tools/campaign/schemas.js +259 -0
- package/dist/tools/campaign/types.d.ts +161 -0
- package/dist/tools/campaign/types.js +2 -0
- package/dist/tools/campaign.d.ts +41 -16
- package/dist/tools/campaign.js +38 -25
- package/dist/tools/custom-event.d.ts +315 -0
- package/dist/tools/custom-event.js +270 -0
- package/dist/tools/export.d.ts +12 -4
- package/dist/tools/export.js +25 -20
- package/dist/tools/import.d.ts +9 -3
- package/dist/tools/import.js +33 -21
- package/dist/tools/index.d.ts +3 -11
- package/dist/tools/index.js +17 -475
- package/dist/tools/member/handlers.d.ts +111 -0
- package/dist/tools/member/handlers.js +206 -0
- package/dist/tools/member/index.d.ts +169 -0
- package/dist/tools/member/index.js +92 -0
- package/dist/tools/member/schemas.d.ts +89 -0
- package/dist/tools/member/schemas.js +65 -0
- package/dist/tools/member.d.ts +21 -0
- package/dist/tools/member.js +56 -62
- package/dist/tools/points.d.ts +19 -6
- package/dist/tools/points.js +51 -49
- package/dist/tools/referral/handlers.d.ts +47 -0
- package/dist/tools/referral/handlers.js +115 -0
- package/dist/tools/referral/index.d.ts +44 -0
- package/dist/tools/referral/index.js +44 -0
- package/dist/tools/referral/schemas.d.ts +34 -0
- package/dist/tools/referral/schemas.js +52 -0
- package/dist/tools/reward/handlers.d.ts +110 -0
- package/dist/tools/reward/handlers.js +289 -0
- package/dist/tools/reward/index.d.ts +177 -0
- package/dist/tools/reward/index.js +90 -0
- package/dist/tools/reward/schemas.d.ts +116 -0
- package/dist/tools/reward/schemas.js +91 -0
- package/dist/tools/reward.d.ts +18 -0
- package/dist/tools/reward.js +56 -66
- package/dist/tools/role.d.ts +26 -7
- package/dist/tools/role.js +25 -12
- package/dist/tools/segment/handlers.d.ts +87 -0
- package/dist/tools/segment/handlers.js +174 -0
- package/dist/tools/segment/index.d.ts +395 -0
- package/dist/tools/segment/index.js +87 -0
- package/dist/tools/segment/schemas.d.ts +337 -0
- package/dist/tools/segment/schemas.js +79 -0
- package/dist/tools/segment.d.ts +29 -10
- package/dist/tools/segment.js +84 -50
- package/dist/tools/store.d.ts +12 -4
- package/dist/tools/store.js +16 -8
- package/dist/tools/tierset.d.ts +19 -7
- package/dist/tools/tierset.js +44 -35
- package/dist/tools/transaction.d.ts +16 -8
- package/dist/tools/transaction.js +25 -21
- package/dist/tools/wallet-type.d.ts +7 -3
- package/dist/tools/wallet-type.js +14 -12
- package/dist/tools/webhook.d.ts +23 -10
- package/dist/tools/webhook.js +135 -33
- package/dist/types/schemas/achievement.d.ts +12 -309
- package/dist/types/schemas/achievement.js +0 -13
- package/dist/types/schemas/admin.d.ts +10 -97
- package/dist/types/schemas/admin.js +0 -38
- package/dist/types/schemas/badge.d.ts +0 -37
- package/dist/types/schemas/badge.js +0 -11
- package/dist/types/schemas/campaign.d.ts +64 -832
- package/dist/types/schemas/campaign.js +2 -25
- package/dist/types/schemas/common.d.ts +5 -0
- package/dist/types/schemas/common.js +5 -0
- package/dist/types/schemas/export.d.ts +0 -17
- package/dist/types/schemas/export.js +0 -7
- package/dist/types/schemas/member.d.ts +37 -176
- package/dist/types/schemas/member.js +0 -27
- package/dist/types/schemas/points.d.ts +0 -63
- package/dist/types/schemas/points.js +0 -22
- package/dist/types/schemas/reward.d.ts +71 -68
- package/dist/types/schemas/reward.js +8 -28
- package/dist/types/schemas/role.d.ts +0 -100
- package/dist/types/schemas/role.js +0 -29
- package/dist/types/schemas/segment.d.ts +0 -58
- package/dist/types/schemas/segment.js +0 -17
- package/dist/types/schemas/tierset.d.ts +0 -176
- package/dist/types/schemas/tierset.js +0 -27
- package/dist/types/schemas/transaction.d.ts +23 -254
- package/dist/types/schemas/transaction.js +0 -7
- package/dist/types/schemas/wallet-type.d.ts +8 -8
- package/dist/types/schemas/wallet-type.js +1 -1
- package/dist/types/schemas/webhook.d.ts +0 -58
- package/dist/types/schemas/webhook.js +0 -12
- package/dist/utils/errors.js +30 -3
- package/dist/utils/payload.d.ts +12 -0
- package/dist/utils/payload.js +14 -0
- package/dist/workflows/app-login-streak.d.ts +39 -0
- package/dist/workflows/app-login-streak.js +298 -0
- package/dist/workflows/early-arrival.d.ts +33 -0
- package/dist/workflows/early-arrival.js +148 -0
- package/dist/workflows/index.d.ts +101 -0
- package/dist/workflows/index.js +208 -0
- package/dist/workflows/match-attendance.d.ts +45 -0
- package/dist/workflows/match-attendance.js +308 -0
- package/dist/workflows/sportsbar-visit.d.ts +41 -0
- package/dist/workflows/sportsbar-visit.js +284 -0
- package/dist/workflows/vod-watching.d.ts +43 -0
- package/dist/workflows/vod-watching.js +326 -0
- package/package.json +10 -2
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// Re-export schemas
|
|
2
|
+
export { CampaignListInputSchema, CampaignGetInputSchema, CampaignCreateInputSchema, CampaignUpdateInputSchema, CampaignPatchInputSchema, CampaignDeleteInputSchema, CampaignSimulateInputSchema, CampaignGenerateCodesInputSchema, CampaignListCodesInputSchema, CampaignGetAvailableInputSchema, CampaignGetVisibleInputSchema, CampaignGetLeaderboardInputSchema, } from "./schemas.js";
|
|
3
|
+
// Re-export handlers
|
|
4
|
+
export { campaignList, campaignGet, campaignCreate, campaignUpdate, campaignPatch, campaignDelete, campaignSimulate, } from "./handlers.js";
|
|
5
|
+
export { campaignGenerateCodes, campaignListCodes, campaignGetAvailable, campaignGetVisible, campaignGetLeaderboard, } from "./member-handlers.js";
|
|
6
|
+
// Imports for tool definitions
|
|
7
|
+
import { CampaignListInputSchema, CampaignGetInputSchema, CampaignCreateInputSchema, CampaignUpdateInputSchema, CampaignPatchInputSchema, CampaignDeleteInputSchema, CampaignSimulateInputSchema, CampaignGenerateCodesInputSchema, CampaignListCodesInputSchema, CampaignGetAvailableInputSchema, CampaignGetVisibleInputSchema, CampaignGetLeaderboardInputSchema, } from "./schemas.js";
|
|
8
|
+
import { campaignList, campaignGet, campaignCreate, campaignUpdate, campaignPatch, campaignDelete, campaignSimulate, } from "./handlers.js";
|
|
9
|
+
import { campaignGenerateCodes, campaignListCodes, campaignGetAvailable, campaignGetVisible, campaignGetLeaderboard, } from "./member-handlers.js";
|
|
10
|
+
// Tool definitions
|
|
11
|
+
export const campaignToolDefinitions = [
|
|
12
|
+
{
|
|
13
|
+
name: "ol_campaign_list",
|
|
14
|
+
title: "List Campaigns",
|
|
15
|
+
description: "List all campaigns. Filter by type (direct/referral) or trigger (transaction/custom_event/time/etc). Use campaign_get for full configuration including rules and effects.",
|
|
16
|
+
readOnly: true,
|
|
17
|
+
inputSchema: CampaignListInputSchema,
|
|
18
|
+
handler: campaignList,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: "ol_campaign_create",
|
|
22
|
+
title: "Create Campaign",
|
|
23
|
+
description: "Create campaign to automate engagement. Triggers: transaction (purchase-based), custom_event (for custom actions), time (scheduled). " +
|
|
24
|
+
"Effects: give_points, give_reward, deduct_unit. Rules define when/what happens. " +
|
|
25
|
+
"REQUIRED: activity.startsAt, rules[].name, effects[].effect. " +
|
|
26
|
+
"pointsRule is a STRING expression (e.g., 'transaction.grossValue * 2'), not an object.",
|
|
27
|
+
readOnly: false,
|
|
28
|
+
inputSchema: CampaignCreateInputSchema,
|
|
29
|
+
handler: campaignCreate,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: "ol_campaign_get",
|
|
33
|
+
title: "Get Campaign Details",
|
|
34
|
+
description: "Get full campaign configuration including all rules, conditions, effects, and targeting.",
|
|
35
|
+
readOnly: true,
|
|
36
|
+
inputSchema: CampaignGetInputSchema,
|
|
37
|
+
handler: campaignGet,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: "ol_campaign_update",
|
|
41
|
+
title: "Update Campaign",
|
|
42
|
+
description: "Full update of campaign configuration. Requires all campaign fields. Use campaign_get first to retrieve current configuration, modify it, then send the complete object.",
|
|
43
|
+
readOnly: false,
|
|
44
|
+
inputSchema: CampaignUpdateInputSchema,
|
|
45
|
+
handler: campaignUpdate,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: "ol_campaign_patch",
|
|
49
|
+
title: "Patch Campaign",
|
|
50
|
+
description: "Partial update of campaign - only active status and displayOrder can be patched. For full updates, use campaign_update.",
|
|
51
|
+
readOnly: false,
|
|
52
|
+
inputSchema: CampaignPatchInputSchema,
|
|
53
|
+
handler: campaignPatch,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: "ol_campaign_delete",
|
|
57
|
+
title: "Delete Campaign (Permanent)",
|
|
58
|
+
description: "Permanently delete a campaign. This cannot be undone. Consider deactivating instead if you may need the campaign later.",
|
|
59
|
+
readOnly: false,
|
|
60
|
+
destructive: true,
|
|
61
|
+
inputSchema: CampaignDeleteInputSchema,
|
|
62
|
+
handler: campaignDelete,
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: "ol_campaign_simulate",
|
|
66
|
+
title: "Simulate Campaign Effects",
|
|
67
|
+
description: "Simulate campaign effects without executing them. Use to preview what points/rewards a transaction would earn. Provide trigger type, transaction/event data, and customer. Returns simulated effects grouped by campaign.",
|
|
68
|
+
readOnly: true,
|
|
69
|
+
inputSchema: CampaignSimulateInputSchema,
|
|
70
|
+
handler: campaignSimulate,
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: "ol_campaign_generate_codes",
|
|
74
|
+
title: "Generate Campaign Codes",
|
|
75
|
+
description: "Generate unique redemption codes for a campaign. Use for promotions requiring unique codes. Codes are auto-generated and can be retrieved with campaign_list_codes.",
|
|
76
|
+
readOnly: false,
|
|
77
|
+
inputSchema: CampaignGenerateCodesInputSchema,
|
|
78
|
+
handler: campaignGenerateCodes,
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: "ol_campaign_list_codes",
|
|
82
|
+
title: "List Campaign Codes",
|
|
83
|
+
description: "List redemption codes for a campaign. Filter by status (active/used) or specific code. Returns code details including usage status.",
|
|
84
|
+
readOnly: true,
|
|
85
|
+
inputSchema: CampaignListCodesInputSchema,
|
|
86
|
+
handler: campaignListCodes,
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
name: "ol_campaign_get_available",
|
|
90
|
+
title: "Get Available Campaigns for Member",
|
|
91
|
+
description: "Get campaigns available to a specific member. Returns campaigns the member can participate in based on their tier, segments, and campaign targeting rules. Includes limitReached indicator.",
|
|
92
|
+
readOnly: true,
|
|
93
|
+
inputSchema: CampaignGetAvailableInputSchema,
|
|
94
|
+
handler: campaignGetAvailable,
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: "ol_campaign_get_visible",
|
|
98
|
+
title: "Get Visible Campaigns for Member",
|
|
99
|
+
description: "Get campaigns visible to a specific member. May include campaigns not yet available (e.g., upcoming campaigns or those requiring certain conditions). Use get_available for campaigns the member can currently participate in.",
|
|
100
|
+
readOnly: true,
|
|
101
|
+
inputSchema: CampaignGetVisibleInputSchema,
|
|
102
|
+
handler: campaignGetVisible,
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
name: "ol_campaign_get_leaderboard",
|
|
106
|
+
title: "Get Campaign Leaderboard",
|
|
107
|
+
description: "Get leaderboard rankings for a campaign. Returns ranked list of members with scores and positions. Use for leaderboard-type campaigns to show competition standings.",
|
|
108
|
+
readOnly: true,
|
|
109
|
+
inputSchema: CampaignGetLeaderboardInputSchema,
|
|
110
|
+
handler: campaignGetLeaderboard,
|
|
111
|
+
},
|
|
112
|
+
];
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { CampaignCode, MemberCampaignItem, LeaderboardEntry } from "./types.js";
|
|
2
|
+
export declare function campaignGenerateCodes(input: {
|
|
3
|
+
storeCode?: string;
|
|
4
|
+
campaignId: string;
|
|
5
|
+
quantity: number;
|
|
6
|
+
}): Promise<{
|
|
7
|
+
codesGenerated: number;
|
|
8
|
+
}>;
|
|
9
|
+
export declare function campaignListCodes(input: {
|
|
10
|
+
storeCode?: string;
|
|
11
|
+
campaignId: string;
|
|
12
|
+
page?: number;
|
|
13
|
+
perPage?: number;
|
|
14
|
+
status?: string;
|
|
15
|
+
code?: string;
|
|
16
|
+
}): Promise<{
|
|
17
|
+
codes: CampaignCode[];
|
|
18
|
+
total: {
|
|
19
|
+
all?: number;
|
|
20
|
+
filtered?: number;
|
|
21
|
+
};
|
|
22
|
+
}>;
|
|
23
|
+
export declare function campaignGetAvailable(input: {
|
|
24
|
+
storeCode?: string;
|
|
25
|
+
memberId: string;
|
|
26
|
+
page?: number;
|
|
27
|
+
perPage?: number;
|
|
28
|
+
type?: string;
|
|
29
|
+
trigger?: string;
|
|
30
|
+
}): Promise<{
|
|
31
|
+
campaigns: MemberCampaignItem[];
|
|
32
|
+
total: {
|
|
33
|
+
all?: number;
|
|
34
|
+
filtered?: number;
|
|
35
|
+
};
|
|
36
|
+
}>;
|
|
37
|
+
export declare function campaignGetVisible(input: {
|
|
38
|
+
storeCode?: string;
|
|
39
|
+
memberId: string;
|
|
40
|
+
page?: number;
|
|
41
|
+
perPage?: number;
|
|
42
|
+
active?: boolean;
|
|
43
|
+
}): Promise<{
|
|
44
|
+
campaigns: MemberCampaignItem[];
|
|
45
|
+
total: {
|
|
46
|
+
all?: number;
|
|
47
|
+
filtered?: number;
|
|
48
|
+
};
|
|
49
|
+
}>;
|
|
50
|
+
export declare function campaignGetLeaderboard(input: {
|
|
51
|
+
storeCode?: string;
|
|
52
|
+
campaignId: string;
|
|
53
|
+
type?: string;
|
|
54
|
+
}): Promise<{
|
|
55
|
+
entries: LeaderboardEntry[];
|
|
56
|
+
total: {
|
|
57
|
+
all?: number;
|
|
58
|
+
filtered?: number;
|
|
59
|
+
};
|
|
60
|
+
}>;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { apiGet, apiPost } from "../../client/http.js";
|
|
2
|
+
import { formatApiError } from "../../utils/errors.js";
|
|
3
|
+
import { getStoreCode } from "../../config.js";
|
|
4
|
+
// Code management handlers
|
|
5
|
+
export async function campaignGenerateCodes(input) {
|
|
6
|
+
const storeCode = getStoreCode(input.storeCode);
|
|
7
|
+
try {
|
|
8
|
+
await apiPost(`/${storeCode}/campaign/${input.campaignId}/codes/generate`, { generate: { numberOfCodes: input.quantity } });
|
|
9
|
+
return { codesGenerated: input.quantity };
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
throw formatApiError(error, "ol_campaign_generate_codes");
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export async function campaignListCodes(input) {
|
|
16
|
+
const storeCode = getStoreCode(input.storeCode);
|
|
17
|
+
const params = new URLSearchParams();
|
|
18
|
+
if (input.page)
|
|
19
|
+
params.append("_page", String(input.page));
|
|
20
|
+
if (input.perPage)
|
|
21
|
+
params.append("_itemsOnPage", String(input.perPage));
|
|
22
|
+
if (input.status)
|
|
23
|
+
params.append("status", input.status);
|
|
24
|
+
if (input.code)
|
|
25
|
+
params.append("code", input.code);
|
|
26
|
+
const queryString = params.toString();
|
|
27
|
+
const url = `/${storeCode}/campaign/${input.campaignId}/codes${queryString ? `?${queryString}` : ""}`;
|
|
28
|
+
try {
|
|
29
|
+
const response = await apiGet(url);
|
|
30
|
+
const codes = (response.items || []).map((item) => ({
|
|
31
|
+
codeId: item.codeId,
|
|
32
|
+
code: item.code,
|
|
33
|
+
status: item.status,
|
|
34
|
+
usedAt: item.usedAt,
|
|
35
|
+
createdAt: item.createdAt,
|
|
36
|
+
createdBy: item.createdBy,
|
|
37
|
+
}));
|
|
38
|
+
const total = response.total || {};
|
|
39
|
+
return {
|
|
40
|
+
codes,
|
|
41
|
+
total: {
|
|
42
|
+
all: typeof total.all === "number" ? total.all : undefined,
|
|
43
|
+
filtered: typeof total.filtered === "number" ? total.filtered : undefined,
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
throw formatApiError(error, "ol_campaign_list_codes");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Member campaign handlers
|
|
52
|
+
export async function campaignGetAvailable(input) {
|
|
53
|
+
const storeCode = getStoreCode(input.storeCode);
|
|
54
|
+
const params = new URLSearchParams();
|
|
55
|
+
if (input.page)
|
|
56
|
+
params.append("_page", String(input.page));
|
|
57
|
+
if (input.perPage)
|
|
58
|
+
params.append("_itemsOnPage", String(input.perPage));
|
|
59
|
+
if (input.type)
|
|
60
|
+
params.append("type", input.type);
|
|
61
|
+
if (input.trigger)
|
|
62
|
+
params.append("trigger", input.trigger);
|
|
63
|
+
const queryString = params.toString();
|
|
64
|
+
const url = `/${storeCode}/member/${input.memberId}/campaign${queryString ? `?${queryString}` : ""}`;
|
|
65
|
+
try {
|
|
66
|
+
const response = await apiGet(url);
|
|
67
|
+
const campaigns = (response.items || []).map((item) => ({
|
|
68
|
+
campaignId: item.campaignId,
|
|
69
|
+
name: item.name,
|
|
70
|
+
active: item.active,
|
|
71
|
+
type: item.type,
|
|
72
|
+
trigger: item.trigger,
|
|
73
|
+
limitReached: item.limitReached,
|
|
74
|
+
description: item.description,
|
|
75
|
+
}));
|
|
76
|
+
const total = response.total || {};
|
|
77
|
+
return {
|
|
78
|
+
campaigns,
|
|
79
|
+
total: {
|
|
80
|
+
all: typeof total.all === "number" ? total.all : undefined,
|
|
81
|
+
filtered: typeof total.filtered === "number" ? total.filtered : undefined,
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
throw formatApiError(error, "ol_campaign_get_available");
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export async function campaignGetVisible(input) {
|
|
90
|
+
const storeCode = getStoreCode(input.storeCode);
|
|
91
|
+
const params = new URLSearchParams();
|
|
92
|
+
if (input.page)
|
|
93
|
+
params.append("_page", String(input.page));
|
|
94
|
+
if (input.perPage)
|
|
95
|
+
params.append("_itemsOnPage", String(input.perPage));
|
|
96
|
+
if (input.active !== undefined)
|
|
97
|
+
params.append("active", String(input.active));
|
|
98
|
+
const queryString = params.toString();
|
|
99
|
+
const url = `/${storeCode}/member/${input.memberId}/campaign/visible${queryString ? `?${queryString}` : ""}`;
|
|
100
|
+
try {
|
|
101
|
+
const response = await apiGet(url);
|
|
102
|
+
const campaigns = (response.items || []).map((item) => ({
|
|
103
|
+
campaignId: item.campaignId,
|
|
104
|
+
name: item.name,
|
|
105
|
+
active: item.active,
|
|
106
|
+
type: item.type,
|
|
107
|
+
trigger: item.trigger,
|
|
108
|
+
description: item.description,
|
|
109
|
+
}));
|
|
110
|
+
const total = response.total || {};
|
|
111
|
+
return {
|
|
112
|
+
campaigns,
|
|
113
|
+
total: {
|
|
114
|
+
all: typeof total.all === "number" ? total.all : undefined,
|
|
115
|
+
filtered: typeof total.filtered === "number" ? total.filtered : undefined,
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
throw formatApiError(error, "ol_campaign_get_visible");
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
export async function campaignGetLeaderboard(input) {
|
|
124
|
+
const storeCode = getStoreCode(input.storeCode);
|
|
125
|
+
const params = new URLSearchParams();
|
|
126
|
+
if (input.type)
|
|
127
|
+
params.append("type", input.type);
|
|
128
|
+
const queryString = params.toString();
|
|
129
|
+
const url = `/${storeCode}/campaign/${input.campaignId}/leaderboard${queryString ? `?${queryString}` : ""}`;
|
|
130
|
+
try {
|
|
131
|
+
const response = await apiGet(url);
|
|
132
|
+
const entries = (response.items || []).map((item) => ({
|
|
133
|
+
member: {
|
|
134
|
+
customerId: item.member.customerId,
|
|
135
|
+
firstName: item.member.firstName,
|
|
136
|
+
lastName: item.member.lastName,
|
|
137
|
+
email: item.member.email,
|
|
138
|
+
loyaltyCardNumber: item.member.loyaltyCardNumber,
|
|
139
|
+
},
|
|
140
|
+
ranking: {
|
|
141
|
+
score: item.ranking.score,
|
|
142
|
+
position: item.ranking.position,
|
|
143
|
+
recalculatedAt: item.ranking.recalculatedAt,
|
|
144
|
+
changedPositionAt: item.ranking.changedPositionAt,
|
|
145
|
+
},
|
|
146
|
+
}));
|
|
147
|
+
const total = response.total || {};
|
|
148
|
+
return {
|
|
149
|
+
entries,
|
|
150
|
+
total: {
|
|
151
|
+
all: typeof total.all === "number" ? total.all : undefined,
|
|
152
|
+
filtered: typeof total.filtered === "number" ? total.filtered : undefined,
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
throw formatApiError(error, "ol_campaign_get_leaderboard");
|
|
158
|
+
}
|
|
159
|
+
}
|