@explorins/pers-sdk 2.0.7 → 2.0.11

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.
Files changed (171) hide show
  1. package/README.md +113 -59
  2. package/dist/analytics/index.d.ts +0 -2
  3. package/dist/analytics/index.d.ts.map +1 -1
  4. package/dist/analytics/models/index.d.ts +1 -10
  5. package/dist/analytics/models/index.d.ts.map +1 -1
  6. package/dist/analytics.cjs +44 -29
  7. package/dist/analytics.cjs.map +1 -1
  8. package/dist/analytics.js +45 -2
  9. package/dist/analytics.js.map +1 -1
  10. package/dist/business/index.d.ts +0 -1
  11. package/dist/business/index.d.ts.map +1 -1
  12. package/dist/business.cjs +7 -774
  13. package/dist/business.cjs.map +1 -1
  14. package/dist/business.js +3 -751
  15. package/dist/business.js.map +1 -1
  16. package/dist/campaign/index.d.ts +0 -1
  17. package/dist/campaign/index.d.ts.map +1 -1
  18. package/dist/campaign.cjs +429 -29
  19. package/dist/campaign.cjs.map +1 -1
  20. package/dist/campaign.js +431 -3
  21. package/dist/campaign.js.map +1 -1
  22. package/dist/chunks/business-membership-service-8KC_qRj7.cjs +756 -0
  23. package/dist/chunks/business-membership-service-8KC_qRj7.cjs.map +1 -0
  24. package/dist/chunks/business-membership-service-D6vaVQTR.js +751 -0
  25. package/dist/chunks/business-membership-service-D6vaVQTR.js.map +1 -0
  26. package/dist/chunks/{web3-chain-service-BeBjALg2.cjs → index-B-g2JPVK.cjs} +1 -220
  27. package/dist/chunks/index-B-g2JPVK.cjs.map +1 -0
  28. package/dist/chunks/{web3-chain-service-DKHCnHQX.js → index-CKm_V5XE.js} +2 -219
  29. package/dist/chunks/index-CKm_V5XE.js.map +1 -0
  30. package/dist/chunks/payment-service-Bkw7ZXev.cjs +214 -0
  31. package/dist/chunks/payment-service-Bkw7ZXev.cjs.map +1 -0
  32. package/dist/chunks/payment-service-IvM6rryM.js +211 -0
  33. package/dist/chunks/payment-service-IvM6rryM.js.map +1 -0
  34. package/dist/chunks/{pers-sdk-JIExM712.js → pers-sdk-DYnIZvcx.js} +12 -291
  35. package/dist/chunks/pers-sdk-DYnIZvcx.js.map +1 -0
  36. package/dist/chunks/{pers-sdk-h-uoLpBx.cjs → pers-sdk-Dr9W8stD.cjs} +38 -318
  37. package/dist/chunks/pers-sdk-Dr9W8stD.cjs.map +1 -0
  38. package/dist/chunks/redemption-service-D-hBqh42.js +339 -0
  39. package/dist/chunks/redemption-service-D-hBqh42.js.map +1 -0
  40. package/dist/chunks/redemption-service-rMB6T2W5.cjs +342 -0
  41. package/dist/chunks/redemption-service-rMB6T2W5.cjs.map +1 -0
  42. package/dist/chunks/tenant-service-CsRA3O2V.js +163 -0
  43. package/dist/chunks/tenant-service-CsRA3O2V.js.map +1 -0
  44. package/dist/chunks/tenant-service-fj-pkXTw.cjs +166 -0
  45. package/dist/chunks/tenant-service-fj-pkXTw.cjs.map +1 -0
  46. package/dist/chunks/{transaction-request.builder-DrqTWcyC.cjs → transaction-request.builder-BwWmfHXm.cjs} +6 -6
  47. package/dist/chunks/{transaction-request.builder-DrqTWcyC.cjs.map → transaction-request.builder-BwWmfHXm.cjs.map} +1 -1
  48. package/dist/chunks/{transaction-request.builder-DltmruUC.js → transaction-request.builder-C1FPWmYN.js} +6 -6
  49. package/dist/chunks/{transaction-request.builder-DltmruUC.js.map → transaction-request.builder-C1FPWmYN.js.map} +1 -1
  50. package/dist/chunks/web3-chain-service-D68-0WaW.cjs +224 -0
  51. package/dist/chunks/web3-chain-service-D68-0WaW.cjs.map +1 -0
  52. package/dist/chunks/web3-chain-service-DuvxmKSj.js +221 -0
  53. package/dist/chunks/web3-chain-service-DuvxmKSj.js.map +1 -0
  54. package/dist/chunks/{explorer.utils-Cx3wrqAj.cjs → web3-manager-C_cFaMCm.cjs} +411 -144
  55. package/dist/chunks/web3-manager-C_cFaMCm.cjs.map +1 -0
  56. package/dist/chunks/{explorer.utils-BkS3k8hX.js → web3-manager-OExwBWB7.js} +412 -146
  57. package/dist/chunks/web3-manager-OExwBWB7.js.map +1 -0
  58. package/dist/core.cjs +18 -21
  59. package/dist/core.cjs.map +1 -1
  60. package/dist/core.js +10 -12
  61. package/dist/core.js.map +1 -1
  62. package/dist/donation/index.d.ts +0 -1
  63. package/dist/donation/index.d.ts.map +1 -1
  64. package/dist/donation.cjs +48 -29
  65. package/dist/donation.cjs.map +1 -1
  66. package/dist/donation.js +50 -3
  67. package/dist/donation.js.map +1 -1
  68. package/dist/index.cjs +43 -69
  69. package/dist/index.cjs.map +1 -1
  70. package/dist/index.d.ts +1 -3
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +13 -15
  73. package/dist/index.js.map +1 -1
  74. package/dist/managers/analytics-manager.d.ts +1 -1
  75. package/dist/managers/index.d.ts +0 -1
  76. package/dist/managers/index.d.ts.map +1 -1
  77. package/dist/managers/web3-manager.d.ts +1 -1
  78. package/dist/managers/web3-manager.d.ts.map +1 -1
  79. package/dist/node.cjs +10 -13
  80. package/dist/node.cjs.map +1 -1
  81. package/dist/node.js +10 -13
  82. package/dist/node.js.map +1 -1
  83. package/dist/package.json +4 -10
  84. package/dist/payment/index.d.ts +0 -1
  85. package/dist/payment/index.d.ts.map +1 -1
  86. package/dist/payment.cjs +5 -232
  87. package/dist/payment.cjs.map +1 -1
  88. package/dist/payment.js +3 -210
  89. package/dist/payment.js.map +1 -1
  90. package/dist/pers-sdk.d.ts +1 -13
  91. package/dist/pers-sdk.d.ts.map +1 -1
  92. package/dist/redemption/index.d.ts +0 -1
  93. package/dist/redemption/index.d.ts.map +1 -1
  94. package/dist/redemption/services/redemption-service.d.ts +1 -2
  95. package/dist/redemption/services/redemption-service.d.ts.map +1 -1
  96. package/dist/redemption.cjs +5 -360
  97. package/dist/redemption.cjs.map +1 -1
  98. package/dist/redemption.js +3 -338
  99. package/dist/redemption.js.map +1 -1
  100. package/dist/shared/interfaces/pers-shared-lib.interfaces.d.ts +15 -21
  101. package/dist/shared/interfaces/pers-shared-lib.interfaces.d.ts.map +1 -1
  102. package/dist/tenant/index.d.ts +0 -1
  103. package/dist/tenant/index.d.ts.map +1 -1
  104. package/dist/tenant.cjs +5 -184
  105. package/dist/tenant.cjs.map +1 -1
  106. package/dist/tenant.js +3 -162
  107. package/dist/tenant.js.map +1 -1
  108. package/dist/token/index.d.ts +0 -1
  109. package/dist/token/index.d.ts.map +1 -1
  110. package/dist/token.cjs +1 -25
  111. package/dist/token.cjs.map +1 -1
  112. package/dist/token.js +1 -1
  113. package/dist/transaction/models/transaction-request.builder.d.ts +4 -4
  114. package/dist/transaction/models/transaction-request.builder.d.ts.map +1 -1
  115. package/dist/transaction.cjs +1 -1
  116. package/dist/transaction.js +1 -1
  117. package/dist/user/index.d.ts +0 -1
  118. package/dist/user/index.d.ts.map +1 -1
  119. package/dist/user-status/index.d.ts +0 -1
  120. package/dist/user-status/index.d.ts.map +1 -1
  121. package/dist/user-status.cjs +0 -25
  122. package/dist/user-status.cjs.map +1 -1
  123. package/dist/user-status.js +0 -1
  124. package/dist/user-status.js.map +1 -1
  125. package/dist/user.cjs +209 -29
  126. package/dist/user.cjs.map +1 -1
  127. package/dist/user.js +211 -3
  128. package/dist/user.js.map +1 -1
  129. package/dist/web3/index.d.ts +1 -0
  130. package/dist/web3/index.d.ts.map +1 -1
  131. package/dist/web3-chain/index.d.ts +0 -1
  132. package/dist/web3-chain/index.d.ts.map +1 -1
  133. package/dist/web3-chain.cjs +14 -29
  134. package/dist/web3-chain.cjs.map +1 -1
  135. package/dist/web3-chain.js +16 -3
  136. package/dist/web3-chain.js.map +1 -1
  137. package/dist/web3-manager.cjs +13 -0
  138. package/dist/web3-manager.cjs.map +1 -0
  139. package/dist/web3-manager.js +7 -0
  140. package/dist/web3-manager.js.map +1 -0
  141. package/dist/web3.cjs +10 -6
  142. package/dist/web3.cjs.map +1 -1
  143. package/dist/web3.js +4 -1
  144. package/dist/web3.js.map +1 -1
  145. package/package.json +4 -10
  146. package/dist/chunks/analytics-service-CitlimKJ.cjs +0 -49
  147. package/dist/chunks/analytics-service-CitlimKJ.cjs.map +0 -1
  148. package/dist/chunks/analytics-service-CxyrOwel.js +0 -46
  149. package/dist/chunks/analytics-service-CxyrOwel.js.map +0 -1
  150. package/dist/chunks/campaign-service-CdEz0jpP.cjs +0 -435
  151. package/dist/chunks/campaign-service-CdEz0jpP.cjs.map +0 -1
  152. package/dist/chunks/campaign-service-DrTAqFZM.js +0 -432
  153. package/dist/chunks/campaign-service-DrTAqFZM.js.map +0 -1
  154. package/dist/chunks/donation-service--6cnTvWq.cjs +0 -54
  155. package/dist/chunks/donation-service--6cnTvWq.cjs.map +0 -1
  156. package/dist/chunks/donation-service-xiXZ2Eto.js +0 -51
  157. package/dist/chunks/donation-service-xiXZ2Eto.js.map +0 -1
  158. package/dist/chunks/explorer.utils-BkS3k8hX.js.map +0 -1
  159. package/dist/chunks/explorer.utils-Cx3wrqAj.cjs.map +0 -1
  160. package/dist/chunks/index-BtDNXaFq.js +0 -13
  161. package/dist/chunks/index-BtDNXaFq.js.map +0 -1
  162. package/dist/chunks/index-CMk3Aqkk.cjs +0 -15
  163. package/dist/chunks/index-CMk3Aqkk.cjs.map +0 -1
  164. package/dist/chunks/pers-sdk-JIExM712.js.map +0 -1
  165. package/dist/chunks/pers-sdk-h-uoLpBx.cjs.map +0 -1
  166. package/dist/chunks/user-service-BGP3SZpk.js +0 -212
  167. package/dist/chunks/user-service-BGP3SZpk.js.map +0 -1
  168. package/dist/chunks/user-service-gITOx4qj.cjs +0 -215
  169. package/dist/chunks/user-service-gITOx4qj.cjs.map +0 -1
  170. package/dist/chunks/web3-chain-service-BeBjALg2.cjs.map +0 -1
  171. package/dist/chunks/web3-chain-service-DKHCnHQX.js.map +0 -1
