@smess/networking 1.0.5 → 1.0.7
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 +58 -0
- package/dist/core/axios.d.ts +6 -6
- package/dist/core/axios.js +22 -24
- package/dist/core/axios.observable.js +15 -17
- package/dist/core/base.provider.advanced.test.js +11 -7
- package/dist/core/base.provider.d.ts +6 -6
- package/dist/core/base.provider.js +8 -8
- package/dist/core/base.provider.test.js +12 -8
- package/dist/core/base.service.wrapper.advanced.test.js +14 -22
- package/dist/core/base.service.wrapper.js +4 -7
- package/dist/core/base.service.wrapper.test.js +5 -7
- package/dist/core/rx.http.service.d.ts +21 -21
- package/dist/core/rx.http.service.js +22 -24
- package/dist/index.d.ts +9 -9
- package/dist/index.js +9 -9
- package/dist/{src/services → services}/auth.service.d.ts +2 -2
- package/dist/{src/services → services}/auth.service.js +1 -1
- package/dist/{src/services → services}/auth.service.test.js +2 -2
- package/dist/{src/services → services}/customer.service.d.ts +2 -2
- package/dist/{src/services → services}/customer.service.js +1 -1
- package/dist/{src/services → services}/customer.service.test.js +2 -2
- package/dist/services/logger.service.d.ts +5 -5
- package/dist/services/logger.service.js +4 -8
- package/dist/services/logger.service.test.js +16 -18
- package/dist/{src/services → services}/order.service.d.ts +2 -2
- package/dist/{src/services → services}/order.service.js +1 -1
- package/dist/{src/services → services}/order.service.test.js +2 -2
- package/dist/{src/services → services}/product.service.js +2 -2
- package/dist/{src/services → services}/product.service.test.js +3 -3
- package/dist/services/smess.service.d.ts +10 -3
- package/dist/services/smess.service.js +40 -48
- package/dist/services/smess.service.test.js +52 -33
- package/dist/{src/services → services}/store.service.d.ts +2 -2
- package/dist/{src/services → services}/store.service.js +1 -1
- package/dist/{src/services → services}/store.service.test.js +2 -2
- package/dist/{src/services → services}/user.service.js +2 -2
- package/dist/{src/services → services}/user.service.test.js +3 -3
- package/dist/types/types.d.ts +12 -8
- package/dist/types/types.js +6 -13
- package/dist/types/types.test.js +5 -7
- package/dist/utils/networking-import.js +3 -43
- package/dist/utils/rxjs-import.js +5 -34
- package/package.json +7 -1
- package/dist/core/product.service.d.ts +0 -19
- package/dist/core/product.service.js +0 -46
- package/dist/core/product.service.test.js +0 -63
- package/dist/core/user.service.d.ts +0 -15
- package/dist/core/user.service.js +0 -39
- package/dist/core/user.service.test.js +0 -45
- package/dist/scripts/real-test.d.ts +0 -1
- package/dist/scripts/real-test.js +0 -242
- package/dist/src/core/axios.d.ts +0 -44
- package/dist/src/core/axios.js +0 -65
- package/dist/src/core/axios.observable.d.ts +0 -11
- package/dist/src/core/axios.observable.js +0 -58
- package/dist/src/core/base.provider.advanced.test.d.ts +0 -1
- package/dist/src/core/base.provider.advanced.test.js +0 -29
- package/dist/src/core/base.provider.d.ts +0 -15
- package/dist/src/core/base.provider.js +0 -13
- package/dist/src/core/base.provider.test.d.ts +0 -1
- package/dist/src/core/base.provider.test.js +0 -32
- package/dist/src/core/base.service.wrapper.advanced.test.d.ts +0 -1
- package/dist/src/core/base.service.wrapper.advanced.test.js +0 -36
- package/dist/src/core/base.service.wrapper.d.ts +0 -7
- package/dist/src/core/base.service.wrapper.js +0 -11
- package/dist/src/core/base.service.wrapper.test.d.ts +0 -1
- package/dist/src/core/base.service.wrapper.test.js +0 -25
- package/dist/src/core/rx.http.service.d.ts +0 -44
- package/dist/src/core/rx.http.service.js +0 -65
- package/dist/src/domain/auth.provider.d.ts +0 -12
- package/dist/src/domain/auth.provider.js +0 -67
- package/dist/src/domain/product.service.js +0 -47
- package/dist/src/domain/smess.service.d.ts +0 -35
- package/dist/src/domain/smess.service.js +0 -137
- package/dist/src/domain/tests/auth.service.test.js +0 -80
- package/dist/src/domain/tests/product.service.test.d.ts +0 -1
- package/dist/src/domain/tests/product.service.test.js +0 -47
- package/dist/src/domain/tests/smess.service.test.d.ts +0 -1
- package/dist/src/domain/tests/smess.service.test.js +0 -106
- package/dist/src/domain/tests/user.service.test.d.ts +0 -1
- package/dist/src/domain/tests/user.service.test.js +0 -51
- package/dist/src/domain/user.service.js +0 -39
- package/dist/src/services/auth.service.test.d.ts +0 -1
- package/dist/src/services/logger.service.d.ts +0 -31
- package/dist/src/services/logger.service.js +0 -93
- package/dist/src/services/logger.service.test.d.ts +0 -1
- package/dist/src/services/logger.service.test.js +0 -31
- package/dist/src/services/product.service.d.ts +0 -21
- package/dist/src/services/product.service.test.d.ts +0 -1
- package/dist/src/services/smess.service.d.ts +0 -36
- package/dist/src/services/smess.service.js +0 -128
- package/dist/src/services/smess.service.test.d.ts +0 -1
- package/dist/src/services/smess.service.test.js +0 -99
- package/dist/src/services/user.service.d.ts +0 -16
- package/dist/src/services/user.service.test.d.ts +0 -1
- package/dist/src/types/types.d.ts +0 -93
- package/dist/src/types/types.js +0 -82
- package/dist/src/types/types.test.d.ts +0 -1
- package/dist/src/types/types.test.js +0 -25
- package/dist/src/utils/networking-import.d.ts +0 -4
- package/dist/src/utils/networking-import.js +0 -3
- package/dist/src/utils/rxjs-import.d.ts +0 -5
- package/dist/src/utils/rxjs-import.js +0 -5
- package/dist/utils/networking-settings.d.ts +0 -6
- package/dist/utils/networking-settings.js +0 -19
- package/dist/utils/networking-settings.test.d.ts +0 -1
- package/dist/utils/networking-settings.test.js +0 -21
- /package/dist/{src/domain/tests → services}/auth.service.test.d.ts +0 -0
- /package/dist/{src/services → services}/customer.service.test.d.ts +0 -0
- /package/dist/{src/services → services}/order.service.test.d.ts +0 -0
- /package/dist/{src/domain → services}/product.service.d.ts +0 -0
- /package/dist/{core → services}/product.service.test.d.ts +0 -0
- /package/dist/{src/services → services}/store.service.test.d.ts +0 -0
- /package/dist/{src/domain → services}/user.service.d.ts +0 -0
- /package/dist/{core → services}/user.service.test.d.ts +0 -0
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.UserService = exports.UserProvider = void 0;
|
|
4
|
-
const base_provider_1 = require("../core/base.provider");
|
|
5
|
-
const base_service_wrapper_1 = require("../core/base.service.wrapper");
|
|
6
|
-
// UserProvider implements ProviderType for user endpoints
|
|
7
|
-
class UserProvider extends base_provider_1.BaseProvider {
|
|
8
|
-
constructor(config, userId) {
|
|
9
|
-
super({
|
|
10
|
-
config,
|
|
11
|
-
path: userId ? `/users/${userId}` : '/users',
|
|
12
|
-
method: 'GET',
|
|
13
|
-
headers: {},
|
|
14
|
-
getPath: () => (userId ? `/users/${userId}` : '/users'),
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
exports.UserProvider = UserProvider;
|
|
19
|
-
// UserService provides high-level methods for user API
|
|
20
|
-
class UserService extends base_service_wrapper_1.BaseServiceWrapper {
|
|
21
|
-
constructor(config, userId) {
|
|
22
|
-
super(new UserProvider(config, userId));
|
|
23
|
-
}
|
|
24
|
-
// Fetch a user by ID
|
|
25
|
-
fetchUserById(id) {
|
|
26
|
-
this.provider = new UserProvider({ baseUrl: 'https://jsonplaceholder.typicode.com', isProd: false }, id);
|
|
27
|
-
return this.request();
|
|
28
|
-
}
|
|
29
|
-
// Fetch all users
|
|
30
|
-
fetchAllUsers() {
|
|
31
|
-
this.provider = new UserProvider({ baseUrl: 'https://jsonplaceholder.typicode.com', isProd: false });
|
|
32
|
-
return this.request();
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
exports.UserService = UserService;
|
|
36
|
-
// Example usage:
|
|
37
|
-
// setNetworkingConfig({ baseUrl: 'https://jsonplaceholder.typicode.com', isProd: false });
|
|
38
|
-
// const userService = new UserService();
|
|
39
|
-
// userService.fetchUserById(1).subscribe(result => console.log(result));
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
export declare enum LogLevel {
|
|
2
|
-
DEBUG = 0,
|
|
3
|
-
INFO = 1,
|
|
4
|
-
WARN = 2,
|
|
5
|
-
ERROR = 3,
|
|
6
|
-
NONE = 4
|
|
7
|
-
}
|
|
8
|
-
export interface LogEntry {
|
|
9
|
-
level: LogLevel;
|
|
10
|
-
message: string;
|
|
11
|
-
data?: unknown;
|
|
12
|
-
timestamp: number;
|
|
13
|
-
context?: string;
|
|
14
|
-
}
|
|
15
|
-
export declare class LoggerService {
|
|
16
|
-
private currentLevel;
|
|
17
|
-
private logs;
|
|
18
|
-
private maxLogs;
|
|
19
|
-
setLogLevel(level: LogLevel): void;
|
|
20
|
-
private shouldLog;
|
|
21
|
-
private formatMessage;
|
|
22
|
-
private getEmojiForLevel;
|
|
23
|
-
private log;
|
|
24
|
-
debug(message: string, data?: unknown, context?: string): void;
|
|
25
|
-
info(message: string, data?: unknown, context?: string): void;
|
|
26
|
-
warn(message: string, data?: unknown, context?: string): void;
|
|
27
|
-
error(message: string, data?: unknown, context?: string): void;
|
|
28
|
-
getLogs(): LogEntry[];
|
|
29
|
-
clearLogs(): void;
|
|
30
|
-
}
|
|
31
|
-
export declare const $logger: LoggerService;
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
export var LogLevel;
|
|
2
|
-
(function (LogLevel) {
|
|
3
|
-
LogLevel[LogLevel["DEBUG"] = 0] = "DEBUG";
|
|
4
|
-
LogLevel[LogLevel["INFO"] = 1] = "INFO";
|
|
5
|
-
LogLevel[LogLevel["WARN"] = 2] = "WARN";
|
|
6
|
-
LogLevel[LogLevel["ERROR"] = 3] = "ERROR";
|
|
7
|
-
LogLevel[LogLevel["NONE"] = 4] = "NONE";
|
|
8
|
-
})(LogLevel || (LogLevel = {}));
|
|
9
|
-
export class LoggerService {
|
|
10
|
-
constructor() {
|
|
11
|
-
this.currentLevel = LogLevel.DEBUG;
|
|
12
|
-
this.logs = [];
|
|
13
|
-
this.maxLogs = 1000;
|
|
14
|
-
}
|
|
15
|
-
setLogLevel(level) {
|
|
16
|
-
this.currentLevel = level;
|
|
17
|
-
}
|
|
18
|
-
shouldLog(level) {
|
|
19
|
-
return level >= this.currentLevel;
|
|
20
|
-
}
|
|
21
|
-
formatMessage(level, message, context) {
|
|
22
|
-
const emoji = this.getEmojiForLevel(level);
|
|
23
|
-
const levelName = LogLevel[level];
|
|
24
|
-
const contextStr = context ? ` [${context}]` : '';
|
|
25
|
-
return `${emoji} ${levelName}${contextStr}: ${message}`;
|
|
26
|
-
}
|
|
27
|
-
getEmojiForLevel(level) {
|
|
28
|
-
switch (level) {
|
|
29
|
-
case LogLevel.DEBUG:
|
|
30
|
-
return '🔍';
|
|
31
|
-
case LogLevel.INFO:
|
|
32
|
-
return 'ℹ️';
|
|
33
|
-
case LogLevel.WARN:
|
|
34
|
-
return '⚠️';
|
|
35
|
-
case LogLevel.ERROR:
|
|
36
|
-
return '❌';
|
|
37
|
-
default:
|
|
38
|
-
return '📝';
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
log(level, message, data, context) {
|
|
42
|
-
if (!this.shouldLog(level))
|
|
43
|
-
return;
|
|
44
|
-
const logEntry = {
|
|
45
|
-
level,
|
|
46
|
-
message,
|
|
47
|
-
data,
|
|
48
|
-
timestamp: Date.now(),
|
|
49
|
-
context
|
|
50
|
-
};
|
|
51
|
-
// Store log entry
|
|
52
|
-
this.logs.push(logEntry);
|
|
53
|
-
if (this.logs.length > this.maxLogs) {
|
|
54
|
-
this.logs.shift();
|
|
55
|
-
}
|
|
56
|
-
// Console output
|
|
57
|
-
const formattedMessage = this.formatMessage(level, message, context);
|
|
58
|
-
switch (level) {
|
|
59
|
-
case LogLevel.DEBUG:
|
|
60
|
-
console.debug(formattedMessage, data || '');
|
|
61
|
-
break;
|
|
62
|
-
case LogLevel.INFO:
|
|
63
|
-
console.info(formattedMessage, data || '');
|
|
64
|
-
break;
|
|
65
|
-
case LogLevel.WARN:
|
|
66
|
-
console.warn(formattedMessage, data || '');
|
|
67
|
-
break;
|
|
68
|
-
case LogLevel.ERROR:
|
|
69
|
-
console.error(formattedMessage, data || '');
|
|
70
|
-
break;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
debug(message, data, context) {
|
|
74
|
-
this.log(LogLevel.DEBUG, message, data, context);
|
|
75
|
-
}
|
|
76
|
-
info(message, data, context) {
|
|
77
|
-
this.log(LogLevel.INFO, message, data, context);
|
|
78
|
-
}
|
|
79
|
-
warn(message, data, context) {
|
|
80
|
-
this.log(LogLevel.WARN, message, data, context);
|
|
81
|
-
}
|
|
82
|
-
error(message, data, context) {
|
|
83
|
-
this.log(LogLevel.ERROR, message, data, context);
|
|
84
|
-
}
|
|
85
|
-
getLogs() {
|
|
86
|
-
return [...this.logs];
|
|
87
|
-
}
|
|
88
|
-
clearLogs() {
|
|
89
|
-
this.logs = [];
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
// Export singleton instance
|
|
93
|
-
export const $logger = new LoggerService();
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { $logger, LogLevel } from './logger.service.js';
|
|
2
|
-
describe('LoggerService', () => {
|
|
3
|
-
beforeEach(() => {
|
|
4
|
-
$logger.clearLogs();
|
|
5
|
-
$logger.setLogLevel(LogLevel.DEBUG);
|
|
6
|
-
});
|
|
7
|
-
it('should log info', () => {
|
|
8
|
-
$logger.info('info message', { foo: 1 }, 'test');
|
|
9
|
-
const logs = $logger.getLogs();
|
|
10
|
-
expect(logs[0].level).toBe(LogLevel.INFO);
|
|
11
|
-
expect(logs[0].message).toBe('info message');
|
|
12
|
-
expect(logs[0].data).toEqual({ foo: 1 });
|
|
13
|
-
expect(logs[0].context).toBe('test');
|
|
14
|
-
});
|
|
15
|
-
it('should log warn and error', () => {
|
|
16
|
-
$logger.warn('warn message');
|
|
17
|
-
$logger.error('error message', { bar: 2 });
|
|
18
|
-
const logs = $logger.getLogs();
|
|
19
|
-
expect(logs[0].level).toBe(LogLevel.WARN);
|
|
20
|
-
expect(logs[1].level).toBe(LogLevel.ERROR);
|
|
21
|
-
expect(logs[1].data).toEqual({ bar: 2 });
|
|
22
|
-
});
|
|
23
|
-
it('should respect log level', () => {
|
|
24
|
-
$logger.setLogLevel(LogLevel.ERROR);
|
|
25
|
-
$logger.info('should not log');
|
|
26
|
-
$logger.error('should log');
|
|
27
|
-
const logs = $logger.getLogs();
|
|
28
|
-
expect(logs.length).toBe(1);
|
|
29
|
-
expect(logs[0].level).toBe(LogLevel.ERROR);
|
|
30
|
-
});
|
|
31
|
-
});
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { BaseProvider } from '../core/base.provider.js';
|
|
2
|
-
import { BaseServiceWrapper } from '../core/base.service.wrapper.js';
|
|
3
|
-
import { NetworkingConfig } from '../types/types.js';
|
|
4
|
-
export interface Product {
|
|
5
|
-
id: number;
|
|
6
|
-
name: string;
|
|
7
|
-
price: number;
|
|
8
|
-
}
|
|
9
|
-
export declare class ProductProvider extends BaseProvider {
|
|
10
|
-
constructor(config: NetworkingConfig, { productId, method }?: {
|
|
11
|
-
productId?: number;
|
|
12
|
-
method?: string;
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
export declare class ProductService extends BaseServiceWrapper<ProductProvider> {
|
|
16
|
-
private config;
|
|
17
|
-
constructor(config: NetworkingConfig, productId?: number, method?: string);
|
|
18
|
-
fetchProductById(id: number): import("rxjs").Observable<import("../types/types.js").NetworkingUIEventWrapped<Product>>;
|
|
19
|
-
fetchAllProducts(): import("rxjs").Observable<import("../types/types.js").NetworkingUIEventWrapped<Product[]>>;
|
|
20
|
-
createProduct(product: Omit<Product, 'id'>): import("rxjs").Observable<import("../types/types.js").NetworkingUIEventWrapped<Product>>;
|
|
21
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { ProviderType, NetworkingUIEventWrapped, HeaderType } from '../types/types.js';
|
|
2
|
-
import { Observable } from '../utils/rxjs-import.js';
|
|
3
|
-
export declare enum SMESSHeader {
|
|
4
|
-
ContentType = "Content-Type",
|
|
5
|
-
Authorization = "Authorization",
|
|
6
|
-
Accept = "Accept",
|
|
7
|
-
ApiKey = "X-Api-Key",
|
|
8
|
-
ClientId = "X-Client-Id"
|
|
9
|
-
}
|
|
10
|
-
export declare enum ContentType {
|
|
11
|
-
Json = "application/json",
|
|
12
|
-
FormURLEncoded = "application/x-www-form-urlencoded"
|
|
13
|
-
}
|
|
14
|
-
export declare enum Accept {
|
|
15
|
-
V1 = "application/json",
|
|
16
|
-
V2 = "application/vnd.smess.v2+json",
|
|
17
|
-
V3 = "application/vnd.smess.v3+json",
|
|
18
|
-
V4 = "application/vnd.smess.v4+json",
|
|
19
|
-
V5 = "application/vnd.smess.v5+json",
|
|
20
|
-
V6 = "application/vnd.smess.v6+json",
|
|
21
|
-
V7 = "application/vnd.smess.v7+json",
|
|
22
|
-
V8 = "application/vnd.smess.v8+json",
|
|
23
|
-
V9 = "application/vnd.smess.v9+json",
|
|
24
|
-
V10 = "application/vnd.smess.v10+json"
|
|
25
|
-
}
|
|
26
|
-
export declare class SmessService<T extends ProviderType> {
|
|
27
|
-
private httpService;
|
|
28
|
-
private target;
|
|
29
|
-
constructor(target: T);
|
|
30
|
-
static getHeaders(version: Accept, authorization?: string | null, options?: HeaderType): Partial<Record<SMESSHeader, string | undefined>>;
|
|
31
|
-
static filterHeaders(headers: Partial<Record<SMESSHeader, string | undefined>>): Record<string, string>;
|
|
32
|
-
private static commonHeaders;
|
|
33
|
-
request<R = unknown>(request?: unknown, mockResponse?: R, ...queryParams: unknown[]): Observable<NetworkingUIEventWrapped<R>>;
|
|
34
|
-
private transformAxiosError;
|
|
35
|
-
private transformAxiosResponse;
|
|
36
|
-
}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { NetworkingUIEventWrapped, AlertModel, AlertButtonModel } from '../types/types.js';
|
|
2
|
-
import { of, catchError, mergeMap, startWith } from '../utils/rxjs-import.js';
|
|
3
|
-
import HttpService from '../core/rx.http.service.js';
|
|
4
|
-
import { $logger } from '../services/logger.service.js';
|
|
5
|
-
export var SMESSHeader;
|
|
6
|
-
(function (SMESSHeader) {
|
|
7
|
-
SMESSHeader["ContentType"] = "Content-Type";
|
|
8
|
-
SMESSHeader["Authorization"] = "Authorization";
|
|
9
|
-
SMESSHeader["Accept"] = "Accept";
|
|
10
|
-
SMESSHeader["ApiKey"] = "X-Api-Key";
|
|
11
|
-
SMESSHeader["ClientId"] = "X-Client-Id";
|
|
12
|
-
})(SMESSHeader || (SMESSHeader = {}));
|
|
13
|
-
export var ContentType;
|
|
14
|
-
(function (ContentType) {
|
|
15
|
-
ContentType["Json"] = "application/json";
|
|
16
|
-
ContentType["FormURLEncoded"] = "application/x-www-form-urlencoded";
|
|
17
|
-
})(ContentType || (ContentType = {}));
|
|
18
|
-
export var Accept;
|
|
19
|
-
(function (Accept) {
|
|
20
|
-
Accept["V1"] = "application/json";
|
|
21
|
-
Accept["V2"] = "application/vnd.smess.v2+json";
|
|
22
|
-
Accept["V3"] = "application/vnd.smess.v3+json";
|
|
23
|
-
Accept["V4"] = "application/vnd.smess.v4+json";
|
|
24
|
-
Accept["V5"] = "application/vnd.smess.v5+json";
|
|
25
|
-
Accept["V6"] = "application/vnd.smess.v6+json";
|
|
26
|
-
Accept["V7"] = "application/vnd.smess.v7+json";
|
|
27
|
-
Accept["V8"] = "application/vnd.smess.v8+json";
|
|
28
|
-
Accept["V9"] = "application/vnd.smess.v9+json";
|
|
29
|
-
Accept["V10"] = "application/vnd.smess.v10+json";
|
|
30
|
-
})(Accept || (Accept = {}));
|
|
31
|
-
export class SmessService {
|
|
32
|
-
constructor(target) {
|
|
33
|
-
this.target = target;
|
|
34
|
-
// Set default headers
|
|
35
|
-
$logger.info('SmessService initialized', {
|
|
36
|
-
target: this.target,
|
|
37
|
-
baseURL: this.target.baseURL,
|
|
38
|
-
method: this.target.method,
|
|
39
|
-
headers: this.target.headers,
|
|
40
|
-
}, 'SmessService');
|
|
41
|
-
this.httpService = HttpService.create({
|
|
42
|
-
baseURL: this.target.baseURL,
|
|
43
|
-
headers: this.target.headers,
|
|
44
|
-
method: this.target.method,
|
|
45
|
-
});
|
|
46
|
-
this.httpService.interceptors.response.use((response) => response, async (error) => {
|
|
47
|
-
const originalRequest = error.config;
|
|
48
|
-
if (error.response?.status === 401 && !originalRequest._retry) {
|
|
49
|
-
originalRequest._retry = true;
|
|
50
|
-
$logger.info('SmessService constructor - 401 retry', originalRequest, 'SmessService');
|
|
51
|
-
// Implement token refresh logic here
|
|
52
|
-
// Then retry the original request
|
|
53
|
-
// return httpService.request(originalRequest);
|
|
54
|
-
}
|
|
55
|
-
return Promise.reject(error);
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
static getHeaders(version, authorization = null, options) {
|
|
59
|
-
const headers = this.commonHeaders(version, options);
|
|
60
|
-
if (authorization) {
|
|
61
|
-
headers['Authorization'] = authorization;
|
|
62
|
-
}
|
|
63
|
-
return headers;
|
|
64
|
-
}
|
|
65
|
-
static filterHeaders(headers) {
|
|
66
|
-
const filteredHeaders = Object.fromEntries(Object.entries(headers).filter(([_, value]) => value !== undefined && value !== null && value !== ''));
|
|
67
|
-
return filteredHeaders;
|
|
68
|
-
}
|
|
69
|
-
static commonHeaders(version, options) {
|
|
70
|
-
const { shouldAddClientIdHeader = true, } = options ?? {};
|
|
71
|
-
const headers = {
|
|
72
|
-
Accept: version,
|
|
73
|
-
Authorization: '',
|
|
74
|
-
'Content-Type': ContentType.Json,
|
|
75
|
-
'X-Api-Key': ''
|
|
76
|
-
};
|
|
77
|
-
return headers;
|
|
78
|
-
}
|
|
79
|
-
// MARK: - Public
|
|
80
|
-
request(request, mockResponse, ...queryParams) {
|
|
81
|
-
const url = queryParams.length
|
|
82
|
-
? this.target.getPath(...queryParams)
|
|
83
|
-
: this.target.path;
|
|
84
|
-
const config = { url };
|
|
85
|
-
let observable;
|
|
86
|
-
if (this.target.method === 'GET') {
|
|
87
|
-
if (request) {
|
|
88
|
-
config.data = request;
|
|
89
|
-
config.params = request;
|
|
90
|
-
}
|
|
91
|
-
observable = this.httpService.get(url, config);
|
|
92
|
-
}
|
|
93
|
-
else if (this.target.method === 'POST') {
|
|
94
|
-
observable = this.httpService.post(url, request, config);
|
|
95
|
-
}
|
|
96
|
-
else if (this.target.method === 'PATCH') {
|
|
97
|
-
observable = this.httpService.patch(url, request, config);
|
|
98
|
-
}
|
|
99
|
-
else if (this.target.method === 'PUT') {
|
|
100
|
-
observable = this.httpService.put(url, request, config);
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
observable = this.httpService.request(config);
|
|
104
|
-
}
|
|
105
|
-
return observable.pipe(catchError((error) => this.transformAxiosError(error, mockResponse)), mergeMap((data) => this.transformAxiosResponse(data)), startWith(NetworkingUIEventWrapped.waiting()));
|
|
106
|
-
}
|
|
107
|
-
// MARK: - Private
|
|
108
|
-
transformAxiosError(error, mockResponse) {
|
|
109
|
-
$logger.error('transformAxiosError', error, 'SmessService');
|
|
110
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
111
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- Required for axios compatibility
|
|
112
|
-
const response = error.response;
|
|
113
|
-
const httpErrorCode = response ? response.status : 0;
|
|
114
|
-
const title = response?.statusText;
|
|
115
|
-
const alertModel = new AlertModel(message, httpErrorCode, true, title, response?.data, [AlertButtonModel.buttonYes()]);
|
|
116
|
-
if (mockResponse) {
|
|
117
|
-
return of(NetworkingUIEventWrapped.succeeded(mockResponse));
|
|
118
|
-
}
|
|
119
|
-
return of(NetworkingUIEventWrapped.failed(alertModel));
|
|
120
|
-
}
|
|
121
|
-
transformAxiosResponse(response) {
|
|
122
|
-
$logger.info('transformAxiosResponse', response, 'SmessService');
|
|
123
|
-
if (response instanceof NetworkingUIEventWrapped) {
|
|
124
|
-
return of(response);
|
|
125
|
-
}
|
|
126
|
-
return of(NetworkingUIEventWrapped.succeeded(response.data));
|
|
127
|
-
}
|
|
128
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
/* eslint-disable @typescript-eslint/no-explicit-any -- Required for test mocks */
|
|
2
|
-
import { SmessService } from './smess.service.js';
|
|
3
|
-
import { NetworkingUIEventWrapped } from '../types/types.js';
|
|
4
|
-
import { of, throwError } from 'rxjs';
|
|
5
|
-
describe('SmessService', () => {
|
|
6
|
-
const config = {
|
|
7
|
-
baseUrl: 'https://api.example.com',
|
|
8
|
-
isProd: false,
|
|
9
|
-
clientId: 'test-client',
|
|
10
|
-
apiKey: 'test-key',
|
|
11
|
-
};
|
|
12
|
-
const provider = {
|
|
13
|
-
baseURL: config.baseUrl,
|
|
14
|
-
path: '/resource',
|
|
15
|
-
method: 'GET',
|
|
16
|
-
headers: {},
|
|
17
|
-
getPath: () => '/resource',
|
|
18
|
-
};
|
|
19
|
-
it('should return succeeded for GET', done => {
|
|
20
|
-
const service = new SmessService(provider);
|
|
21
|
-
service['httpService'] = {
|
|
22
|
-
get: jest.fn(() => of({ data: { foo: 'bar' } })),
|
|
23
|
-
post: jest.fn(),
|
|
24
|
-
patch: jest.fn(),
|
|
25
|
-
put: jest.fn(),
|
|
26
|
-
request: jest.fn(),
|
|
27
|
-
interceptors: { response: { use: jest.fn() } },
|
|
28
|
-
};
|
|
29
|
-
service.request().subscribe((result) => {
|
|
30
|
-
if (result.hasSuccess) {
|
|
31
|
-
expect(result.response).toEqual({ foo: 'bar' });
|
|
32
|
-
done();
|
|
33
|
-
}
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
it('should return succeeded for POST', done => {
|
|
37
|
-
const postProvider = { ...provider, method: 'POST' };
|
|
38
|
-
const service = new SmessService(postProvider);
|
|
39
|
-
service['httpService'] = {
|
|
40
|
-
get: jest.fn(),
|
|
41
|
-
post: jest.fn(() => of({ data: { foo: 'baz' } })),
|
|
42
|
-
patch: jest.fn(),
|
|
43
|
-
put: jest.fn(),
|
|
44
|
-
request: jest.fn(),
|
|
45
|
-
interceptors: { response: { use: jest.fn() } },
|
|
46
|
-
};
|
|
47
|
-
service.request({ some: 'data' }).subscribe((result) => {
|
|
48
|
-
if (result.hasSuccess) {
|
|
49
|
-
expect(result.response).toEqual({ foo: 'baz' });
|
|
50
|
-
done();
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
it('should handle error', done => {
|
|
55
|
-
const service = new SmessService(provider);
|
|
56
|
-
service['httpService'] = {
|
|
57
|
-
get: jest.fn(() => throwError(() => new Error('Test error'))),
|
|
58
|
-
post: jest.fn(),
|
|
59
|
-
patch: jest.fn(),
|
|
60
|
-
put: jest.fn(),
|
|
61
|
-
request: jest.fn(),
|
|
62
|
-
interceptors: { response: { use: jest.fn() } },
|
|
63
|
-
};
|
|
64
|
-
service.request().subscribe((result) => {
|
|
65
|
-
if (result.hasFailed) {
|
|
66
|
-
expect(result).toBeInstanceOf(NetworkingUIEventWrapped);
|
|
67
|
-
expect(result.hasFailed).toBe(true);
|
|
68
|
-
expect(result.alertModel).toBeTruthy();
|
|
69
|
-
expect(result.alertModel?.message).toBe('Test error');
|
|
70
|
-
done();
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
});
|
|
74
|
-
it('should return mock response if provided', done => {
|
|
75
|
-
const service = new SmessService(provider);
|
|
76
|
-
service['httpService'] = {
|
|
77
|
-
get: jest.fn(() => throwError(() => new Error('Test error'))),
|
|
78
|
-
post: jest.fn(),
|
|
79
|
-
patch: jest.fn(),
|
|
80
|
-
put: jest.fn(),
|
|
81
|
-
request: jest.fn((payload, mockResponse) => {
|
|
82
|
-
if (payload === 'error') {
|
|
83
|
-
return throwError(() => new Error('Test error'));
|
|
84
|
-
}
|
|
85
|
-
if (mockResponse !== undefined) {
|
|
86
|
-
return of(NetworkingUIEventWrapped.succeeded(mockResponse));
|
|
87
|
-
}
|
|
88
|
-
return of({ data: { foo: 'mock' } });
|
|
89
|
-
}),
|
|
90
|
-
interceptors: { response: { use: jest.fn() } },
|
|
91
|
-
};
|
|
92
|
-
service.request(undefined, { foo: 'mock' }).subscribe((result) => {
|
|
93
|
-
if (result.hasSuccess) {
|
|
94
|
-
expect(result.response).toEqual({ foo: 'mock' });
|
|
95
|
-
done();
|
|
96
|
-
}
|
|
97
|
-
});
|
|
98
|
-
});
|
|
99
|
-
});
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { BaseProvider } from '../core/base.provider.js';
|
|
2
|
-
import { BaseServiceWrapper } from '../core/base.service.wrapper.js';
|
|
3
|
-
import { NetworkingConfig } from '../types/types.js';
|
|
4
|
-
export interface User {
|
|
5
|
-
id: number;
|
|
6
|
-
name: string;
|
|
7
|
-
email: string;
|
|
8
|
-
}
|
|
9
|
-
export declare class UserProvider extends BaseProvider {
|
|
10
|
-
constructor(config: NetworkingConfig, userId?: number);
|
|
11
|
-
}
|
|
12
|
-
export declare class UserService extends BaseServiceWrapper<UserProvider> {
|
|
13
|
-
constructor(config: NetworkingConfig, userId?: number);
|
|
14
|
-
fetchUserById(id: number): import("rxjs").Observable<import("../types/types.js").NetworkingUIEventWrapped<User>>;
|
|
15
|
-
fetchAllUsers(): import("rxjs").Observable<import("../types/types.js").NetworkingUIEventWrapped<User[]>>;
|
|
16
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
export type CallbackHandler = () => void;
|
|
2
|
-
interface AlertModelable {
|
|
3
|
-
isUnauthenticated: boolean;
|
|
4
|
-
isNetworkingError: boolean;
|
|
5
|
-
}
|
|
6
|
-
interface AlertButtonModelable {
|
|
7
|
-
title: string;
|
|
8
|
-
handler?: CallbackHandler;
|
|
9
|
-
}
|
|
10
|
-
export declare class AlertButtonModel implements AlertButtonModelable {
|
|
11
|
-
title: string;
|
|
12
|
-
handler?: CallbackHandler | undefined;
|
|
13
|
-
constructor(title: string, handler?: CallbackHandler | undefined);
|
|
14
|
-
static buttonYes(handler?: CallbackHandler): AlertButtonModelable;
|
|
15
|
-
static buttonNo(handler?: CallbackHandler): AlertButtonModelable;
|
|
16
|
-
}
|
|
17
|
-
export declare class AlertModel implements AlertModelable {
|
|
18
|
-
message: string;
|
|
19
|
-
httpErrorCode: number;
|
|
20
|
-
isDisplayable: boolean;
|
|
21
|
-
title?: string | undefined;
|
|
22
|
-
data?: unknown | undefined;
|
|
23
|
-
buttons?: AlertButtonModelable[] | undefined;
|
|
24
|
-
constructor(message: string, httpErrorCode: number, isDisplayable?: boolean, title?: string | undefined, data?: unknown | undefined, buttons?: AlertButtonModelable[] | undefined);
|
|
25
|
-
get isUnauthenticated(): boolean;
|
|
26
|
-
get isNetworkingError(): boolean;
|
|
27
|
-
static default(): AlertModel;
|
|
28
|
-
}
|
|
29
|
-
export declare class ValidationErrorMessage {
|
|
30
|
-
message: string;
|
|
31
|
-
constructor(message: string);
|
|
32
|
-
}
|
|
33
|
-
export type NetworkingFailed = {
|
|
34
|
-
alertModel: AlertModel;
|
|
35
|
-
};
|
|
36
|
-
export type NetworkingSucceeded<ResponseType> = {
|
|
37
|
-
responseBody: ResponseType;
|
|
38
|
-
};
|
|
39
|
-
export declare enum NetworkingUIEvent {
|
|
40
|
-
waiting = "waiting",
|
|
41
|
-
succeeded = "succeeded",
|
|
42
|
-
failed = "failed"
|
|
43
|
-
}
|
|
44
|
-
export declare class NetworkingUIEventWrapped<JSONResponse> {
|
|
45
|
-
private event;
|
|
46
|
-
private succeeded?;
|
|
47
|
-
private failed?;
|
|
48
|
-
constructor(event: NetworkingUIEvent, succeeded?: NetworkingSucceeded<JSONResponse> | undefined, failed?: NetworkingFailed | undefined);
|
|
49
|
-
get response(): JSONResponse | null;
|
|
50
|
-
get alertModel(): AlertModel | null;
|
|
51
|
-
get isWaiting(): boolean;
|
|
52
|
-
get hasSuccess(): boolean;
|
|
53
|
-
get hasFailed(): boolean;
|
|
54
|
-
get isUnauthenticated(): boolean;
|
|
55
|
-
static waiting<JSONResponse>(): NetworkingUIEventWrapped<JSONResponse>;
|
|
56
|
-
static succeeded<JSONResponse>(data: JSONResponse): NetworkingUIEventWrapped<JSONResponse>;
|
|
57
|
-
static failed<JSONResponse>(alertModel: AlertModel): NetworkingUIEventWrapped<JSONResponse>;
|
|
58
|
-
}
|
|
59
|
-
export interface ProviderType {
|
|
60
|
-
baseURL: string;
|
|
61
|
-
path: string;
|
|
62
|
-
method: string;
|
|
63
|
-
headers: Record<string, string | undefined>;
|
|
64
|
-
getPath(...queryParams: unknown[]): string;
|
|
65
|
-
}
|
|
66
|
-
export interface HeaderType {
|
|
67
|
-
shouldAddEncryptionHeader?: boolean;
|
|
68
|
-
shouldAddClientIdHeader?: boolean;
|
|
69
|
-
}
|
|
70
|
-
export interface HttpResponse {
|
|
71
|
-
data: unknown;
|
|
72
|
-
}
|
|
73
|
-
export interface ServerValidationErrorMessage {
|
|
74
|
-
message: string;
|
|
75
|
-
parameters?: {
|
|
76
|
-
error_code?: string;
|
|
77
|
-
field?: string;
|
|
78
|
-
[key: string]: unknown;
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
export interface ServerErrorResponse {
|
|
82
|
-
errors?: {
|
|
83
|
-
[field: string]: ServerValidationErrorMessage[];
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
export interface NetworkingConfig {
|
|
87
|
-
baseUrl: string;
|
|
88
|
-
version?: string;
|
|
89
|
-
isProd: boolean;
|
|
90
|
-
clientId?: string;
|
|
91
|
-
apiKey?: string;
|
|
92
|
-
}
|
|
93
|
-
export {};
|