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