@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.
Files changed (36) hide show
  1. package/README.md +4 -25
  2. package/dist/index.d.ts +4 -4
  3. package/dist/index.js +4 -4
  4. package/dist/scripts/real-test.js +188 -15
  5. package/dist/src/core/base.service.wrapper.js +1 -1
  6. package/dist/src/core/base.service.wrapper.test.js +1 -1
  7. package/dist/src/services/auth.service.d.ts +57 -0
  8. package/dist/src/services/auth.service.js +96 -0
  9. package/dist/src/services/auth.service.test.d.ts +1 -0
  10. package/dist/src/services/auth.service.test.js +131 -0
  11. package/dist/src/services/customer.service.d.ts +43 -0
  12. package/dist/src/services/customer.service.js +75 -0
  13. package/dist/src/services/customer.service.test.d.ts +1 -0
  14. package/dist/src/services/customer.service.test.js +98 -0
  15. package/dist/src/services/order.service.d.ts +60 -0
  16. package/dist/src/services/order.service.js +94 -0
  17. package/dist/src/services/order.service.test.d.ts +1 -0
  18. package/dist/src/services/order.service.test.js +137 -0
  19. package/dist/src/services/product.service.d.ts +21 -0
  20. package/dist/src/services/product.service.js +47 -0
  21. package/dist/src/services/product.service.test.d.ts +1 -0
  22. package/dist/src/services/product.service.test.js +54 -0
  23. package/dist/src/services/smess.service.d.ts +36 -0
  24. package/dist/src/services/smess.service.js +136 -0
  25. package/dist/src/services/smess.service.test.d.ts +1 -0
  26. package/dist/src/services/smess.service.test.js +102 -0
  27. package/dist/src/services/store.service.d.ts +39 -0
  28. package/dist/src/services/store.service.js +78 -0
  29. package/dist/src/services/store.service.test.d.ts +1 -0
  30. package/dist/src/services/store.service.test.js +106 -0
  31. package/dist/src/services/user.service.d.ts +16 -0
  32. package/dist/src/services/user.service.js +39 -0
  33. package/dist/src/services/user.service.test.d.ts +1 -0
  34. package/dist/src/services/user.service.test.js +47 -0
  35. package/dist/src/types/types.d.ts +1 -3
  36. 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 './core/product.service';
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 './core/base.provider';
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/domain/user.service';
2
- export * from './src/domain/product.service';
3
- export * from './src/domain/auth.provider';
4
- export * from './src/domain/smess.service';
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/domain/user.service"), exports);
19
- __exportStar(require("./src/domain/product.service"), exports);
20
- __exportStar(require("./src/domain/auth.provider"), exports);
21
- __exportStar(require("./src/domain/smess.service"), exports);
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 user_service_js_1 = require("../src/domain/user.service.js");
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 user_service_js_1.UserService(config);
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
- console.error('❌ UserService observable error:', err);
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
- console.log('UserService emission:', val);
26
- if (val && val.hasSuccess && val.response) {
27
- console.log('✅ UserService real API test succeeded:', val.response);
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
- console.error('❌ UserService real API test failed:', val.alertModel || val);
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
- console.error('❌ UserService observable error:', err);
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
- console.error('❌ UserService observable completed without emission');
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
- console.error('❌ UserService test error:', err);
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
- console.log('✅ Direct axios test succeeded:', response.data);
222
+ logger_service_1.$logger.info('✅ Direct axios test succeeded', response.data, 'real-test');
58
223
  }
59
224
  else {
60
- console.error('❌ Direct axios test failed:', response.data);
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
- console.error('❌ Direct axios test error:', err);
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
- console.log('🎉 All real API tests passed!');
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("../domain/smess.service");
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('../domain/smess.service', () => ({
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
+ });