@smess/networking 1.0.29 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +6 -0
- package/dist/index.js +6 -0
- package/dist/services/storefront.cart.service.d.ts +73 -0
- package/dist/services/storefront.cart.service.js +167 -0
- package/dist/services/storefront.cart.service.test.d.ts +1 -0
- package/dist/services/storefront.cart.service.test.js +211 -0
- package/dist/services/storefront.checkout.service.d.ts +62 -0
- package/dist/services/storefront.checkout.service.js +75 -0
- package/dist/services/storefront.checkout.service.test.d.ts +1 -0
- package/dist/services/storefront.checkout.service.test.js +158 -0
- package/dist/services/storefront.customer.metadata.service.d.ts +91 -0
- package/dist/services/storefront.customer.metadata.service.js +225 -0
- package/dist/services/storefront.customer.metadata.service.test.d.ts +1 -0
- package/dist/services/storefront.customer.metadata.service.test.js +271 -0
- package/dist/services/storefront.order.service.d.ts +45 -0
- package/dist/services/storefront.order.service.js +99 -0
- package/dist/services/storefront.order.service.test.d.ts +1 -0
- package/dist/services/storefront.order.service.test.js +158 -0
- package/dist/services/storefront.product.service.d.ts +52 -0
- package/dist/services/storefront.product.service.js +75 -0
- package/dist/services/storefront.product.service.test.d.ts +1 -0
- package/dist/services/storefront.product.service.test.js +120 -0
- package/dist/services/storefront.store.service.d.ts +54 -0
- package/dist/services/storefront.store.service.js +142 -0
- package/dist/services/storefront.store.service.test.d.ts +1 -0
- package/dist/services/storefront.store.service.test.js +90 -0
- package/dist/src/core/axios.d.ts +51 -0
- package/dist/src/core/axios.js +65 -0
- package/dist/src/core/axios.observable.d.ts +11 -0
- package/dist/src/core/axios.observable.js +58 -0
- package/dist/src/core/base.provider.advanced.test.d.ts +1 -0
- package/dist/src/core/base.provider.advanced.test.js +29 -0
- package/dist/src/core/base.provider.d.ts +15 -0
- package/dist/src/core/base.provider.js +13 -0
- package/dist/src/core/base.provider.test.d.ts +1 -0
- package/dist/src/core/base.provider.test.js +36 -0
- package/dist/src/core/base.service.wrapper.advanced.test.d.ts +1 -0
- package/dist/src/core/base.service.wrapper.advanced.test.js +39 -0
- package/dist/src/core/base.service.wrapper.d.ts +7 -0
- package/dist/src/core/base.service.wrapper.js +11 -0
- package/dist/src/core/base.service.wrapper.test.d.ts +1 -0
- package/dist/src/core/base.service.wrapper.test.js +25 -0
- package/dist/src/core/rx.http.service.d.ts +51 -0
- package/dist/src/core/rx.http.service.js +65 -0
- package/dist/src/index.d.ts +25 -0
- package/dist/src/index.js +29 -0
- package/dist/src/services/auth.service.d.ts +65 -0
- package/dist/src/services/auth.service.js +197 -0
- package/dist/src/services/auth.service.test.d.ts +1 -0
- package/dist/src/services/auth.service.test.js +334 -0
- package/dist/src/services/cache.service.d.ts +31 -0
- package/dist/src/services/cache.service.js +77 -0
- package/dist/src/services/cache.service.test.d.ts +1 -0
- package/dist/src/services/cache.service.test.js +88 -0
- package/dist/src/services/customer.service.d.ts +199 -0
- package/dist/src/services/customer.service.js +114 -0
- package/dist/src/services/customer.service.test.d.ts +1 -0
- package/dist/src/services/customer.service.test.js +430 -0
- package/dist/src/services/employee.service.d.ts +73 -0
- package/dist/src/services/employee.service.js +74 -0
- package/dist/src/services/employee.service.test.d.ts +1 -0
- package/dist/src/services/employee.service.test.js +127 -0
- package/dist/src/services/logger.service.d.ts +31 -0
- package/dist/src/services/logger.service.js +93 -0
- package/dist/src/services/logger.service.test.d.ts +1 -0
- package/dist/src/services/logger.service.test.js +31 -0
- package/dist/src/services/order.service.d.ts +73 -0
- package/dist/src/services/order.service.js +97 -0
- package/dist/src/services/order.service.test.d.ts +1 -0
- package/dist/src/services/order.service.test.js +163 -0
- package/dist/src/services/product.service.d.ts +21 -0
- package/dist/src/services/product.service.js +42 -0
- package/dist/src/services/product.service.test.d.ts +1 -0
- package/dist/src/services/product.service.test.js +61 -0
- package/dist/src/services/smess.service.d.ts +36 -0
- package/dist/src/services/smess.service.js +128 -0
- package/dist/src/services/smess.service.test.d.ts +1 -0
- package/dist/src/services/smess.service.test.js +103 -0
- package/dist/src/services/store.cart.service.d.ts +158 -0
- package/dist/src/services/store.cart.service.js +177 -0
- package/dist/src/services/store.cart.service.test.d.ts +1 -0
- package/dist/src/services/store.cart.service.test.js +394 -0
- package/dist/src/services/store.product.service.d.ts +124 -0
- package/dist/src/services/store.product.service.js +102 -0
- package/dist/src/services/store.product.service.test.d.ts +1 -0
- package/dist/src/services/store.product.service.test.js +319 -0
- package/dist/src/services/store.service.d.ts +79 -0
- package/dist/src/services/store.service.js +235 -0
- package/dist/src/services/store.service.test.d.ts +1 -0
- package/dist/src/services/store.service.test.js +274 -0
- package/dist/src/services/storefront.cart.service.d.ts +73 -0
- package/dist/src/services/storefront.cart.service.js +167 -0
- package/dist/src/services/storefront.cart.service.test.d.ts +1 -0
- package/dist/src/services/storefront.cart.service.test.js +211 -0
- package/dist/src/services/storefront.checkout.service.d.ts +62 -0
- package/dist/src/services/storefront.checkout.service.js +75 -0
- package/dist/src/services/storefront.checkout.service.test.d.ts +1 -0
- package/dist/src/services/storefront.checkout.service.test.js +158 -0
- package/dist/src/services/storefront.customer.metadata.service.d.ts +91 -0
- package/dist/src/services/storefront.customer.metadata.service.js +225 -0
- package/dist/src/services/storefront.customer.metadata.service.test.d.ts +1 -0
- package/dist/src/services/storefront.customer.metadata.service.test.js +271 -0
- package/dist/src/services/storefront.order.service.d.ts +45 -0
- package/dist/src/services/storefront.order.service.js +99 -0
- package/dist/src/services/storefront.order.service.test.d.ts +1 -0
- package/dist/src/services/storefront.order.service.test.js +158 -0
- package/dist/src/services/storefront.product.service.d.ts +52 -0
- package/dist/src/services/storefront.product.service.js +75 -0
- package/dist/src/services/storefront.product.service.test.d.ts +1 -0
- package/dist/src/services/storefront.product.service.test.js +120 -0
- package/dist/src/services/storefront.store.service.d.ts +52 -0
- package/dist/src/services/storefront.store.service.js +140 -0
- package/dist/src/services/storefront.store.service.test.d.ts +1 -0
- package/dist/src/services/storefront.store.service.test.js +90 -0
- package/dist/src/services/user.service.d.ts +16 -0
- package/dist/src/services/user.service.js +37 -0
- package/dist/src/services/user.service.test.d.ts +1 -0
- package/dist/src/services/user.service.test.js +52 -0
- package/dist/src/services/utils/withAuthReset.d.ts +3 -0
- package/dist/src/services/utils/withAuthReset.js +8 -0
- package/dist/src/types/types.d.ts +93 -0
- package/dist/src/types/types.js +82 -0
- package/dist/src/types/types.test.d.ts +1 -0
- package/dist/src/types/types.test.js +25 -0
- package/dist/src/utils/cache-import.d.ts +3 -0
- package/dist/src/utils/cache-import.js +2 -0
- package/dist/src/utils/networking-import.d.ts +4 -0
- package/dist/src/utils/networking-import.js +3 -0
- package/dist/src/utils/rxjs-import.d.ts +5 -0
- package/dist/src/utils/rxjs-import.js +5 -0
- package/dist/types/types.d.ts +3 -0
- package/package.json +1 -1
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { EmployeeService, } from "./employee.service";
|
|
2
|
+
import { NetworkingUIEventWrapped, AlertModel, } from "../types/types";
|
|
3
|
+
import { BehaviorSubject, of } from "rxjs";
|
|
4
|
+
describe("EmployeeService", () => {
|
|
5
|
+
const config = {
|
|
6
|
+
baseUrl: "https://api.example.com",
|
|
7
|
+
isProd: false,
|
|
8
|
+
clientId: "test-client-id",
|
|
9
|
+
apiKey: "test-api-key",
|
|
10
|
+
};
|
|
11
|
+
let service;
|
|
12
|
+
let $authToken;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
$authToken = new BehaviorSubject(null);
|
|
15
|
+
service = new EmployeeService(config, $authToken);
|
|
16
|
+
});
|
|
17
|
+
it("getProfile success", async () => {
|
|
18
|
+
const response = {
|
|
19
|
+
data: { id: "employee-123", email: "employee@example.com" },
|
|
20
|
+
};
|
|
21
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
22
|
+
request: () => of(NetworkingUIEventWrapped.succeeded(response)),
|
|
23
|
+
});
|
|
24
|
+
const result = await service.getProfile().toPromise();
|
|
25
|
+
expect(result?.hasSuccess).toBe(true);
|
|
26
|
+
expect(result?.response).toEqual(response);
|
|
27
|
+
});
|
|
28
|
+
it("getProfile error clears auth token", async () => {
|
|
29
|
+
const alert = new AlertModel("Unauthorized", 401, true);
|
|
30
|
+
$authToken.next("token-123");
|
|
31
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
32
|
+
request: () => of(NetworkingUIEventWrapped.failed(alert)),
|
|
33
|
+
});
|
|
34
|
+
const result = await service.getProfile().toPromise();
|
|
35
|
+
expect(result?.hasFailed).toBe(true);
|
|
36
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
37
|
+
expect($authToken.value).toBeNull();
|
|
38
|
+
});
|
|
39
|
+
it("getCartCollection success", async () => {
|
|
40
|
+
const response = {
|
|
41
|
+
data: { items: [], page: 1, perPage: 24, total: 0 },
|
|
42
|
+
};
|
|
43
|
+
const requestMock = jest
|
|
44
|
+
.fn()
|
|
45
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.succeeded(response)));
|
|
46
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
47
|
+
request: requestMock,
|
|
48
|
+
});
|
|
49
|
+
const query = {
|
|
50
|
+
page: 1,
|
|
51
|
+
per_page: 24,
|
|
52
|
+
status: "submitted",
|
|
53
|
+
};
|
|
54
|
+
const result = await service.getCartCollection(query).toPromise();
|
|
55
|
+
expect(requestMock).toHaveBeenCalledWith(query);
|
|
56
|
+
expect(result?.hasSuccess).toBe(true);
|
|
57
|
+
expect(result?.response).toEqual(response);
|
|
58
|
+
});
|
|
59
|
+
it("getCartCollection error clears auth token", async () => {
|
|
60
|
+
const requestMock = jest
|
|
61
|
+
.fn()
|
|
62
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.failed(new AlertModel("Unauthorized", 401, true))));
|
|
63
|
+
$authToken.next("token-456");
|
|
64
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
65
|
+
request: requestMock,
|
|
66
|
+
});
|
|
67
|
+
const query = {
|
|
68
|
+
page: 2,
|
|
69
|
+
per_page: 10,
|
|
70
|
+
};
|
|
71
|
+
const result = await service.getCartCollection(query).toPromise();
|
|
72
|
+
expect(requestMock).toHaveBeenCalledWith(query);
|
|
73
|
+
expect(result?.hasFailed).toBe(true);
|
|
74
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
75
|
+
expect($authToken.value).toBeNull();
|
|
76
|
+
});
|
|
77
|
+
it("bulkCartAction success", async () => {
|
|
78
|
+
const response = {
|
|
79
|
+
data: { updated: 1 },
|
|
80
|
+
};
|
|
81
|
+
const requestMock = jest
|
|
82
|
+
.fn()
|
|
83
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.succeeded(response)));
|
|
84
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
85
|
+
request: requestMock,
|
|
86
|
+
});
|
|
87
|
+
const payload = {
|
|
88
|
+
update: [
|
|
89
|
+
{
|
|
90
|
+
cart_id: "cart-123",
|
|
91
|
+
status: "submitted",
|
|
92
|
+
items: [
|
|
93
|
+
{
|
|
94
|
+
product_id: "product-1",
|
|
95
|
+
quantity: 2,
|
|
96
|
+
},
|
|
97
|
+
],
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
};
|
|
101
|
+
const result = await service.bulkCartAction(payload).toPromise();
|
|
102
|
+
expect(requestMock).toHaveBeenCalledWith(payload);
|
|
103
|
+
expect(result?.hasSuccess).toBe(true);
|
|
104
|
+
expect(result?.response).toEqual(response);
|
|
105
|
+
});
|
|
106
|
+
it("bulkCartAction error clears auth token", async () => {
|
|
107
|
+
const requestMock = jest
|
|
108
|
+
.fn()
|
|
109
|
+
.mockReturnValue(of(NetworkingUIEventWrapped.failed(new AlertModel("Unauthorized", 401, true))));
|
|
110
|
+
$authToken.next("token-789");
|
|
111
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
112
|
+
request: requestMock,
|
|
113
|
+
});
|
|
114
|
+
const payload = {
|
|
115
|
+
update: [
|
|
116
|
+
{
|
|
117
|
+
cart_id: "cart-456",
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
};
|
|
121
|
+
const result = await service.bulkCartAction(payload).toPromise();
|
|
122
|
+
expect(requestMock).toHaveBeenCalledWith(payload);
|
|
123
|
+
expect(result?.hasFailed).toBe(true);
|
|
124
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
125
|
+
expect($authToken.value).toBeNull();
|
|
126
|
+
});
|
|
127
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
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;
|
|
@@ -0,0 +1,93 @@
|
|
|
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();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { $logger, LogLevel } from "./logger.service";
|
|
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
|
+
});
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { ProviderType, NetworkingConfig, NetworkingUIEventWrapped, HttpResponse } from "../types/types";
|
|
2
|
+
import { SmessService } from "./smess.service";
|
|
3
|
+
import { BehaviorSubject, Observable } from "rxjs";
|
|
4
|
+
export type OrderTarget = "order-list" | "order-create" | "order-delete" | "order-get-draft" | "order-update" | "order-get" | "order-collection";
|
|
5
|
+
export interface CreateOrderRequest extends UpdateOrderRequest {
|
|
6
|
+
}
|
|
7
|
+
export interface UpdateOrderRequest {
|
|
8
|
+
external_id?: string;
|
|
9
|
+
order_date: string;
|
|
10
|
+
type?: string;
|
|
11
|
+
status?: string;
|
|
12
|
+
payment_status?: string;
|
|
13
|
+
delivery_note?: string;
|
|
14
|
+
delivery_fee?: number;
|
|
15
|
+
delivery_address?: string;
|
|
16
|
+
payment_method?: string;
|
|
17
|
+
payment_period?: string;
|
|
18
|
+
discount_in_percent?: number;
|
|
19
|
+
due_payment_amount?: number;
|
|
20
|
+
total_gst?: number;
|
|
21
|
+
total_exclude_gst?: number;
|
|
22
|
+
total_include_gst?: number;
|
|
23
|
+
order_items: OrderItemRequest[];
|
|
24
|
+
}
|
|
25
|
+
export interface OrderItemRequest {
|
|
26
|
+
product_name: string;
|
|
27
|
+
product_category: string;
|
|
28
|
+
supplier?: string;
|
|
29
|
+
supplier_code?: string;
|
|
30
|
+
supplier_item_name?: string;
|
|
31
|
+
unit: string;
|
|
32
|
+
quantity: number;
|
|
33
|
+
price_include_taxes: number;
|
|
34
|
+
vat_in_percent: number;
|
|
35
|
+
discount_in_percent?: number;
|
|
36
|
+
page_number?: number;
|
|
37
|
+
item_row_in_page?: number;
|
|
38
|
+
}
|
|
39
|
+
export interface OrderCollectionRequest {
|
|
40
|
+
page?: number;
|
|
41
|
+
per_page?: number;
|
|
42
|
+
search?: string;
|
|
43
|
+
status?: string;
|
|
44
|
+
payment_status?: string;
|
|
45
|
+
order_date_from?: string;
|
|
46
|
+
order_date_to?: string;
|
|
47
|
+
sort_by?: string;
|
|
48
|
+
sort_order?: 'asc' | 'desc';
|
|
49
|
+
}
|
|
50
|
+
export declare class OrderProvider implements ProviderType {
|
|
51
|
+
private readonly config;
|
|
52
|
+
private readonly target;
|
|
53
|
+
private readonly $authToken;
|
|
54
|
+
constructor(config: NetworkingConfig, target: OrderTarget, $authToken: BehaviorSubject<string | null>);
|
|
55
|
+
get baseURL(): string;
|
|
56
|
+
get path(): string;
|
|
57
|
+
get method(): string;
|
|
58
|
+
get headers(): Record<string, string>;
|
|
59
|
+
getPath(...queryParams: unknown[]): string;
|
|
60
|
+
}
|
|
61
|
+
export declare class OrderService {
|
|
62
|
+
private readonly config;
|
|
63
|
+
private readonly $authToken;
|
|
64
|
+
constructor(config: NetworkingConfig, $authToken: BehaviorSubject<string | null>);
|
|
65
|
+
provider(target: OrderTarget): SmessService<OrderProvider>;
|
|
66
|
+
list(): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
67
|
+
create(payload: CreateOrderRequest): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
68
|
+
delete(id: string): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
69
|
+
getDraft(): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
70
|
+
update(id: string, payload: UpdateOrderRequest): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
71
|
+
get(id: string): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
72
|
+
collection(payload: OrderCollectionRequest): Observable<NetworkingUIEventWrapped<HttpResponse>>;
|
|
73
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Accept, SMESSHeader, SmessService } from "./smess.service";
|
|
2
|
+
export class OrderProvider {
|
|
3
|
+
constructor(config, target, $authToken) {
|
|
4
|
+
this.config = config;
|
|
5
|
+
this.target = target;
|
|
6
|
+
this.$authToken = $authToken;
|
|
7
|
+
}
|
|
8
|
+
get baseURL() {
|
|
9
|
+
return this.config.version
|
|
10
|
+
? `${this.config.baseUrl}/${this.config.version}`
|
|
11
|
+
: this.config.baseUrl;
|
|
12
|
+
}
|
|
13
|
+
get path() {
|
|
14
|
+
switch (this.target) {
|
|
15
|
+
case "order-list":
|
|
16
|
+
return "/order/list";
|
|
17
|
+
case "order-create":
|
|
18
|
+
return "/order/create";
|
|
19
|
+
case "order-delete":
|
|
20
|
+
return "/order/${id}";
|
|
21
|
+
case "order-get-draft":
|
|
22
|
+
return "/order/get-draft";
|
|
23
|
+
case "order-collection":
|
|
24
|
+
return "/order/collection";
|
|
25
|
+
case "order-update":
|
|
26
|
+
case "order-get":
|
|
27
|
+
default:
|
|
28
|
+
return "/order/${id}";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
get method() {
|
|
32
|
+
switch (this.target) {
|
|
33
|
+
case "order-list":
|
|
34
|
+
case "order-get":
|
|
35
|
+
case "order-get-draft":
|
|
36
|
+
case "order-collection":
|
|
37
|
+
return "GET";
|
|
38
|
+
case "order-create":
|
|
39
|
+
return "POST";
|
|
40
|
+
case "order-update":
|
|
41
|
+
return "PUT";
|
|
42
|
+
case "order-delete":
|
|
43
|
+
return "DELETE";
|
|
44
|
+
default:
|
|
45
|
+
return "GET";
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
get headers() {
|
|
49
|
+
let headers = SmessService.getHeaders(Accept.V1, this.$authToken.value);
|
|
50
|
+
if (this.config.clientId) {
|
|
51
|
+
headers[SMESSHeader.ClientId] = this.config.clientId;
|
|
52
|
+
}
|
|
53
|
+
if (this.config.apiKey) {
|
|
54
|
+
headers[SMESSHeader.ApiKey] = this.config.apiKey;
|
|
55
|
+
}
|
|
56
|
+
return SmessService.filterHeaders(headers);
|
|
57
|
+
}
|
|
58
|
+
getPath(...queryParams) {
|
|
59
|
+
let definedPath = this.path;
|
|
60
|
+
const params = definedPath.match(/\$\{(.+?)\}/g);
|
|
61
|
+
params?.forEach((value, index) => {
|
|
62
|
+
definedPath = definedPath.replace(value, String(queryParams[index]));
|
|
63
|
+
});
|
|
64
|
+
return definedPath;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export class OrderService {
|
|
68
|
+
constructor(config, $authToken) {
|
|
69
|
+
this.config = config;
|
|
70
|
+
this.$authToken = $authToken;
|
|
71
|
+
}
|
|
72
|
+
provider(target) {
|
|
73
|
+
const targetWrapper = new OrderProvider(this.config, target, this.$authToken);
|
|
74
|
+
return new SmessService(targetWrapper);
|
|
75
|
+
}
|
|
76
|
+
list() {
|
|
77
|
+
return this.provider("order-list").request();
|
|
78
|
+
}
|
|
79
|
+
create(payload) {
|
|
80
|
+
return this.provider("order-create").request(payload);
|
|
81
|
+
}
|
|
82
|
+
delete(id) {
|
|
83
|
+
return this.provider("order-delete").request(null, undefined, id);
|
|
84
|
+
}
|
|
85
|
+
getDraft() {
|
|
86
|
+
return this.provider("order-get-draft").request();
|
|
87
|
+
}
|
|
88
|
+
update(id, payload) {
|
|
89
|
+
return this.provider("order-update").request(payload, undefined, id);
|
|
90
|
+
}
|
|
91
|
+
get(id) {
|
|
92
|
+
return this.provider("order-get").request(null, undefined, id);
|
|
93
|
+
}
|
|
94
|
+
collection(payload) {
|
|
95
|
+
return this.provider("order-collection").request(payload, undefined, undefined);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { OrderService, } from "./order.service";
|
|
2
|
+
import { NetworkingUIEventWrapped, AlertModel, } from "../types/types";
|
|
3
|
+
import { of, BehaviorSubject } from "rxjs";
|
|
4
|
+
describe("OrderService", () => {
|
|
5
|
+
const config = {
|
|
6
|
+
baseUrl: "https://api.example.com",
|
|
7
|
+
isProd: false,
|
|
8
|
+
clientId: "test-client-id",
|
|
9
|
+
apiKey: "test-api-key",
|
|
10
|
+
};
|
|
11
|
+
let service;
|
|
12
|
+
let $authToken;
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
$authToken = new BehaviorSubject(null);
|
|
15
|
+
service = new OrderService(config, $authToken);
|
|
16
|
+
});
|
|
17
|
+
it("list success", async () => {
|
|
18
|
+
const response = { data: [{ id: "1", status: "draft" }] };
|
|
19
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
20
|
+
request: () => of(NetworkingUIEventWrapped.succeeded(response)),
|
|
21
|
+
});
|
|
22
|
+
const result = await service.list().toPromise();
|
|
23
|
+
expect(result?.hasSuccess).toBe(true);
|
|
24
|
+
expect(result?.response).toEqual(response);
|
|
25
|
+
});
|
|
26
|
+
it("list error", async () => {
|
|
27
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
28
|
+
request: () => of(NetworkingUIEventWrapped.failed(AlertModel.default())),
|
|
29
|
+
});
|
|
30
|
+
const result = await service.list().toPromise();
|
|
31
|
+
expect(result?.hasFailed).toBe(true);
|
|
32
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
33
|
+
});
|
|
34
|
+
it("create success", async () => {
|
|
35
|
+
const payload = {
|
|
36
|
+
order_date: "2024-01-01",
|
|
37
|
+
order_items: [],
|
|
38
|
+
};
|
|
39
|
+
const response = { data: { id: "1", status: "created" } };
|
|
40
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
41
|
+
request: () => of(NetworkingUIEventWrapped.succeeded(response)),
|
|
42
|
+
});
|
|
43
|
+
const result = await service.create(payload).toPromise();
|
|
44
|
+
expect(result?.hasSuccess).toBe(true);
|
|
45
|
+
expect(result?.response).toEqual(response);
|
|
46
|
+
});
|
|
47
|
+
it("create error", async () => {
|
|
48
|
+
const payload = {
|
|
49
|
+
order_date: "2024-01-01",
|
|
50
|
+
order_items: [],
|
|
51
|
+
};
|
|
52
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
53
|
+
request: () => of(NetworkingUIEventWrapped.failed(AlertModel.default())),
|
|
54
|
+
});
|
|
55
|
+
const result = await service.create(payload).toPromise();
|
|
56
|
+
expect(result?.hasFailed).toBe(true);
|
|
57
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
58
|
+
});
|
|
59
|
+
it("delete success", async () => {
|
|
60
|
+
const response = { data: { id: "1", status: "deleted" } };
|
|
61
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
62
|
+
request: (_payload, _mockResponse, id) => of(NetworkingUIEventWrapped.succeeded(response)),
|
|
63
|
+
});
|
|
64
|
+
const result = await service.delete("1").toPromise();
|
|
65
|
+
expect(result?.hasSuccess).toBe(true);
|
|
66
|
+
expect(result?.response).toEqual(response);
|
|
67
|
+
});
|
|
68
|
+
it("delete error", async () => {
|
|
69
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
70
|
+
request: (_payload, _mockResponse, id) => of(NetworkingUIEventWrapped.failed(AlertModel.default())),
|
|
71
|
+
});
|
|
72
|
+
const result = await service.delete("1").toPromise();
|
|
73
|
+
expect(result?.hasFailed).toBe(true);
|
|
74
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
75
|
+
});
|
|
76
|
+
it("getDraft success", async () => {
|
|
77
|
+
const response = { data: { id: "draft", status: "draft" } };
|
|
78
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
79
|
+
request: () => of(NetworkingUIEventWrapped.succeeded(response)),
|
|
80
|
+
});
|
|
81
|
+
const result = await service.getDraft().toPromise();
|
|
82
|
+
expect(result?.hasSuccess).toBe(true);
|
|
83
|
+
expect(result?.response).toEqual(response);
|
|
84
|
+
});
|
|
85
|
+
it("getDraft error", async () => {
|
|
86
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
87
|
+
request: () => of(NetworkingUIEventWrapped.failed(AlertModel.default())),
|
|
88
|
+
});
|
|
89
|
+
const result = await service.getDraft().toPromise();
|
|
90
|
+
expect(result?.hasFailed).toBe(true);
|
|
91
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
92
|
+
});
|
|
93
|
+
it("update success", async () => {
|
|
94
|
+
const payload = {
|
|
95
|
+
order_date: "2024-01-01",
|
|
96
|
+
order_items: [],
|
|
97
|
+
};
|
|
98
|
+
const response = { data: { id: "1", status: "updated" } };
|
|
99
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
100
|
+
request: (_payload, _mockResponse, id) => of(NetworkingUIEventWrapped.succeeded(response)),
|
|
101
|
+
});
|
|
102
|
+
const result = await service.update("1", payload).toPromise();
|
|
103
|
+
expect(result?.hasSuccess).toBe(true);
|
|
104
|
+
expect(result?.response).toEqual(response);
|
|
105
|
+
});
|
|
106
|
+
it("update error", async () => {
|
|
107
|
+
const payload = {
|
|
108
|
+
order_date: "2024-01-01",
|
|
109
|
+
order_items: [],
|
|
110
|
+
};
|
|
111
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
112
|
+
request: (_payload, _mockResponse, id) => of(NetworkingUIEventWrapped.failed(AlertModel.default())),
|
|
113
|
+
});
|
|
114
|
+
const result = await service.update("1", payload).toPromise();
|
|
115
|
+
expect(result?.hasFailed).toBe(true);
|
|
116
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
117
|
+
});
|
|
118
|
+
it("get success", async () => {
|
|
119
|
+
const response = { data: { id: "1", status: "fetched" } };
|
|
120
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
121
|
+
request: (_payload, _mockResponse, id) => of(NetworkingUIEventWrapped.succeeded(response)),
|
|
122
|
+
});
|
|
123
|
+
const result = await service.get("1").toPromise();
|
|
124
|
+
expect(result?.hasSuccess).toBe(true);
|
|
125
|
+
expect(result?.response).toEqual(response);
|
|
126
|
+
});
|
|
127
|
+
it("get error", async () => {
|
|
128
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
129
|
+
request: (_payload, _mockResponse, id) => of(NetworkingUIEventWrapped.failed(AlertModel.default())),
|
|
130
|
+
});
|
|
131
|
+
const result = await service.get("1").toPromise();
|
|
132
|
+
expect(result?.hasFailed).toBe(true);
|
|
133
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
134
|
+
});
|
|
135
|
+
it("collection success", async () => {
|
|
136
|
+
const payload = {
|
|
137
|
+
page: 1,
|
|
138
|
+
per_page: 10,
|
|
139
|
+
search: "test order",
|
|
140
|
+
status: "pending",
|
|
141
|
+
payment_status: "paid",
|
|
142
|
+
};
|
|
143
|
+
const response = { data: { orders: [], total: 0 } };
|
|
144
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
145
|
+
request: () => of(NetworkingUIEventWrapped.succeeded(response)),
|
|
146
|
+
});
|
|
147
|
+
const result = await service.collection(payload).toPromise();
|
|
148
|
+
expect(result?.hasSuccess).toBe(true);
|
|
149
|
+
expect(result?.response).toEqual(response);
|
|
150
|
+
});
|
|
151
|
+
it("collection error", async () => {
|
|
152
|
+
const payload = {
|
|
153
|
+
page: 1,
|
|
154
|
+
per_page: 10,
|
|
155
|
+
};
|
|
156
|
+
jest.spyOn(service, "provider").mockReturnValue({
|
|
157
|
+
request: () => of(NetworkingUIEventWrapped.failed(AlertModel.default())),
|
|
158
|
+
});
|
|
159
|
+
const result = await service.collection(payload).toPromise();
|
|
160
|
+
expect(result?.hasFailed).toBe(true);
|
|
161
|
+
expect(result?.alertModel).toBeInstanceOf(AlertModel);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { BaseProvider } from "../core/base.provider";
|
|
2
|
+
import { BaseServiceWrapper } from "../core/base.service.wrapper";
|
|
3
|
+
import { NetworkingConfig } from "../types/types";
|
|
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").NetworkingUIEventWrapped<Product>>;
|
|
19
|
+
fetchAllProducts(): import("rxjs").Observable<import("../types/types").NetworkingUIEventWrapped<Product[]>>;
|
|
20
|
+
createProduct(product: Omit<Product, "id">): import("rxjs").Observable<import("../types/types").NetworkingUIEventWrapped<Product>>;
|
|
21
|
+
}
|