package/dist/campaign.js CHANGED
@@ -1,4 +1,432 @@
1
- export { C as CampaignApi, a as CampaignService } from './chunks/campaign-service-DrTAqFZM.js';
2
- export { AccountOwnerType, ApiKeyType, MEMBERSHIP_ROLE_HIERARCHY, MembershipRole, NativeTokenTypes, hasMinimumRole } from '@explorins/pers-shared';
3
- import './chunks/pagination-utils-9vQ-Npkr.js';
1
+ import { b as buildPaginationParams, n as normalizeToPaginated } from './chunks/pagination-utils-9vQ-Npkr.js';
2
+
3
+ /**
4
+ * Platform-Agnostic Campaign API Client (NEW - RESTful Design)
5
+ *
6
+ * Updated to use the new microservice-ready campaign controllers:
7
+ * - CampaignsController: Core campaign operations
8
+ * - CampaignTagsController: Tag management
9
+ * - CampaignTokensController: Token unit operations
10
+ * - CampaignTriggersController: Trigger system
11
+ * - CampaignEngagementsController: Business relationships
12
+ * - CampaignClaimsController: Claims processing
13
+ *
14
+ * Uses @explorins/pers-shared DTOs for consistency with backend.
15
+ * All endpoints updated to new RESTful patterns without role revelation.
16
+ */
17
+ class CampaignApi {
18
+ constructor(apiClient) {
19
+ this.apiClient = apiClient;
20
+ }
21
+ // ==========================================
22
+ // CORE CAMPAIGN OPERATIONS (/campaigns)
23
+ // ==========================================
24
+ /**
25
+ * Get campaigns with pagination support
26
+ * Returns paginated response with metadata (total, page, limit, hasMore)
27
+ * Intelligent access: Public gets active only, Business gets own campaigns, Admin gets all
28
+ */
29
+ async getCampaigns(options) {
30
+ const params = [];
31
+ // Always include pagination params to ensure paginated response
32
+ params.push(`page=${options?.page || 1}`);
33
+ params.push(`limit=${options?.limit || 50}`);
34
+ if (options?.active !== undefined)
35
+ params.push(`active=${options.active}`);
36
+ if (options?.tag)
37
+ params.push(`tag=${encodeURIComponent(options.tag)}`);
38
+ if (options?.businessId)
39
+ params.push(`businessId=${encodeURIComponent(options.businessId)}`);
40
+ if (options?.sortBy)
41
+ params.push(`sortBy=${options.sortBy}`);
42
+ if (options?.sortOrder)
43
+ params.push(`sortOrder=${options.sortOrder}`);
44
+ return this.apiClient.get(`/campaigns?${params.join('&')}`);
45
+ }
46
+ /**
47
+ * PUBLIC: Get campaign by ID
48
+ * NEW: /campaigns/{id}
49
+ */
50
+ async getCampaignById(id) {
51
+ return this.apiClient.get(`/campaigns/${id}`);
52
+ }
53
+ /**
54
+ * ADMIN: Create campaign
55
+ * NEW: POST /campaigns
56
+ */
57
+ async createCampaign(campaign) {
58
+ return this.apiClient.post('/campaigns', campaign);
59
+ }
60
+ /**
61
+ * ADMIN: Update campaign
62
+ * NEW: PUT /campaigns/{id}
63
+ */
64
+ async updateCampaign(campaignId, campaign) {
65
+ return this.apiClient.put(`/campaigns/${campaignId}`, campaign);
66
+ }
67
+ /**
68
+ * ADMIN: Toggle campaign active status
69
+ * NEW: PUT /campaigns/{id}/status
70
+ */
71
+ async toggleCampaignActive(campaignId) {
72
+ return this.apiClient.put(`/campaigns/${campaignId}/status`, {});
73
+ }
74
+ /**
75
+ * ADMIN: Toggle campaign testnet environment
76
+ * NEW: PUT /campaigns/{id}/environment
77
+ */
78
+ async toggleCampaignTestnet(campaignId) {
79
+ return this.apiClient.put(`/campaigns/${campaignId}/environment`, {});
80
+ }
81
+ /**
82
+ * ADMIN: Delete campaign
83
+ * NEW: DELETE /campaigns/{id}
84
+ */
85
+ async deleteCampaign(campaignId) {
86
+ return this.apiClient.delete(`/campaigns/${campaignId}`);
87
+ }
88
+ // ==========================================
89
+ // TAG MANAGEMENT (/campaign-tags)
90
+ // ==========================================
91
+ /**
92
+ * ADMIN: Get all unique campaign tags
93
+ * NEW: GET /campaign-tags
94
+ */
95
+ async getAllUniqueTags() {
96
+ return this.apiClient.get('/campaigns/tags');
97
+ }
98
+ /**
99
+ * ADMIN: Update campaign tags (replace all)
100
+ * NEW: PUT /campaign-tags/{id}
101
+ */
102
+ async updateCampaignTags(campaignId, tags) {
103
+ return this.apiClient.put(`/campaigns/${campaignId}/tags`, { tags });
104
+ }
105
+ /**
106
+ * ADMIN: Add tags to campaign
107
+ * NEW: POST /campaign-tags/{id}
108
+ */
109
+ async addTagsToCampaign(campaignId, tags) {
110
+ return this.apiClient.post(`/campaigns/${campaignId}/tags`, { tags });
111
+ }
112
+ /**
113
+ * ADMIN: Remove tag from campaign
114
+ * NEW: DELETE /campaign-tags/{id}/{tag}
115
+ */
116
+ async removeTagFromCampaign(campaignId, tag) {
117
+ return this.apiClient.delete(`/campaigns/${campaignId}/tags/${encodeURIComponent(tag)}`);
118
+ }
119
+ // ==========================================
120
+ // TOKEN MANAGEMENT (/campaign-tokens)
121
+ // ==========================================
122
+ /**
123
+ * ADMIN: Create campaign token unit
124
+ * NEW: POST /campaign-tokens/{id}
125
+ */
126
+ async createCampaignTokenUnit(campaignId, campaignTokenUnit) {
127
+ return this.apiClient.post(`/campaigns/${campaignId}/tokens`, campaignTokenUnit);
128
+ }
129
+ /**
130
+ * ADMIN: Update campaign token unit
131
+ * NEW: PUT /campaign-tokens/{id}/{tokenUnitId}
132
+ */
133
+ async updateCampaignTokenUnit(campaignId, tokenUnitId, campaignTokenUnit) {
134
+ return this.apiClient.put(`/campaigns/${campaignId}/tokens/${tokenUnitId}`, campaignTokenUnit);
135
+ }
136
+ /**
137
+ * ADMIN: Delete campaign token unit
138
+ * NEW: DELETE /campaign-tokens/{id}/{tokenUnitId}
139
+ */
140
+ async deleteCampaignTokenUnit(campaignId, campaignTokenUnitId) {
141
+ return this.apiClient.delete(`/campaigns/${campaignId}/tokens/${campaignTokenUnitId}`);
142
+ }
143
+ // ==========================================
144
+ // TRIGGER SYSTEM (/campaign-triggers)
145
+ // ==========================================
146
+ /**
147
+ * PUBLIC: Get campaign triggers catalog with pagination
148
+ * NEW: GET /campaign-triggers
149
+ *
150
+ * @param options - Pagination and sorting options
151
+ * @returns Paginated list of campaign triggers
152
+ *
153
+ * @example
154
+ * ```typescript
155
+ * // Get first page
156
+ * const page1 = await campaignApi.getCampaignTriggers();
157
+ *
158
+ * // Get specific page
159
+ * const page2 = await campaignApi.getCampaignTriggers({ page: 2, limit: 25 });
160
+ *
161
+ * // Access data
162
+ * page1.data.forEach(trigger => console.log(trigger.name));
163
+ * ```
164
+ */
165
+ async getCampaignTriggers(options) {
166
+ const params = buildPaginationParams(options);
167
+ const response = await this.apiClient.get(`/campaign-triggers?${params.toString()}`);
168
+ return normalizeToPaginated(response);
169
+ }
170
+ /**
171
+ * ADMIN: Create campaign trigger
172
+ * NEW: POST /campaign-triggers
173
+ */
174
+ async createCampaignTrigger(trigger) {
175
+ return this.apiClient.post(`/campaign-triggers`, trigger);
176
+ }
177
+ /**
178
+ * ADMIN: Update campaign trigger
179
+ * NEW: PUT /campaign-triggers/{id}
180
+ */
181
+ async updateCampaignTrigger(triggerId, trigger) {
182
+ return this.apiClient.put(`/campaign-triggers/${triggerId}`, trigger);
183
+ }
184
+ /**
185
+ * ADMIN: Delete campaign trigger
186
+ * NEW: DELETE /campaign-triggers/{id}
187
+ */
188
+ async deleteCampaignTrigger(triggerId) {
189
+ return this.apiClient.delete(`/campaign-triggers/${triggerId}`);
190
+ }
191
+ /**
192
+ * ADMIN: Assign trigger to campaign
193
+ * NEW: PUT /campaign-triggers/{triggerId}/assign/{campaignId}
194
+ */
195
+ async setCampaignTrigger(campaignId, triggerId) {
196
+ return this.apiClient.put(`/campaign-triggers/${triggerId}/assign/${campaignId}`, {});
197
+ }
198
+ /**
199
+ * ADMIN: Add/Remove condition to trigger
200
+ * NEW: PUT /campaign-triggers/{triggerId}/conditions/{conditionId}
201
+ */
202
+ async addOrRemoveConditionToTrigger(triggerId, condition) {
203
+ return this.apiClient.put(`/campaign-triggers/${triggerId}/conditions`, condition);
204
+ }
205
+ // ==========================================
206
+ // BUSINESS ENGAGEMENTS (/campaign-engagements)
207
+ // ==========================================
208
+ /**
209
+ * ADMIN: Add business engagement to campaign
210
+ * NEW: POST /campaign-engagements/{id}
211
+ */
212
+ async addBusinessEngagementToCampaign(campaignId, campaignBusinessEngagement) {
213
+ return this.apiClient.post(`/campaigns/${campaignId}/engagements`, campaignBusinessEngagement);
214
+ }
215
+ /**
216
+ * ADMIN: Update campaign business engagement
217
+ * NEW: PUT /campaign-engagements/{id}/{businessEngagementId}
218
+ */
219
+ async updateCampaignBusinessEngagement(campaignId, businessEngagementId, campaignBusinessEngagement) {
220
+ return this.apiClient.put(`/campaigns/${campaignId}/engagements/${businessEngagementId}`, campaignBusinessEngagement);
221
+ }
222
+ /**
223
+ * ADMIN: Delete campaign business engagement
224
+ * NEW: DELETE /campaign-engagements/{id}/{businessEngagementId}
225
+ */
226
+ async deleteCampaignBusinessEngagement(campaignId, businessEngagementId) {
227
+ return this.apiClient.delete(`/campaigns/${campaignId}/engagements/${businessEngagementId}`);
228
+ }
229
+ // ==========================================
230
+ // CLAIMS PROCESSING (/campaign-claims)
231
+ // ==========================================
232
+ /**
233
+ * USER: Claim campaign reward
234
+ */
235
+ async claimCampaign(request) {
236
+ return this.apiClient.post('/campaigns/claims', request);
237
+ }
238
+ /**
239
+ * Unified claims retrieval method with pagination
240
+ * Routes to appropriate endpoint based on filters:
241
+ * - No filters: Admin gets all claims
242
+ * - With userId/campaignId/businessId: Admin gets filtered claims
243
+ *
244
+ * @param filters - Filter and pagination options
245
+ * @returns Paginated list of campaign claims
246
+ *
247
+ * @example
248
+ * ```typescript
249
+ * // Admin: Get all claims
250
+ * const allClaims = await campaignApi.getClaims();
251
+ *
252
+ * // Admin: Get claims for specific user
253
+ * const userClaims = await campaignApi.getClaims({ userId: 'user-123' });
254
+ *
255
+ * // Admin: Get claims for specific campaign (paginated)
256
+ * const page1 = await campaignApi.getClaims({
257
+ * campaignId: 'campaign-123',
258
+ * page: 1,
259
+ * limit: 50
260
+ * });
261
+ *
262
+ * // Admin: Get claims with multiple filters
263
+ * const filtered = await campaignApi.getClaims({
264
+ * businessId: 'business-456',
265
+ * page: 2
266
+ * });
267
+ * ```
268
+ */
269
+ async getClaims(filters) {
270
+ const params = buildPaginationParams(filters);
271
+ // Add filter parameters
272
+ if (filters?.campaignId)
273
+ params.set('campaignId', filters.campaignId);
274
+ if (filters?.userId)
275
+ params.set('userId', filters.userId);
276
+ if (filters?.businessId)
277
+ params.set('businessId', filters.businessId);
278
+ const endpoint = `/campaigns/claims?${params.toString()}`;
279
+ const response = await this.apiClient.get(endpoint);
280
+ return normalizeToPaginated(response);
281
+ }
282
+ /**
283
+ * USER: Get logged-in user's own campaign claims
284
+ * Uses /me endpoint for authenticated user context
285
+ *
286
+ * @param options - Pagination options
287
+ * @returns Paginated list of user's claims
288
+ */
289
+ async getClaimsLoggedUser(options) {
290
+ const params = buildPaginationParams(options);
291
+ const response = await this.apiClient.get(`/campaigns/claims/me?${params.toString()}`);
292
+ return normalizeToPaginated(response);
293
+ }
294
+ }
295
+
296
+ /**
297
+ * Platform-Agnostic Campaign Service
298
+ *
299
+ * Contains campaign business logic and operations that work across platforms.
300
+ * No framework dependencies - pure TypeScript business logic.
301
+ *
302
+ * Focuses only on actual backend capabilities.
303
+ */
304
+ class CampaignService {
305
+ constructor(campaignApi) {
306
+ this.campaignApi = campaignApi;
307
+ }
308
+ // ==========================================
309
+ // PUBLIC OPERATIONS
310
+ // ==========================================
311
+ /**
312
+ * PUBLIC: Get campaign by ID
313
+ */
314
+ async getCampaignById(id) {
315
+ return this.campaignApi.getCampaignById(id);
316
+ }
317
+ // ==========================================
318
+ // AUTHENTICATED OPERATIONS
319
+ // ==========================================
320
+ /**
321
+ * AUTH: Claim campaign
322
+ */
323
+ async claimCampaign(request) {
324
+ return this.campaignApi.claimCampaign(request);
325
+ }
326
+ /**
327
+ * AUTH: Get claims for logged user with pagination
328
+ */
329
+ async getClaimsForLoggedUser(options) {
330
+ return this.campaignApi.getClaimsLoggedUser(options);
331
+ }
332
+ // ==========================================
333
+ // CAMPAIGN OPERATIONS (Paginated)
334
+ // ==========================================
335
+ /**
336
+ * Get campaigns with pagination support
337
+ * Intelligent access: Public gets active only, Business gets own campaigns, Admin gets all
338
+ * @param options.active - Filter by active status
339
+ * @param options.businessId - Filter by business engagement
340
+ * @param options.page - Page number (1-based, default: 1)
341
+ * @param options.limit - Items per page (default: 50)
342
+ * @param options.sortBy - Sort field
343
+ * @param options.sortOrder - Sort direction
344
+ */
345
+ async getCampaigns(options) {
346
+ return this.campaignApi.getCampaigns(options);
347
+ }
348
+ /**
349
+ * ADMIN: Get campaign triggers with pagination
350
+ */
351
+ async getCampaignTriggers(options) {
352
+ return this.campaignApi.getCampaignTriggers(options);
353
+ }
354
+ /**
355
+ * ADMIN: Toggle campaign active status
356
+ */
357
+ async toggleCampaignActive(campaignId) {
358
+ return this.campaignApi.toggleCampaignActive(campaignId);
359
+ }
360
+ /**
361
+ * ADMIN: Toggle campaign testnet environment
362
+ */
363
+ async toggleCampaignTestnet(campaignId) {
364
+ return this.campaignApi.toggleCampaignTestnet(campaignId);
365
+ }
366
+ /**
367
+ * ADMIN: Create campaign
368
+ */
369
+ async createCampaign(campaign) {
370
+ return this.campaignApi.createCampaign(campaign);
371
+ }
372
+ /**
373
+ * ADMIN: Set campaign trigger
374
+ */
375
+ async setCampaignTrigger(campaignId, triggerId) {
376
+ return this.campaignApi.setCampaignTrigger(campaignId, triggerId);
377
+ }
378
+ /**
379
+ * ADMIN: Update campaign
380
+ */
381
+ async updateCampaign(campaignId, campaign) {
382
+ return this.campaignApi.updateCampaign(campaignId, campaign);
383
+ }
384
+ /**
385
+ * ADMIN: Create campaign token unit
386
+ */
387
+ async createCampaignTokenUnit(campaignId, campaignTokenUnit) {
388
+ return this.campaignApi.createCampaignTokenUnit(campaignId, campaignTokenUnit);
389
+ }
390
+ /**
391
+ * ADMIN: Delete campaign token unit
392
+ */
393
+ async deleteCampaignTokenUnit(campaignId, campaignTokenUnitId) {
394
+ return this.campaignApi.deleteCampaignTokenUnit(campaignId, campaignTokenUnitId);
395
+ }
396
+ /**
397
+ * ADMIN: Add business engagement to campaign
398
+ */
399
+ async addBusinessEngagementToCampaign(campaignId, campaignBusinessEngagement) {
400
+ return this.campaignApi.addBusinessEngagementToCampaign(campaignId, campaignBusinessEngagement);
401
+ }
402
+ /**
403
+ * ADMIN: Update campaign business engagement
404
+ */
405
+ async updateCampaignBusinessEngagement(campaignId, businessEngagementId, campaignBusinessEngagement) {
406
+ return this.campaignApi.updateCampaignBusinessEngagement(campaignId, businessEngagementId, campaignBusinessEngagement);
407
+ }
408
+ async deleteCampaignBusinessEngagement(campaignId, businessEngagementId) {
409
+ return this.campaignApi.deleteCampaignBusinessEngagement(campaignId, businessEngagementId);
410
+ }
411
+ /**
412
+ * ADMIN: Get campaign claims with optional filters and pagination
413
+ */
414
+ async getCampaignClaims(filters) {
415
+ return this.campaignApi.getClaims(filters);
416
+ }
417
+ /**
418
+ * ADMIN: Get campaign claims by user ID with pagination
419
+ */
420
+ async getCampaignClaimsByUserId(userId, options) {
421
+ return this.campaignApi.getClaims({ userId, ...options });
422
+ }
423
+ /**
424
+ * ADMIN: Get campaign claims by business ID with pagination
425
+ */
426
+ async getCampaignClaimsByBusinessId(businessId, options) {
427
+ return this.campaignApi.getClaims({ businessId, ...options });
428
+ }
429
+ }
430
+
431
+ export { CampaignApi, CampaignService };
4
432
  //# sourceMappingURL=campaign.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"campaign.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
1
+ {"version":3,"file":"campaign.js","sources":["../src/campaign/api/campaign-api.ts","../src/campaign/services/campaign-service.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}