@smess/networking 1.0.2 → 1.0.4
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 +4 -25
- package/dist/index.d.ts +4 -4
- package/dist/index.js +4 -4
- package/dist/scripts/real-test.js +188 -15
- package/dist/src/core/base.service.wrapper.js +1 -1
- package/dist/src/core/base.service.wrapper.test.js +1 -1
- package/dist/src/services/auth.service.d.ts +57 -0
- package/dist/src/services/auth.service.js +96 -0
- package/dist/src/services/auth.service.test.d.ts +1 -0
- package/dist/src/services/auth.service.test.js +131 -0
- package/dist/src/services/customer.service.d.ts +43 -0
- package/dist/src/services/customer.service.js +75 -0
- package/dist/src/services/customer.service.test.d.ts +1 -0
- package/dist/src/services/customer.service.test.js +98 -0
- package/dist/src/services/order.service.d.ts +60 -0
- package/dist/src/services/order.service.js +94 -0
- package/dist/src/services/order.service.test.d.ts +1 -0
- package/dist/src/services/order.service.test.js +137 -0
- package/dist/src/services/product.service.d.ts +21 -0
- package/dist/src/services/product.service.js +47 -0
- package/dist/src/services/product.service.test.d.ts +1 -0
- package/dist/src/services/product.service.test.js +54 -0
- package/dist/src/services/smess.service.d.ts +36 -0
- package/dist/src/services/smess.service.js +136 -0
- package/dist/src/services/smess.service.test.d.ts +1 -0
- package/dist/src/services/smess.service.test.js +102 -0
- package/dist/src/services/store.service.d.ts +39 -0
- package/dist/src/services/store.service.js +78 -0
- package/dist/src/services/store.service.test.d.ts +1 -0
- package/dist/src/services/store.service.test.js +106 -0
- package/dist/src/services/user.service.d.ts +16 -0
- package/dist/src/services/user.service.js +39 -0
- package/dist/src/services/user.service.test.d.ts +1 -0
- package/dist/src/services/user.service.test.js +47 -0
- package/dist/src/types/types.d.ts +1 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -26,12 +26,12 @@ const configB = {
|
|
|
26
26
|
|
|
27
27
|
### 2. Create providers/services with config
|
|
28
28
|
```typescript
|
|
29
|
-
import { ProductService } from '
|
|
30
|
-
import { UserService } from './core/user.service';
|
|
29
|
+
import { ProductService, UserService, AuthService } from '@smess/networking';
|
|
31
30
|
|
|
32
31
|
const productServiceA = new ProductService(configA);
|
|
33
32
|
const productServiceB = new ProductService(configB);
|
|
34
33
|
const userServiceA = new UserService(configA);
|
|
34
|
+
const authServiceA = new AuthService(configA);
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
### 3. Use services independently
|
|
@@ -39,12 +39,12 @@ const userServiceA = new UserService(configA);
|
|
|
39
39
|
productServiceA.fetchAllProducts().subscribe(...);
|
|
40
40
|
productServiceB.createProduct({ name: 'X', price: 10 }).subscribe(...);
|
|
41
41
|
userServiceA.fetchUserById(1).subscribe(...);
|
|
42
|
+
authServiceA.login({ identifier: 'user', password: 'pass' }).subscribe(...);
|
|
42
43
|
```
|
|
43
44
|
|
|
44
45
|
### 4. Example: Custom Provider
|
|
45
46
|
```typescript
|
|
46
|
-
import { BaseProvider } from '
|
|
47
|
-
import { SmessService } from './services/smess.service';
|
|
47
|
+
import { BaseProvider, SmessService } from '@smess/networking';
|
|
48
48
|
|
|
49
49
|
const config = {
|
|
50
50
|
baseUrl: 'https://custom-api',
|
|
@@ -72,27 +72,6 @@ service.request().subscribe(result => {
|
|
|
72
72
|
});
|
|
73
73
|
```
|
|
74
74
|
|
|
75
|
-
### 4. Example: Custom CustomerProvider
|
|
76
|
-
|
|
77
|
-
```typescript
|
|
78
|
-
import { CustomerProvider, CustomerTarget } from './core/customer.provider';
|
|
79
|
-
import { SmessService } from './services/smess.service';
|
|
80
|
-
|
|
81
|
-
const config = {
|
|
82
|
-
baseUrl: 'https://api.example.com',
|
|
83
|
-
isProd: false,
|
|
84
|
-
clientId: 'customer-client',
|
|
85
|
-
apiKey: 'customer-key',
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
const provider = new CustomerProvider(config, 'get-profile');
|
|
89
|
-
const service = new SmessService(provider);
|
|
90
|
-
|
|
91
|
-
service.request().subscribe(result => {
|
|
92
|
-
// handle result
|
|
93
|
-
});
|
|
94
|
-
```
|
|
95
|
-
|
|
96
75
|
---
|
|
97
76
|
|
|
98
77
|
## Private Package Usage
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export * from './src/
|
|
2
|
-
export * from './src/
|
|
3
|
-
export * from './src/
|
|
4
|
-
export * from './src/
|
|
1
|
+
export * from './src/services/user.service';
|
|
2
|
+
export * from './src/services/product.service';
|
|
3
|
+
export * from './src/services/auth.service';
|
|
4
|
+
export * from './src/services/smess.service';
|
|
5
5
|
export * from './src/core/base.provider';
|
|
6
6
|
export * from './src/core/base.service.wrapper';
|
|
7
7
|
export * from './src/core/axios.observable';
|
package/dist/index.js
CHANGED
|
@@ -15,10 +15,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
exports.apiVersion = exports.baseURL = exports.$logger = void 0;
|
|
18
|
-
__exportStar(require("./src/
|
|
19
|
-
__exportStar(require("./src/
|
|
20
|
-
__exportStar(require("./src/
|
|
21
|
-
__exportStar(require("./src/
|
|
18
|
+
__exportStar(require("./src/services/user.service"), exports);
|
|
19
|
+
__exportStar(require("./src/services/product.service"), exports);
|
|
20
|
+
__exportStar(require("./src/services/auth.service"), exports);
|
|
21
|
+
__exportStar(require("./src/services/smess.service"), exports);
|
|
22
22
|
__exportStar(require("./src/core/base.provider"), exports);
|
|
23
23
|
__exportStar(require("./src/core/base.service.wrapper"), exports);
|
|
24
24
|
__exportStar(require("./src/core/axios.observable"), exports);
|
|
@@ -3,42 +3,207 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const
|
|
6
|
+
const user_service_1 = require("../src/services/user.service");
|
|
7
7
|
const rxjs_1 = require("rxjs");
|
|
8
8
|
const axios_1 = __importDefault(require("axios"));
|
|
9
|
+
const auth_service_1 = require("../src/services/auth.service");
|
|
10
|
+
const customer_service_1 = require("../src/services/customer.service");
|
|
11
|
+
const store_service_1 = require("../src/services/store.service");
|
|
12
|
+
const logger_service_1 = require("../src/services/logger.service");
|
|
13
|
+
function isNetworkingUIEventWrapped(val) {
|
|
14
|
+
return (typeof val === 'object' &&
|
|
15
|
+
val !== null &&
|
|
16
|
+
'hasSuccess' in val &&
|
|
17
|
+
'hasFailed' in val &&
|
|
18
|
+
'response' in val);
|
|
19
|
+
}
|
|
20
|
+
async function testAuthService() {
|
|
21
|
+
const config = {
|
|
22
|
+
baseUrl: 'https://api.smeservices.cloud',
|
|
23
|
+
version: 'api/v1',
|
|
24
|
+
isProd: true,
|
|
25
|
+
clientId: '665e188a-cdb0-11ef-b5bd-470a5caf5cbc',
|
|
26
|
+
};
|
|
27
|
+
const $authToken = new rxjs_1.BehaviorSubject(null);
|
|
28
|
+
const authService = new auth_service_1.AuthService(config, $authToken);
|
|
29
|
+
let emitted = false;
|
|
30
|
+
try {
|
|
31
|
+
const obs$ = authService.login({ identifier: 'test@email.org', password: 'PassWord123' }).pipe((0, rxjs_1.timeout)({ first: 10000 }), (0, rxjs_1.catchError)(err => {
|
|
32
|
+
logger_service_1.$logger.error('❌ AuthService observable error', err, 'real-test');
|
|
33
|
+
return (0, rxjs_1.of)(undefined);
|
|
34
|
+
}));
|
|
35
|
+
await new Promise((resolve, reject) => {
|
|
36
|
+
obs$.subscribe({
|
|
37
|
+
next: (val) => {
|
|
38
|
+
emitted = true;
|
|
39
|
+
logger_service_1.$logger.info('AuthService emission', val, 'real-test');
|
|
40
|
+
if (isNetworkingUIEventWrapped(val) && val.hasSuccess && val.response) {
|
|
41
|
+
logger_service_1.$logger.info('✅ AuthService real API test succeeded', val.response, 'real-test');
|
|
42
|
+
resolve(undefined);
|
|
43
|
+
}
|
|
44
|
+
else if (isNetworkingUIEventWrapped(val) && val.hasFailed) {
|
|
45
|
+
logger_service_1.$logger.error('❌ AuthService real API test failed', val.alertModel || val, 'real-test');
|
|
46
|
+
reject(new Error('AuthService failed'));
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
error: (err) => {
|
|
50
|
+
logger_service_1.$logger.error('❌ AuthService observable error', err, 'real-test');
|
|
51
|
+
reject(err);
|
|
52
|
+
},
|
|
53
|
+
complete: () => {
|
|
54
|
+
if (!emitted) {
|
|
55
|
+
logger_service_1.$logger.error('❌ AuthService observable completed without emission', undefined, 'real-test');
|
|
56
|
+
reject(new Error('No emission'));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
logger_service_1.$logger.error('❌ AuthService test error', err, 'real-test');
|
|
64
|
+
process.exit(2);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
9
67
|
async function testUserService() {
|
|
10
68
|
const config = {
|
|
11
69
|
baseUrl: 'https://jsonplaceholder.typicode.com',
|
|
12
70
|
isProd: false,
|
|
13
71
|
};
|
|
14
|
-
const userService = new
|
|
72
|
+
const userService = new user_service_1.UserService(config);
|
|
15
73
|
let emitted = false;
|
|
16
74
|
try {
|
|
17
75
|
const obs$ = userService.fetchUserById(1).pipe((0, rxjs_1.timeout)({ first: 10000 }), (0, rxjs_1.catchError)(err => {
|
|
18
|
-
|
|
76
|
+
logger_service_1.$logger.error('❌ UserService observable error', err, 'real-test');
|
|
19
77
|
return (0, rxjs_1.of)(undefined);
|
|
20
78
|
}));
|
|
21
79
|
await new Promise((resolve, reject) => {
|
|
22
80
|
obs$.subscribe({
|
|
23
81
|
next: (val) => {
|
|
24
82
|
emitted = true;
|
|
25
|
-
|
|
26
|
-
if (val && val.hasSuccess && val.response) {
|
|
27
|
-
|
|
83
|
+
logger_service_1.$logger.info('UserService emission', val, 'real-test');
|
|
84
|
+
if (isNetworkingUIEventWrapped(val) && val.hasSuccess && val.response) {
|
|
85
|
+
logger_service_1.$logger.info('✅ UserService real API test succeeded', val.response, 'real-test');
|
|
28
86
|
resolve(undefined);
|
|
29
87
|
}
|
|
30
|
-
else if (val && val.hasFailed) {
|
|
31
|
-
|
|
88
|
+
else if (isNetworkingUIEventWrapped(val) && val.hasFailed) {
|
|
89
|
+
logger_service_1.$logger.error('❌ UserService real API test failed', val.alertModel || val, 'real-test');
|
|
32
90
|
reject(new Error('UserService failed'));
|
|
33
91
|
}
|
|
34
92
|
},
|
|
35
93
|
error: (err) => {
|
|
36
|
-
|
|
94
|
+
logger_service_1.$logger.error('❌ UserService observable error', err, 'real-test');
|
|
95
|
+
reject(err);
|
|
96
|
+
},
|
|
97
|
+
complete: () => {
|
|
98
|
+
if (!emitted) {
|
|
99
|
+
logger_service_1.$logger.error('❌ UserService observable completed without emission', undefined, 'real-test');
|
|
100
|
+
reject(new Error('No emission'));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
catch (err) {
|
|
107
|
+
logger_service_1.$logger.error('❌ UserService test error', err, 'real-test');
|
|
108
|
+
process.exit(2);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
async function testCustomerRegister() {
|
|
112
|
+
const config = {
|
|
113
|
+
baseUrl: 'https://api.smeservices.cloud',
|
|
114
|
+
version: 'api/v1',
|
|
115
|
+
isProd: true,
|
|
116
|
+
clientId: '665e188a-cdb0-11ef-b5bd-470a5caf5cbc',
|
|
117
|
+
};
|
|
118
|
+
const $authToken = new rxjs_1.BehaviorSubject(null);
|
|
119
|
+
const customerService = new customer_service_1.CustomerService(config, $authToken);
|
|
120
|
+
const random = Math.floor(Math.random() * 1000000);
|
|
121
|
+
const payload = {
|
|
122
|
+
email: `realtest+${random}@email.org`,
|
|
123
|
+
password: `PassWord${random}`,
|
|
124
|
+
phone_number: `+83${random}`,
|
|
125
|
+
client_id: config.clientId,
|
|
126
|
+
};
|
|
127
|
+
let emitted = false;
|
|
128
|
+
try {
|
|
129
|
+
const obs$ = customerService.register(payload).pipe((0, rxjs_1.timeout)({ first: 10000 }), (0, rxjs_1.catchError)(err => {
|
|
130
|
+
logger_service_1.$logger.error('❌ CustomerService observable error', err, 'real-test');
|
|
131
|
+
return (0, rxjs_1.of)(undefined);
|
|
132
|
+
}));
|
|
133
|
+
await new Promise((resolve, reject) => {
|
|
134
|
+
obs$.subscribe({
|
|
135
|
+
next: (val) => {
|
|
136
|
+
emitted = true;
|
|
137
|
+
logger_service_1.$logger.info('CustomerService emission', val, 'real-test');
|
|
138
|
+
if (isNetworkingUIEventWrapped(val) && val.hasSuccess && val.response) {
|
|
139
|
+
logger_service_1.$logger.info('✅ CustomerService real API test succeeded', val.response, 'real-test');
|
|
140
|
+
resolve(undefined);
|
|
141
|
+
}
|
|
142
|
+
else if (isNetworkingUIEventWrapped(val) && val.hasFailed) {
|
|
143
|
+
logger_service_1.$logger.error('❌ CustomerService real API test failed', val.alertModel || val, 'real-test');
|
|
144
|
+
reject(new Error('CustomerService failed'));
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
error: (err) => {
|
|
148
|
+
logger_service_1.$logger.error('❌ CustomerService observable error', err, 'real-test');
|
|
149
|
+
reject(err);
|
|
150
|
+
},
|
|
151
|
+
complete: () => {
|
|
152
|
+
if (!emitted) {
|
|
153
|
+
logger_service_1.$logger.error('❌ CustomerService observable completed without emission', undefined, 'real-test');
|
|
154
|
+
reject(new Error('No emission'));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
logger_service_1.$logger.error('❌ CustomerService test error', err, 'real-test');
|
|
162
|
+
process.exit(2);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
async function testStoreProductCollection() {
|
|
166
|
+
const config = {
|
|
167
|
+
baseUrl: 'https://api.smeservices.cloud',
|
|
168
|
+
version: 'api/v1',
|
|
169
|
+
isProd: true,
|
|
170
|
+
clientId: '665e188a-cdb0-11ef-b5bd-470a5caf5cbc',
|
|
171
|
+
};
|
|
172
|
+
const $authToken = new rxjs_1.BehaviorSubject(null);
|
|
173
|
+
const storeService = new store_service_1.StoreService(config, $authToken);
|
|
174
|
+
const storeId = 'f1df6e9a-0160-11f0-82c2-6cac1a7e2953'; // Use a real or test store id as appropriate
|
|
175
|
+
const payload = {
|
|
176
|
+
page: 1,
|
|
177
|
+
per_page: 10,
|
|
178
|
+
search: 'bia',
|
|
179
|
+
};
|
|
180
|
+
let emitted = false;
|
|
181
|
+
try {
|
|
182
|
+
const obs$ = storeService.productCollection(storeId, payload).pipe((0, rxjs_1.timeout)({ first: 10000 }), (0, rxjs_1.catchError)(err => {
|
|
183
|
+
logger_service_1.$logger.error('❌ StoreService.productCollection observable error', err, 'real-test');
|
|
184
|
+
return (0, rxjs_1.of)(undefined);
|
|
185
|
+
}));
|
|
186
|
+
await new Promise((resolve, reject) => {
|
|
187
|
+
obs$.subscribe({
|
|
188
|
+
next: (val) => {
|
|
189
|
+
emitted = true;
|
|
190
|
+
logger_service_1.$logger.info('StoreService.productCollection emission', val, 'real-test');
|
|
191
|
+
if (isNetworkingUIEventWrapped(val) && val.hasSuccess && val.response) {
|
|
192
|
+
logger_service_1.$logger.info('✅ StoreService.productCollection real API test succeeded', val.response, 'real-test');
|
|
193
|
+
resolve(undefined);
|
|
194
|
+
}
|
|
195
|
+
else if (isNetworkingUIEventWrapped(val) && val.hasFailed) {
|
|
196
|
+
logger_service_1.$logger.error('❌ StoreService.productCollection real API test failed', val.alertModel || val, 'real-test');
|
|
197
|
+
reject(new Error('StoreService.productCollection failed'));
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
error: (err) => {
|
|
201
|
+
logger_service_1.$logger.error('❌ StoreService.productCollection observable error', err, 'real-test');
|
|
37
202
|
reject(err);
|
|
38
203
|
},
|
|
39
204
|
complete: () => {
|
|
40
205
|
if (!emitted) {
|
|
41
|
-
|
|
206
|
+
logger_service_1.$logger.error('❌ StoreService.productCollection observable completed without emission', undefined, 'real-test');
|
|
42
207
|
reject(new Error('No emission'));
|
|
43
208
|
}
|
|
44
209
|
}
|
|
@@ -46,7 +211,7 @@ async function testUserService() {
|
|
|
46
211
|
});
|
|
47
212
|
}
|
|
48
213
|
catch (err) {
|
|
49
|
-
|
|
214
|
+
logger_service_1.$logger.error('❌ StoreService.productCollection test error', err, 'real-test');
|
|
50
215
|
process.exit(2);
|
|
51
216
|
}
|
|
52
217
|
}
|
|
@@ -54,21 +219,29 @@ async function testAxiosDirect() {
|
|
|
54
219
|
try {
|
|
55
220
|
const response = await axios_1.default.get('https://jsonplaceholder.typicode.com/users/1');
|
|
56
221
|
if (response && response.data && response.data.id === 1) {
|
|
57
|
-
|
|
222
|
+
logger_service_1.$logger.info('✅ Direct axios test succeeded', response.data, 'real-test');
|
|
58
223
|
}
|
|
59
224
|
else {
|
|
60
|
-
|
|
225
|
+
logger_service_1.$logger.error('❌ Direct axios test failed', response.data, 'real-test');
|
|
61
226
|
process.exit(3);
|
|
62
227
|
}
|
|
63
228
|
}
|
|
64
229
|
catch (err) {
|
|
65
|
-
|
|
230
|
+
logger_service_1.$logger.error('❌ Direct axios test error', err, 'real-test');
|
|
66
231
|
process.exit(4);
|
|
67
232
|
}
|
|
68
233
|
}
|
|
69
234
|
(async () => {
|
|
70
235
|
await testAxiosDirect();
|
|
236
|
+
logger_service_1.$logger.info('✅ Direct axios test passed!', undefined, 'real-test');
|
|
237
|
+
await testAuthService();
|
|
238
|
+
logger_service_1.$logger.info('✅ AuthService real API tests passed!', undefined, 'real-test');
|
|
71
239
|
await testUserService();
|
|
72
|
-
|
|
240
|
+
logger_service_1.$logger.info('✅ UserService real API tests passed!', undefined, 'real-test');
|
|
241
|
+
await testCustomerRegister();
|
|
242
|
+
logger_service_1.$logger.info('✅ CustomerService real API register test passed!', undefined, 'real-test');
|
|
243
|
+
await testStoreProductCollection();
|
|
244
|
+
logger_service_1.$logger.info('✅ StoreService.productCollection real API test passed!', undefined, 'real-test');
|
|
245
|
+
logger_service_1.$logger.info('🎉 All real API tests passed!', undefined, 'real-test');
|
|
73
246
|
process.exit(0);
|
|
74
247
|
})();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.BaseServiceWrapper = void 0;
|
|
4
|
-
const smess_service_1 = require("../
|
|
4
|
+
const smess_service_1 = require("../services/smess.service");
|
|
5
5
|
class BaseServiceWrapper {
|
|
6
6
|
constructor(provider) {
|
|
7
7
|
this.provider = provider;
|
|
@@ -4,7 +4,7 @@ const base_service_wrapper_1 = require("./base.service.wrapper");
|
|
|
4
4
|
const types_1 = require("../types/types");
|
|
5
5
|
const rxjs_1 = require("rxjs");
|
|
6
6
|
// Mock SmessService for testing
|
|
7
|
-
jest.mock('../
|
|
7
|
+
jest.mock('../services/smess.service', () => ({
|
|
8
8
|
SmessService: jest.fn().mockImplementation(() => ({
|
|
9
9
|
request: jest.fn(() => (0, rxjs_1.of)(types_1.NetworkingUIEventWrapped.succeeded({ foo: 'bar' })))
|
|
10
10
|
}))
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ProviderType, NetworkingConfig, NetworkingUIEventWrapped, HttpResponse } from '../types/types';
|
|
2
|
+
import { SmessService } from './smess.service';
|
|
3
|
+
import { BehaviorSubject, Observable } from "rxjs";
|
|
4
|
+
export interface AuthLoginRequest {
|
|
5
|
+
identifier: string;
|
|
6
|
+
password: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ForgotPasswordRequest {
|
|
9
|
+
identifier: string;
|
|
10
|
+
}
|
|
11
|
+
export interface AuthChangePasswordRequest {
|
|
12
|
+
old_password: string;
|
|
13
|
+
password: string;
|
|
14
|
+
}
|
|
15
|
+
export interface ResetPasswordRequest {
|
|
16
|
+
token: string;
|
|
17
|
+
password: string;
|
|
18
|
+
}
|
|
19
|
+
export type AuthLoginResponse = {
|
|
20
|
+
token_type: unknown;
|
|
21
|
+
expires_in: unknown;
|
|
22
|
+
token: unknown;
|
|
23
|
+
refresh_token: unknown;
|
|
24
|
+
};
|
|
25
|
+
export type AuthTarget = 'login' | 'logout' | 'change-password' | 'password-forgot' | 'reset-password' | 'verify-reset-password-token';
|
|
26
|
+
export declare class AuthProvider implements ProviderType {
|
|
27
|
+
private readonly config;
|
|
28
|
+
private readonly target;
|
|
29
|
+
private readonly $authToken;
|
|
30
|
+
constructor(config: NetworkingConfig, target: AuthTarget, $authToken: BehaviorSubject<string | null>);
|
|
31
|
+
get baseURL(): string;
|
|
32
|
+
get path(): string;
|
|
33
|
+
get method(): string;
|
|
34
|
+
get headers(): Record<string, string>;
|
|
35
|
+
getPath(...queryParams: unknown[]): string;
|
|
36
|
+
}
|
|
37
|
+
export interface AuthServiceType {
|
|
38
|
+
provider(target: AuthTarget): SmessService<AuthProvider>;
|
|
39
|
+
login(payload: AuthLoginRequest): Observable<NetworkingUIEventWrapped<AuthLoginResponse>>;
|
|
40
|
+
logout(): Observable<NetworkingUIEventWrapped<void>>;
|
|
41
|
+
forgotPassword(payload: ForgotPasswordRequest): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
42
|
+
changePassword(payload: AuthChangePasswordRequest): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
43
|
+
resetPassword(payload: ResetPasswordRequest): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
44
|
+
verifyResetPasswordToken(token: string): Observable<NetworkingUIEventWrapped<AuthLoginResponse>>;
|
|
45
|
+
}
|
|
46
|
+
export declare class AuthService implements AuthServiceType {
|
|
47
|
+
private readonly config;
|
|
48
|
+
private readonly $authToken;
|
|
49
|
+
constructor(config: NetworkingConfig, $authToken: BehaviorSubject<string | null>);
|
|
50
|
+
provider(target: AuthTarget): SmessService<AuthProvider>;
|
|
51
|
+
login(payload: AuthLoginRequest): Observable<NetworkingUIEventWrapped<AuthLoginResponse>>;
|
|
52
|
+
logout(): Observable<NetworkingUIEventWrapped<void>>;
|
|
53
|
+
forgotPassword(payload: ForgotPasswordRequest): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
54
|
+
changePassword(payload: AuthChangePasswordRequest): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
55
|
+
resetPassword(payload: ResetPasswordRequest): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
56
|
+
verifyResetPasswordToken(token: string): Observable<NetworkingUIEventWrapped<AuthLoginResponse>>;
|
|
57
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AuthService = exports.AuthProvider = void 0;
|
|
4
|
+
const smess_service_1 = require("./smess.service");
|
|
5
|
+
class AuthProvider {
|
|
6
|
+
constructor(config, target, $authToken) {
|
|
7
|
+
this.config = config;
|
|
8
|
+
this.target = target;
|
|
9
|
+
this.$authToken = $authToken;
|
|
10
|
+
}
|
|
11
|
+
get baseURL() {
|
|
12
|
+
return this.config.version ? `${this.config.baseUrl}/${this.config.version}` : this.config.baseUrl;
|
|
13
|
+
}
|
|
14
|
+
get path() {
|
|
15
|
+
switch (this.target) {
|
|
16
|
+
case 'login':
|
|
17
|
+
return '/authentication/login_check';
|
|
18
|
+
case 'password-forgot':
|
|
19
|
+
return '/authentication/forgot-password';
|
|
20
|
+
case 'reset-password':
|
|
21
|
+
return '/authentication/reset-password';
|
|
22
|
+
case 'verify-reset-password-token':
|
|
23
|
+
return '/authentication/verify-reset-password-token';
|
|
24
|
+
case 'logout':
|
|
25
|
+
return '/authentication/logout';
|
|
26
|
+
case 'change-password':
|
|
27
|
+
return '/authentication/change-password';
|
|
28
|
+
default:
|
|
29
|
+
return '/authentication';
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
get method() {
|
|
33
|
+
switch (this.target) {
|
|
34
|
+
default:
|
|
35
|
+
return 'POST';
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
get headers() {
|
|
39
|
+
let authHeaders = {};
|
|
40
|
+
switch (this.target) {
|
|
41
|
+
case 'login':
|
|
42
|
+
case 'password-forgot':
|
|
43
|
+
case 'reset-password':
|
|
44
|
+
case 'verify-reset-password-token':
|
|
45
|
+
authHeaders = smess_service_1.SmessService.getHeaders(smess_service_1.Accept.V1);
|
|
46
|
+
break;
|
|
47
|
+
default:
|
|
48
|
+
authHeaders = smess_service_1.SmessService.getHeaders(smess_service_1.Accept.V1, this.$authToken.value);
|
|
49
|
+
}
|
|
50
|
+
if (this.config.clientId) {
|
|
51
|
+
authHeaders[smess_service_1.SMESSHeader.ClientId] = this.config.clientId;
|
|
52
|
+
}
|
|
53
|
+
if (this.config.apiKey) {
|
|
54
|
+
authHeaders[smess_service_1.SMESSHeader.ApiKey] = this.config.apiKey;
|
|
55
|
+
}
|
|
56
|
+
return smess_service_1.SmessService.filterHeaders(authHeaders);
|
|
57
|
+
}
|
|
58
|
+
getPath(...queryParams) {
|
|
59
|
+
let definedPath = this.path;
|
|
60
|
+
const params = definedPath.match(/\$\{(.+?)\}/g);
|
|
61
|
+
params === null || params === void 0 ? void 0 : params.forEach((value, index) => {
|
|
62
|
+
definedPath = definedPath.replace(value, String(queryParams[index]));
|
|
63
|
+
});
|
|
64
|
+
return definedPath;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
exports.AuthProvider = AuthProvider;
|
|
68
|
+
class AuthService {
|
|
69
|
+
constructor(config, $authToken) {
|
|
70
|
+
this.config = config;
|
|
71
|
+
this.$authToken = $authToken;
|
|
72
|
+
}
|
|
73
|
+
provider(target) {
|
|
74
|
+
const targetWrapper = new AuthProvider(this.config, target, this.$authToken);
|
|
75
|
+
return new smess_service_1.SmessService(targetWrapper);
|
|
76
|
+
}
|
|
77
|
+
login(payload) {
|
|
78
|
+
return this.provider('login').request(payload);
|
|
79
|
+
}
|
|
80
|
+
logout() {
|
|
81
|
+
return this.provider('logout').request();
|
|
82
|
+
}
|
|
83
|
+
forgotPassword(payload) {
|
|
84
|
+
return this.provider('password-forgot').request(payload);
|
|
85
|
+
}
|
|
86
|
+
changePassword(payload) {
|
|
87
|
+
return this.provider('change-password').request(payload);
|
|
88
|
+
}
|
|
89
|
+
resetPassword(payload) {
|
|
90
|
+
return this.provider('reset-password').request(payload);
|
|
91
|
+
}
|
|
92
|
+
verifyResetPasswordToken(token) {
|
|
93
|
+
return this.provider('verify-reset-password-token').request({ token });
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
exports.AuthService = AuthService;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const auth_service_1 = require("./auth.service");
|
|
4
|
+
const types_1 = require("../types/types");
|
|
5
|
+
const rxjs_1 = require("rxjs");
|
|
6
|
+
describe('AuthService', () => {
|
|
7
|
+
const config = {
|
|
8
|
+
baseUrl: 'https://api.example.com',
|
|
9
|
+
isProd: false,
|
|
10
|
+
clientId: 'test-client-id',
|
|
11
|
+
apiKey: 'test-api-key',
|
|
12
|
+
};
|
|
13
|
+
let service;
|
|
14
|
+
let $authToken;
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
$authToken = new rxjs_1.BehaviorSubject(null);
|
|
17
|
+
service = new auth_service_1.AuthService(config, $authToken);
|
|
18
|
+
});
|
|
19
|
+
it('login success', async () => {
|
|
20
|
+
const payload = { identifier: 'user', password: 'pass' };
|
|
21
|
+
const response = {
|
|
22
|
+
token_type: 'Bearer',
|
|
23
|
+
expires_in: 3600,
|
|
24
|
+
token: 'token',
|
|
25
|
+
refresh_token: 'refresh',
|
|
26
|
+
};
|
|
27
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
28
|
+
request: () => (0, rxjs_1.of)(types_1.NetworkingUIEventWrapped.succeeded(response)),
|
|
29
|
+
});
|
|
30
|
+
const result = await service.login(payload).toPromise();
|
|
31
|
+
expect(result === null || result === void 0 ? void 0 : result.hasSuccess).toBe(true);
|
|
32
|
+
expect(result === null || result === void 0 ? void 0 : result.response).toEqual(response);
|
|
33
|
+
});
|
|
34
|
+
it('login error', async () => {
|
|
35
|
+
const payload = { identifier: 'user', password: 'wrong' };
|
|
36
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
37
|
+
request: () => (0, rxjs_1.of)(types_1.NetworkingUIEventWrapped.failed(types_1.AlertModel.default())),
|
|
38
|
+
});
|
|
39
|
+
const result = await service.login(payload).toPromise();
|
|
40
|
+
expect(result === null || result === void 0 ? void 0 : result.hasFailed).toBe(true);
|
|
41
|
+
expect(result === null || result === void 0 ? void 0 : result.alertModel).toBeInstanceOf(types_1.AlertModel);
|
|
42
|
+
});
|
|
43
|
+
it('logout success', async () => {
|
|
44
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
45
|
+
request: () => (0, rxjs_1.of)(types_1.NetworkingUIEventWrapped.succeeded(undefined)),
|
|
46
|
+
});
|
|
47
|
+
const result = await service.logout().toPromise();
|
|
48
|
+
expect(result === null || result === void 0 ? void 0 : result.hasSuccess).toBe(true);
|
|
49
|
+
});
|
|
50
|
+
it('forgotPassword success', async () => {
|
|
51
|
+
const payload = { identifier: 'user' };
|
|
52
|
+
const response = { data: 'ok' };
|
|
53
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
54
|
+
request: () => (0, rxjs_1.of)(types_1.NetworkingUIEventWrapped.succeeded(response)),
|
|
55
|
+
});
|
|
56
|
+
const result = await service.forgotPassword(payload).toPromise();
|
|
57
|
+
expect(result === null || result === void 0 ? void 0 : result.hasSuccess).toBe(true);
|
|
58
|
+
expect(result === null || result === void 0 ? void 0 : result.response).toEqual(response);
|
|
59
|
+
});
|
|
60
|
+
it('changePassword success', async () => {
|
|
61
|
+
const payload = { old_password: 'old', password: 'new' };
|
|
62
|
+
const response = { data: 'changed' };
|
|
63
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
64
|
+
request: () => (0, rxjs_1.of)(types_1.NetworkingUIEventWrapped.succeeded(response)),
|
|
65
|
+
});
|
|
66
|
+
const result = await service.changePassword(payload).toPromise();
|
|
67
|
+
expect(result === null || result === void 0 ? void 0 : result.hasSuccess).toBe(true);
|
|
68
|
+
expect(result === null || result === void 0 ? void 0 : result.response).toEqual(response);
|
|
69
|
+
});
|
|
70
|
+
it('resetPassword success', async () => {
|
|
71
|
+
const payload = { token: 'token', password: 'newpass' };
|
|
72
|
+
const response = { data: 'reset' };
|
|
73
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
74
|
+
request: () => (0, rxjs_1.of)(types_1.NetworkingUIEventWrapped.succeeded(response)),
|
|
75
|
+
});
|
|
76
|
+
const result = await service.resetPassword(payload).toPromise();
|
|
77
|
+
expect(result === null || result === void 0 ? void 0 : result.hasSuccess).toBe(true);
|
|
78
|
+
expect(result === null || result === void 0 ? void 0 : result.response).toEqual(response);
|
|
79
|
+
});
|
|
80
|
+
it('verifyResetPasswordToken success', async () => {
|
|
81
|
+
const token = 'token';
|
|
82
|
+
const response = {
|
|
83
|
+
token_type: 'Bearer',
|
|
84
|
+
expires_in: 3600,
|
|
85
|
+
token: 'token',
|
|
86
|
+
refresh_token: 'refresh',
|
|
87
|
+
};
|
|
88
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
89
|
+
request: () => (0, rxjs_1.of)(types_1.NetworkingUIEventWrapped.succeeded(response)),
|
|
90
|
+
});
|
|
91
|
+
const result = await service.verifyResetPasswordToken(token).toPromise();
|
|
92
|
+
expect(result === null || result === void 0 ? void 0 : result.hasSuccess).toBe(true);
|
|
93
|
+
expect(result === null || result === void 0 ? void 0 : result.response).toEqual(response);
|
|
94
|
+
});
|
|
95
|
+
it('forgotPassword error', async () => {
|
|
96
|
+
const payload = { identifier: 'user' };
|
|
97
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
98
|
+
request: () => (0, rxjs_1.of)(types_1.NetworkingUIEventWrapped.failed(types_1.AlertModel.default())),
|
|
99
|
+
});
|
|
100
|
+
const result = await service.forgotPassword(payload).toPromise();
|
|
101
|
+
expect(result === null || result === void 0 ? void 0 : result.hasFailed).toBe(true);
|
|
102
|
+
expect(result === null || result === void 0 ? void 0 : result.alertModel).toBeInstanceOf(types_1.AlertModel);
|
|
103
|
+
});
|
|
104
|
+
it('changePassword error', async () => {
|
|
105
|
+
const payload = { old_password: 'old', password: 'bad' };
|
|
106
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
107
|
+
request: () => (0, rxjs_1.of)(types_1.NetworkingUIEventWrapped.failed(types_1.AlertModel.default())),
|
|
108
|
+
});
|
|
109
|
+
const result = await service.changePassword(payload).toPromise();
|
|
110
|
+
expect(result === null || result === void 0 ? void 0 : result.hasFailed).toBe(true);
|
|
111
|
+
expect(result === null || result === void 0 ? void 0 : result.alertModel).toBeInstanceOf(types_1.AlertModel);
|
|
112
|
+
});
|
|
113
|
+
it('resetPassword error', async () => {
|
|
114
|
+
const payload = { token: 'bad', password: 'bad' };
|
|
115
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
116
|
+
request: () => (0, rxjs_1.of)(types_1.NetworkingUIEventWrapped.failed(types_1.AlertModel.default())),
|
|
117
|
+
});
|
|
118
|
+
const result = await service.resetPassword(payload).toPromise();
|
|
119
|
+
expect(result === null || result === void 0 ? void 0 : result.hasFailed).toBe(true);
|
|
120
|
+
expect(result === null || result === void 0 ? void 0 : result.alertModel).toBeInstanceOf(types_1.AlertModel);
|
|
121
|
+
});
|
|
122
|
+
it('verifyResetPasswordToken error', async () => {
|
|
123
|
+
const token = 'bad';
|
|
124
|
+
jest.spyOn(service, 'provider').mockReturnValue({
|
|
125
|
+
request: () => (0, rxjs_1.of)(types_1.NetworkingUIEventWrapped.failed(types_1.AlertModel.default())),
|
|
126
|
+
});
|
|
127
|
+
const result = await service.verifyResetPasswordToken(token).toPromise();
|
|
128
|
+
expect(result === null || result === void 0 ? void 0 : result.hasFailed).toBe(true);
|
|
129
|
+
expect(result === null || result === void 0 ? void 0 : result.alertModel).toBeInstanceOf(types_1.AlertModel);
|
|
130
|
+
});
|
|
131
|
+
});
|