akeyless-server-commons 1.0.200 → 1.0.204
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/cjs/helpers/boards_helpers.js +1 -2
- package/dist/cjs/helpers/boards_helpers.js.map +1 -1
- package/dist/cjs/helpers/email_helpers.js +35 -35
- package/dist/cjs/helpers/email_helpers.js.map +1 -1
- package/dist/cjs/helpers/firebase_helpers.js +112 -107
- package/dist/cjs/helpers/firebase_helpers.js.map +1 -1
- package/dist/cjs/helpers/global_helpers.d.ts +1 -1
- package/dist/cjs/helpers/global_helpers.js +8 -19
- package/dist/cjs/helpers/global_helpers.js.map +1 -1
- package/dist/cjs/helpers/login_helpers.js +7 -16
- package/dist/cjs/helpers/login_helpers.js.map +1 -1
- package/dist/cjs/helpers/notification_helpers.js +36 -46
- package/dist/cjs/helpers/notification_helpers.js.map +1 -1
- package/dist/cjs/helpers/rabbitmq_helpers.d.ts +64 -0
- package/dist/cjs/helpers/rabbitmq_helpers.js +193 -0
- package/dist/cjs/helpers/rabbitmq_helpers.js.map +1 -0
- package/dist/cjs/helpers/redis/helpers.js +42 -52
- package/dist/cjs/helpers/redis/helpers.js.map +1 -1
- package/dist/cjs/helpers/redis/initialize.js +2 -1
- package/dist/cjs/helpers/redis/initialize.js.map +1 -1
- package/dist/cjs/helpers/redis/keys.js +3 -12
- package/dist/cjs/helpers/redis/keys.js.map +1 -1
- package/dist/cjs/helpers/redis/snapshot.js +38 -52
- package/dist/cjs/helpers/redis/snapshot.js.map +1 -1
- package/dist/cjs/helpers/start.js +26 -19
- package/dist/cjs/helpers/start.js.map +1 -1
- package/dist/cjs/helpers/tasks_helpers.js +20 -29
- package/dist/cjs/helpers/tasks_helpers.js.map +1 -1
- package/dist/cjs/helpers/time_helpers.js +12 -14
- package/dist/cjs/helpers/time_helpers.js.map +1 -1
- package/dist/cjs/index.js +17 -7
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/managers/cache_manager.js +3 -3
- package/dist/cjs/managers/cache_manager.js.map +1 -1
- package/dist/cjs/managers/index.d.ts +1 -0
- package/dist/cjs/managers/index.js +1 -0
- package/dist/cjs/managers/index.js.map +1 -1
- package/dist/cjs/managers/logger_manager.js +2 -2
- package/dist/cjs/managers/logger_manager.js.map +1 -1
- package/dist/cjs/managers/rabbitmq_manager.d.ts +60 -0
- package/dist/cjs/managers/rabbitmq_manager.js +190 -0
- package/dist/cjs/managers/rabbitmq_manager.js.map +1 -0
- package/dist/cjs/managers/translation_manager.js +3 -3
- package/dist/cjs/managers/translation_manager.js.map +1 -1
- package/dist/cjs/middlewares/auth_mw.js +11 -20
- package/dist/cjs/middlewares/auth_mw.js.map +1 -1
- package/dist/cjs/middlewares/global_mw.js +9 -10
- package/dist/cjs/middlewares/global_mw.js.map +1 -1
- package/dist/cjs/types/interfaces/global.d.ts +1 -0
- package/dist/esm/helpers/boards_helpers.js +1 -2
- package/dist/esm/helpers/boards_helpers.js.map +1 -1
- package/dist/esm/helpers/email_helpers.js +18 -28
- package/dist/esm/helpers/email_helpers.js.map +1 -1
- package/dist/esm/helpers/firebase_helpers.js +112 -107
- package/dist/esm/helpers/firebase_helpers.js.map +1 -1
- package/dist/esm/helpers/global_helpers.d.ts +1 -1
- package/dist/esm/helpers/global_helpers.js +8 -19
- package/dist/esm/helpers/global_helpers.js.map +1 -1
- package/dist/esm/helpers/login_helpers.js +7 -16
- package/dist/esm/helpers/login_helpers.js.map +1 -1
- package/dist/esm/helpers/notification_helpers.js +36 -46
- package/dist/esm/helpers/notification_helpers.js.map +1 -1
- package/dist/esm/helpers/rabbitmq_helpers.d.ts +64 -0
- package/dist/esm/helpers/rabbitmq_helpers.js +186 -0
- package/dist/esm/helpers/rabbitmq_helpers.js.map +1 -0
- package/dist/esm/helpers/redis/helpers.js +42 -52
- package/dist/esm/helpers/redis/helpers.js.map +1 -1
- package/dist/esm/helpers/redis/initialize.js +2 -1
- package/dist/esm/helpers/redis/initialize.js.map +1 -1
- package/dist/esm/helpers/redis/keys.js +3 -12
- package/dist/esm/helpers/redis/keys.js.map +1 -1
- package/dist/esm/helpers/redis/snapshot.js +38 -52
- package/dist/esm/helpers/redis/snapshot.js.map +1 -1
- package/dist/esm/helpers/start.js +26 -19
- package/dist/esm/helpers/start.js.map +1 -1
- package/dist/esm/helpers/tasks_helpers.js +20 -29
- package/dist/esm/helpers/tasks_helpers.js.map +1 -1
- package/dist/esm/helpers/time_helpers.js +12 -14
- package/dist/esm/helpers/time_helpers.js.map +1 -1
- package/dist/esm/managers/cache_manager.js +3 -3
- package/dist/esm/managers/cache_manager.js.map +1 -1
- package/dist/esm/managers/index.d.ts +1 -0
- package/dist/esm/managers/index.js +1 -0
- package/dist/esm/managers/index.js.map +1 -1
- package/dist/esm/managers/logger_manager.js +2 -2
- package/dist/esm/managers/logger_manager.js.map +1 -1
- package/dist/esm/managers/rabbitmq_manager.d.ts +60 -0
- package/dist/esm/managers/rabbitmq_manager.js +183 -0
- package/dist/esm/managers/rabbitmq_manager.js.map +1 -0
- package/dist/esm/managers/translation_manager.js +3 -3
- package/dist/esm/managers/translation_manager.js.map +1 -1
- package/dist/esm/middlewares/auth_mw.js +11 -20
- package/dist/esm/middlewares/auth_mw.js.map +1 -1
- package/dist/esm/middlewares/global_mw.js +9 -10
- package/dist/esm/middlewares/global_mw.js.map +1 -1
- package/dist/esm/types/interfaces/global.d.ts +1 -0
- package/dist/helpers/boards_helpers.js +62 -0
- package/dist/helpers/email_helpers.js +153 -0
- package/dist/helpers/firebase_helpers.js +601 -0
- package/dist/helpers/global_helpers.js +147 -0
- package/dist/helpers/index.js +12 -0
- package/dist/helpers/location_helpers.js +15 -0
- package/dist/helpers/login_helpers.js +18 -0
- package/dist/helpers/notification_helpers.js +248 -0
- package/dist/helpers/phone_number_helpers.js +96 -0
- package/dist/helpers/redis/helpers.js +215 -0
- package/dist/helpers/redis/index.js +4 -0
- package/dist/helpers/redis/initialize.js +139 -0
- package/dist/helpers/redis/keys.js +23 -0
- package/dist/helpers/redis/snapshot.js +166 -0
- package/dist/helpers/start.js +83 -0
- package/dist/helpers/tasks_helpers.js +139 -0
- package/dist/helpers/time_helpers.js +167 -0
- package/dist/index.js +5 -0
- package/dist/managers/cache_manager.js +37 -0
- package/dist/managers/index.js +4 -0
- package/dist/managers/logger_manager.js +68 -0
- package/dist/managers/rabbitmq_manager.js +179 -0
- package/dist/managers/translation_manager.js +38 -0
- package/dist/middlewares/auth_mw.js +50 -0
- package/dist/middlewares/error_handling.js +20 -0
- package/dist/middlewares/global_mw.js +119 -0
- package/dist/middlewares/index.js +4 -0
- package/dist/middlewares/trim_mw.js +7 -0
- package/dist/test.js +1 -0
- package/dist/types/enums/global.js +8 -0
- package/dist/types/enums/index.js +1 -0
- package/dist/types/helpers/boards_helpers.d.ts +10 -0
- package/dist/types/helpers/email_helpers.d.ts +12 -0
- package/dist/types/helpers/firebase_helpers.d.ts +56 -0
- package/dist/types/helpers/global_helpers.d.ts +16 -0
- package/dist/types/helpers/index.d.ts +12 -0
- package/dist/types/helpers/location_helpers.d.ts +3 -0
- package/dist/types/helpers/login_helpers.d.ts +4 -0
- package/dist/types/helpers/notification_helpers.d.ts +11 -0
- package/dist/types/helpers/phone_number_helpers.d.ts +19 -0
- package/dist/types/helpers/redis/helpers.d.ts +11 -0
- package/dist/types/helpers/redis/index.d.ts +4 -0
- package/dist/types/helpers/redis/initialize.d.ts +6 -0
- package/dist/types/helpers/redis/keys.d.ts +5 -0
- package/dist/types/helpers/redis/snapshot.d.ts +2 -0
- package/dist/types/helpers/start.d.ts +4 -0
- package/dist/types/helpers/tasks_helpers.d.ts +25 -0
- package/dist/types/helpers/time_helpers.d.ts +40 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.js +3 -0
- package/dist/types/interfaces/index.js +2 -0
- package/dist/types/managers/cache_manager.d.ts +12 -0
- package/dist/types/managers/index.d.ts +4 -0
- package/dist/types/managers/logger_manager.d.ts +14 -0
- package/dist/types/managers/rabbitmq_manager.d.ts +60 -0
- package/dist/types/managers/translation_manager.d.ts +14 -0
- package/dist/types/middlewares/auth_mw.d.ts +4 -0
- package/dist/types/middlewares/error_handling.d.ts +11 -0
- package/dist/types/middlewares/global_mw.d.ts +5 -0
- package/dist/types/middlewares/index.d.ts +4 -0
- package/dist/types/middlewares/trim_mw.d.ts +2 -0
- package/dist/types/test.d.ts +0 -0
- package/dist/types/types/enums/global.d.ts +9 -0
- package/dist/types/types/enums/index.d.ts +1 -0
- package/dist/types/types/firebase_types.js +1 -0
- package/dist/types/types/global.js +1 -0
- package/dist/types/types/index.d.ts +3 -0
- package/dist/types/types/index.js +2 -0
- package/dist/types/types/interfaces/email.d.ts +33 -0
- package/dist/types/types/interfaces/global.d.ts +27 -0
- package/dist/types/types/interfaces/index.d.ts +2 -0
- package/dist/types/types/types/firebase_types.d.ts +50 -0
- package/dist/types/types/types/global.d.ts +17 -0
- package/dist/types/types/types/index.d.ts +2 -0
- package/package.json +5 -2
- package/dist/cjs/helpers/tasks.d.ts +0 -12
- package/dist/cjs/helpers/tasks.js +0 -62
- package/dist/cjs/helpers/tasks.js.map +0 -1
- package/dist/cjs/managers/cacche_manager2.d.ts +0 -18
- package/dist/cjs/managers/cacche_manager2.js +0 -41
- package/dist/cjs/managers/cacche_manager2.js.map +0 -1
- package/dist/cjs/managers/socket_manager.js +0 -245
- package/dist/cjs/managers/socket_manager.js.map +0 -1
- package/dist/esm/helpers/tasks.d.ts +0 -12
- package/dist/esm/helpers/tasks.js +0 -58
- package/dist/esm/helpers/tasks.js.map +0 -1
- package/dist/esm/managers/cacche_manager2.d.ts +0 -18
- package/dist/esm/managers/cacche_manager2.js +0 -37
- package/dist/esm/managers/cacche_manager2.js.map +0 -1
- package/dist/esm/managers/socket_manager.js +0 -243
- package/dist/esm/managers/socket_manager.js.map +0 -1
- /package/dist/{cjs/managers/socket_manager.d.ts → types/interfaces/email.js} +0 -0
- /package/dist/{esm/managers/socket_manager.d.ts → types/interfaces/global.js} +0 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { readFileSync } from "fs";
|
|
2
|
+
import { cache_manager, logger } from "../managers";
|
|
3
|
+
import { LanguageOptions } from "akeyless-types-commons";
|
|
4
|
+
import axios from "axios";
|
|
5
|
+
import https from "https";
|
|
6
|
+
export const init_env_variables = (required_vars = []) => {
|
|
7
|
+
required_vars.forEach((varName) => {
|
|
8
|
+
const env_val = process.env[varName];
|
|
9
|
+
if (!env_val) {
|
|
10
|
+
logger.error(`--- Error: Missing mandatory environment variable: ${varName}. ---`);
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
const env_vars = {};
|
|
15
|
+
Object.keys(process.env).forEach((var_name) => {
|
|
16
|
+
const env_val = process.env[var_name];
|
|
17
|
+
env_vars[var_name] = env_val;
|
|
18
|
+
});
|
|
19
|
+
return env_vars;
|
|
20
|
+
};
|
|
21
|
+
export const json_ok = (data) => {
|
|
22
|
+
return {
|
|
23
|
+
success: true,
|
|
24
|
+
data,
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
export const json_failed = (error, msg) => {
|
|
28
|
+
return {
|
|
29
|
+
success: false,
|
|
30
|
+
error: error.message || error || "general error: something happened ",
|
|
31
|
+
msg: msg,
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
export const parse_error = (error) => {
|
|
35
|
+
return error instanceof Error ? { name: error.name, message: error.message } : error;
|
|
36
|
+
};
|
|
37
|
+
export const get_version = (packageJsonPath) => {
|
|
38
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8"));
|
|
39
|
+
return packageJson.version;
|
|
40
|
+
};
|
|
41
|
+
export const sleep = (ms = 2500) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
42
|
+
const BASE_URLS = {
|
|
43
|
+
local: {
|
|
44
|
+
bi: "http://localhost:9002/api/bi",
|
|
45
|
+
call_center: "http://localhost:9003/api/call-center",
|
|
46
|
+
dashboard: "http://localhost",
|
|
47
|
+
devices: "http://localhost:9001/api/devices",
|
|
48
|
+
end_users: "http://10.100.102.9:9011/api/end-users",
|
|
49
|
+
notifications: "http://localhost:9006/api/notifications",
|
|
50
|
+
installer: "http://localhost",
|
|
51
|
+
ox_server: "http://localhost",
|
|
52
|
+
toolbox: "http://localhost",
|
|
53
|
+
},
|
|
54
|
+
prod: {
|
|
55
|
+
bi: "https://nx-api.info/api/bi",
|
|
56
|
+
call_center: "https://nx-api.info/api/call-center",
|
|
57
|
+
dashboard: "https://akeyless-dashboard.online",
|
|
58
|
+
devices: "https://nx-api.info/api/devices",
|
|
59
|
+
end_users: "https://nx-api.info/api/end-users",
|
|
60
|
+
notifications: "https://nx-api.info/api/notifications",
|
|
61
|
+
installer: "https://installerapp.online",
|
|
62
|
+
ox_server: "https://akeyless-online.info",
|
|
63
|
+
toolbox: "https://akeyless-toolbox.online",
|
|
64
|
+
},
|
|
65
|
+
qa: {
|
|
66
|
+
bi: "https://nx-api.xyz/api/bi",
|
|
67
|
+
call_center: "https://nx-api.xyz/api/call-center",
|
|
68
|
+
dashboard: "https://akeyless-dashboard.xyz",
|
|
69
|
+
devices: "https://nx-api.xyz/api/devices",
|
|
70
|
+
end_users: "https://nx-api.xyz/api/end-users",
|
|
71
|
+
notifications: "https://nx-api.xyz/api/notifications",
|
|
72
|
+
installer: "https://installerapp.xyz",
|
|
73
|
+
ox_server: "https://akeyless-online.xyz",
|
|
74
|
+
toolbox: "https://akeyless-toolbox.xyz",
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
export function get_nx_service_urls(env_name = "mode") {
|
|
78
|
+
const env_value = process.env[env_name]?.toLowerCase();
|
|
79
|
+
if (!env_value)
|
|
80
|
+
throw new Error(`missing [${env_name}] environment variable`);
|
|
81
|
+
const env_key = ["production", "prod"].includes(env_value) ? "prod" : env_value === "qa" ? "qa" : "local";
|
|
82
|
+
return BASE_URLS[env_key];
|
|
83
|
+
}
|
|
84
|
+
export const get_address_by_geo = async ({ lat, lng }, currentLanguage) => {
|
|
85
|
+
const address_not_found = "";
|
|
86
|
+
if (lat < -90 || lat > 90 || lng < -180 || lng > 180) {
|
|
87
|
+
return address_not_found;
|
|
88
|
+
}
|
|
89
|
+
const language = currentLanguage === LanguageOptions.He ? "iw" : "en";
|
|
90
|
+
const google_setting = cache_manager.getObjectData("nx-settings")["google"];
|
|
91
|
+
const geocode_api_key = google_setting["geocode_api_key"];
|
|
92
|
+
if (!geocode_api_key) {
|
|
93
|
+
throw new Error("missing env google api key");
|
|
94
|
+
}
|
|
95
|
+
const url = `https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${lng}&key=${geocode_api_key}&language=${language}`;
|
|
96
|
+
try {
|
|
97
|
+
const response = await axios.get(url);
|
|
98
|
+
if (response?.data?.results[0]) {
|
|
99
|
+
return response.data.results[0].formatted_address.slice(0, 35);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
return address_not_found;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
logger.error("getAddressByGeo error:", error);
|
|
107
|
+
return address_not_found;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
export const validate_and_cast = (variable, condition) => !!condition;
|
|
111
|
+
export const get_or_default = (value, default_value) => {
|
|
112
|
+
if (value !== undefined) {
|
|
113
|
+
return value;
|
|
114
|
+
}
|
|
115
|
+
return typeof default_value === "function" ? default_value() : default_value;
|
|
116
|
+
};
|
|
117
|
+
export const trim_strings = (input) => {
|
|
118
|
+
if (typeof input === "string") {
|
|
119
|
+
return input.trim();
|
|
120
|
+
}
|
|
121
|
+
if (Array.isArray(input)) {
|
|
122
|
+
return input.map(trim_strings);
|
|
123
|
+
}
|
|
124
|
+
if (input instanceof Date || input instanceof RegExp || input instanceof Map || input instanceof Set) {
|
|
125
|
+
return input;
|
|
126
|
+
}
|
|
127
|
+
if (input !== null && typeof input === "object") {
|
|
128
|
+
const trimmed_object = {};
|
|
129
|
+
for (const key of Object.getOwnPropertyNames(input)) {
|
|
130
|
+
if (Object.prototype.hasOwnProperty.call(input, key)) {
|
|
131
|
+
trimmed_object[key] = trim_strings(input[key]);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return trimmed_object;
|
|
135
|
+
}
|
|
136
|
+
return input;
|
|
137
|
+
};
|
|
138
|
+
export const remove_nulls_and_undefined = (obj) => {
|
|
139
|
+
return Object.fromEntries(Object.entries(obj).filter(([_, value]) => value !== undefined && value !== null));
|
|
140
|
+
};
|
|
141
|
+
export const ignore_ssl_request = async (config) => {
|
|
142
|
+
const { mode } = init_env_variables(["mode"]);
|
|
143
|
+
if (mode === "qa") {
|
|
144
|
+
config.httpsAgent = new https.Agent({ rejectUnauthorized: false });
|
|
145
|
+
}
|
|
146
|
+
return await axios(config);
|
|
147
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from "./global_helpers";
|
|
2
|
+
export * from "./firebase_helpers";
|
|
3
|
+
export * from "./start";
|
|
4
|
+
export * from "./time_helpers";
|
|
5
|
+
export * from "./login_helpers";
|
|
6
|
+
export * from "./notification_helpers";
|
|
7
|
+
export * from "./email_helpers";
|
|
8
|
+
export * from "./phone_number_helpers";
|
|
9
|
+
export * from "./tasks_helpers";
|
|
10
|
+
export * from "./boards_helpers";
|
|
11
|
+
export * from "./redis";
|
|
12
|
+
export * from "./location_helpers";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const get_distance_in_meters_between_geo_points = (location1, location2) => {
|
|
2
|
+
const toRadians = (angle) => angle * (Math.PI / 180);
|
|
3
|
+
const R = 6371e3;
|
|
4
|
+
const φ1 = toRadians(location1.lat);
|
|
5
|
+
const φ2 = toRadians(location2.lat);
|
|
6
|
+
const Δφ = toRadians(location2.lat - location1.lat);
|
|
7
|
+
const Δλ = toRadians(location2.lng - location1.lng);
|
|
8
|
+
const a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) + Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2);
|
|
9
|
+
const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
|
|
10
|
+
// distance in meters
|
|
11
|
+
return R * c;
|
|
12
|
+
};
|
|
13
|
+
export const get_location_url = (location) => {
|
|
14
|
+
return `https://www.google.com/maps?q=${location.lat},${location.lng}`;
|
|
15
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { query_document_optional } from "./firebase_helpers";
|
|
2
|
+
export const convert_to_short_phone_number = (phone_number) => {
|
|
3
|
+
return `0${phone_number.split("+972")[1]}`;
|
|
4
|
+
};
|
|
5
|
+
/// nx user
|
|
6
|
+
export const get_user_by_identifier = async (identifier, ignore_log = false) => {
|
|
7
|
+
if (identifier.includes("@") && identifier.includes(".")) {
|
|
8
|
+
const email_query = await query_document_optional("nx-users", "email", "==", identifier, ignore_log);
|
|
9
|
+
return email_query;
|
|
10
|
+
}
|
|
11
|
+
const phone_query = await query_document_optional("nx-users", "phone_number", "in", [convert_to_short_phone_number(identifier), identifier], ignore_log);
|
|
12
|
+
return phone_query;
|
|
13
|
+
};
|
|
14
|
+
/// mobile app user
|
|
15
|
+
export const get_mobile_app_user_by_uid = async (uid, ignore_log = false) => {
|
|
16
|
+
const user = (await query_document_optional("mobile_users_app_pro", "uid", "==", uid, ignore_log));
|
|
17
|
+
return user;
|
|
18
|
+
};
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import { cache_manager, logger, translation_manager } from "../managers";
|
|
3
|
+
import { add_document, messaging, add_audit_record, get_nx_settings } from "./firebase_helpers";
|
|
4
|
+
import { is_iccid, is_international_phone_number, is_israel_long_phone_number, is_thailand_long_phone_number } from "./phone_number_helpers";
|
|
5
|
+
import { Twilio } from "twilio";
|
|
6
|
+
import { Timestamp } from "firebase-admin/firestore";
|
|
7
|
+
import { v4 as uniqId } from "uuid";
|
|
8
|
+
import FormData from "form-data";
|
|
9
|
+
const send_local_sms = async (recepient, text, details) => {
|
|
10
|
+
const { sms_provider: { multisend }, } = cache_manager.getObjectData("nx-settings");
|
|
11
|
+
const msgId = uniqId();
|
|
12
|
+
let data = new FormData();
|
|
13
|
+
data.append("user", multisend.user);
|
|
14
|
+
data.append("password", multisend.password);
|
|
15
|
+
data.append("from", multisend.from);
|
|
16
|
+
data.append("recipient", recepient);
|
|
17
|
+
data.append("message", text);
|
|
18
|
+
data.append("customermessageid", msgId);
|
|
19
|
+
if (is_international_phone_number(recepient)) {
|
|
20
|
+
data.append("international", "1");
|
|
21
|
+
}
|
|
22
|
+
const config = {
|
|
23
|
+
method: "post",
|
|
24
|
+
maxBodyLength: Infinity,
|
|
25
|
+
url: "https://api.multisend.co.il/v2/sendsms",
|
|
26
|
+
data: data,
|
|
27
|
+
};
|
|
28
|
+
const response = await axios(config);
|
|
29
|
+
if (response.status !== 200) {
|
|
30
|
+
throw `multisend request failed , status: ${response.status} , data: ${JSON.stringify(response.data)}`;
|
|
31
|
+
}
|
|
32
|
+
if (!response.data.success) {
|
|
33
|
+
throw `http request to multisend error ${JSON.stringify(response.data.error)}`;
|
|
34
|
+
}
|
|
35
|
+
await keep_outgoing_sms(recepient, text, "multisend", msgId, details);
|
|
36
|
+
logger.log("send_local_sms. message sent successfully", { number: recepient, text, response: response.data });
|
|
37
|
+
return "multisend";
|
|
38
|
+
};
|
|
39
|
+
const send_international_sms = async (recepient, text, details) => {
|
|
40
|
+
const { sms_provider: { twilio }, } = cache_manager.getObjectData("nx-settings");
|
|
41
|
+
const twilioClient = new Twilio(twilio.account_sid, twilio.token);
|
|
42
|
+
const message = await twilioClient.messages.create({
|
|
43
|
+
messagingServiceSid: twilio.messaging_service_sid,
|
|
44
|
+
body: text,
|
|
45
|
+
to: recepient,
|
|
46
|
+
});
|
|
47
|
+
logger.log("twilio response", message);
|
|
48
|
+
if (message.errorMessage) {
|
|
49
|
+
throw `twilioClient.messages.create failed: ${message.errorMessage} `;
|
|
50
|
+
}
|
|
51
|
+
await keep_outgoing_sms(recepient, text, "twilio", message.sid, details);
|
|
52
|
+
logger.log("send_international_sms. message sent successfully", { number: recepient, text, response: message });
|
|
53
|
+
return "twilio";
|
|
54
|
+
};
|
|
55
|
+
const login_to_monogoto = async () => {
|
|
56
|
+
try {
|
|
57
|
+
const { sms_provider: { monogoto }, } = cache_manager.getObjectData("nx-settings");
|
|
58
|
+
const data = { username: monogoto.user, password: monogoto.password };
|
|
59
|
+
const response = await axios({
|
|
60
|
+
method: "post",
|
|
61
|
+
url: `https://api.monogoto.io/api/v1/auth/login`,
|
|
62
|
+
data,
|
|
63
|
+
});
|
|
64
|
+
return response.data;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
logger.error("monogoto login error:", error);
|
|
68
|
+
throw `login_to_monogoto failed: ` + error;
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
const send_iccid_sms = async (recepient, text, details) => {
|
|
72
|
+
const { sms_provider: { monogoto }, } = cache_manager.getObjectData("nx-settings");
|
|
73
|
+
const monogoto_auth = await login_to_monogoto();
|
|
74
|
+
const data = { message: text, from: monogoto.from };
|
|
75
|
+
const response = await axios({
|
|
76
|
+
method: "post",
|
|
77
|
+
url: `https://api.monogoto.io/api/v1/things/sms/sendSMS/${recepient}`,
|
|
78
|
+
data: data,
|
|
79
|
+
headers: {
|
|
80
|
+
Authorization: `Bearer ${monogoto_auth.access_token}`,
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
if (response.status !== 200) {
|
|
84
|
+
throw `monogoto request failed , status: ${response.status} , data: ${JSON.stringify(response.data)}`;
|
|
85
|
+
}
|
|
86
|
+
await keep_outgoing_sms(recepient, text, "monogoto", response.data, details);
|
|
87
|
+
logger.log("send_iccid_sms. message sent successfully", { number: recepient, text, response: response.data });
|
|
88
|
+
return "monogoto";
|
|
89
|
+
};
|
|
90
|
+
export const send_sms = async (recepient, text, entity_for_audit, details) => {
|
|
91
|
+
try {
|
|
92
|
+
let sms_to_send = [];
|
|
93
|
+
const { sms_groups } = await get_nx_settings();
|
|
94
|
+
if (sms_groups && sms_groups.values[recepient]) {
|
|
95
|
+
sms_groups.values[recepient].forEach((number) => {
|
|
96
|
+
sms_to_send.push(number);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
sms_to_send.push(recepient);
|
|
101
|
+
}
|
|
102
|
+
sms_to_send = [...new Set(sms_to_send)];
|
|
103
|
+
const promises = sms_to_send.map(async (number) => {
|
|
104
|
+
let service = null;
|
|
105
|
+
const is_international = is_international_phone_number(number) && !is_thailand_long_phone_number(number) && !is_israel_long_phone_number(number);
|
|
106
|
+
if (is_iccid(number)) {
|
|
107
|
+
service = await send_iccid_sms(number, text, details);
|
|
108
|
+
}
|
|
109
|
+
else if (is_international) {
|
|
110
|
+
service = await send_international_sms(number, text, details);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
service = await send_local_sms(number, text, details);
|
|
114
|
+
}
|
|
115
|
+
await add_audit_record("send_sms", entity_for_audit || "general", {
|
|
116
|
+
recepient: number,
|
|
117
|
+
message: text,
|
|
118
|
+
service,
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
await Promise.all(promises);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
logger.error(`${entity_for_audit}, send_sms failed:`, error);
|
|
125
|
+
throw `${entity_for_audit}, send_sms failed: ` + error;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
const keep_outgoing_sms = async (recepient, content, service, external_id, details) => {
|
|
129
|
+
const timestamp = Timestamp.now();
|
|
130
|
+
const data = {
|
|
131
|
+
external_id,
|
|
132
|
+
content,
|
|
133
|
+
recipient: recepient,
|
|
134
|
+
service,
|
|
135
|
+
timestamp,
|
|
136
|
+
status: "new",
|
|
137
|
+
};
|
|
138
|
+
if (details) {
|
|
139
|
+
data.details = details;
|
|
140
|
+
}
|
|
141
|
+
await add_document("nx-sms-out", data);
|
|
142
|
+
};
|
|
143
|
+
export const push_event_to_mobile_users = async (event) => {
|
|
144
|
+
const units = cache_manager.getArrayData("units");
|
|
145
|
+
const users_units = cache_manager.getArrayData("usersUnits");
|
|
146
|
+
const mobile_users_app_pro = cache_manager.getArrayData("mobile_users_app_pro");
|
|
147
|
+
const app_pro_extra_pushes = cache_manager.getArrayData("app_pro_extra_pushes");
|
|
148
|
+
console.log(`units: ${units.length}, users_units: ${users_units.length}, mobile_users_app_pro: ${mobile_users_app_pro.length}, app_pro_extra_pushes: ${app_pro_extra_pushes.length}`);
|
|
149
|
+
if (!units.length || !users_units.length || !mobile_users_app_pro.length) {
|
|
150
|
+
throw "push_event_to_mobile_users. missing cached data for any of the following: units, usersUnits, mobile_users_app_pro, app_pro_extra_pushes";
|
|
151
|
+
}
|
|
152
|
+
///-- main driver
|
|
153
|
+
const unit = units.find((unit) => unit.carId == event.car_number);
|
|
154
|
+
const main_driver = mobile_users_app_pro.find((user) => user.short_phone_number == unit.userPhone);
|
|
155
|
+
///-- secondary drivers
|
|
156
|
+
const secondary_units = users_units.filter((unit) => unit.carId == event.car_number);
|
|
157
|
+
const secondary_phone_numbers = secondary_units.map((unit) => unit.phone);
|
|
158
|
+
const secondary_drivers = mobile_users_app_pro.filter((user) => secondary_phone_numbers.includes(user.long_phone_number));
|
|
159
|
+
///-- extra users
|
|
160
|
+
const extra_uids = app_pro_extra_pushes.filter((doc) => doc.car_number == event.car_number).map((doc) => doc.uid);
|
|
161
|
+
const extra_drivers = extra_uids.length > 0 ? mobile_users_app_pro.filter((user) => extra_uids.includes(user.uid)) : [];
|
|
162
|
+
const drivers = [main_driver, ...secondary_drivers, ...extra_drivers];
|
|
163
|
+
for (const mobile_user of drivers) {
|
|
164
|
+
const source = event.source == "erm" || event.source == "erm2" ? "erm" : event.source;
|
|
165
|
+
if (mobile_user.disabled_events?.[event.car_number]?.[source]?.includes(event.event_id)) {
|
|
166
|
+
logger.log(`push_event_to_mobile_users. event ${event.event_id} / ${event.event_name} is disabled for user ${mobile_user.uid} / ${mobile_user.short_phone_number}`);
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
const mobile_user_language = mobile_user.language;
|
|
170
|
+
const language = { heb: "he", en: "en", ru: "ru" }[mobile_user_language];
|
|
171
|
+
const message_title = translation_manager.get_translation("push_notifications", language, "title", "event_from_device");
|
|
172
|
+
const message_body = translation_manager.get_translation("events_from_device", language, "", event.event_name);
|
|
173
|
+
await send_fcm_message(message_title, message_body, [mobile_user.fcm_token], "");
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
export const send_fcm_message = async (title, body, fcm_tokens, custom_sound) => {
|
|
177
|
+
fcm_tokens = [...new Set(fcm_tokens)];
|
|
178
|
+
if (fcm_tokens.length == 0) {
|
|
179
|
+
return {
|
|
180
|
+
success: false,
|
|
181
|
+
response: "No recipients",
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
if (fcm_tokens.length == 0) {
|
|
185
|
+
return {
|
|
186
|
+
success: false,
|
|
187
|
+
response: "No recipients",
|
|
188
|
+
success_count: 0,
|
|
189
|
+
failure_count: 0,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
const message = {
|
|
193
|
+
tokens: fcm_tokens,
|
|
194
|
+
notification: {
|
|
195
|
+
title: title,
|
|
196
|
+
body: body,
|
|
197
|
+
},
|
|
198
|
+
android: {
|
|
199
|
+
ttl: 3600 * 1000,
|
|
200
|
+
priority: "high",
|
|
201
|
+
notification: {
|
|
202
|
+
sound: custom_sound || "default",
|
|
203
|
+
channelId: custom_sound,
|
|
204
|
+
title: title,
|
|
205
|
+
body: body,
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
apns: {
|
|
209
|
+
payload: {
|
|
210
|
+
aps: {
|
|
211
|
+
sound: custom_sound ? `${custom_sound}.wav` : "default",
|
|
212
|
+
alert: {
|
|
213
|
+
title: title,
|
|
214
|
+
body: body,
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
},
|
|
219
|
+
};
|
|
220
|
+
try {
|
|
221
|
+
const response = await messaging.sendEachForMulticast(message);
|
|
222
|
+
const { successCount: success_count, failureCount: failure_count, responses } = response;
|
|
223
|
+
if (success_count && !failure_count) {
|
|
224
|
+
logger.log(`send_fcm_message. Successfully sent to all ${success_count} recipients. `, { title, body });
|
|
225
|
+
}
|
|
226
|
+
else if (success_count && failure_count) {
|
|
227
|
+
logger.log(`send_fcm_message. Successfully sent to ${success_count} recipients, but failed to sent to ${failure_count} recipients`, {
|
|
228
|
+
title,
|
|
229
|
+
body,
|
|
230
|
+
responses,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
logger.log(`send_fcm_message. Failed to sent to ${failure_count} recipients`, { title, body, responses: response.responses });
|
|
235
|
+
}
|
|
236
|
+
return {
|
|
237
|
+
success: success_count > 0 && failure_count == 0,
|
|
238
|
+
response: JSON.stringify(response.responses),
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
logger.error("Exception", error.message);
|
|
243
|
+
return {
|
|
244
|
+
success: false,
|
|
245
|
+
response: `Exception: ${error.message}`,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
};
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { SimProvider } from "../types/enums";
|
|
2
|
+
export const is_long_phone_number = (phone_number) => {
|
|
3
|
+
return phone_number.startsWith("+");
|
|
4
|
+
};
|
|
5
|
+
export const is_israel_long_phone_number = (phone_number) => {
|
|
6
|
+
return phone_number.startsWith("+972");
|
|
7
|
+
};
|
|
8
|
+
export const is_thailand_long_phone_number = (phone_number) => {
|
|
9
|
+
return phone_number.startsWith("+66");
|
|
10
|
+
};
|
|
11
|
+
export const is_international_phone_number = (phone_number) => {
|
|
12
|
+
return is_long_phone_number(phone_number) && !is_israel_long_phone_number(phone_number);
|
|
13
|
+
};
|
|
14
|
+
export const is_iccid = (number) => {
|
|
15
|
+
if (number.length < 19 || number.length > 22)
|
|
16
|
+
return false;
|
|
17
|
+
if (!/^\d+$/.test(number))
|
|
18
|
+
return false;
|
|
19
|
+
if (!number.startsWith("89"))
|
|
20
|
+
return false;
|
|
21
|
+
return true;
|
|
22
|
+
};
|
|
23
|
+
export const convert_to_short_israel_phone = (international_number) => {
|
|
24
|
+
const base = international_number.replace("+972", "");
|
|
25
|
+
return base.startsWith("130") ? base : `0${base}`;
|
|
26
|
+
};
|
|
27
|
+
export const is_sim_provider_partner = (phone_number) => {
|
|
28
|
+
const { short_phone_number } = long_short_phone_numbers(phone_number);
|
|
29
|
+
return short_phone_number.startsWith("054") || short_phone_number.startsWith("1302");
|
|
30
|
+
};
|
|
31
|
+
export const is_sim_provider_pelephone = (phone_number) => {
|
|
32
|
+
const { short_phone_number } = long_short_phone_numbers(phone_number);
|
|
33
|
+
return short_phone_number.startsWith("050");
|
|
34
|
+
};
|
|
35
|
+
export const is_sim_provider_celcom = (phone_number) => {
|
|
36
|
+
const { short_phone_number } = long_short_phone_numbers(phone_number);
|
|
37
|
+
return short_phone_number.startsWith("052") || short_phone_number.startsWith("1303");
|
|
38
|
+
};
|
|
39
|
+
export const is_sim_provider_monogoto = (phone_number) => {
|
|
40
|
+
return is_iccid(phone_number);
|
|
41
|
+
};
|
|
42
|
+
export const get_sim_provider = (phone_number) => {
|
|
43
|
+
if (is_sim_provider_partner(phone_number)) {
|
|
44
|
+
return SimProvider.partner;
|
|
45
|
+
}
|
|
46
|
+
if (is_sim_provider_pelephone(phone_number)) {
|
|
47
|
+
return SimProvider.pelephone;
|
|
48
|
+
}
|
|
49
|
+
if (is_sim_provider_celcom(phone_number)) {
|
|
50
|
+
return SimProvider.celcom;
|
|
51
|
+
}
|
|
52
|
+
if (is_sim_provider_monogoto(phone_number)) {
|
|
53
|
+
return SimProvider.monogoto;
|
|
54
|
+
}
|
|
55
|
+
return SimProvider.unknown;
|
|
56
|
+
};
|
|
57
|
+
export const long_short_phone_numbers = (phone_number) => {
|
|
58
|
+
phone_number = phone_number.trim();
|
|
59
|
+
if (!phone_number.length) {
|
|
60
|
+
return {
|
|
61
|
+
short_phone_number: phone_number,
|
|
62
|
+
long_phone_number: phone_number,
|
|
63
|
+
is_israeli: true,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
if (is_iccid(phone_number)) {
|
|
67
|
+
return {
|
|
68
|
+
short_phone_number: phone_number,
|
|
69
|
+
long_phone_number: phone_number,
|
|
70
|
+
is_israeli: false,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
let short_phone_number = phone_number;
|
|
74
|
+
let long_phone_number = phone_number;
|
|
75
|
+
if (phone_number.startsWith("05")) {
|
|
76
|
+
short_phone_number = phone_number;
|
|
77
|
+
long_phone_number = long_phone_number.replace("05", "+9725");
|
|
78
|
+
}
|
|
79
|
+
else if (phone_number.startsWith("103")) {
|
|
80
|
+
short_phone_number = phone_number;
|
|
81
|
+
long_phone_number = `+972${short_phone_number}`;
|
|
82
|
+
}
|
|
83
|
+
else if (phone_number.startsWith("+972")) {
|
|
84
|
+
long_phone_number = phone_number;
|
|
85
|
+
short_phone_number = long_phone_number.replace("+9725", "05");
|
|
86
|
+
}
|
|
87
|
+
else if (phone_number.startsWith("+1")) {
|
|
88
|
+
long_phone_number = phone_number;
|
|
89
|
+
short_phone_number = long_phone_number.replace("+1", "");
|
|
90
|
+
}
|
|
91
|
+
return {
|
|
92
|
+
short_phone_number,
|
|
93
|
+
long_phone_number,
|
|
94
|
+
is_israeli: long_phone_number.startsWith("+972"),
|
|
95
|
+
};
|
|
96
|
+
};
|