@explorins/pers-sdk 1.6.4 → 1.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -37
- package/dist/analytics/index.d.ts +0 -16
- package/dist/analytics/index.d.ts.map +1 -1
- package/dist/analytics.cjs +5 -73
- package/dist/analytics.cjs.map +1 -1
- package/dist/analytics.js +1 -72
- package/dist/analytics.js.map +1 -1
- package/dist/business/index.d.ts +0 -24
- package/dist/business/index.d.ts.map +1 -1
- package/dist/business.cjs +5 -273
- package/dist/business.cjs.map +1 -1
- package/dist/business.js +1 -272
- package/dist/business.js.map +1 -1
- package/dist/campaign/api/campaign-api.d.ts +3 -3
- package/dist/campaign/api/campaign-api.d.ts.map +1 -1
- package/dist/campaign/index.d.ts +0 -34
- package/dist/campaign/index.d.ts.map +1 -1
- package/dist/campaign.cjs +5 -447
- package/dist/campaign.cjs.map +1 -1
- package/dist/campaign.js +1 -446
- package/dist/campaign.js.map +1 -1
- package/dist/chunks/analytics-service-CitlimKJ.cjs +49 -0
- package/dist/chunks/analytics-service-CitlimKJ.cjs.map +1 -0
- package/dist/chunks/analytics-service-CxyrOwel.js +46 -0
- package/dist/chunks/analytics-service-CxyrOwel.js.map +1 -0
- package/dist/chunks/{token-sdk-BW4kkJb3.js → base-token-service-BSXDwrcq.js} +138 -204
- package/dist/chunks/base-token-service-BSXDwrcq.js.map +1 -0
- package/dist/chunks/{token-sdk-CiAbOb6c.cjs → base-token-service-CYuqPPs0.cjs} +140 -207
- package/dist/chunks/base-token-service-CYuqPPs0.cjs.map +1 -0
- package/dist/chunks/business-service-Cq3-oksM.cjs +241 -0
- package/dist/chunks/business-service-Cq3-oksM.cjs.map +1 -0
- package/dist/chunks/business-service-DrC-TNGa.js +238 -0
- package/dist/chunks/business-service-DrC-TNGa.js.map +1 -0
- package/dist/chunks/campaign-service-CWK9I388.cjs +403 -0
- package/dist/chunks/campaign-service-CWK9I388.cjs.map +1 -0
- package/dist/chunks/campaign-service-Dd7gMjC9.js +400 -0
- package/dist/chunks/campaign-service-Dd7gMjC9.js.map +1 -0
- package/dist/chunks/donation-service-CyJS4DIZ.js +47 -0
- package/dist/chunks/donation-service-CyJS4DIZ.js.map +1 -0
- package/dist/chunks/donation-service-D-xFrONi.cjs +50 -0
- package/dist/chunks/donation-service-D-xFrONi.cjs.map +1 -0
- package/dist/chunks/{index-CJ9Jfa4A.js → explorer.utils-Ckll15ja.js} +108 -172
- package/dist/chunks/explorer.utils-Ckll15ja.js.map +1 -0
- package/dist/chunks/{index-CzEluQmf.cjs → explorer.utils-GpskbLl1.cjs} +106 -174
- package/dist/chunks/explorer.utils-GpskbLl1.cjs.map +1 -0
- package/dist/chunks/index-BtDNXaFq.js +13 -0
- package/dist/chunks/index-BtDNXaFq.js.map +1 -0
- package/dist/chunks/index-CMk3Aqkk.cjs +15 -0
- package/dist/chunks/index-CMk3Aqkk.cjs.map +1 -0
- package/dist/chunks/payment-service-B4qx0qiE.cjs +220 -0
- package/dist/chunks/payment-service-B4qx0qiE.cjs.map +1 -0
- package/dist/chunks/payment-service-DfCBFosx.js +217 -0
- package/dist/chunks/payment-service-DfCBFosx.js.map +1 -0
- package/dist/chunks/pers-sdk-CajYwGkL.cjs +5850 -0
- package/dist/chunks/pers-sdk-CajYwGkL.cjs.map +1 -0
- package/dist/chunks/pers-sdk-eO4XUi8w.js +5817 -0
- package/dist/chunks/pers-sdk-eO4XUi8w.js.map +1 -0
- package/dist/chunks/redemption-service-7qbeQxEM.cjs +330 -0
- package/dist/chunks/redemption-service-7qbeQxEM.cjs.map +1 -0
- package/dist/chunks/redemption-service-BT0J5Iy7.js +327 -0
- package/dist/chunks/redemption-service-BT0J5Iy7.js.map +1 -0
- package/dist/chunks/tenant-service-Ba7xrWED.cjs +171 -0
- package/dist/chunks/tenant-service-Ba7xrWED.cjs.map +1 -0
- package/dist/chunks/tenant-service-DELk412y.js +168 -0
- package/dist/chunks/tenant-service-DELk412y.js.map +1 -0
- package/dist/chunks/token-service-BWScn8Qa.cjs +208 -0
- package/dist/chunks/token-service-BWScn8Qa.cjs.map +1 -0
- package/dist/chunks/token-service-CpVwC5Eb.js +205 -0
- package/dist/chunks/token-service-CpVwC5Eb.js.map +1 -0
- package/dist/chunks/user-service-D1Rn4U8u.cjs +153 -0
- package/dist/chunks/user-service-D1Rn4U8u.cjs.map +1 -0
- package/dist/chunks/user-service-D6mTa_WZ.js +150 -0
- package/dist/chunks/user-service-D6mTa_WZ.js.map +1 -0
- package/dist/chunks/{index-BfOoX87y.cjs → web3-chain-service-BYkj61DN.cjs} +1 -33
- package/dist/chunks/web3-chain-service-BYkj61DN.cjs.map +1 -0
- package/dist/chunks/{index-CM21r58m.js → web3-chain-service-DN6tJmvK.js} +2 -31
- package/dist/chunks/web3-chain-service-DN6tJmvK.js.map +1 -0
- package/dist/core/auth/auth-provider.interface.d.ts +32 -69
- package/dist/core/auth/auth-provider.interface.d.ts.map +1 -1
- package/dist/core/auth/default-auth-provider.d.ts +15 -58
- package/dist/core/auth/default-auth-provider.d.ts.map +1 -1
- package/dist/core/auth/index.d.ts +10 -12
- package/dist/core/auth/index.d.ts.map +1 -1
- package/dist/core/auth/refresh-manager.d.ts +18 -0
- package/dist/core/auth/refresh-manager.d.ts.map +1 -0
- package/dist/core/auth/services/auth-service.d.ts +11 -6
- package/dist/core/auth/services/auth-service.d.ts.map +1 -1
- package/dist/core/auth/token-storage.d.ts +27 -47
- package/dist/core/auth/token-storage.d.ts.map +1 -1
- package/dist/core/errors/index.d.ts +1 -5
- package/dist/core/errors/index.d.ts.map +1 -1
- package/dist/core/index.d.ts +4 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/pers-api-client.d.ts +10 -126
- package/dist/core/pers-api-client.d.ts.map +1 -1
- package/dist/core/pers-config.d.ts +8 -3
- package/dist/core/pers-config.d.ts.map +1 -1
- package/dist/core/utils/jwt.function.d.ts.map +1 -1
- package/dist/core.cjs +22 -17
- package/dist/core.cjs.map +1 -1
- package/dist/core.js +13 -13
- package/dist/donation/index.d.ts +0 -15
- package/dist/donation/index.d.ts.map +1 -1
- package/dist/donation.cjs +5 -75
- package/dist/donation.cjs.map +1 -1
- package/dist/donation.js +1 -74
- package/dist/donation.js.map +1 -1
- package/dist/index.cjs +51 -56
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +16 -15
- package/dist/index.js.map +1 -1
- package/dist/managers/analytics-manager.d.ts +290 -10
- package/dist/managers/analytics-manager.d.ts.map +1 -1
- package/dist/managers/auth-manager.d.ts +123 -23
- package/dist/managers/auth-manager.d.ts.map +1 -1
- package/dist/managers/business-manager.d.ts +273 -18
- package/dist/managers/business-manager.d.ts.map +1 -1
- package/dist/managers/campaign-manager.d.ts +585 -46
- package/dist/managers/campaign-manager.d.ts.map +1 -1
- package/dist/managers/donation-manager.d.ts +5 -5
- package/dist/managers/donation-manager.d.ts.map +1 -1
- package/dist/managers/file-manager.d.ts +430 -13
- package/dist/managers/file-manager.d.ts.map +1 -1
- package/dist/managers/purchase-manager.d.ts +340 -15
- package/dist/managers/purchase-manager.d.ts.map +1 -1
- package/dist/managers/redemption-manager.d.ts +450 -27
- package/dist/managers/redemption-manager.d.ts.map +1 -1
- package/dist/managers/tenant-manager.d.ts +5 -5
- package/dist/managers/tenant-manager.d.ts.map +1 -1
- package/dist/managers/token-manager.d.ts +245 -21
- package/dist/managers/token-manager.d.ts.map +1 -1
- package/dist/managers/transaction-manager.d.ts +447 -18
- package/dist/managers/transaction-manager.d.ts.map +1 -1
- package/dist/managers/user-manager.d.ts +216 -14
- package/dist/managers/user-manager.d.ts.map +1 -1
- package/dist/managers/web3-manager.d.ts +4 -4
- package/dist/managers/web3-manager.d.ts.map +1 -1
- package/dist/package.json +9 -2
- package/dist/payment/index.d.ts +0 -21
- package/dist/payment/index.d.ts.map +1 -1
- package/dist/payment.cjs +5 -255
- package/dist/payment.cjs.map +1 -1
- package/dist/payment.js +1 -254
- package/dist/payment.js.map +1 -1
- package/dist/pers-sdk.d.ts +141 -34
- package/dist/pers-sdk.d.ts.map +1 -1
- package/dist/redemption/index.d.ts +0 -25
- package/dist/redemption/index.d.ts.map +1 -1
- package/dist/redemption.cjs +5 -365
- package/dist/redemption.cjs.map +1 -1
- package/dist/redemption.js +1 -364
- package/dist/redemption.js.map +1 -1
- package/dist/tenant/index.d.ts +0 -22
- package/dist/tenant/index.d.ts.map +1 -1
- package/dist/tenant.cjs +5 -203
- package/dist/tenant.cjs.map +1 -1
- package/dist/tenant.js +1 -202
- package/dist/tenant.js.map +1 -1
- package/dist/token.cjs +6 -6
- package/dist/token.js +2 -2
- package/dist/transaction/index.d.ts +0 -22
- package/dist/transaction/index.d.ts.map +1 -1
- package/dist/transaction.cjs +0 -40
- package/dist/transaction.cjs.map +1 -1
- package/dist/transaction.js +1 -40
- package/dist/transaction.js.map +1 -1
- package/dist/user/index.d.ts +0 -25
- package/dist/user/index.d.ts.map +1 -1
- package/dist/user.cjs +5 -185
- package/dist/user.cjs.map +1 -1
- package/dist/user.js +1 -184
- package/dist/user.js.map +1 -1
- package/dist/web3/index.d.ts +0 -11
- package/dist/web3/index.d.ts.map +1 -1
- package/dist/web3-chain/index.d.ts +0 -9
- package/dist/web3-chain/index.d.ts.map +1 -1
- package/dist/web3-chain/services/getWeb3FCD.service.d.ts.map +1 -1
- package/dist/web3-chain.cjs +5 -5
- package/dist/web3-chain.js +2 -1
- package/dist/web3-chain.js.map +1 -1
- package/dist/web3.cjs +6 -10
- package/dist/web3.cjs.map +1 -1
- package/dist/web3.js +1 -4
- package/dist/web3.js.map +1 -1
- package/package.json +9 -2
- package/dist/chunks/base-token-service-D0KANDgM.js +0 -139
- package/dist/chunks/base-token-service-D0KANDgM.js.map +0 -1
- package/dist/chunks/base-token-service-zNfPjHRx.cjs +0 -141
- package/dist/chunks/base-token-service-zNfPjHRx.cjs.map +0 -1
- package/dist/chunks/index-BfOoX87y.cjs.map +0 -1
- package/dist/chunks/index-CJ9Jfa4A.js.map +0 -1
- package/dist/chunks/index-CM21r58m.js.map +0 -1
- package/dist/chunks/index-CzEluQmf.cjs.map +0 -1
- package/dist/chunks/pers-sdk-DbPwFKrf.cjs +0 -3378
- package/dist/chunks/pers-sdk-DbPwFKrf.cjs.map +0 -1
- package/dist/chunks/pers-sdk-Z6MKeFBX.js +0 -3353
- package/dist/chunks/pers-sdk-Z6MKeFBX.js.map +0 -1
- package/dist/chunks/token-sdk-BW4kkJb3.js.map +0 -1
- package/dist/chunks/token-sdk-CiAbOb6c.cjs.map +0 -1
- package/dist/core/auth/auth-constants.d.ts +0 -33
- package/dist/core/auth/auth-constants.d.ts.map +0 -1
- package/dist/core/auth/auth-errors.d.ts +0 -8
- package/dist/core/auth/auth-errors.d.ts.map +0 -1
- package/dist/core/auth/create-auth-provider.d.ts +0 -27
- package/dist/core/auth/create-auth-provider.d.ts.map +0 -1
- package/dist/core/auth/token-refresh.d.ts +0 -91
- package/dist/core/auth/token-refresh.d.ts.map +0 -1
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform-Agnostic Redemption API Client (UPDATED - RESTful Design)
|
|
3
|
+
*
|
|
4
|
+
* Updated to work with the new RESTful controller structure:
|
|
5
|
+
* - /redemptions (main redemption management)
|
|
6
|
+
* - /redemption-types (redemption type management)
|
|
7
|
+
* - /redemption-tokens (token unit management)
|
|
8
|
+
* - /redemption-redeems (redemption execution and history)
|
|
9
|
+
*
|
|
10
|
+
* Handles redemption operations using the PERS backend with intelligent access detection.
|
|
11
|
+
* Uses @explorins/pers-shared DTOs for consistency with backend.
|
|
12
|
+
*/
|
|
13
|
+
class RedemptionApi {
|
|
14
|
+
constructor(apiClient) {
|
|
15
|
+
this.apiClient = apiClient;
|
|
16
|
+
this.basePath = '/redemptions';
|
|
17
|
+
this.typesPath = '/redemptions/types';
|
|
18
|
+
}
|
|
19
|
+
// ==========================================
|
|
20
|
+
// PUBLIC OPERATIONS (Project Key)
|
|
21
|
+
// ==========================================
|
|
22
|
+
/**
|
|
23
|
+
* UNIFIED: Get redemptions with intelligent access control
|
|
24
|
+
*
|
|
25
|
+
* Intelligent endpoint that adapts based on authentication:
|
|
26
|
+
* - Public users: Get active redemptions only
|
|
27
|
+
* - Admin users: Get all redemptions with optional filtering
|
|
28
|
+
*
|
|
29
|
+
* @param options.active - Filter by active status (undefined = all for admins/active for public)
|
|
30
|
+
* @param options.adminAccess - Force admin access (requires admin auth)
|
|
31
|
+
*/
|
|
32
|
+
async getRedemptions(options) {
|
|
33
|
+
let url = `${this.basePath}`;
|
|
34
|
+
if (options?.active !== undefined) {
|
|
35
|
+
url += `?active=${options.active}`;
|
|
36
|
+
}
|
|
37
|
+
return this.apiClient.get(url);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* PUBLIC: Get redemption types
|
|
41
|
+
*
|
|
42
|
+
* Updated: /redemption/type → /redemption-types
|
|
43
|
+
*/
|
|
44
|
+
async getRedemptionTypes() {
|
|
45
|
+
return this.apiClient.get(this.typesPath);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* PUBLIC: Get redemption by ID
|
|
49
|
+
*
|
|
50
|
+
* Updated: /redemption/:id → /redemptions/:id
|
|
51
|
+
*/
|
|
52
|
+
async getRedemptionById(id) {
|
|
53
|
+
return this.apiClient.get(`${this.basePath}/${id}`);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* PUBLIC: Get available supply for redemption
|
|
57
|
+
*
|
|
58
|
+
* Updated: /redemption/:id/available-supply → /redemptions/:id/supply
|
|
59
|
+
*/
|
|
60
|
+
async getRedemptionAvailableSupply(id) {
|
|
61
|
+
const result = await this.apiClient.get(`${this.basePath}/${id}/supply`);
|
|
62
|
+
return result.available;
|
|
63
|
+
}
|
|
64
|
+
// ==========================================
|
|
65
|
+
// REDEMPTION EXECUTION (UNIFIED ENDPOINT)
|
|
66
|
+
// ==========================================
|
|
67
|
+
/**
|
|
68
|
+
* Execute redemption (unified endpoint)
|
|
69
|
+
*
|
|
70
|
+
* NEW: POST /redemption-redeems - Role-based processing
|
|
71
|
+
* - USER: Direct user redemption processing
|
|
72
|
+
* - ADMIN: Can process redemptions for any account type
|
|
73
|
+
* - BUSINESS: Process redemptions for customers
|
|
74
|
+
*/
|
|
75
|
+
async redeemRedemption(redemptionId) {
|
|
76
|
+
const body = {
|
|
77
|
+
redemptionId: redemptionId,
|
|
78
|
+
};
|
|
79
|
+
return this.apiClient.post(this.basePath + '/redeems', body);
|
|
80
|
+
}
|
|
81
|
+
// ==========================================
|
|
82
|
+
// REDEMPTION REDEEMS QUERIES (NEW ENDPOINTS)
|
|
83
|
+
// ==========================================
|
|
84
|
+
/**
|
|
85
|
+
* UNIFIED: Get redemption redeems with filtering and intelligent access
|
|
86
|
+
*
|
|
87
|
+
* Role-based access with unified filtering:
|
|
88
|
+
* - Users: See only their own redeems (userId/businessId filters ignored)
|
|
89
|
+
* - Admins: Can filter by userId, businessId, or redemptionId
|
|
90
|
+
*
|
|
91
|
+
* @param filters.redemptionId - Filter by specific redemption
|
|
92
|
+
* @param filters.userId - Admin only: Filter by user ID
|
|
93
|
+
* @param filters.businessId - Admin only: Filter by business ID
|
|
94
|
+
* @param filters.myRedeems - Force user's own redeems (uses /me endpoint)
|
|
95
|
+
*/
|
|
96
|
+
async getRedemptionRedeems(filters) {
|
|
97
|
+
let url = `${this.basePath}/redeems`;
|
|
98
|
+
// Use convenience endpoint for user's own redeems
|
|
99
|
+
if (filters?.myRedeems) {
|
|
100
|
+
url = `${this.basePath}/redeems/me`;
|
|
101
|
+
if (filters.redemptionId) {
|
|
102
|
+
url += `?redemptionId=${filters.redemptionId}`;
|
|
103
|
+
}
|
|
104
|
+
return this.apiClient.get(url);
|
|
105
|
+
}
|
|
106
|
+
// Use admin endpoint with filtering
|
|
107
|
+
const params = new URLSearchParams();
|
|
108
|
+
if (filters?.redemptionId)
|
|
109
|
+
params.append('redemptionId', filters.redemptionId);
|
|
110
|
+
if (filters?.userId)
|
|
111
|
+
params.append('userId', filters.userId);
|
|
112
|
+
if (filters?.businessId)
|
|
113
|
+
params.append('businessId', filters.businessId);
|
|
114
|
+
const queryString = params.toString();
|
|
115
|
+
if (queryString) {
|
|
116
|
+
url += `?${queryString}`;
|
|
117
|
+
}
|
|
118
|
+
return this.apiClient.get(url);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* UNIFIED: Get specific redemption redeem by ID
|
|
122
|
+
*/
|
|
123
|
+
async getRedemptionRedeemById(id) {
|
|
124
|
+
return this.apiClient.get(`${this.basePath}/redeems/${id}`);
|
|
125
|
+
}
|
|
126
|
+
// ==========================================
|
|
127
|
+
// USER OPERATIONS (JWT + Project Key)
|
|
128
|
+
// ==========================================
|
|
129
|
+
/**
|
|
130
|
+
* UNIFIED: Get user redemption history
|
|
131
|
+
*
|
|
132
|
+
* Uses convenience endpoint /redemption-redeems/me with optional filtering
|
|
133
|
+
* @param redemptionId - Optional filter by specific redemption
|
|
134
|
+
*/
|
|
135
|
+
async getUserRedeems(redemptionId) {
|
|
136
|
+
return this.getRedemptionRedeems({ myRedeems: true, redemptionId });
|
|
137
|
+
}
|
|
138
|
+
// ==========================================
|
|
139
|
+
// ADMIN OPERATIONS (Tenant Admin JWT)
|
|
140
|
+
// ==========================================
|
|
141
|
+
/**
|
|
142
|
+
* ADMIN: Get redemptions with filtering (using intelligent endpoint)
|
|
143
|
+
*
|
|
144
|
+
* Updated: /redemption/admin → /redemptions (intelligent access detection)
|
|
145
|
+
* The unified endpoint will detect admin privileges and allow filtering
|
|
146
|
+
*/
|
|
147
|
+
async getRedemptionsAsAdmin(active) {
|
|
148
|
+
return this.getRedemptions({ active, adminAccess: true });
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* ADMIN: Create redemption
|
|
152
|
+
*
|
|
153
|
+
* Updated: /redemption/admin → /redemptions
|
|
154
|
+
*/
|
|
155
|
+
async createRedemption(redemption) {
|
|
156
|
+
return this.apiClient.post(`${this.basePath}`, redemption);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* ADMIN: Update redemption
|
|
160
|
+
*
|
|
161
|
+
* Updated: /redemption/admin/:id → /redemptions/:id
|
|
162
|
+
*/
|
|
163
|
+
async updateRedemption(id, redemptionCreateRequest) {
|
|
164
|
+
return this.apiClient.put(`${this.basePath}/${id}`, redemptionCreateRequest);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* UNIFIED: Toggle redemption active status
|
|
168
|
+
*
|
|
169
|
+
* Updated: /redemption/admin/:id/toggle-active → /redemptions/:id/status
|
|
170
|
+
* Following standard /status pattern used across domains
|
|
171
|
+
*/
|
|
172
|
+
async toggleRedemptionActive(redemptionId) {
|
|
173
|
+
return this.apiClient.put(`${this.basePath}/${redemptionId}/status`, {});
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* ADMIN: Delete redemption
|
|
177
|
+
*
|
|
178
|
+
* Updated: /redemption/admin/:id → /redemptions/:id
|
|
179
|
+
*/
|
|
180
|
+
async deleteRedemption(id) {
|
|
181
|
+
return this.apiClient.delete(`${this.basePath}/${id}`);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* ADMIN: Create redemption type
|
|
185
|
+
*
|
|
186
|
+
* Updated: /redemption/admin/type → /redemption-types
|
|
187
|
+
*/
|
|
188
|
+
async createRedemptionType(redemptionType) {
|
|
189
|
+
return this.apiClient.post(this.typesPath, redemptionType);
|
|
190
|
+
}
|
|
191
|
+
// ==========================================
|
|
192
|
+
// TOKEN UNIT MANAGEMENT (Admin)
|
|
193
|
+
// ==========================================
|
|
194
|
+
/**
|
|
195
|
+
* ADMIN: Create redemption token unit
|
|
196
|
+
*
|
|
197
|
+
* Updated: /redemption/admin/:id/token-units → /redemption-tokens/:id/
|
|
198
|
+
*/
|
|
199
|
+
async createRedemptionTokenUnit(redemptionId, redemptionTokenUnit) {
|
|
200
|
+
return this.apiClient.post(`${this.basePath}/${redemptionId}/tokens`, redemptionTokenUnit);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* ADMIN: Update redemption token unit
|
|
204
|
+
*
|
|
205
|
+
* Updated: /redemption/admin/:id/token-units/:tokenUnitId → /redemption-tokens/:id/:tokenUnitId
|
|
206
|
+
*/
|
|
207
|
+
async updateRedemptionTokenUnit(redemptionId, tokenUnitId, redemptionTokenUnit) {
|
|
208
|
+
return this.apiClient.put(`${this.basePath}/${redemptionId}/tokens/${tokenUnitId}`, redemptionTokenUnit);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* ADMIN: Delete redemption token unit
|
|
212
|
+
*
|
|
213
|
+
* Updated: /redemption/admin/:id/token-units/:tokenUnitId → /redemption-tokens/:id/:tokenUnitId
|
|
214
|
+
*/
|
|
215
|
+
async deleteRedemptionTokenUnit(redemptionId, redemptionTokenUnitId) {
|
|
216
|
+
return this.apiClient.delete(`${this.basePath}/${redemptionId}/tokens/${redemptionTokenUnitId}`);
|
|
217
|
+
}
|
|
218
|
+
// ==========================================
|
|
219
|
+
// CONVENIENCE METHODS (Legacy Support)
|
|
220
|
+
// ==========================================
|
|
221
|
+
/**
|
|
222
|
+
* Convenience: Get active redemptions (public access)
|
|
223
|
+
*/
|
|
224
|
+
async getActiveRedemptions() {
|
|
225
|
+
return this.getRedemptions({ active: true });
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Platform-Agnostic Redemption Service
|
|
231
|
+
*
|
|
232
|
+
* Contains redemption business logic and operations that work across platforms.
|
|
233
|
+
* No framework dependencies - pure TypeScript business logic.
|
|
234
|
+
*
|
|
235
|
+
* Focuses only on actual backend capabilities.
|
|
236
|
+
*/
|
|
237
|
+
class RedemptionService {
|
|
238
|
+
constructor(redemptionApi) {
|
|
239
|
+
this.redemptionApi = redemptionApi;
|
|
240
|
+
}
|
|
241
|
+
// ==========================================
|
|
242
|
+
// PUBLIC OPERATIONS
|
|
243
|
+
// ==========================================
|
|
244
|
+
/**
|
|
245
|
+
* UNIFIED: Get redemptions with intelligent access control
|
|
246
|
+
* @param options.active - Filter by active status
|
|
247
|
+
* @param options.adminAccess - Force admin access
|
|
248
|
+
*/
|
|
249
|
+
async getRedemptions(options) {
|
|
250
|
+
return this.redemptionApi.getRedemptions(options);
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Convenience: Get active redemptions (public)
|
|
254
|
+
*/
|
|
255
|
+
async getActiveRedemptions() {
|
|
256
|
+
return this.redemptionApi.getActiveRedemptions();
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* PUBLIC: Get redemption types
|
|
260
|
+
*/
|
|
261
|
+
async getRedemptionTypes() {
|
|
262
|
+
return this.redemptionApi.getRedemptionTypes();
|
|
263
|
+
}
|
|
264
|
+
// ==========================================
|
|
265
|
+
// AUTHENTICATED OPERATIONS
|
|
266
|
+
// ==========================================
|
|
267
|
+
/**
|
|
268
|
+
* AUTH: Redeem a redemption
|
|
269
|
+
*/
|
|
270
|
+
async redeemRedemption(redemptionId) {
|
|
271
|
+
return this.redemptionApi.redeemRedemption(redemptionId);
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* UNIFIED: Get redemption redeems with filtering
|
|
275
|
+
*/
|
|
276
|
+
async getRedemptionRedeems(filters) {
|
|
277
|
+
return this.redemptionApi.getRedemptionRedeems(filters);
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Convenience: Get user redemptions
|
|
281
|
+
*/
|
|
282
|
+
async getUserRedeems() {
|
|
283
|
+
return this.redemptionApi.getUserRedeems();
|
|
284
|
+
}
|
|
285
|
+
// ==========================================
|
|
286
|
+
// ADMIN OPERATIONS
|
|
287
|
+
// ==========================================
|
|
288
|
+
/**
|
|
289
|
+
* Convenience: Get redemptions as admin
|
|
290
|
+
*/
|
|
291
|
+
async getRedemptionsAsAdmin(active) {
|
|
292
|
+
return this.redemptionApi.getRedemptionsAsAdmin(active);
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* ADMIN: Create redemption
|
|
296
|
+
*/
|
|
297
|
+
async createRedemption(redemption) {
|
|
298
|
+
return this.redemptionApi.createRedemption(redemption);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* ADMIN: Update redemption
|
|
302
|
+
*/
|
|
303
|
+
async updateRedemption(id, redemptionCreateRequest) {
|
|
304
|
+
return this.redemptionApi.updateRedemption(id, redemptionCreateRequest); // ✅ CORRECTED: Fixed parameter
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* ADMIN: Toggle redemption active status
|
|
308
|
+
*/
|
|
309
|
+
async toggleRedemptionActive(redemptionId) {
|
|
310
|
+
return this.redemptionApi.toggleRedemptionActive(redemptionId);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* ADMIN: Create redemption token unit
|
|
314
|
+
*/
|
|
315
|
+
async createRedemptionTokenUnit(redemptionId, redemptionTokenUnit) {
|
|
316
|
+
return this.redemptionApi.createRedemptionTokenUnit(redemptionId, redemptionTokenUnit);
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* ADMIN: Delete redemption token unit
|
|
320
|
+
*/
|
|
321
|
+
async deleteRedemptionTokenUnit(redemptionId, redemptionTokenUnitId) {
|
|
322
|
+
return this.redemptionApi.deleteRedemptionTokenUnit(redemptionId, redemptionTokenUnitId);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
export { RedemptionApi as R, RedemptionService as a };
|
|
327
|
+
//# sourceMappingURL=redemption-service-BT0J5Iy7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redemption-service-BT0J5Iy7.js","sources":["../../src/redemption/api/redemption-api.ts","../../src/redemption/services/redemption-service.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Platform-Agnostic Tenant API Client
|
|
5
|
+
*
|
|
6
|
+
* Handles tenant and admin operations using the PERS backend.
|
|
7
|
+
* Updated to match new RESTful tenant controller endpoints.
|
|
8
|
+
*
|
|
9
|
+
* Note: Special header handling (bypass-auth-interceptor) should be handled by PersApiClient internally
|
|
10
|
+
* or through endpoint-specific configuration.
|
|
11
|
+
*/
|
|
12
|
+
class TenantApi {
|
|
13
|
+
constructor(apiClient) {
|
|
14
|
+
this.apiClient = apiClient;
|
|
15
|
+
this.basePath = '/tenants';
|
|
16
|
+
this.adminPath = '/admins';
|
|
17
|
+
}
|
|
18
|
+
// ==========================================
|
|
19
|
+
// PUBLIC OPERATIONS
|
|
20
|
+
// ==========================================
|
|
21
|
+
/**
|
|
22
|
+
* API KEY: Get current tenant public information
|
|
23
|
+
* ✅ UPDATED: Uses /tenants/me endpoint with API key authentication
|
|
24
|
+
*
|
|
25
|
+
* Requires: X-API-Key header (handled by PersApiClient)
|
|
26
|
+
* Returns: Enhanced public tenant information for the authenticated project
|
|
27
|
+
*/
|
|
28
|
+
async getRemoteTenant() {
|
|
29
|
+
// Remove cache busting - not needed for authenticated endpoint
|
|
30
|
+
const timestamp = Date.now().toString();
|
|
31
|
+
const url = `${this.basePath}/me?date=${timestamp}`;
|
|
32
|
+
return this.apiClient.get(url);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* API KEY: Get remote login token
|
|
36
|
+
* ✅ UPDATED: Requires API key authentication
|
|
37
|
+
*/
|
|
38
|
+
async getRemoteLoginToken() {
|
|
39
|
+
return this.apiClient.get(`${this.basePath}/login-token`);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* API KEY: Get remote client configuration
|
|
43
|
+
* ✅ UPDATED: Requires API key authentication
|
|
44
|
+
*/
|
|
45
|
+
async getRemoteClientConfig() {
|
|
46
|
+
return this.apiClient.get(`${this.basePath}/client-config`);
|
|
47
|
+
}
|
|
48
|
+
// ==========================================
|
|
49
|
+
// PUBLIC UNAUTHENTICATED OPERATIONS
|
|
50
|
+
// ==========================================
|
|
51
|
+
/**
|
|
52
|
+
* PUBLIC: Get tenant public information by ID (no auth required)
|
|
53
|
+
* ✅ NEW: For cases where you need public tenant info without API key
|
|
54
|
+
*
|
|
55
|
+
* @param tenantId - The tenant ID to retrieve public information for
|
|
56
|
+
*/
|
|
57
|
+
async getPublicTenantById(tenantId) {
|
|
58
|
+
const url = `${this.basePath}/${tenantId}`;
|
|
59
|
+
return this.apiClient.get(url);
|
|
60
|
+
}
|
|
61
|
+
// ==========================================
|
|
62
|
+
// ADMIN OPERATIONS
|
|
63
|
+
// ==========================================
|
|
64
|
+
/**
|
|
65
|
+
* ADMIN: Update tenant information
|
|
66
|
+
* ✅ UPDATED: Uses PUT /tenants (admin endpoint)
|
|
67
|
+
*/
|
|
68
|
+
async updateRemoteTenant(tenantData) {
|
|
69
|
+
return this.apiClient.put(`${this.basePath}`, tenantData);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* ADMIN: Create new API key
|
|
73
|
+
* ✅ NEW: Create new API key for the tenant
|
|
74
|
+
*/
|
|
75
|
+
async createApiKey(keyName) {
|
|
76
|
+
return this.apiClient.post(`${this.basePath}/api-keys`, { keyName });
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* ADMIN: Create new JWT token
|
|
80
|
+
* ✅ NEW: Create new JWT token for the tenant
|
|
81
|
+
*/
|
|
82
|
+
async createJwtToken(isTestnet = false) {
|
|
83
|
+
return this.apiClient.post(`${this.basePath}/jwt-tokens`, { isTestnet });
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* ADMIN: Get all tenant admins
|
|
87
|
+
*/
|
|
88
|
+
async getAdmins() {
|
|
89
|
+
return this.apiClient.get(`${this.adminPath}`);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* ADMIN: Create new admin
|
|
93
|
+
*/
|
|
94
|
+
async postAdmin(adminData) {
|
|
95
|
+
return this.apiClient.post(`${this.adminPath}`, adminData);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* ADMIN: Update admin (toggle tenant association)
|
|
99
|
+
*/
|
|
100
|
+
async putAdmin(adminId, adminData) {
|
|
101
|
+
return this.apiClient.put(`${this.adminPath}/${adminId}/tenant`, adminData);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Platform-Agnostic Tenant Service
|
|
107
|
+
*
|
|
108
|
+
* Contains tenant business logic and operations that work across platforms.
|
|
109
|
+
* No framework dependencies - pure TypeScript business logic.
|
|
110
|
+
* Matches framework TenantApiService capabilities exactly.
|
|
111
|
+
*/
|
|
112
|
+
class TenantService {
|
|
113
|
+
constructor(tenantApi) {
|
|
114
|
+
this.tenantApi = tenantApi;
|
|
115
|
+
}
|
|
116
|
+
// ==========================================
|
|
117
|
+
// PUBLIC OPERATIONS
|
|
118
|
+
// ==========================================
|
|
119
|
+
/**
|
|
120
|
+
* PUBLIC: Get tenant public information
|
|
121
|
+
*/
|
|
122
|
+
async getRemoteTenant() {
|
|
123
|
+
return this.tenantApi.getRemoteTenant();
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* PUBLIC: Get remote login token
|
|
127
|
+
*/
|
|
128
|
+
async getRemoteLoginToken() {
|
|
129
|
+
return this.tenantApi.getRemoteLoginToken();
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* PUBLIC: Get remote client configuration
|
|
133
|
+
*/
|
|
134
|
+
async getRemoteClientConfig() {
|
|
135
|
+
return this.tenantApi.getRemoteClientConfig();
|
|
136
|
+
}
|
|
137
|
+
// ==========================================
|
|
138
|
+
// ADMIN OPERATIONS
|
|
139
|
+
// ==========================================
|
|
140
|
+
/**
|
|
141
|
+
* ADMIN: Update tenant information
|
|
142
|
+
* ✅ FIXED: Uses TenantPublicDTO directly like framework
|
|
143
|
+
*/
|
|
144
|
+
async updateRemoteTenant(tenantData) {
|
|
145
|
+
return this.tenantApi.updateRemoteTenant(tenantData);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* ADMIN: Get all tenant admins
|
|
149
|
+
*/
|
|
150
|
+
async getAdmins() {
|
|
151
|
+
return this.tenantApi.getAdmins();
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* ADMIN: Create new admin
|
|
155
|
+
* ✅ FIXED: Renamed to match framework postAdmin method
|
|
156
|
+
*/
|
|
157
|
+
async postAdmin(adminData) {
|
|
158
|
+
return this.tenantApi.postAdmin(adminData);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* ADMIN: Update admin (toggle tenant association)
|
|
162
|
+
* ✅ FIXED: Renamed to match framework putAdmin method
|
|
163
|
+
*/
|
|
164
|
+
async putAdmin(adminId, adminData) {
|
|
165
|
+
return this.tenantApi.putAdmin(adminId, adminData);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
exports.TenantApi = TenantApi;
|
|
170
|
+
exports.TenantService = TenantService;
|
|
171
|
+
//# sourceMappingURL=tenant-service-Ba7xrWED.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-service-Ba7xrWED.cjs","sources":["../../src/tenant/api/tenant-api.ts","../../src/tenant/services/tenant-service.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform-Agnostic Tenant API Client
|
|
3
|
+
*
|
|
4
|
+
* Handles tenant and admin operations using the PERS backend.
|
|
5
|
+
* Updated to match new RESTful tenant controller endpoints.
|
|
6
|
+
*
|
|
7
|
+
* Note: Special header handling (bypass-auth-interceptor) should be handled by PersApiClient internally
|
|
8
|
+
* or through endpoint-specific configuration.
|
|
9
|
+
*/
|
|
10
|
+
class TenantApi {
|
|
11
|
+
constructor(apiClient) {
|
|
12
|
+
this.apiClient = apiClient;
|
|
13
|
+
this.basePath = '/tenants';
|
|
14
|
+
this.adminPath = '/admins';
|
|
15
|
+
}
|
|
16
|
+
// ==========================================
|
|
17
|
+
// PUBLIC OPERATIONS
|
|
18
|
+
// ==========================================
|
|
19
|
+
/**
|
|
20
|
+
* API KEY: Get current tenant public information
|
|
21
|
+
* ✅ UPDATED: Uses /tenants/me endpoint with API key authentication
|
|
22
|
+
*
|
|
23
|
+
* Requires: X-API-Key header (handled by PersApiClient)
|
|
24
|
+
* Returns: Enhanced public tenant information for the authenticated project
|
|
25
|
+
*/
|
|
26
|
+
async getRemoteTenant() {
|
|
27
|
+
// Remove cache busting - not needed for authenticated endpoint
|
|
28
|
+
const timestamp = Date.now().toString();
|
|
29
|
+
const url = `${this.basePath}/me?date=${timestamp}`;
|
|
30
|
+
return this.apiClient.get(url);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* API KEY: Get remote login token
|
|
34
|
+
* ✅ UPDATED: Requires API key authentication
|
|
35
|
+
*/
|
|
36
|
+
async getRemoteLoginToken() {
|
|
37
|
+
return this.apiClient.get(`${this.basePath}/login-token`);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* API KEY: Get remote client configuration
|
|
41
|
+
* ✅ UPDATED: Requires API key authentication
|
|
42
|
+
*/
|
|
43
|
+
async getRemoteClientConfig() {
|
|
44
|
+
return this.apiClient.get(`${this.basePath}/client-config`);
|
|
45
|
+
}
|
|
46
|
+
// ==========================================
|
|
47
|
+
// PUBLIC UNAUTHENTICATED OPERATIONS
|
|
48
|
+
// ==========================================
|
|
49
|
+
/**
|
|
50
|
+
* PUBLIC: Get tenant public information by ID (no auth required)
|
|
51
|
+
* ✅ NEW: For cases where you need public tenant info without API key
|
|
52
|
+
*
|
|
53
|
+
* @param tenantId - The tenant ID to retrieve public information for
|
|
54
|
+
*/
|
|
55
|
+
async getPublicTenantById(tenantId) {
|
|
56
|
+
const url = `${this.basePath}/${tenantId}`;
|
|
57
|
+
return this.apiClient.get(url);
|
|
58
|
+
}
|
|
59
|
+
// ==========================================
|
|
60
|
+
// ADMIN OPERATIONS
|
|
61
|
+
// ==========================================
|
|
62
|
+
/**
|
|
63
|
+
* ADMIN: Update tenant information
|
|
64
|
+
* ✅ UPDATED: Uses PUT /tenants (admin endpoint)
|
|
65
|
+
*/
|
|
66
|
+
async updateRemoteTenant(tenantData) {
|
|
67
|
+
return this.apiClient.put(`${this.basePath}`, tenantData);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* ADMIN: Create new API key
|
|
71
|
+
* ✅ NEW: Create new API key for the tenant
|
|
72
|
+
*/
|
|
73
|
+
async createApiKey(keyName) {
|
|
74
|
+
return this.apiClient.post(`${this.basePath}/api-keys`, { keyName });
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* ADMIN: Create new JWT token
|
|
78
|
+
* ✅ NEW: Create new JWT token for the tenant
|
|
79
|
+
*/
|
|
80
|
+
async createJwtToken(isTestnet = false) {
|
|
81
|
+
return this.apiClient.post(`${this.basePath}/jwt-tokens`, { isTestnet });
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* ADMIN: Get all tenant admins
|
|
85
|
+
*/
|
|
86
|
+
async getAdmins() {
|
|
87
|
+
return this.apiClient.get(`${this.adminPath}`);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* ADMIN: Create new admin
|
|
91
|
+
*/
|
|
92
|
+
async postAdmin(adminData) {
|
|
93
|
+
return this.apiClient.post(`${this.adminPath}`, adminData);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* ADMIN: Update admin (toggle tenant association)
|
|
97
|
+
*/
|
|
98
|
+
async putAdmin(adminId, adminData) {
|
|
99
|
+
return this.apiClient.put(`${this.adminPath}/${adminId}/tenant`, adminData);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Platform-Agnostic Tenant Service
|
|
105
|
+
*
|
|
106
|
+
* Contains tenant business logic and operations that work across platforms.
|
|
107
|
+
* No framework dependencies - pure TypeScript business logic.
|
|
108
|
+
* Matches framework TenantApiService capabilities exactly.
|
|
109
|
+
*/
|
|
110
|
+
class TenantService {
|
|
111
|
+
constructor(tenantApi) {
|
|
112
|
+
this.tenantApi = tenantApi;
|
|
113
|
+
}
|
|
114
|
+
// ==========================================
|
|
115
|
+
// PUBLIC OPERATIONS
|
|
116
|
+
// ==========================================
|
|
117
|
+
/**
|
|
118
|
+
* PUBLIC: Get tenant public information
|
|
119
|
+
*/
|
|
120
|
+
async getRemoteTenant() {
|
|
121
|
+
return this.tenantApi.getRemoteTenant();
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* PUBLIC: Get remote login token
|
|
125
|
+
*/
|
|
126
|
+
async getRemoteLoginToken() {
|
|
127
|
+
return this.tenantApi.getRemoteLoginToken();
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* PUBLIC: Get remote client configuration
|
|
131
|
+
*/
|
|
132
|
+
async getRemoteClientConfig() {
|
|
133
|
+
return this.tenantApi.getRemoteClientConfig();
|
|
134
|
+
}
|
|
135
|
+
// ==========================================
|
|
136
|
+
// ADMIN OPERATIONS
|
|
137
|
+
// ==========================================
|
|
138
|
+
/**
|
|
139
|
+
* ADMIN: Update tenant information
|
|
140
|
+
* ✅ FIXED: Uses TenantPublicDTO directly like framework
|
|
141
|
+
*/
|
|
142
|
+
async updateRemoteTenant(tenantData) {
|
|
143
|
+
return this.tenantApi.updateRemoteTenant(tenantData);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* ADMIN: Get all tenant admins
|
|
147
|
+
*/
|
|
148
|
+
async getAdmins() {
|
|
149
|
+
return this.tenantApi.getAdmins();
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* ADMIN: Create new admin
|
|
153
|
+
* ✅ FIXED: Renamed to match framework postAdmin method
|
|
154
|
+
*/
|
|
155
|
+
async postAdmin(adminData) {
|
|
156
|
+
return this.tenantApi.postAdmin(adminData);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* ADMIN: Update admin (toggle tenant association)
|
|
160
|
+
* ✅ FIXED: Renamed to match framework putAdmin method
|
|
161
|
+
*/
|
|
162
|
+
async putAdmin(adminId, adminData) {
|
|
163
|
+
return this.tenantApi.putAdmin(adminId, adminData);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export { TenantApi as T, TenantService as a };
|
|
168
|
+
//# sourceMappingURL=tenant-service-DELk412y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-service-DELk412y.js","sources":["../../src/tenant/api/tenant-api.ts","../../src/tenant/services/tenant-service.ts"],"sourcesContent":[null,null],"names":[],"mappings":"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"}
|