@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/business.js CHANGED
@@ -1,752 +1,4 @@
1
- import { b as buildPaginationParams, n as normalizeToPaginated } from './chunks/pagination-utils-9vQ-Npkr.js';
2
- import { MembershipRole, hasMinimumRole } from '@explorins/pers-shared';
3
- export { AccountOwnerType, ApiKeyType, MEMBERSHIP_ROLE_HIERARCHY, MembershipRole, NativeTokenTypes, hasMinimumRole } from '@explorins/pers-shared';
4
-
5
- /**
6
- * Platform-Agnostic Business API Client
7
- *
8
- * Updated to match the actual RESTful endpoints:
9
- * - /businesses for business operations
10
- * - /business-types for business type operations (separate controller)
11
- */
12
- class BusinessApi {
13
- constructor(apiClient) {
14
- this.apiClient = apiClient;
15
- this.basePath = '/businesses';
16
- this.businessTypesPath = '/businesses/types';
17
- }
18
- // ==========================================
19
- // 🌐 BUSINESS TYPES MANAGEMENT
20
- // ==========================================
21
- /**
22
- * Get all business types (project key required)
23
- *
24
- * Endpoint: GET /business-types
25
- * Auth: @ApiSecurity('projectKey')
26
- *
27
- * @param options Pagination options (page, limit, sortBy, sortOrder)
28
- * @returns Paginated response with business types
29
- */
30
- async getBusinessTypes(options) {
31
- const params = buildPaginationParams(options);
32
- const response = await this.apiClient.get(`${this.businessTypesPath}?${params.toString()}`);
33
- return normalizeToPaginated(response);
34
- }
35
- /**
36
- * ADMIN: Create business type
37
- *
38
- * Endpoint: POST /business-types
39
- * Auth: @TenantAdmin()
40
- */
41
- async createBusinessType(dto) {
42
- return this.apiClient.post(this.businessTypesPath, dto);
43
- }
44
- /**
45
- * ADMIN: Update business type
46
- *
47
- * Endpoint: PUT /business-types
48
- * Auth: @TenantAdmin()
49
- */
50
- async updateBusinessType(dto) {
51
- return this.apiClient.put(this.businessTypesPath, dto);
52
- }
53
- /**
54
- * ADMIN: Delete business type
55
- *
56
- * Endpoint: DELETE /business-types/{id}
57
- * Auth: @TenantAdmin()
58
- */
59
- async deleteBusinessType(id) {
60
- return this.apiClient.delete(`${this.businessTypesPath}/${id}`);
61
- }
62
- // ==========================================
63
- // 🏢 BUSINESS MANAGEMENT
64
- // ==========================================
65
- /**
66
- * Get current business info (business authentication required)
67
- *
68
- * Endpoint: GET /businesses/me
69
- * Auth: @Business()
70
- */
71
- async getCurrentBusiness() {
72
- return this.apiClient.get(`${this.basePath}/me`);
73
- }
74
- /**
75
- * Get all businesses with role-based filtering and pagination
76
- *
77
- * Endpoint: GET /businesses?active={boolean}&sanitize={mode}&page={number}&limit={number}
78
- * Auth: @ApiSecurity('projectKey') (enhanced with role-based filtering)
79
- *
80
- * Note:
81
- * - Project API Key users: Active businesses only (automatically filtered)
82
- * - Admin JWT users: Full access with all query parameters
83
- *
84
- * @param options - Filter and pagination options
85
- * @returns Paginated list of businesses
86
- *
87
- * @example
88
- * ```typescript
89
- * // Get first page of active businesses
90
- * const page1 = await businessApi.getBusinesses({ active: true });
91
- *
92
- * // Get all businesses (admin only) with pagination
93
- * const page2 = await businessApi.getBusinesses({
94
- * page: 2,
95
- * limit: 25,
96
- * sanitize: 'soft'
97
- * });
98
- * ```
99
- */
100
- async getBusinesses(options) {
101
- const params = buildPaginationParams(options);
102
- if (options?.active !== undefined) {
103
- params.set('active', String(options.active));
104
- }
105
- if (options?.sanitize) {
106
- params.set('sanitize', options.sanitize);
107
- }
108
- const response = await this.apiClient.get(`${this.basePath}?${params.toString()}`);
109
- return normalizeToPaginated(response);
110
- }
111
- /**
112
- * Get business by ID
113
- *
114
- * Endpoint: GET /businesses/{id}
115
- * Auth: @ApiSecurity('projectKey')
116
- */
117
- async getBusinessById(businessId) {
118
- return this.apiClient.get(`${this.basePath}/${businessId}`);
119
- }
120
- /**
121
- * Get business by account address
122
- *
123
- * Endpoint: GET /businesses/account/{accountAddress}
124
- * Auth: @ApiSecurity('projectKey')
125
- */
126
- async getBusinessByAccount(accountAddress) {
127
- return this.apiClient.get(`${this.basePath}/account/${accountAddress}`);
128
- }
129
- // ==========================================
130
- // 🔧 ADMIN OPERATIONS
131
- // ==========================================
132
- /**
133
- * ADMIN: Create business
134
- *
135
- * Endpoint: POST /businesses
136
- * Auth: @TenantAdmin()
137
- * Returns: BusinessApiKeyDTO | BusinessTokenBalancesDTO
138
- */
139
- async createBusiness(dto) {
140
- return this.apiClient.post(this.basePath, dto);
141
- }
142
- /**
143
- * ADMIN: Create business by display name (convenience method)
144
- */
145
- async createBusinessByDisplayName(displayName) {
146
- const dto = {
147
- displayName,
148
- // Add other required fields based on BusinessCreateRequestDTO structure
149
- };
150
- return this.createBusiness(dto);
151
- }
152
- /**
153
- * ADMIN: Create businesses from URL
154
- *
155
- * Endpoint: POST /businesses/bulk/url
156
- * Auth: @TenantAdmin()
157
- */
158
- async createBusinessesFromUrl(url) {
159
- return this.apiClient.post(`${this.basePath}/bulk/url`, { url });
160
- }
161
- /**
162
- * ADMIN: Update business
163
- *
164
- * Endpoint: PUT /businesses/{id}
165
- * Auth: @TenantAdmin()
166
- */
167
- async updateBusiness(id, businessData) {
168
- return this.apiClient.put(`${this.basePath}/${id}`, businessData);
169
- }
170
- /**
171
- * ADMIN: Toggle business active status
172
- *
173
- * Endpoint: PUT /businesses/{id}/status
174
- * Auth: @TenantAdmin()
175
- */
176
- async toggleBusinessStatus(id, dto) {
177
- return this.apiClient.put(`${this.basePath}/${id}/status`, dto);
178
- }
179
- }
180
-
181
- /**
182
- * Business Membership API Client
183
- *
184
- * Platform-agnostic API client for managing business memberships.
185
- * Handles user access to businesses with role-based permissions.
186
- *
187
- * Base Path: /businesses/:businessId/members
188
- *
189
- * Required Headers:
190
- * - Authorization: Bearer <business_jwt_token>
191
- * - X-Project-Key: <project_key>
192
- *
193
- * @example
194
- * ```typescript
195
- * const membershipApi = new BusinessMembershipApi(apiClient);
196
- *
197
- * // List all members of a business
198
- * const members = await membershipApi.getMembers('business-123');
199
- *
200
- * // Add a new member
201
- * const newMember = await membershipApi.addMember('business-123', {
202
- * userId: 'user-456',
203
- * role: MembershipRole.EDITOR
204
- * });
205
- * ```
206
- *
207
- * @version 2.0.0
208
- */
209
- class BusinessMembershipApi {
210
- constructor(apiClient) {
211
- this.apiClient = apiClient;
212
- }
213
- /**
214
- * Build the membership endpoint path for a business
215
- */
216
- getMembersPath(businessId) {
217
- return `/businesses/${businessId}/members`;
218
- }
219
- /**
220
- * Build the membership endpoint path for a specific member
221
- */
222
- getMemberPath(businessId, userId) {
223
- return `/businesses/${businessId}/members/${userId}`;
224
- }
225
- // ==========================================
226
- // LIST MEMBERS
227
- // ==========================================
228
- /**
229
- * List all members of a business with pagination
230
- *
231
- * Endpoint: GET /businesses/:businessId/members
232
- * Min Role: VIEWER (any member can view)
233
- *
234
- * @param businessId - The business UUID
235
- * @param options - Pagination and filter options
236
- * @returns Paginated array of business memberships with user and role details
237
- *
238
- * @throws {AuthenticationError} 401 - Not authenticated
239
- * @throws {PersApiError} 403 - businessId in path doesn't match JWT's business
240
- *
241
- * @example
242
- * ```typescript
243
- * // Get first page of members
244
- * const page1 = await membershipApi.getMembers('business-123');
245
- * page1.data.forEach(m => console.log(`${m.userId}: ${m.role}`));
246
- *
247
- * // Filter by role
248
- * const admins = await membershipApi.getMembers('business-123', {
249
- * role: MembershipRole.ADMIN,
250
- * page: 1,
251
- * limit: 50
252
- * });
253
- *
254
- * // Paginate through all members
255
- * const page2 = await membershipApi.getMembers('business-123', { page: 2 });
256
- * ```
257
- */
258
- async getMembers(businessId, options) {
259
- const params = buildPaginationParams(options);
260
- if (options?.role) {
261
- params.set('role', options.role);
262
- }
263
- const response = await this.apiClient.get(`${this.getMembersPath(businessId)}?${params.toString()}`);
264
- return normalizeToPaginated(response);
265
- }
266
- // ==========================================
267
- // ADD MEMBER
268
- // ==========================================
269
- /**
270
- * Add a member to a business
271
- *
272
- * Endpoint: POST /businesses/:businessId/members
273
- * Min Role: ADMIN
274
- *
275
- * @param businessId - The business UUID
276
- * @param request - The add member request with userId and optional role
277
- * @returns The created business membership
278
- *
279
- * @throws {AuthenticationError} 401 - Not authenticated
280
- * @throws {PersApiError} 403 - Insufficient role (requires ADMIN or higher)
281
- * @throws {PersApiError} 404 - User not found
282
- * @throws {PersApiError} 409 - User is already a member
283
- *
284
- * @example
285
- * ```typescript
286
- * const newMember = await membershipApi.addMember('business-123', {
287
- * userId: 'user-456',
288
- * role: MembershipRole.EDITOR
289
- * });
290
- * ```
291
- */
292
- async addMember(businessId, request) {
293
- return this.apiClient.post(this.getMembersPath(businessId), request);
294
- }
295
- /**
296
- * Add a member to a business with explicit parameters
297
- *
298
- * Convenience method that constructs the request DTO internally.
299
- *
300
- * @param businessId - The business UUID
301
- * @param userId - The user UUID to add
302
- * @param role - The role to assign (defaults to VIEWER)
303
- * @returns The created business membership
304
- *
305
- * @example
306
- * ```typescript
307
- * const member = await membershipApi.addMemberByUserId(
308
- * 'business-123',
309
- * 'user-456',
310
- * MembershipRole.EDITOR
311
- * );
312
- * ```
313
- */
314
- async addMemberByUserId(businessId, userId, role = MembershipRole.VIEWER) {
315
- return this.addMember(businessId, { userId, role });
316
- }
317
- // ==========================================
318
- // UPDATE MEMBER ROLE
319
- // ==========================================
320
- /**
321
- * Update a member's role in a business
322
- *
323
- * Endpoint: PUT /businesses/:businessId/members/:userId
324
- * Min Role: ADMIN
325
- *
326
- * Business Rules:
327
- * - Cannot demote the last OWNER (must transfer ownership first)
328
- * - Can only assign roles up to your own level (ADMIN cannot create OWNER)
329
- *
330
- * @param businessId - The business UUID
331
- * @param userId - The user UUID to update
332
- * @param request - The update request with new role
333
- * @returns The updated business membership
334
- *
335
- * @throws {AuthenticationError} 401 - Not authenticated
336
- * @throws {PersApiError} 403 - Insufficient role (requires ADMIN or higher)
337
- * @throws {PersApiError} 404 - Membership not found
338
- * @throws {PersApiError} 400 - Cannot demote last OWNER
339
- *
340
- * @example
341
- * ```typescript
342
- * const updated = await membershipApi.updateMemberRole(
343
- * 'business-123',
344
- * 'user-456',
345
- * { role: MembershipRole.ADMIN }
346
- * );
347
- * ```
348
- */
349
- async updateMemberRole(businessId, userId, request) {
350
- return this.apiClient.put(this.getMemberPath(businessId, userId), request);
351
- }
352
- /**
353
- * Update a member's role with explicit parameters
354
- *
355
- * Convenience method that constructs the request DTO internally.
356
- *
357
- * @param businessId - The business UUID
358
- * @param userId - The user UUID to update
359
- * @param role - The new role to assign
360
- * @returns The updated business membership
361
- *
362
- * @example
363
- * ```typescript
364
- * const updated = await membershipApi.setMemberRole(
365
- * 'business-123',
366
- * 'user-456',
367
- * MembershipRole.ADMIN
368
- * );
369
- * ```
370
- */
371
- async setMemberRole(businessId, userId, role) {
372
- return this.updateMemberRole(businessId, userId, { role });
373
- }
374
- // ==========================================
375
- // REMOVE MEMBER
376
- // ==========================================
377
- /**
378
- * Remove a member from a business
379
- *
380
- * Endpoint: DELETE /businesses/:businessId/members/:userId
381
- * Min Role: ADMIN
382
- *
383
- * Business Rules:
384
- * - Cannot remove the last OWNER
385
- * - Cannot remove yourself (use leave endpoint or transfer ownership)
386
- *
387
- * @param businessId - The business UUID
388
- * @param userId - The user UUID to remove
389
- * @returns Success confirmation
390
- *
391
- * @throws {AuthenticationError} 401 - Not authenticated
392
- * @throws {PersApiError} 403 - Insufficient role (requires ADMIN or higher)
393
- * @throws {PersApiError} 404 - Membership not found
394
- * @throws {PersApiError} 400 - Cannot remove last OWNER
395
- *
396
- * @example
397
- * ```typescript
398
- * const result = await membershipApi.removeMember('business-123', 'user-456');
399
- * if (result.success) {
400
- * console.log('Member removed successfully');
401
- * }
402
- * ```
403
- */
404
- async removeMember(businessId, userId) {
405
- return this.apiClient.delete(this.getMemberPath(businessId, userId));
406
- }
407
- }
408
-
409
- /**
410
- * Platform-Agnostic Business Service
411
- *
412
- * Contains business logic and operations that work across platforms.
413
- * No framework dependencies - pure TypeScript business logic.
414
- *
415
- * Focuses only on actual backend capabilities.
416
- */
417
- class BusinessService {
418
- constructor(businessApi) {
419
- this.businessApi = businessApi;
420
- }
421
- /**
422
- * Get all active businesses with pagination
423
- * @deprecated Use getBusinesses({ active: true }) for more control
424
- */
425
- async getActiveBusinesses(options) {
426
- return this.businessApi.getBusinesses({ active: true, ...options });
427
- }
428
- /**
429
- * Get all business types with pagination
430
- */
431
- async getBusinessTypes(options) {
432
- return this.businessApi.getBusinessTypes(options);
433
- }
434
- /**
435
- * Get business by ID
436
- */
437
- async getBusinessById(businessId) {
438
- return this.businessApi.getBusinessById(businessId);
439
- }
440
- /**
441
- * Get business by account address
442
- */
443
- async getBusinessByAccount(accountAddress) {
444
- return this.businessApi.getBusinessByAccount(accountAddress);
445
- }
446
- /**
447
- * Get businesses by type (client-side filtering)
448
- * @deprecated Consider implementing server-side filtering for better performance
449
- */
450
- async getBusinessesByType(typeId, options) {
451
- const response = await this.getActiveBusinesses(options);
452
- const filtered = response.data.filter((business) => business.businessType && business.businessType.id === parseInt(typeId));
453
- return {
454
- data: filtered,
455
- pagination: {
456
- ...response.pagination,
457
- total: filtered.length,
458
- pages: Math.ceil(filtered.length / (response.pagination.limit || 20))
459
- }
460
- };
461
- }
462
- // ==========================================
463
- // ADMIN OPERATIONS
464
- // ==========================================
465
- /**
466
- * ADMIN: Get all businesses with pagination (active and inactive)
467
- */
468
- async getBusinesses(options) {
469
- return this.businessApi.getBusinesses(options);
470
- }
471
- /**
472
- * ADMIN: Create business by display name
473
- */
474
- async createBusinessByDisplayName(displayName) {
475
- return this.businessApi.createBusinessByDisplayName(displayName);
476
- }
477
- /**
478
- * ADMIN: Update business
479
- */
480
- async updateBusiness(id, businessData) {
481
- return this.businessApi.updateBusiness(id, businessData);
482
- }
483
- /**
484
- * ADMIN: Toggle business active status
485
- */
486
- async toggleBusinessStatus(id, dto) {
487
- return this.businessApi.toggleBusinessStatus(id, dto);
488
- }
489
- }
490
-
491
- /**
492
- * Business Membership Service
493
- *
494
- * Platform-agnostic service for managing business memberships.
495
- * Provides business logic layer on top of the API client with
496
- * convenience methods and role-based utilities.
497
- *
498
- * @example
499
- * ```typescript
500
- * const service = new BusinessMembershipService(membershipApi);
501
- *
502
- * // Get members with admin permissions
503
- * const admins = await service.getMembersByRole('business-123', MembershipRole.ADMIN);
504
- *
505
- * // Check permissions
506
- * const canManage = service.canManageMembers(MembershipRole.ADMIN); // true
507
- * ```
508
- *
509
- * @version 2.0.0
510
- */
511
- class BusinessMembershipService {
512
- constructor(membershipApi) {
513
- this.membershipApi = membershipApi;
514
- }
515
- // ==========================================
516
- // MEMBER LISTING
517
- // ==========================================
518
- /**
519
- * Get all members of a business with pagination
520
- *
521
- * @param businessId - The business UUID
522
- * @param options - Pagination options
523
- * @returns Paginated response with business memberships
524
- */
525
- async getMembers(businessId, options) {
526
- return this.membershipApi.getMembers(businessId, options);
527
- }
528
- /**
529
- * Get members filtered by role (client-side filtering)
530
- * @deprecated Consider server-side role filtering for better performance
531
- */
532
- async getMembersByRole(businessId, role, options) {
533
- const response = await this.getMembers(businessId, options);
534
- const filtered = response.data.filter((m) => m.role === role);
535
- return {
536
- data: filtered,
537
- pagination: {
538
- ...response.pagination,
539
- total: filtered.length,
540
- pages: Math.ceil(filtered.length / (response.pagination.limit || 20))
541
- }
542
- };
543
- }
544
- /**
545
- * Get members with at least a minimum role level
546
- *
547
- * Uses the role hierarchy: OWNER > ADMIN > EDITOR > VIEWER
548
- *
549
- * @param businessId - The business UUID
550
- * @param minRole - The minimum role level
551
- * @returns Array of memberships with role >= minRole
552
- *
553
- * @example
554
- * ```typescript
555
- * // Get all members who can manage content (EDITOR and above)
556
- * const editors = await service.getMembersWithMinRole('biz-123', MembershipRole.EDITOR);
557
- * ```
558
- */
559
- async getMembersWithMinRole(businessId, minRole) {
560
- const response = await this.getMembers(businessId);
561
- return response.data.filter((m) => hasMinimumRole(m.role, minRole));
562
- }
563
- /**
564
- * Get a specific member by user ID
565
- *
566
- * @param businessId - The business UUID
567
- * @param userId - The user UUID to find
568
- * @returns The membership if found, undefined otherwise
569
- */
570
- async getMemberByUserId(businessId, userId) {
571
- const response = await this.getMembers(businessId);
572
- return response.data.find((m) => m.userId === userId);
573
- }
574
- /**
575
- * Count members by role
576
- *
577
- * @param businessId - The business UUID
578
- * @returns Object with count per role
579
- *
580
- * @example
581
- * ```typescript
582
- * const counts = await service.getMemberCountsByRole('biz-123');
583
- * // { OWNER: 1, ADMIN: 2, EDITOR: 5, VIEWER: 10 }
584
- * ```
585
- */
586
- async getMemberCountsByRole(businessId) {
587
- const response = await this.getMembers(businessId);
588
- const counts = {
589
- [MembershipRole.OWNER]: 0,
590
- [MembershipRole.ADMIN]: 0,
591
- [MembershipRole.EDITOR]: 0,
592
- [MembershipRole.VIEWER]: 0,
593
- };
594
- for (const member of response.data) {
595
- if (member.role in counts) {
596
- counts[member.role]++;
597
- }
598
- }
599
- return counts;
600
- }
601
- // ==========================================
602
- // MEMBER MANAGEMENT
603
- // ==========================================
604
- /**
605
- * Add a new member to a business
606
- *
607
- * @param businessId - The business UUID
608
- * @param userId - The user UUID to add
609
- * @param role - The role to assign (defaults to VIEWER)
610
- * @returns The created membership
611
- */
612
- async addMember(businessId, userId, role = MembershipRole.VIEWER) {
613
- return this.membershipApi.addMemberByUserId(businessId, userId, role);
614
- }
615
- /**
616
- * Update a member's role
617
- *
618
- * @param businessId - The business UUID
619
- * @param userId - The user UUID to update
620
- * @param newRole - The new role to assign
621
- * @returns The updated membership
622
- */
623
- async updateMemberRole(businessId, userId, newRole) {
624
- return this.membershipApi.setMemberRole(businessId, userId, newRole);
625
- }
626
- /**
627
- * Remove a member from a business
628
- *
629
- * @param businessId - The business UUID
630
- * @param userId - The user UUID to remove
631
- * @returns Success confirmation
632
- */
633
- async removeMember(businessId, userId) {
634
- return this.membershipApi.removeMember(businessId, userId);
635
- }
636
- /**
637
- * Promote a member to a higher role
638
- *
639
- * @param businessId - The business UUID
640
- * @param userId - The user UUID to promote
641
- * @param targetRole - The target role (must be higher than current)
642
- * @returns The updated membership
643
- * @throws Error if target role is not higher than current
644
- */
645
- async promoteMember(businessId, userId, targetRole) {
646
- const member = await this.getMemberByUserId(businessId, userId);
647
- if (!member) {
648
- throw new Error(`Member not found: ${userId}`);
649
- }
650
- // Validate that target role is actually a promotion
651
- if (!hasMinimumRole(targetRole, member.role) || targetRole === member.role) {
652
- throw new Error(`Cannot promote to ${targetRole}: current role is ${member.role}`);
653
- }
654
- return this.updateMemberRole(businessId, userId, targetRole);
655
- }
656
- /**
657
- * Demote a member to a lower role
658
- *
659
- * Note: Cannot demote the last OWNER
660
- *
661
- * @param businessId - The business UUID
662
- * @param userId - The user UUID to demote
663
- * @param targetRole - The target role (must be lower than current)
664
- * @returns The updated membership
665
- * @throws Error if target role is not lower than current
666
- */
667
- async demoteMember(businessId, userId, targetRole) {
668
- const member = await this.getMemberByUserId(businessId, userId);
669
- if (!member) {
670
- throw new Error(`Member not found: ${userId}`);
671
- }
672
- // Validate that target role is actually a demotion
673
- if (hasMinimumRole(targetRole, member.role)) {
674
- throw new Error(`Cannot demote to ${targetRole}: current role is ${member.role}`);
675
- }
676
- return this.updateMemberRole(businessId, userId, targetRole);
677
- }
678
- // ==========================================
679
- // PERMISSION UTILITIES
680
- // ==========================================
681
- /**
682
- * Check if a role can view members (any member)
683
- */
684
- canViewMembers(role) {
685
- return role !== null;
686
- }
687
- /**
688
- * Check if a role can manage members (ADMIN or higher)
689
- */
690
- canManageMembers(role) {
691
- return role !== null && hasMinimumRole(role, MembershipRole.ADMIN);
692
- }
693
- /**
694
- * Check if a role can edit content (EDITOR or higher)
695
- */
696
- canEditContent(role) {
697
- return role !== null && hasMinimumRole(role, MembershipRole.EDITOR);
698
- }
699
- /**
700
- * Check if a role can delete the business (OWNER only)
701
- */
702
- canDeleteBusiness(role) {
703
- return role === MembershipRole.OWNER;
704
- }
705
- /**
706
- * Get permissions object for a role
707
- *
708
- * Useful for UI components to conditionally render based on permissions.
709
- *
710
- * @param role - The membership role (or null if not a member)
711
- * @returns Object with boolean permission flags
712
- *
713
- * @example
714
- * ```typescript
715
- * const perms = service.getPermissions(MembershipRole.EDITOR);
716
- * // { canViewMembers: true, canManageMembers: false, canEditContent: true, canDeleteBusiness: false }
717
- *
718
- * if (perms.canManageMembers) {
719
- * showAddMemberButton();
720
- * }
721
- * ```
722
- */
723
- getPermissions(role) {
724
- return {
725
- canViewMembers: this.canViewMembers(role),
726
- canManageMembers: this.canManageMembers(role),
727
- canEditContent: this.canEditContent(role),
728
- canDeleteBusiness: this.canDeleteBusiness(role),
729
- };
730
- }
731
- /**
732
- * Check if a role can assign another role
733
- *
734
- * Rule: Can only assign roles up to your own level
735
- * (ADMIN cannot create OWNER, but OWNER can create anything)
736
- *
737
- * @param assignerRole - The role of the user assigning
738
- * @param targetRole - The role being assigned
739
- * @returns true if the assigner can assign the target role
740
- */
741
- canAssignRole(assignerRole, targetRole) {
742
- // Must be at least ADMIN to assign any role
743
- if (!hasMinimumRole(assignerRole, MembershipRole.ADMIN)) {
744
- return false;
745
- }
746
- // Can only assign roles up to your own level
747
- return hasMinimumRole(assignerRole, targetRole);
748
- }
749
- }
750
-
751
- export { BusinessApi, BusinessMembershipApi, BusinessMembershipService, BusinessService };
1
+ export { B as BusinessApi, a as BusinessMembershipApi, c as BusinessMembershipService, b as BusinessService } from './chunks/business-membership-service-D6vaVQTR.js';
2
+ import './chunks/pagination-utils-9vQ-Npkr.js';
3
+ import '@explorins/pers-shared';
752
4
  //# sourceMappingURL=business.js.map