@oxyhq/core 2.4.1 → 3.0.0
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/dist/cjs/.tsbuildinfo +1 -1
- package/dist/cjs/OxyServices.js +1 -1
- package/dist/cjs/mixins/OxyServices.applications.js +212 -0
- package/dist/cjs/mixins/OxyServices.auth.js +4 -4
- package/dist/cjs/mixins/index.js +2 -2
- package/dist/esm/.tsbuildinfo +1 -1
- package/dist/esm/OxyServices.js +1 -1
- package/dist/esm/mixins/OxyServices.applications.js +209 -0
- package/dist/esm/mixins/OxyServices.auth.js +4 -4
- package/dist/esm/mixins/index.js +2 -2
- package/dist/types/.tsbuildinfo +1 -1
- package/dist/types/OxyServices.d.ts +1 -1
- package/dist/types/index.d.ts +1 -0
- package/dist/types/mixins/OxyServices.applications.d.ts +317 -0
- package/dist/types/mixins/OxyServices.auth.d.ts +4 -4
- package/dist/types/mixins/OxyServices.utility.d.ts +1 -1
- package/dist/types/mixins/index.d.ts +2 -2
- package/package.json +1 -1
- package/src/OxyServices.ts +1 -1
- package/src/index.ts +29 -0
- package/src/mixins/OxyServices.applications.ts +511 -0
- package/src/mixins/OxyServices.auth.ts +4 -4
- package/src/mixins/OxyServices.utility.ts +1 -1
- package/src/mixins/index.ts +3 -3
- package/src/mixins/OxyServices.developer.ts +0 -114
package/dist/esm/OxyServices.js
CHANGED
|
@@ -20,7 +20,7 @@ import { composeOxyServices } from './mixins/index.js';
|
|
|
20
20
|
* - **Payment**: Payment processing
|
|
21
21
|
* - **Karma**: Karma system
|
|
22
22
|
* - **Assets**: File upload and asset management
|
|
23
|
-
* - **
|
|
23
|
+
* - **Applications**: Application, membership, and credential management
|
|
24
24
|
* - **Location**: Location-based features
|
|
25
25
|
* - **Analytics**: Analytics tracking
|
|
26
26
|
* - **Devices**: Device management
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { CACHE_TIMES } from './mixinHelpers.js';
|
|
2
|
+
export function OxyServicesApplicationsMixin(Base) {
|
|
3
|
+
return class extends Base {
|
|
4
|
+
constructor(...args) {
|
|
5
|
+
super(...args);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* List applications the current user is an active member of.
|
|
9
|
+
*/
|
|
10
|
+
async getApplications() {
|
|
11
|
+
try {
|
|
12
|
+
const res = await this.makeRequest('GET', '/applications', undefined, { cache: true, cacheTTL: CACHE_TIMES.MEDIUM });
|
|
13
|
+
return res.applications ?? [];
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
throw this.handleError(error);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a new application. The caller becomes its `owner`.
|
|
21
|
+
* @param data - Application configuration. Staff-only fields are ignored.
|
|
22
|
+
*/
|
|
23
|
+
async createApplication(data) {
|
|
24
|
+
try {
|
|
25
|
+
const res = await this.makeRequest('POST', '/applications', data, { cache: false });
|
|
26
|
+
return res.application;
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
throw this.handleError(error);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Fetch a single application by id.
|
|
34
|
+
* @param applicationId - The application's Mongo `_id`.
|
|
35
|
+
*/
|
|
36
|
+
async getApplication(applicationId) {
|
|
37
|
+
try {
|
|
38
|
+
const res = await this.makeRequest('GET', `/applications/${applicationId}`, undefined, { cache: true, cacheTTL: CACHE_TIMES.LONG });
|
|
39
|
+
return res.application;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
throw this.handleError(error);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Update an application's mutable fields.
|
|
47
|
+
* @param applicationId - The application's Mongo `_id`.
|
|
48
|
+
* @param data - Subset of updatable fields. Staff-only fields are ignored.
|
|
49
|
+
*/
|
|
50
|
+
async updateApplication(applicationId, data) {
|
|
51
|
+
try {
|
|
52
|
+
const res = await this.makeRequest('PATCH', `/applications/${applicationId}`, data, { cache: false });
|
|
53
|
+
return res.application;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
throw this.handleError(error);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Soft-delete an application (owner only).
|
|
61
|
+
* @param applicationId - The application's Mongo `_id`.
|
|
62
|
+
*/
|
|
63
|
+
async deleteApplication(applicationId) {
|
|
64
|
+
try {
|
|
65
|
+
return await this.makeRequest('DELETE', `/applications/${applicationId}`, undefined, { cache: false });
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
throw this.handleError(error);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* List members of an application.
|
|
73
|
+
* @param applicationId - The application's Mongo `_id`.
|
|
74
|
+
*/
|
|
75
|
+
async getApplicationMembers(applicationId) {
|
|
76
|
+
try {
|
|
77
|
+
const res = await this.makeRequest('GET', `/applications/${applicationId}/members`, undefined, { cache: true, cacheTTL: CACHE_TIMES.MEDIUM });
|
|
78
|
+
return res.members ?? [];
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
throw this.handleError(error);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Add a member to an application.
|
|
86
|
+
* @param applicationId - The application's Mongo `_id`.
|
|
87
|
+
* @param data - Target user id and role (never `owner`).
|
|
88
|
+
*/
|
|
89
|
+
async inviteApplicationMember(applicationId, data) {
|
|
90
|
+
try {
|
|
91
|
+
const res = await this.makeRequest('POST', `/applications/${applicationId}/members`, data, { cache: false });
|
|
92
|
+
return res.member;
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
throw this.handleError(error);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Change a member's role.
|
|
100
|
+
* @param applicationId - The application's Mongo `_id`.
|
|
101
|
+
* @param memberId - The member's Mongo `_id`.
|
|
102
|
+
* @param data - New role.
|
|
103
|
+
*/
|
|
104
|
+
async updateApplicationMember(applicationId, memberId, data) {
|
|
105
|
+
try {
|
|
106
|
+
const res = await this.makeRequest('PATCH', `/applications/${applicationId}/members/${memberId}`, data, { cache: false });
|
|
107
|
+
return res.member;
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
throw this.handleError(error);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Remove a member from an application.
|
|
115
|
+
* @param applicationId - The application's Mongo `_id`.
|
|
116
|
+
* @param memberId - The member's Mongo `_id`.
|
|
117
|
+
*/
|
|
118
|
+
async removeApplicationMember(applicationId, memberId) {
|
|
119
|
+
try {
|
|
120
|
+
return await this.makeRequest('DELETE', `/applications/${applicationId}/members/${memberId}`, undefined, { cache: false });
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
throw this.handleError(error);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Transfer ownership of an application to another member (owner only).
|
|
128
|
+
* Demotes the current owner to `admin` and promotes the target to `owner`.
|
|
129
|
+
* @param applicationId - The application's Mongo `_id`.
|
|
130
|
+
* @param data - Target user id.
|
|
131
|
+
*/
|
|
132
|
+
async transferApplicationOwnership(applicationId, data) {
|
|
133
|
+
try {
|
|
134
|
+
return await this.makeRequest('POST', `/applications/${applicationId}/transfer-ownership`, data, { cache: false });
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
throw this.handleError(error);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* List an application's credentials. The response NEVER includes secrets.
|
|
142
|
+
* @param applicationId - The application's Mongo `_id`.
|
|
143
|
+
*/
|
|
144
|
+
async getApplicationCredentials(applicationId) {
|
|
145
|
+
try {
|
|
146
|
+
const res = await this.makeRequest('GET', `/applications/${applicationId}/credentials`, undefined, { cache: true, cacheTTL: CACHE_TIMES.MEDIUM });
|
|
147
|
+
return res.credentials ?? [];
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
throw this.handleError(error);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Create a credential. The plaintext `secret` is returned exactly ONCE;
|
|
155
|
+
* the server stores only a hash and will never return it again.
|
|
156
|
+
* @param applicationId - The application's Mongo `_id`.
|
|
157
|
+
* @param data - Credential configuration.
|
|
158
|
+
*/
|
|
159
|
+
async createApplicationCredential(applicationId, data) {
|
|
160
|
+
try {
|
|
161
|
+
return await this.makeRequest('POST', `/applications/${applicationId}/credentials`, data, { cache: false });
|
|
162
|
+
}
|
|
163
|
+
catch (error) {
|
|
164
|
+
throw this.handleError(error);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Rotate a credential's secret. The new plaintext `secret` is returned
|
|
169
|
+
* exactly ONCE.
|
|
170
|
+
* @param applicationId - The application's Mongo `_id`.
|
|
171
|
+
* @param credentialId - The credential's Mongo `_id`.
|
|
172
|
+
*/
|
|
173
|
+
async rotateApplicationCredential(applicationId, credentialId) {
|
|
174
|
+
try {
|
|
175
|
+
return await this.makeRequest('POST', `/applications/${applicationId}/credentials/${credentialId}/rotate`, undefined, { cache: false });
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
throw this.handleError(error);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Revoke a credential (`status='revoked'`). Revoked credentials can no
|
|
183
|
+
* longer authenticate.
|
|
184
|
+
* @param applicationId - The application's Mongo `_id`.
|
|
185
|
+
* @param credentialId - The credential's Mongo `_id`.
|
|
186
|
+
*/
|
|
187
|
+
async revokeApplicationCredential(applicationId, credentialId) {
|
|
188
|
+
try {
|
|
189
|
+
return await this.makeRequest('DELETE', `/applications/${applicationId}/credentials/${credentialId}`, undefined, { cache: false });
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
throw this.handleError(error);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Fetch usage statistics for an application.
|
|
197
|
+
* @param applicationId - The application's Mongo `_id`.
|
|
198
|
+
* @param period - Time window (defaults to the server default).
|
|
199
|
+
*/
|
|
200
|
+
async getApplicationUsage(applicationId, period) {
|
|
201
|
+
try {
|
|
202
|
+
return await this.makeRequest('GET', `/applications/${applicationId}/usage`, period ? { period } : undefined, { cache: true, cacheTTL: CACHE_TIMES.SHORT });
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
throw this.handleError(error);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
}
|
|
@@ -60,8 +60,8 @@ export function OxyServicesAuthMixin(Base) {
|
|
|
60
60
|
* legitimate multi-tenant hosts that need to switch credentials cannot leak
|
|
61
61
|
* one tenant's token to another tenant on the same instance.
|
|
62
62
|
*
|
|
63
|
-
* @param apiKey -
|
|
64
|
-
* @param apiSecret -
|
|
63
|
+
* @param apiKey - Application credential public key (oxy_dk_*)
|
|
64
|
+
* @param apiSecret - Application credential secret
|
|
65
65
|
*/
|
|
66
66
|
configureServiceAuth(apiKey, apiSecret) {
|
|
67
67
|
this._serviceApiKey = apiKey;
|
|
@@ -83,8 +83,8 @@ export function OxyServicesAuthMixin(Base) {
|
|
|
83
83
|
* This prevents an attacker who learned a peer's apiKey from extracting
|
|
84
84
|
* their service token by polling with a wrong secret.
|
|
85
85
|
*
|
|
86
|
-
* @param apiKey -
|
|
87
|
-
* @param apiSecret -
|
|
86
|
+
* @param apiKey - Application credential public key (optional if configureServiceAuth was called)
|
|
87
|
+
* @param apiSecret - Application credential secret (optional if configureServiceAuth was called)
|
|
88
88
|
*/
|
|
89
89
|
async getServiceToken(apiKey, apiSecret) {
|
|
90
90
|
const key = apiKey || this._serviceApiKey;
|
package/dist/esm/mixins/index.js
CHANGED
|
@@ -16,7 +16,7 @@ import { OxyServicesLanguageMixin } from './OxyServices.language.js';
|
|
|
16
16
|
import { OxyServicesPaymentMixin } from './OxyServices.payment.js';
|
|
17
17
|
import { OxyServicesKarmaMixin } from './OxyServices.karma.js';
|
|
18
18
|
import { OxyServicesAssetsMixin } from './OxyServices.assets.js';
|
|
19
|
-
import {
|
|
19
|
+
import { OxyServicesApplicationsMixin } from './OxyServices.applications.js';
|
|
20
20
|
import { OxyServicesLocationMixin } from './OxyServices.location.js';
|
|
21
21
|
import { OxyServicesAnalyticsMixin } from './OxyServices.analytics.js';
|
|
22
22
|
import { OxyServicesDevicesMixin } from './OxyServices.devices.js';
|
|
@@ -60,7 +60,7 @@ const MIXIN_PIPELINE = [
|
|
|
60
60
|
OxyServicesPaymentMixin,
|
|
61
61
|
OxyServicesKarmaMixin,
|
|
62
62
|
OxyServicesAssetsMixin,
|
|
63
|
-
|
|
63
|
+
OxyServicesApplicationsMixin,
|
|
64
64
|
OxyServicesLocationMixin,
|
|
65
65
|
OxyServicesAnalyticsMixin,
|
|
66
66
|
OxyServicesDevicesMixin,
|