storemw-core-client 1.0.1
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/.env +1 -0
- package/.vscode/launch.json +24 -0
- package/dist/config/config.d.ts +6 -0
- package/dist/config/config.js +13 -0
- package/dist/config/env.d.ts +7 -0
- package/dist/config/env.js +16 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.js +8 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +32 -0
- package/dist/lib/ApiService.d.ts +41 -0
- package/dist/lib/ApiService.js +143 -0
- package/dist/lib/index.d.ts +4 -0
- package/dist/lib/index.js +9 -0
- package/dist/lib/queryParams.d.ts +43 -0
- package/dist/lib/queryParams.js +99 -0
- package/dist/services/account/AccountService.d.ts +52 -0
- package/dist/services/account/AccountService.js +119 -0
- package/dist/services/auth/AuthService.d.ts +44 -0
- package/dist/services/auth/AuthService.js +76 -0
- package/dist/services/branch/BranchService.d.ts +124 -0
- package/dist/services/branch/BranchService.js +162 -0
- package/dist/services/business/BusinessService.d.ts +91 -0
- package/dist/services/business/BusinessService.js +153 -0
- package/dist/services/document/DocumentService.d.ts +578 -0
- package/dist/services/document/DocumentService.js +615 -0
- package/dist/services/index.d.ts +36 -0
- package/dist/services/index.js +97 -0
- package/dist/services/injection_field/InjectionFieldService.d.ts +113 -0
- package/dist/services/injection_field/InjectionFieldService.js +220 -0
- package/dist/services/inventory/InventoryService.d.ts +27 -0
- package/dist/services/inventory/InventoryService.js +231 -0
- package/dist/services/item/ItemService.d.ts +227 -0
- package/dist/services/item/ItemService.js +411 -0
- package/dist/services/location/LocationService.d.ts +154 -0
- package/dist/services/location/LocationService.js +256 -0
- package/dist/services/logistic/LogisticService.d.ts +104 -0
- package/dist/services/logistic/LogisticService.js +150 -0
- package/dist/services/permission/PermissionService.d.ts +296 -0
- package/dist/services/permission/PermissionService.js +576 -0
- package/dist/services/permission/config/custom/adminPermission.d.ts +4 -0
- package/dist/services/permission/config/custom/adminPermission.js +18 -0
- package/dist/services/permission/config/custom/config.d.ts +40 -0
- package/dist/services/permission/config/custom/config.js +23 -0
- package/dist/services/permission/config/default/adminPermission.d.ts +2 -0
- package/dist/services/permission/config/default/adminPermission.js +129 -0
- package/dist/services/permission/config/default/agentPermission.d.ts +2 -0
- package/dist/services/permission/config/default/agentPermission.js +43 -0
- package/dist/services/permission/config/default/customerPermission.d.ts +2 -0
- package/dist/services/permission/config/default/customerPermission.js +10 -0
- package/dist/services/permission/config/default/driverPermission.d.ts +2 -0
- package/dist/services/permission/config/default/driverPermission.js +4 -0
- package/dist/services/permission/config/default/workerPermission.d.ts +2 -0
- package/dist/services/permission/config/default/workerPermission.js +25 -0
- package/dist/services/rate/RateService.d.ts +201 -0
- package/dist/services/rate/RateService.js +303 -0
- package/dist/services/region/RegionService.d.ts +111 -0
- package/dist/services/region/RegionService.js +193 -0
- package/dist/services/repository/RepositoryService.d.ts +153 -0
- package/dist/services/repository/RepositoryService.js +243 -0
- package/dist/services/transaction/TransactionService.d.ts +153 -0
- package/dist/services/transaction/TransactionService.js +173 -0
- package/dist/services/user/BranchUserService.d.ts +129 -0
- package/dist/services/user/BranchUserService.js +193 -0
- package/dist/services/user/UserRoleService.d.ts +105 -0
- package/dist/services/user/UserRoleService.js +193 -0
- package/dist/services/user/UserService.d.ts +269 -0
- package/dist/services/user/UserService.js +477 -0
- package/dist/services/wallet/WalletService.d.ts +104 -0
- package/dist/services/wallet/WalletService.js +163 -0
- package/dist/utils/dateUtils.d.ts +6 -0
- package/dist/utils/dateUtils.js +28 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +13 -0
- package/package.json +27 -0
- package/src/config/config.ts +15 -0
- package/src/config/env.ts +18 -0
- package/src/config/index.ts +2 -0
- package/src/index.ts +41 -0
- package/src/lib/ApiService.ts +170 -0
- package/src/lib/index.ts +5 -0
- package/src/lib/queryParams.ts +162 -0
- package/src/services/account/AccountService.ts +232 -0
- package/src/services/auth/AuthService.ts +125 -0
- package/src/services/branch/BranchService.ts +330 -0
- package/src/services/business/BusinessService.ts +277 -0
- package/src/services/document/DocumentService.ts +1471 -0
- package/src/services/index.ts +73 -0
- package/src/services/injection_field/InjectionFieldService.ts +483 -0
- package/src/services/inventory/InventoryService.ts +314 -0
- package/src/services/item/ItemService.ts +707 -0
- package/src/services/location/LocationService.ts +505 -0
- package/src/services/logistic/LogisticService.ts +285 -0
- package/src/services/permission/PermissionService.ts +1069 -0
- package/src/services/permission/config/custom/adminPermission.ts +19 -0
- package/src/services/permission/config/custom/config.ts +39 -0
- package/src/services/permission/config/default/adminPermission.ts +129 -0
- package/src/services/permission/config/default/agentPermission.ts +42 -0
- package/src/services/permission/config/default/customerPermission.ts +9 -0
- package/src/services/permission/config/default/driverPermission.ts +4 -0
- package/src/services/permission/config/default/workerPermission.ts +25 -0
- package/src/services/rate/RateService.ts +570 -0
- package/src/services/region/RegionService.ts +353 -0
- package/src/services/repository/RepositoryService.ts +437 -0
- package/src/services/transaction/TransactionService.ts +404 -0
- package/src/services/user/BranchUserService.ts +381 -0
- package/src/services/user/UserRoleService.ts +342 -0
- package/src/services/user/UserService.ts +807 -0
- package/src/services/wallet/WalletService.ts +300 -0
- package/src/utils/dateUtils.ts +26 -0
- package/src/utils/index.ts +2 -0
- package/tsconfig.json +119 -0
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WalletService = exports.walletCurrencyTypes = exports.walletTargetTypes = exports.walletTypes = void 0;
|
|
4
|
+
const lib_1 = require("@/lib");
|
|
5
|
+
const lib_2 = require("@/lib");
|
|
6
|
+
exports.walletTypes = {
|
|
7
|
+
wallet: "wallet",
|
|
8
|
+
walletUser: "wallet_user"
|
|
9
|
+
};
|
|
10
|
+
exports.walletTargetTypes = {
|
|
11
|
+
wallet: "wallet",
|
|
12
|
+
walletUser: "wallet_user"
|
|
13
|
+
};
|
|
14
|
+
exports.walletCurrencyTypes = {
|
|
15
|
+
myr: "MYR",
|
|
16
|
+
sgd: "SGD",
|
|
17
|
+
usd: "USD",
|
|
18
|
+
cny: "CNY"
|
|
19
|
+
};
|
|
20
|
+
const getCreatePayload = (walletType, data) => {
|
|
21
|
+
if (walletType === "wallet" && "wallet" in data) {
|
|
22
|
+
return {
|
|
23
|
+
wallet: {
|
|
24
|
+
name: data.wallet.name,
|
|
25
|
+
currency: data.wallet.currency,
|
|
26
|
+
wallet_key: data.wallet.walletKey,
|
|
27
|
+
primary_wallet: (data.wallet.isPrimary === true) ? 1 : 0,
|
|
28
|
+
conversion_rate: data.wallet.conversionRate,
|
|
29
|
+
description: data.wallet.description,
|
|
30
|
+
status: (data.wallet.status === true) ? 1 : 0
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
if (walletType === "wallet_user" && "walletUser" in data) {
|
|
35
|
+
return {
|
|
36
|
+
wallet: {
|
|
37
|
+
wallet_id: data.walletUser.walletId,
|
|
38
|
+
user_id: data.walletUser.userId,
|
|
39
|
+
status: (data.walletUser.status === true) ? 1 : 0
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
const getUpdatePayload = (walletType, data) => {
|
|
45
|
+
if (walletType === "wallet" && "wallet" in data) {
|
|
46
|
+
return {
|
|
47
|
+
wallet: {
|
|
48
|
+
name: data.wallet.name,
|
|
49
|
+
currency: data.wallet.currency,
|
|
50
|
+
wallet_key: data.wallet.walletKey,
|
|
51
|
+
primary_wallet: (data.wallet.isPrimary === true) ? 1 : 0,
|
|
52
|
+
conversion_rate: data.wallet.conversionRate,
|
|
53
|
+
description: data.wallet.description,
|
|
54
|
+
status: (data.wallet.status === true) ? 1 : 0
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (walletType === "wallet_user" && "walletUser" in data) {
|
|
59
|
+
return {
|
|
60
|
+
wallet: {
|
|
61
|
+
status: (data.walletUser.status === true) ? 1 : 0
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const WalletService = (props) => {
|
|
67
|
+
const { walletType = "wallet", walletTargetType, ...rest } = props ?? {};
|
|
68
|
+
const { makeCall } = (0, lib_1.ApiService)(rest?.customToken ? { customToken: rest.customToken } : {});
|
|
69
|
+
const endpoint1 = "wallet";
|
|
70
|
+
const endpoint2 = "wallets";
|
|
71
|
+
const list = async (props) => {
|
|
72
|
+
const { walletType: overrideWalletType } = props;
|
|
73
|
+
const url = (0, lib_2.buildApiListUrl)(`${endpoint2}/${overrideWalletType || walletType}`, props);
|
|
74
|
+
const response = await makeCall({
|
|
75
|
+
url,
|
|
76
|
+
method: "get",
|
|
77
|
+
payload: {},
|
|
78
|
+
// configuration
|
|
79
|
+
});
|
|
80
|
+
return response;
|
|
81
|
+
};
|
|
82
|
+
const get = async (props) => {
|
|
83
|
+
const { id, walletType: overrideWalletType } = props;
|
|
84
|
+
const url = (0, lib_2.buildApiGetUrl)(`${endpoint1}/${overrideWalletType || walletType}/${id}`, props);
|
|
85
|
+
const response = await makeCall({
|
|
86
|
+
url,
|
|
87
|
+
method: "get",
|
|
88
|
+
payload: {},
|
|
89
|
+
// configuration
|
|
90
|
+
});
|
|
91
|
+
return response;
|
|
92
|
+
};
|
|
93
|
+
const create = async ({ data, walletType: overrideWalletType, walletTargetType: overrideWalletTargetType }) => {
|
|
94
|
+
let _walletType = overrideWalletType || walletType;
|
|
95
|
+
let payload = getCreatePayload(_walletType, data);
|
|
96
|
+
let url = `${endpoint1}`;
|
|
97
|
+
let postData = {
|
|
98
|
+
scope: {
|
|
99
|
+
target: overrideWalletTargetType || walletTargetType,
|
|
100
|
+
action: "",
|
|
101
|
+
},
|
|
102
|
+
payload
|
|
103
|
+
};
|
|
104
|
+
const response = await makeCall({
|
|
105
|
+
url,
|
|
106
|
+
method: "post",
|
|
107
|
+
payload: postData
|
|
108
|
+
});
|
|
109
|
+
return response;
|
|
110
|
+
};
|
|
111
|
+
const update = async ({ id, data, walletType: overrideWalletType, walletTargetType: overrideWalletTargetType }) => {
|
|
112
|
+
let url = `${endpoint1}/${id}`;
|
|
113
|
+
let _walletType = overrideWalletType || walletType;
|
|
114
|
+
let payload = getUpdatePayload(_walletType, data);
|
|
115
|
+
const postData = {
|
|
116
|
+
scope: {
|
|
117
|
+
target: overrideWalletTargetType || walletTargetType,
|
|
118
|
+
action: "",
|
|
119
|
+
},
|
|
120
|
+
payload
|
|
121
|
+
};
|
|
122
|
+
const response = await makeCall({
|
|
123
|
+
url,
|
|
124
|
+
method: "put",
|
|
125
|
+
payload: postData
|
|
126
|
+
});
|
|
127
|
+
return response;
|
|
128
|
+
};
|
|
129
|
+
const remove = async ({ ids, walletTargetType: overrideWalletTargetType }) => {
|
|
130
|
+
let url = `${endpoint2}/delete`;
|
|
131
|
+
const postData = {
|
|
132
|
+
scope: {
|
|
133
|
+
target: overrideWalletTargetType || walletTargetType,
|
|
134
|
+
},
|
|
135
|
+
payload: {
|
|
136
|
+
ids
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
const response = await makeCall({
|
|
140
|
+
url,
|
|
141
|
+
method: "post",
|
|
142
|
+
payload: postData
|
|
143
|
+
});
|
|
144
|
+
return response;
|
|
145
|
+
};
|
|
146
|
+
const getDataTypes = async ({ walletType: overrideWalletType }) => {
|
|
147
|
+
let url = `${endpoint1}/data_types/${overrideWalletType || walletType}`;
|
|
148
|
+
const response = await makeCall({
|
|
149
|
+
url,
|
|
150
|
+
method: "get",
|
|
151
|
+
});
|
|
152
|
+
return response;
|
|
153
|
+
};
|
|
154
|
+
return {
|
|
155
|
+
list,
|
|
156
|
+
get,
|
|
157
|
+
create,
|
|
158
|
+
update,
|
|
159
|
+
remove,
|
|
160
|
+
getDataTypes,
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
exports.WalletService = WalletService;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import dayjs from "dayjs";
|
|
2
|
+
export declare const getCurrentDateTimeISO: () => string;
|
|
3
|
+
export declare const dayjsDisplayFormat = "YYYY-MM-DD HH:mm:ss";
|
|
4
|
+
export declare const getCurrentDateTime: () => string;
|
|
5
|
+
export declare const formatDisplayDateTime: (date: any) => string;
|
|
6
|
+
export { dayjs };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.dayjs = exports.formatDisplayDateTime = exports.getCurrentDateTime = exports.dayjsDisplayFormat = exports.getCurrentDateTimeISO = void 0;
|
|
7
|
+
const dayjs_1 = __importDefault(require("dayjs"));
|
|
8
|
+
exports.dayjs = dayjs_1.default;
|
|
9
|
+
const utc_1 = __importDefault(require("dayjs/plugin/utc"));
|
|
10
|
+
const timezone_1 = __importDefault(require("dayjs/plugin/timezone"));
|
|
11
|
+
// extend plugins
|
|
12
|
+
dayjs_1.default.extend(utc_1.default);
|
|
13
|
+
dayjs_1.default.extend(timezone_1.default);
|
|
14
|
+
// set default timezone to Malaysia
|
|
15
|
+
dayjs_1.default.tz.setDefault("Asia/Kuala_Lumpur");
|
|
16
|
+
const getCurrentDateTimeISO = () => {
|
|
17
|
+
return (0, dayjs_1.default)().toISOString();
|
|
18
|
+
};
|
|
19
|
+
exports.getCurrentDateTimeISO = getCurrentDateTimeISO;
|
|
20
|
+
exports.dayjsDisplayFormat = "YYYY-MM-DD HH:mm:ss";
|
|
21
|
+
const getCurrentDateTime = () => {
|
|
22
|
+
return (0, dayjs_1.default)().format(exports.dayjsDisplayFormat);
|
|
23
|
+
};
|
|
24
|
+
exports.getCurrentDateTime = getCurrentDateTime;
|
|
25
|
+
const formatDisplayDateTime = (date) => {
|
|
26
|
+
return (0, dayjs_1.default)(date).format(exports.dayjsDisplayFormat);
|
|
27
|
+
};
|
|
28
|
+
exports.formatDisplayDateTime = formatDisplayDateTime;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.formatDisplayDateTime = exports.getCurrentDateTimeISO = exports.getCurrentDateTime = exports.dayjs = exports._ = void 0;
|
|
7
|
+
var lodash_1 = require("lodash");
|
|
8
|
+
Object.defineProperty(exports, "_", { enumerable: true, get: function () { return __importDefault(lodash_1).default; } });
|
|
9
|
+
var dateUtils_1 = require("./dateUtils");
|
|
10
|
+
Object.defineProperty(exports, "dayjs", { enumerable: true, get: function () { return dateUtils_1.dayjs; } });
|
|
11
|
+
Object.defineProperty(exports, "getCurrentDateTime", { enumerable: true, get: function () { return dateUtils_1.getCurrentDateTime; } });
|
|
12
|
+
Object.defineProperty(exports, "getCurrentDateTimeISO", { enumerable: true, get: function () { return dateUtils_1.getCurrentDateTimeISO; } });
|
|
13
|
+
Object.defineProperty(exports, "formatDisplayDateTime", { enumerable: true, get: function () { return dateUtils_1.formatDisplayDateTime; } });
|
package/package.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "storemw-core-client",
|
|
3
|
+
"version": "1.0.1",
|
|
4
|
+
"main": "index.js",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"build": "tsc",
|
|
7
|
+
"dev": "ts-node -r tsconfig-paths/register src/index.ts",
|
|
8
|
+
"start": "node dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [],
|
|
11
|
+
"author": "",
|
|
12
|
+
"license": "ISC",
|
|
13
|
+
"description": "",
|
|
14
|
+
"devDependencies": {
|
|
15
|
+
"@types/lodash": "^4.17.20",
|
|
16
|
+
"@types/node": "^20.19.24",
|
|
17
|
+
"ts-node": "^10.9.2",
|
|
18
|
+
"tsconfig-paths": "^4.2.0",
|
|
19
|
+
"typescript": "^5.0.0"
|
|
20
|
+
},
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"axios": "^1.13.1",
|
|
23
|
+
"dayjs": "^1.11.18",
|
|
24
|
+
"dotenv": "^17.2.3",
|
|
25
|
+
"lodash": "^4.17.21"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface ApiConfig {
|
|
2
|
+
baseURL: string;
|
|
3
|
+
token?: string;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
// Shared default config (global runtime memory)
|
|
7
|
+
let defaultConfig: ApiConfig = {
|
|
8
|
+
baseURL: "",
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export const setApiConfig = (newConfig: ApiConfig) => {
|
|
12
|
+
defaultConfig = { ...defaultConfig, ...newConfig };
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const getApiConfig = (): ApiConfig => defaultConfig;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import "dotenv/config";
|
|
2
|
+
|
|
3
|
+
export const env = {
|
|
4
|
+
NODE_ENV: process.env.NODE_ENV ?? "development",
|
|
5
|
+
|
|
6
|
+
// 👇 the API endpoint
|
|
7
|
+
API_BASE_URL:
|
|
8
|
+
process.env.NEXT_PUBLIC_API_BASE_URL ??
|
|
9
|
+
process.env.VITE_API_BASE_URL ??
|
|
10
|
+
process.env.API_BASE_URL ??
|
|
11
|
+
"",
|
|
12
|
+
|
|
13
|
+
// 👇 optional auth token
|
|
14
|
+
API_TOKEN: process.env.API_TOKEN ?? "",
|
|
15
|
+
|
|
16
|
+
// 👇 you can add more if needed later
|
|
17
|
+
DEBUG: process.env.DEBUG === "true",
|
|
18
|
+
};
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AuthService,
|
|
3
|
+
LocationService,
|
|
4
|
+
} from "@/services"
|
|
5
|
+
|
|
6
|
+
import { setApiConfig, env } from "@/config"
|
|
7
|
+
|
|
8
|
+
// set the api config from env
|
|
9
|
+
setApiConfig({
|
|
10
|
+
baseURL: env.API_BASE_URL,
|
|
11
|
+
token: ""
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
const testAuthToken = async () => {
|
|
15
|
+
const authService = AuthService({ authTargetType: "administrator" })
|
|
16
|
+
const response = await authService.authLogin({
|
|
17
|
+
username: "masteradmin2",
|
|
18
|
+
password: "abc12345"
|
|
19
|
+
})
|
|
20
|
+
return response
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// const testLocation = async () => {
|
|
24
|
+
// const locationService = LocationService({ customToken: "sdfdsfds" })
|
|
25
|
+
// await locationService.get({ id: 23432, dataTypes: [], locationType: "location" })
|
|
26
|
+
//
|
|
27
|
+
// }
|
|
28
|
+
|
|
29
|
+
(async () => {
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
// await testLocation();
|
|
33
|
+
const response = await testAuthToken();
|
|
34
|
+
console.log('response', response)
|
|
35
|
+
} catch (error) {
|
|
36
|
+
console.error(`error`, error)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
})();
|
|
40
|
+
|
|
41
|
+
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import axios, { isAxiosError } from "axios";
|
|
2
|
+
import type { AxiosResponse, AxiosInstance, AxiosRequestConfig } from "axios";
|
|
3
|
+
|
|
4
|
+
// import { EnvService, /* SessionService */ } from '.'; // Adjust path as needed
|
|
5
|
+
|
|
6
|
+
import { getApiConfig } from "@/config";
|
|
7
|
+
|
|
8
|
+
type ApiResponse = {
|
|
9
|
+
status: boolean;
|
|
10
|
+
message: string;
|
|
11
|
+
data?: any;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
type ApiError = {
|
|
15
|
+
message: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
type AxiosInstanceParams = {
|
|
19
|
+
axiosClient: AxiosInstance,
|
|
20
|
+
cancelToken: any
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type ApiServiceType = {
|
|
24
|
+
customToken?: string, // custom jwt token
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// You can inject token later if needed (via a setter or directly)
|
|
28
|
+
let accessToken: string = '';
|
|
29
|
+
|
|
30
|
+
const createAxiosInstance = (endpointUrl: string): AxiosInstanceParams => {
|
|
31
|
+
// return axios.create({
|
|
32
|
+
// baseURL: endpointUrl,
|
|
33
|
+
// timeout: 30000,
|
|
34
|
+
// });
|
|
35
|
+
|
|
36
|
+
let axiosClient = axios.create({
|
|
37
|
+
baseURL: endpointUrl,
|
|
38
|
+
timeout: 30000,
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
let cancelToken = axios.CancelToken
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
axiosClient,
|
|
45
|
+
cancelToken
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export const ApiService = (props?: ApiServiceType) => {
|
|
50
|
+
|
|
51
|
+
const customToken = props?.customToken
|
|
52
|
+
|
|
53
|
+
// const { baseURL } = EnvService(); // always read fresh env if needed
|
|
54
|
+
const { baseURL } = getApiConfig()
|
|
55
|
+
|
|
56
|
+
const {
|
|
57
|
+
axiosClient,
|
|
58
|
+
// cancelToken,
|
|
59
|
+
} = createAxiosInstance(baseURL)
|
|
60
|
+
|
|
61
|
+
const setToken = (token: string) => {
|
|
62
|
+
accessToken = token;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const getAuthorization = (): string => {
|
|
66
|
+
return accessToken ? `Bearer ${accessToken}` : '';
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const makeCall = async ({
|
|
70
|
+
url,
|
|
71
|
+
payload,
|
|
72
|
+
method,
|
|
73
|
+
sessionAuthentication = true
|
|
74
|
+
}: {
|
|
75
|
+
url: string;
|
|
76
|
+
payload?: any;
|
|
77
|
+
method: 'get' | 'post' | 'put' | 'delete';
|
|
78
|
+
sessionAuthentication?: boolean; // skip to check the session for headers
|
|
79
|
+
}): Promise<ApiResponse> => {
|
|
80
|
+
|
|
81
|
+
if (customToken) { // if option to use customToken
|
|
82
|
+
setToken(customToken)
|
|
83
|
+
} else {
|
|
84
|
+
if (sessionAuthentication) {
|
|
85
|
+
// const { getSession } = SessionService()
|
|
86
|
+
|
|
87
|
+
// const session = await getSession()
|
|
88
|
+
|
|
89
|
+
// if (session?.token) {
|
|
90
|
+
// setToken(session?.token)
|
|
91
|
+
// }
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
// const client = createAxiosInstance(baseURL);
|
|
97
|
+
const client = axiosClient
|
|
98
|
+
|
|
99
|
+
// console.log('accessToken', accessToken)
|
|
100
|
+
|
|
101
|
+
const headers: Record<string, string> = {
|
|
102
|
+
'Content-Type': 'application/json',
|
|
103
|
+
...(accessToken ? { Authorization: getAuthorization() } : {}),
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const config: AxiosRequestConfig = {
|
|
107
|
+
method,
|
|
108
|
+
url,
|
|
109
|
+
headers,
|
|
110
|
+
...(method.toLowerCase() !== 'get' ? { data: payload } : {}),
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// console.log('[Axios Call]', baseURL, url, method, JSON.stringify(payload));
|
|
114
|
+
|
|
115
|
+
try {
|
|
116
|
+
const response = await client.request<ApiResponse>(config);
|
|
117
|
+
return parseResponse(response);
|
|
118
|
+
} catch (error: unknown) {
|
|
119
|
+
if (isAxiosError<ApiError>(error)) {
|
|
120
|
+
const message =
|
|
121
|
+
error.response?.data?.message || error.message || 'Network error';
|
|
122
|
+
|
|
123
|
+
// console.log('error', error)
|
|
124
|
+
throw getError(false, message);
|
|
125
|
+
}
|
|
126
|
+
throw getError(false, `${(error as any)?.message || 'Unknown error'}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const parseResponse = (response: AxiosResponse<ApiResponse>) => {
|
|
131
|
+
if (!isRequestSuccess(response)) {
|
|
132
|
+
throw getError(false, 'Server failed to respond properly');
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (!isResultSuccess(response)) {
|
|
136
|
+
throw getError(false, response?.data?.message || 'API returned an error');
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const { status, message, data } = response.data;
|
|
140
|
+
return getSuccess(status, message, data);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const isRequestSuccess = (response: AxiosResponse): boolean => response.status === 200
|
|
144
|
+
|
|
145
|
+
const isResultSuccess = (response: AxiosResponse<ApiResponse>): boolean =>
|
|
146
|
+
Boolean(response?.data?.status)
|
|
147
|
+
|
|
148
|
+
const getError = (status: boolean, message = '') => ({
|
|
149
|
+
status,
|
|
150
|
+
message,
|
|
151
|
+
})
|
|
152
|
+
|
|
153
|
+
const getSuccess = (status: boolean, message = '', data?: any) => ({
|
|
154
|
+
status,
|
|
155
|
+
message,
|
|
156
|
+
data,
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
return {
|
|
160
|
+
createAxiosInstance,
|
|
161
|
+
getAuthorization,
|
|
162
|
+
setToken,
|
|
163
|
+
makeCall,
|
|
164
|
+
parseResponse,
|
|
165
|
+
isRequestSuccess,
|
|
166
|
+
isResultSuccess,
|
|
167
|
+
getError,
|
|
168
|
+
getSuccess
|
|
169
|
+
}
|
|
170
|
+
};
|
package/src/lib/index.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { ApiService } from './ApiService';
|
|
2
|
+
export type { ApiServiceType } from "./ApiService"
|
|
3
|
+
|
|
4
|
+
export { filterOperatorTypes, buildApiGetUrl, buildApiListUrl, BuildApiListParamsProps, BuildApiGetParamsProps } from './queryParams';
|
|
5
|
+
export type { FilterItem } from './queryParams';
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
export const _operatorSymbols = {
|
|
2
|
+
eq: "=",
|
|
3
|
+
startsWith: "_%",
|
|
4
|
+
endsWith: "%_",
|
|
5
|
+
contains: "%",
|
|
6
|
+
containsOr: "%||",
|
|
7
|
+
anyOf: "where_in",
|
|
8
|
+
anyOfOr: "or_where_in",
|
|
9
|
+
excludeOf: "where_not_in",
|
|
10
|
+
excludeOfOr: "or_where_not_in",
|
|
11
|
+
moreThanEq: ">=",
|
|
12
|
+
moreThanEqOr: ">=||",
|
|
13
|
+
lessThanEq: "<=",
|
|
14
|
+
lessThanEqOr: "<=||",
|
|
15
|
+
notEq: "!=",
|
|
16
|
+
eqOr: "=||",
|
|
17
|
+
havingInOr: "or_having_in",
|
|
18
|
+
isNull: "null",
|
|
19
|
+
isNotNull: "null!=",
|
|
20
|
+
isNullOr: "null||",
|
|
21
|
+
} as const;
|
|
22
|
+
|
|
23
|
+
export const filterOperatorTypes = Object.keys(_operatorSymbols).reduce((acc, key) => {
|
|
24
|
+
acc[key] = key;
|
|
25
|
+
return acc;
|
|
26
|
+
}, {} as Record<string, string>);
|
|
27
|
+
|
|
28
|
+
export type FilterOperator = keyof typeof filterOperatorTypes;
|
|
29
|
+
|
|
30
|
+
export type FilterItem = {
|
|
31
|
+
name: string;
|
|
32
|
+
// operator: keyof typeof _operatorSymbols;
|
|
33
|
+
operator: FilterOperator,
|
|
34
|
+
value?: any;
|
|
35
|
+
group?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// export type SortInfo = {
|
|
39
|
+
// id: string;
|
|
40
|
+
// dir: 1 | -1;
|
|
41
|
+
// }
|
|
42
|
+
|
|
43
|
+
export type BuildApiListParamsProps = {
|
|
44
|
+
limit?: number;
|
|
45
|
+
offset?: number;
|
|
46
|
+
filterValue?: FilterItem[];
|
|
47
|
+
// sortInfo?: SortInfo;
|
|
48
|
+
sortField?: string;
|
|
49
|
+
sortOrder?: "asc" | "desc";
|
|
50
|
+
dataTypes?: string[];
|
|
51
|
+
extraFilters?: any[]; // e.g. location filters
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export type BuildApiGetParamsProps = {
|
|
55
|
+
dataTypes?: string[];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function buildApiListUrl(
|
|
59
|
+
endpoint: string,
|
|
60
|
+
props: BuildApiListParamsProps,
|
|
61
|
+
// operatorSymbols: Record<string, string>
|
|
62
|
+
): string {
|
|
63
|
+
|
|
64
|
+
let filters: any[] = [];
|
|
65
|
+
|
|
66
|
+
const {
|
|
67
|
+
limit,
|
|
68
|
+
offset,
|
|
69
|
+
filterValue,
|
|
70
|
+
// sortInfo,
|
|
71
|
+
sortField,
|
|
72
|
+
sortOrder,
|
|
73
|
+
dataTypes = [],
|
|
74
|
+
extraFilters = [],
|
|
75
|
+
} = props;
|
|
76
|
+
|
|
77
|
+
// Process filters
|
|
78
|
+
if (filterValue) {
|
|
79
|
+
for (const filter of filterValue) {
|
|
80
|
+
if (
|
|
81
|
+
filter.value !== undefined ||
|
|
82
|
+
filter.operator === "isNull" ||
|
|
83
|
+
filter.operator === "isNotNull" ||
|
|
84
|
+
filter.operator === "isNullOr"
|
|
85
|
+
) {
|
|
86
|
+
const line: any = {
|
|
87
|
+
field: filter.name,
|
|
88
|
+
operator: _operatorSymbols[filter.operator as keyof typeof _operatorSymbols],
|
|
89
|
+
value: filter.value,
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
if (filter.group) line.group = filter.group;
|
|
93
|
+
|
|
94
|
+
filters.push(line);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Add any extra filters passed in
|
|
100
|
+
filters = [...filters, ...extraFilters];
|
|
101
|
+
|
|
102
|
+
// Sorting
|
|
103
|
+
let sortfield = sortField ?? "id";
|
|
104
|
+
let sortorder = sortOrder ?? "desc";
|
|
105
|
+
|
|
106
|
+
// if (sortInfo?.id) {
|
|
107
|
+
// sortfield = sortInfo.id;
|
|
108
|
+
// sortorder = sortInfo.dir === -1 ? "desc" : "asc";
|
|
109
|
+
// }
|
|
110
|
+
|
|
111
|
+
// Build URL
|
|
112
|
+
let url = `${endpoint}?limit=${limit}&offset=${offset}&sortfield=${sortfield}&sortorder=${sortorder}`;
|
|
113
|
+
url += `&filters=${JSON.stringify(filters.length > 0 ? filters : [])}`;
|
|
114
|
+
|
|
115
|
+
if (dataTypes.length > 0) {
|
|
116
|
+
url += `&datatypes=${JSON.stringify(dataTypes)}`;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return url;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function buildApiGetUrl(
|
|
123
|
+
endpoint: string,
|
|
124
|
+
props: BuildApiGetParamsProps,
|
|
125
|
+
// operatorSymbols: Record<string, string>
|
|
126
|
+
): string {
|
|
127
|
+
|
|
128
|
+
// let filters: any[] = [];
|
|
129
|
+
|
|
130
|
+
const {
|
|
131
|
+
// limit,
|
|
132
|
+
// offset,
|
|
133
|
+
// filterValue,
|
|
134
|
+
// // sortInfo,
|
|
135
|
+
// sortField,
|
|
136
|
+
// sortOrder,
|
|
137
|
+
dataTypes = [],
|
|
138
|
+
// extraFilters = [],
|
|
139
|
+
} = props;
|
|
140
|
+
|
|
141
|
+
// Add any extra filters passed in
|
|
142
|
+
// filters = [...filters, ...extraFilters];
|
|
143
|
+
|
|
144
|
+
// Sorting
|
|
145
|
+
// let sortfield = sortField ?? "id";
|
|
146
|
+
// let sortorder = sortOrder ?? "desc";
|
|
147
|
+
|
|
148
|
+
// if (sortInfo?.id) {
|
|
149
|
+
// sortfield = sortInfo.id;
|
|
150
|
+
// sortorder = sortInfo.dir === -1 ? "desc" : "asc";
|
|
151
|
+
// }
|
|
152
|
+
|
|
153
|
+
// Build URL
|
|
154
|
+
let url = `${endpoint}?`;
|
|
155
|
+
// url += `&filters=${JSON.stringify(filters.length > 0 ? filters : [])}`;
|
|
156
|
+
|
|
157
|
+
if (dataTypes.length > 0) {
|
|
158
|
+
url += `datatypes=${JSON.stringify(dataTypes)}`;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return url;
|
|
162
|
+
}
|