flexbiz-server 12.3.29 → 12.3.31
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/install_centos7.sh +474 -0
- package/package.json +1 -1
- package/server/app.js +16 -16
- package/server/cluster.js +16 -16
- package/server/global.js +1 -1
- package/server/libs/utils.js +1 -1
- package/server/models/user.js +12 -17
- package/server/modules/vouchers/vo-hd2.js +3 -3
- package/server/route.js +21 -25
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
#Cấp quyền thực thi: chmod +x install_centos7.sh.
|
|
3
|
+
#Chạy script với quyền root: sudo ./install_centos7.sh.
|
|
4
|
+
# Cập nhật hệ thống
|
|
5
|
+
echo "Đang cập nhật hệ thống..."
|
|
6
|
+
sudo yum update -y
|
|
7
|
+
sudo yum install -y epel-release
|
|
8
|
+
echo "Cập nhật hệ thống hoàn tất."
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# --- Cài đặt MongoDB (Phiên bản mới nhất - 7.0) ---
|
|
12
|
+
echo ""
|
|
13
|
+
echo "--- Bắt đầu cài đặt MongoDB ---"
|
|
14
|
+
# Tạo repo file chỉ khi nó chưa tồn tại hoặc nội dung không đúng
|
|
15
|
+
if ! grep -q "mongodb-org-7.0" /etc/yum.repos.d/mongodb-org-7.0.repo; then
|
|
16
|
+
echo "Tạo file repo cho MongoDB 7.0..."
|
|
17
|
+
sudo tee /etc/yum.repos.d/mongodb-org-7.0.repo <<EOL
|
|
18
|
+
[mongodb-org-7.0]
|
|
19
|
+
name=MongoDB Repository
|
|
20
|
+
baseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/7.0/x86_64/
|
|
21
|
+
gpgcheck=1
|
|
22
|
+
enabled=1
|
|
23
|
+
gpgkey=https://www.mongodb.org/static/pgp/server-7.0.asc
|
|
24
|
+
EOL
|
|
25
|
+
fi
|
|
26
|
+
sudo yum install -y mongodb-org
|
|
27
|
+
|
|
28
|
+
# Đảm bảo user/group mongod tồn tại và có đủ quyền
|
|
29
|
+
echo "Kiểm tra và cấu hình lại quyền cho user mongod..."
|
|
30
|
+
if ! id "mongod" &>/dev/null; then
|
|
31
|
+
echo "Tạo user và group mongod nếu chưa tồn tại..."
|
|
32
|
+
sudo groupadd -r mongod || true # Tạo group, bỏ qua lỗi nếu đã tồn tại
|
|
33
|
+
sudo useradd -r -g mongod -s /sbin/nologin -M mongod || true # Tạo user, bỏ qua lỗi nếu đã tồn tại
|
|
34
|
+
fi
|
|
35
|
+
|
|
36
|
+
# Đảm bảo quyền sở hữu và truy cập cho các thư mục MongoDB
|
|
37
|
+
sudo chown -R mongod:mongod /var/lib/mongo
|
|
38
|
+
sudo chown -R mongod:mongod /var/log/mongodb
|
|
39
|
+
|
|
40
|
+
# Chỉnh sửa file service của MongoDB để thêm Restart=always và LimitNOFILE
|
|
41
|
+
# Kiểm tra xem dòng đã tồn tại chưa trước khi thêm để tránh trùng lặp
|
|
42
|
+
if ! grep -q "Restart=always" /lib/systemd/system/mongod.service; then
|
|
43
|
+
echo "Thêm Restart=always vào mongod.service..."
|
|
44
|
+
sudo sed -i '/^\[Service\]/aRestart=always' /lib/systemd/system/mongod.service
|
|
45
|
+
fi
|
|
46
|
+
if ! grep -q "LimitNOFILE=1500000" /lib/systemd/system/mongod.service; then
|
|
47
|
+
echo "Thêm LimitNOFILE=1500000 vào mongod.service..."
|
|
48
|
+
sudo sed -i '/^\[Service\]/aLimitNOFILE=1500000' /lib/systemd/system/mongod.service
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
sudo systemctl daemon-reload # Tải lại cấu hình systemd
|
|
52
|
+
sudo systemctl start mongod
|
|
53
|
+
sudo systemctl enable mongod
|
|
54
|
+
echo "Cài đặt MongoDB hoàn tất."
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# --- Cài đặt Redis và cấu hình vĩnh viễn ---
|
|
58
|
+
echo ""
|
|
59
|
+
echo "--- Bắt đầu cài đặt Redis và cấu hình vĩnh viễn ---"
|
|
60
|
+
sudo yum install -y redis
|
|
61
|
+
sudo systemctl stop redis # Dừng Redis để chỉnh sửa cấu hình an toàn
|
|
62
|
+
|
|
63
|
+
# Cấu hình Redis trong /etc/redis.conf
|
|
64
|
+
echo "Áp dụng cấu hình Redis vào /etc/redis.conf..."
|
|
65
|
+
REDIS_CONF="/etc/redis.conf"
|
|
66
|
+
|
|
67
|
+
# stop-writes-on-bgsave-error
|
|
68
|
+
if ! grep -q "stop-writes-on-bgsave-error no" "$REDIS_CONF"; then
|
|
69
|
+
sudo sed -i 's/^stop-writes-on-bgsave-error yes/stop-writes-on-bgsave-error no/' "$REDIS_CONF"
|
|
70
|
+
if ! grep -q "stop-writes-on-bgsave-error no" "$REDIS_CONF"; then # Nếu không có yes/no nào thì thêm mới
|
|
71
|
+
echo "stop-writes-on-bgsave-error no" | sudo tee -a "$REDIS_CONF"
|
|
72
|
+
fi
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
# dir và dbfilename
|
|
76
|
+
if grep -q "^dir " "$REDIS_CONF"; then
|
|
77
|
+
sudo sed -i 's|^dir .*|dir /home|' "$REDIS_CONF"
|
|
78
|
+
else
|
|
79
|
+
echo "dir /home" | sudo tee -a "$REDIS_CONF"
|
|
80
|
+
fi
|
|
81
|
+
|
|
82
|
+
if grep -q "^dbfilename " "$REDIS_CONF"; then
|
|
83
|
+
sudo sed -i 's/^dbfilename .*/dbfilename temp.rdb/' "$REDIS_CONF"
|
|
84
|
+
else
|
|
85
|
+
echo "dbfilename temp.rdb" | sudo tee -a "$REDIS_CONF"
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
# Vô hiệu hóa lưu dữ liệu vào đĩa (CẢNH BÁO: Mất dữ liệu khi khởi động lại)
|
|
89
|
+
# Vô hiệu hóa appendonly
|
|
90
|
+
if grep -q "^appendonly yes" "$REDIS_CONF"; then
|
|
91
|
+
sudo sed -i 's/^appendonly yes/appendonly no/' "$REDIS_CONF"
|
|
92
|
+
elif ! grep -q "^appendonly no" "$REDIS_CONF"; then
|
|
93
|
+
echo "appendonly no" | sudo tee -a "$REDIS_CONF"
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
# Vô hiệu hóa save
|
|
97
|
+
sudo sed -i '/^save /d' "$REDIS_CONF" # Xóa tất cả các dòng save cũ
|
|
98
|
+
echo "save \"\"" | sudo tee -a "$REDIS_CONF" # Thêm dòng save rỗng
|
|
99
|
+
|
|
100
|
+
# Cấu hình vm.overcommit_memory để tránh lỗi "Cannot allocate memory"
|
|
101
|
+
echo "Cấu hình vm.overcommit_memory..."
|
|
102
|
+
if ! grep -q "vm.overcommit_memory=1" /etc/sysctl.conf; then
|
|
103
|
+
echo "vm.overcommit_memory=1" | sudo tee -a /etc/sysctl.conf
|
|
104
|
+
sudo sysctl -p # Tải lại cấu hình sysctl chỉ khi thay đổi
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
sudo systemctl start redis
|
|
108
|
+
sudo systemctl enable redis
|
|
109
|
+
echo "Cài đặt Redis và cấu hình hoàn tất."
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
# --- Cài đặt Node.js (Phiên bản LTS mới nhất) ---
|
|
113
|
+
echo ""
|
|
114
|
+
echo "--- Bắt đầu cài đặt Node.js ---"
|
|
115
|
+
# Chỉ thêm repo nếu chưa có
|
|
116
|
+
if ! grep -q "nodesource.com" /etc/yum.repos.d/nodesource-el7.repo; then
|
|
117
|
+
echo "Thêm kho NodeSource LTS..."
|
|
118
|
+
curl -sL https://rpm.nodesource.com/setup_lts.x | sudo bash -
|
|
119
|
+
fi
|
|
120
|
+
sudo yum install -y nodejs
|
|
121
|
+
echo "Cài đặt Node.js hoàn tất."
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
# --- Cài đặt PM2 ---
|
|
125
|
+
echo ""
|
|
126
|
+
echo "--- Bắt đầu cài đặt PM2 ---"
|
|
127
|
+
sudo npm install -g pm2
|
|
128
|
+
# Chỉ chạy startup nếu PM2 chưa được cấu hình cho systemd
|
|
129
|
+
if ! sudo systemctl is-enabled pm2-$(whoami) &>/dev/null; then
|
|
130
|
+
echo "Cấu hình PM2 khởi động cùng hệ thống..."
|
|
131
|
+
sudo env PATH=\$PATH:/usr/bin pm2 startup systemd -u $(whoami) --hp /home/$(whoami)
|
|
132
|
+
fi
|
|
133
|
+
echo "Cài đặt PM2 hoàn tất."
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
# --- Cài đặt Nginx và cấu hình SELinux ---
|
|
137
|
+
echo ""
|
|
138
|
+
echo "--- Bắt đầu cài đặt Nginx và cấu hình SELinux ---"
|
|
139
|
+
sudo yum install -y nginx
|
|
140
|
+
sudo systemctl start nginx
|
|
141
|
+
sudo systemctl enable nginx
|
|
142
|
+
# Mở cổng HTTP/HTTPS trong Firewall chỉ khi chưa mở
|
|
143
|
+
if ! sudo firewall-cmd --list-services --permanent | grep -q "http"; then
|
|
144
|
+
echo "Mở cổng HTTP trong Firewall..."
|
|
145
|
+
sudo firewall-cmd --permanent --add-service=http
|
|
146
|
+
fi
|
|
147
|
+
if ! sudo firewall-cmd --list-services --permanent | grep -q "https"; then
|
|
148
|
+
echo "Mở cổng HTTPS trong Firewall..."
|
|
149
|
+
sudo firewall-cmd --permanent --add-service=https
|
|
150
|
+
fi
|
|
151
|
+
sudo firewall-cmd --reload
|
|
152
|
+
# Cấu hình SELinux để Nginx có thể kết nối mạng chỉ khi chưa được đặt
|
|
153
|
+
if ! getsebool httpd_can_network_connect | grep -q "on"; then
|
|
154
|
+
echo "Cấu hình SELinux cho Nginx..."
|
|
155
|
+
sudo setsebool -P httpd_can_network_connect on
|
|
156
|
+
fi
|
|
157
|
+
echo "Cài đặt Nginx và cấu hình SELinux hoàn tất."
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
# --- Tạo 20GB RAM ảo (Swap Space) ---
|
|
161
|
+
echo ""
|
|
162
|
+
echo "--- Bắt đầu tạo 20GB RAM ảo (Swap Space) ---"
|
|
163
|
+
if [ ! -f /swapfile ]; then # Chỉ tạo swapfile nếu nó chưa tồn tại
|
|
164
|
+
echo "Tạo file swap 20GB..."
|
|
165
|
+
sudo fallocate -l 20G /swapfile
|
|
166
|
+
sudo chmod 600 /swapfile
|
|
167
|
+
sudo mkswap /swapfile
|
|
168
|
+
sudo swapon /swapfile
|
|
169
|
+
# Thêm vào fstab chỉ khi dòng chưa tồn tại
|
|
170
|
+
if ! grep -q "/swapfile none swap sw 0 0" /etc/fstab; then
|
|
171
|
+
echo "Thêm swapfile vào /etc/fstab..."
|
|
172
|
+
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
|
|
173
|
+
fi
|
|
174
|
+
else
|
|
175
|
+
echo "Swapfile đã tồn tại. Kiểm tra và kích hoạt nếu cần."
|
|
176
|
+
if ! swapon --show | grep -q "/swapfile"; then
|
|
177
|
+
sudo swapon /swapfile
|
|
178
|
+
fi
|
|
179
|
+
fi
|
|
180
|
+
echo "Tạo 20GB RAM ảo hoàn tất."
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
# --- Tạo dự án Node.js và cấu hình Babel Build ---
|
|
184
|
+
echo ""
|
|
185
|
+
echo "--- Bắt đầu tạo dự án Node.js và cấu hình Babel Build ---"
|
|
186
|
+
|
|
187
|
+
# Lấy đường dẫn của script hiện tại
|
|
188
|
+
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
|
|
189
|
+
|
|
190
|
+
# Hỏi tên dự án từ người dùng
|
|
191
|
+
read -p "Nhập tên dự án Node.js của bạn (mặc định: flexbiz-server): " PROJECT_NAME
|
|
192
|
+
PROJECT_NAME=${PROJECT_NAME:-flexbiz-server} # Đặt giá trị mặc định nếu người dùng không nhập gì
|
|
193
|
+
|
|
194
|
+
PROJECT_PATH="$SCRIPT_DIR/$PROJECT_NAME"
|
|
195
|
+
|
|
196
|
+
# Kiểm tra xem thư mục dự án đã tồn tại chưa
|
|
197
|
+
if [ -d "$PROJECT_PATH" ]; then
|
|
198
|
+
echo "Thư mục dự án '$PROJECT_NAME' đã tồn tại tại '$PROJECT_PATH'."
|
|
199
|
+
echo "Bỏ qua việc tạo dự án và cài đặt dependencies/cấu hình ban đầu."
|
|
200
|
+
cd "$PROJECT_PATH" || { echo "Lỗi: Không thể chuyển đến thư mục dự án đã tồn tại."; exit 1; }
|
|
201
|
+
else
|
|
202
|
+
echo "Tạo thư mục dự án: $PROJECT_PATH"
|
|
203
|
+
mkdir -p "$PROJECT_PATH"
|
|
204
|
+
|
|
205
|
+
echo "Chuyển đến thư mục dự án và khởi tạo Node.js project..."
|
|
206
|
+
cd "$PROJECT_PATH" || { echo "Lỗi: Không thể chuyển đến thư mục dự án."; exit 1; }
|
|
207
|
+
|
|
208
|
+
npm init -y # Khởi tạo package.json với các giá trị mặc định
|
|
209
|
+
|
|
210
|
+
echo "Cài đặt các dependencies và devDependencies..."
|
|
211
|
+
npm install "blocked-at@^1.2.0" "flexbiz-server@latest" "http-proxy-middleware@3.0.5" # dependencies
|
|
212
|
+
npm install --save-dev "@babel/cli" "@babel/core" "@babel/node" "@babel/preset-env" # devDependencies
|
|
213
|
+
|
|
214
|
+
echo "Tạo file .babelrc..."
|
|
215
|
+
cat << EOF > "$PROJECT_PATH/.babelrc"
|
|
216
|
+
{
|
|
217
|
+
"presets": ["@babel/preset-env"]
|
|
218
|
+
}
|
|
219
|
+
EOF
|
|
220
|
+
|
|
221
|
+
echo "Tạo thư mục src và file src/index.js..."
|
|
222
|
+
mkdir -p "$PROJECT_PATH/src"
|
|
223
|
+
cat << 'EOF_INDEXJS' > "$PROJECT_PATH/src/index.js"
|
|
224
|
+
import express from "express";
|
|
225
|
+
import Server from 'flexbiz-server/server/app';
|
|
226
|
+
const configs = require("./configs");
|
|
227
|
+
|
|
228
|
+
const app = express();
|
|
229
|
+
|
|
230
|
+
// Áp dụng các cấu hình
|
|
231
|
+
configs.use_ssl = false;
|
|
232
|
+
configs.BLOCKCHAIN_SOCKET = false;
|
|
233
|
+
configs.limitRequestSize = '50mb';
|
|
234
|
+
configs.limitFileSize = 1024*1024*50;
|
|
235
|
+
configs.has_api_barcode = true;
|
|
236
|
+
configs.createIndexes = true;
|
|
237
|
+
|
|
238
|
+
const port = process.argv[2] || 9999;
|
|
239
|
+
console.log("file start with port", port);
|
|
240
|
+
|
|
241
|
+
Server(app, {
|
|
242
|
+
configs,
|
|
243
|
+
port,
|
|
244
|
+
input_cpus: 4,
|
|
245
|
+
import_cpus: 1,
|
|
246
|
+
report_cpus: 1,
|
|
247
|
+
createRedisCache: true,
|
|
248
|
+
useSocket: true,
|
|
249
|
+
useAgenda: false,
|
|
250
|
+
cluster: false,
|
|
251
|
+
});
|
|
252
|
+
EOF_INDEXJS
|
|
253
|
+
|
|
254
|
+
echo "Tạo file src/configs.js (placeholder)..."
|
|
255
|
+
cat << 'EOF_CONFIGSJS' > "$PROJECT_PATH/src/configs.js"
|
|
256
|
+
// Đây là một file configs.js placeholder.
|
|
257
|
+
// Bạn cần thay đổi nội dung này với các cấu hình thực tế của mình.
|
|
258
|
+
exports.domain = 'localhost';
|
|
259
|
+
exports.api_url = 'http://localhost';
|
|
260
|
+
exports.home_url = 'http://localhost';
|
|
261
|
+
|
|
262
|
+
//Các domain không hạn chế quyền truy cập. Có thể khai báo trong api domain
|
|
263
|
+
exports.trust_domains = "";
|
|
264
|
+
exports.trust_keys =[];
|
|
265
|
+
|
|
266
|
+
exports.company = 'Tên công ty';
|
|
267
|
+
exports.program = "";
|
|
268
|
+
exports.version = "7.0.1";
|
|
269
|
+
exports.PORT = '443';
|
|
270
|
+
exports.use_ssl = true;
|
|
271
|
+
exports.trust_proxy = true;
|
|
272
|
+
exports.check_expire_date = false;//Kiểm tra hạn sử dụng của công ty
|
|
273
|
+
exports.timezone = 'Asia/Ho_Chi_Minh';
|
|
274
|
+
exports.initSysData = false;
|
|
275
|
+
exports.limitRequestSize = '5mb';
|
|
276
|
+
exports.limitFileSize = 1024*1024*2;
|
|
277
|
+
exports.limitRowImport = 20000;//giới hạn số dòng mỗi lần import
|
|
278
|
+
|
|
279
|
+
exports.cryptoPassword = 'ABC@1';//khoá dùng để mã hoá dữ liệu. cần thay đổi thông tin này
|
|
280
|
+
exports.MAX_TRY_OTP =3;
|
|
281
|
+
|
|
282
|
+
//maxLag for toobusy
|
|
283
|
+
exports.maxLag = 5000;
|
|
284
|
+
|
|
285
|
+
exports.check_token_expired = false;//Kiểm tra hạn sử dụng của token
|
|
286
|
+
exports.require_verify = false;//Yêu cầu user phải xác thực tài khoản trước khi sử dụng
|
|
287
|
+
exports.use_pin_as_otp = false;//Sử dụng mã pin thay cho OTP
|
|
288
|
+
|
|
289
|
+
exports.APP_SECRET = "";
|
|
290
|
+
//Token của user public
|
|
291
|
+
exports.public_token = "flex.public.token";
|
|
292
|
+
//Key để push thông báo qua website: use tool of webPush to create a vapidkeys. just need to run: web-push generate-vapid-keys --json
|
|
293
|
+
exports.vapidKeys = {"publicKey":"","privateKey":""}
|
|
294
|
+
//recaptcha
|
|
295
|
+
exports.GOOGLE_RECAPTCHA_SECRET_KEY = "";
|
|
296
|
+
//sử đụng google transtale api để tự động dịch label hay tin tức
|
|
297
|
+
exports.GOOGLE_TRANSLATE_API_KEY = "";
|
|
298
|
+
//đường dẫn các thư mục chứa source code và tài nguyên của hệ thống
|
|
299
|
+
exports.paths={
|
|
300
|
+
public:__dirname + "/public",
|
|
301
|
+
modules:__dirname + "/modules",
|
|
302
|
+
models:__dirname + "/models",
|
|
303
|
+
templates: __dirname + "/templates",
|
|
304
|
+
images: __dirname + "/images",
|
|
305
|
+
videos: __dirname + "/videos",
|
|
306
|
+
uploads: __dirname + "/uploads",
|
|
307
|
+
log: __dirname + "/log",
|
|
308
|
+
admin: "",
|
|
309
|
+
maps:"",
|
|
310
|
+
workers:""
|
|
311
|
+
}
|
|
312
|
+
//Cấu hình giới hạn băng thông truy cập
|
|
313
|
+
exports.limitRequest={
|
|
314
|
+
api:{
|
|
315
|
+
duration: 1,//seconds
|
|
316
|
+
points: 1000,
|
|
317
|
+
blockDuration:0,//seconds
|
|
318
|
+
},
|
|
319
|
+
sys:{
|
|
320
|
+
duration: 1,//seconds
|
|
321
|
+
points: 1000,
|
|
322
|
+
blockDuration:0,//seconds
|
|
323
|
+
},
|
|
324
|
+
public:{
|
|
325
|
+
duration: 1,//seconds
|
|
326
|
+
points: 1000,
|
|
327
|
+
blockDuration:0,//seconds
|
|
328
|
+
},
|
|
329
|
+
//required
|
|
330
|
+
auth:{
|
|
331
|
+
duration: 1,//seconds
|
|
332
|
+
points: 1000,
|
|
333
|
+
blockDuration:0,//seconds
|
|
334
|
+
},
|
|
335
|
+
//required
|
|
336
|
+
other:{
|
|
337
|
+
duration: 1,//seconds
|
|
338
|
+
points: 1000,
|
|
339
|
+
blockDuration:0,//seconds
|
|
340
|
+
},
|
|
341
|
+
}
|
|
342
|
+
//Cấu hình smtp để gửi email thông báo mặc định. Có thể cấu hình cho từng công ty thông qua màn hình khai báo thông tin công ty
|
|
343
|
+
exports.sender = {
|
|
344
|
+
"host": "",
|
|
345
|
+
"port": 465,
|
|
346
|
+
"requireTLS": true,
|
|
347
|
+
"tls": {
|
|
348
|
+
"ciphers": 'SSLv3'
|
|
349
|
+
},
|
|
350
|
+
"secureConnection": false,
|
|
351
|
+
"auth": {
|
|
352
|
+
"user": "",
|
|
353
|
+
"pass": ""
|
|
354
|
+
},
|
|
355
|
+
"name":"System"
|
|
356
|
+
}
|
|
357
|
+
exports.sender_otp = exports.sender;
|
|
358
|
+
//Tự động tạo user ADMIN
|
|
359
|
+
exports.adminUsers = [
|
|
360
|
+
{
|
|
361
|
+
email: 'admin',
|
|
362
|
+
name: 'Admin',
|
|
363
|
+
defaultPassword: 'admin@123456'
|
|
364
|
+
}
|
|
365
|
+
];
|
|
366
|
+
//Admin hệ thống cao nhất
|
|
367
|
+
exports.supperAdmin = "admin";
|
|
368
|
+
//Các admin phụ
|
|
369
|
+
exports.subAdmins = [];
|
|
370
|
+
//User Partners
|
|
371
|
+
exports.partnerUsers = [];
|
|
372
|
+
//
|
|
373
|
+
exports.admins =exports.adminUsers.map(u=>u.email)
|
|
374
|
+
exports.partners = exports.partnerUsers.map(u=>u.email);
|
|
375
|
+
//Danh sách các user support hệ thống: là các admin và subAdmins
|
|
376
|
+
exports.supportUsers = [...exports.admins,...exports.subAdmins];
|
|
377
|
+
console.log("support users",exports.supportUsers);
|
|
378
|
+
//cấu hình sms dùng để gửi tin nhắn OTP
|
|
379
|
+
exports.sms = {
|
|
380
|
+
send: async (Phone,otp_code,id_app)=>{
|
|
381
|
+
let Brandname="";
|
|
382
|
+
let Content =``;
|
|
383
|
+
let ApiKey = "";
|
|
384
|
+
let SecretKey = "";
|
|
385
|
+
let SmsType ="2";
|
|
386
|
+
let url = ``
|
|
387
|
+
|
|
388
|
+
const axios = require('axios');
|
|
389
|
+
try{
|
|
390
|
+
let data = (await axios.get(url)).data;
|
|
391
|
+
if(data.CodeResult=="100"){
|
|
392
|
+
return data;
|
|
393
|
+
}else{
|
|
394
|
+
throw data.message || data.ErrorMessage || data.error || data;
|
|
395
|
+
}
|
|
396
|
+
}catch(e){
|
|
397
|
+
console.error("send sms",e);
|
|
398
|
+
throw e.message || e.ErrorMessage || e;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
//openapi key dùng để kết nối với chatgpt
|
|
403
|
+
exports.openapi_key = "";
|
|
404
|
+
|
|
405
|
+
//google key để đọc file google document và các dịch vụ khác của google
|
|
406
|
+
exports.google_credentials = {
|
|
407
|
+
|
|
408
|
+
}
|
|
409
|
+
//Cấu hình đăng nhập bằng google nếu cần
|
|
410
|
+
exports.google = {
|
|
411
|
+
clientID: '',
|
|
412
|
+
clientSecret: '',
|
|
413
|
+
callbackURL: exports.domain + '/auth/google/callback',
|
|
414
|
+
scope: ['profile', 'email', 'https://www.googleapis.com/auth/drive']
|
|
415
|
+
};
|
|
416
|
+
//Cấu hình đăng nhập bằng facebook nếu cần
|
|
417
|
+
exports.facebook = {
|
|
418
|
+
clientID: '',
|
|
419
|
+
clientSecret: '',
|
|
420
|
+
callbackURL: exports.domain + '/auth/facebook/callback',
|
|
421
|
+
scope: ['email']
|
|
422
|
+
};
|
|
423
|
+
//Cấu hình database
|
|
424
|
+
exports.database = {
|
|
425
|
+
url: 'mongodb://127.0.0.1/flexbiz'
|
|
426
|
+
};
|
|
427
|
+
EOF_CONFIGSJS
|
|
428
|
+
|
|
429
|
+
echo "Cập nhật scripts trong package.json..."
|
|
430
|
+
# Cài đặt jq nếu chưa có
|
|
431
|
+
if ! command -v jq &> /dev/null; then
|
|
432
|
+
echo "Cài đặt jq để chỉnh sửa package.json..."
|
|
433
|
+
sudo yum install -y jq
|
|
434
|
+
fi
|
|
435
|
+
|
|
436
|
+
# Cập nhật script "build"
|
|
437
|
+
jq '.scripts.build = "babel src -d dist"' package.json > temp.json && mv temp.json package.json
|
|
438
|
+
# Cập nhật script "start" để chạy code đã biên dịch
|
|
439
|
+
jq '.scripts.start = "NODE_ENV=production NODE_OPTIONS=--max-old-space-size=2000 node dist/index.js"' package.json > temp.json && mv temp.json package.json
|
|
440
|
+
# Cập nhật script "dev" để chạy với babel-node (cho phát triển)
|
|
441
|
+
jq '.scripts.dev = "NODE_OPTIONS=--max-old-space-size=2000 babel-node src/index.js"' package.json > temp.json && mv temp.json package.json
|
|
442
|
+
|
|
443
|
+
# Xóa script "test" mặc định nếu nó còn là "echo \"Error: no test specified\" && exit 1"
|
|
444
|
+
if grep -q '"test": "echo \\"Error: no test specified\\" && exit 1"' package.json; then
|
|
445
|
+
jq 'del(.scripts.test)' package.json > temp.json && mv temp.json package.json
|
|
446
|
+
fi
|
|
447
|
+
|
|
448
|
+
echo "Dự án Node.js '$PROJECT_NAME' đã được tạo và các dependencies đã được cài đặt tại $PROJECT_PATH."
|
|
449
|
+
echo "Để biên dịch code, chạy: npm run build"
|
|
450
|
+
echo "Để chạy code đã biên dịch (production), chạy: npm start"
|
|
451
|
+
echo "Để chạy code trực tiếp với Babel (development), chạy: npm run dev"
|
|
452
|
+
echo "QUAN TRỌNG: Hãy chỉnh sửa file $PROJECT_PATH/src/configs.js với cấu hình thực tế của bạn."
|
|
453
|
+
fi
|
|
454
|
+
|
|
455
|
+
echo ""
|
|
456
|
+
echo "========================================"
|
|
457
|
+
echo "Tất cả phần mềm và cấu hình đã được cài đặt thành công!"
|
|
458
|
+
echo "Dự án Node.js của bạn được tạo tại: $PROJECT_PATH"
|
|
459
|
+
echo "Để chạy dự án, hãy chuyển đến thư mục $PROJECT_PATH và chạy: npm start"
|
|
460
|
+
echo "Kiểm tra trạng thái:"
|
|
461
|
+
echo "MongoDB: systemctl status mongod"
|
|
462
|
+
echo "Redis: systemctl status redis"
|
|
463
|
+
echo "Node.js: node -v"
|
|
464
|
+
echo "PM2: pm2 -v"
|
|
465
|
+
echo "Nginx: systemctl status nginx"
|
|
466
|
+
echo "RAM ảo (Swap): swapon --show"
|
|
467
|
+
echo "SELinux httpd_can_network_connect: getsebool httpd_can_network_connect"
|
|
468
|
+
echo "Redis: redis-cli config get stop-writes-on-bgsave-error"
|
|
469
|
+
echo "Redis: redis-cli config get dir"
|
|
470
|
+
echo "Redis: redis-cli config get dbfilename"
|
|
471
|
+
echo "Redis: redis-cli config get save"
|
|
472
|
+
echo "Redis: redis-cli config get appendonly"
|
|
473
|
+
echo "MongoDB LimitNOFILE: systemctl show mongod | grep LimitNOFILE"
|
|
474
|
+
echo "========================================"
|
package/package.json
CHANGED
package/server/app.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
'use strict';require("events").EventEmitter.defaultMaxListeners=1E7;
|
|
2
2
|
const os=require("os"),express=require("express"),bodyParser=require("body-parser"),passport=require("passport"),https=require("https"),http=require("http"),fs=require("fs"),cors=require("cors"),_global=require("./global"),defaultConfigs=require("./defaultConfigs"),crypto=require("crypto"),mainServer=function($app$$,$options$$={cluster:!0,port:443,useSocket:!0},$callbackServer$$=null){const $configs$$=global.configs={...defaultConfigs,...$options$$.configs,lite:$options$$.lite},$User$$=global.getModel("user");
|
|
3
|
-
$configs$$.admins||($configs$$.admins=$configs$$.adminUsers.map($u$$=>$u$$.email));$configs$$.supportUsers||($configs$$.supportUsers=[...$configs$$.admins]);$configs$$.public_token||($configs$$.public_token="flex.public.token");
|
|
4
|
-
$app$$.use(function($req$$,$res$$,$next$$){$toobusy$$()?(console.error("Server is busy right now. This request has been cancel:",$req$$.originalUrl),$res$$.status(503).send({error:"Server is busy right now, sorry."})):$next$$()})
|
|
5
|
-
require("cookie-parser");$app$$.use($
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
require("rotating-file-stream");const $logDirectory$$=$configs$$.paths.log||__dirname+"/log";fs.existsSync($logDirectory$$)||fs.mkdirSync($logDirectory$$);$accessLogStream_rfs
|
|
10
|
-
$res$$.status(500).send("Server Error!")});global.mongoose.connect($configs$$.database.url,{useNewUrlParser:!0}).then(async()=>{console.log("Connected to Database");
|
|
11
|
-
require("./libs/redis-cache").set();$options$$.start_abci_handler&&global.getModel("assabcihandler").start();!0!==$options$$.lite?require("./route")($app$$,()=>{if(!1
|
|
12
|
-
$
|
|
13
|
-
$
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
global.
|
|
17
|
-
$callbackServer$$&&$callbackServer$$()}):require("./route")($app$$,()=>{$callbackServer$$&&$callbackServer$$()},!0)})}).catch($err$$=>{console.log("Not Connected to Database ERROR! "
|
|
18
|
-
process.on("uncaughtException",function($err$jscomp$3_error$$){console.error((new Date).toUTCString()+" uncaughtException:",$err$jscomp$3_error$$.message);console.error($err$jscomp$3_error$$.stack);$err$jscomp$3_error$$=`
|
|
3
|
+
$configs$$.admins||($configs$$.admins=$configs$$.adminUsers.map($u$$=>$u$$.email));$configs$$.supportUsers||($configs$$.supportUsers=[...$configs$$.admins]);$configs$$.public_token||($configs$$.public_token="flex.public.token");var $_port_compress_cookieParser_morgan_multer_root_dir_uploads_session$$=$options$$.port||$configs$$.port||$configs$$.PORT||443;$configs$$.port=$_port_compress_cookieParser_morgan_multer_root_dir_uploads_session$$;global.port=$_port_compress_cookieParser_morgan_multer_root_dir_uploads_session$$;
|
|
4
|
+
require("moment-timezone").tz.setDefault($configs$$.timezone||"Asia/Ho_Chi_Minh");$app$$||($app$$=express());$app$$.set("trust proxy",1);const $toobusy$$=require("toobusy-js");$configs$$.maxLag&&$toobusy$$.maxLag($configs$$.maxLag);$app$$.use(function($req$$,$res$$,$next$$){$toobusy$$()?(console.error("Server is busy right now. This request has been cancel:",$req$$.originalUrl),$res$$.status(503).send({error:"Server is busy right now, sorry."})):$next$$()});$_port_compress_cookieParser_morgan_multer_root_dir_uploads_session$$=
|
|
5
|
+
require("express-session");$app$$.use($_port_compress_cookieParser_morgan_multer_root_dir_uploads_session$$({secret:"QV098PVT123456HLBN",resave:!1,saveUninitialized:!0,cookie:{secure:!1}}));$_port_compress_cookieParser_morgan_multer_root_dir_uploads_session$$=require("cookie-parser");$app$$.use($_port_compress_cookieParser_morgan_multer_root_dir_uploads_session$$());$app$$.use(function($req$$,$res$$,$next$$){let $uid$$=$req$$.cookies.uid;$uid$$||($uid$$=$req$$.headers.uid);$uid$$||($uid$$="uid:"+
|
|
6
|
+
crypto.randomBytes(20).toString("hex"),$res$$.cookie("uid",$uid$$,{expires:new Date(Date.now()+31536E6),sameSite:"none",secure:!0}));$res$$.set("uid",$uid$$);$req$$.cookies.uid=$uid$$;$next$$()});$_port_compress_cookieParser_morgan_multer_root_dir_uploads_session$$=require("compression");$app$$.use($_port_compress_cookieParser_morgan_multer_root_dir_uploads_session$$());$_port_compress_cookieParser_morgan_multer_root_dir_uploads_session$$=$configs$$.paths.uploads||__dirname+"/uploads";const $limitFileSize$$=
|
|
7
|
+
$configs$$.limitFileSize||1048576;$app$$.use(function($req$jscomp$2_size$$,$res$$,$next$$){if(($req$jscomp$2_size$$=$req$jscomp$2_size$$.headers["content-lenght"])&&$req$jscomp$2_size$$>$limitFileSize$$)return $res$$.status(400).send({error:"File too large"});$next$$()});$_port_compress_cookieParser_morgan_multer_root_dir_uploads_session$$=require("multer")({dest:$_port_compress_cookieParser_morgan_multer_root_dir_uploads_session$$,limits:{files:1,fileSize:$limitFileSize$$}});$app$$.use($_port_compress_cookieParser_morgan_multer_root_dir_uploads_session$$);
|
|
8
|
+
$app$$.use(cors({credentials:!0,exposedHeaders:["set-cookie","uid"],origin:($origin$$,$callback$$)=>{$callback$$(null,!0)}}));$configs$$.paths||($configs$$.paths={});!0!==$options$$.lite&&($app$$.use("/",express.static($configs$$.paths.public||__dirname+"/public")),$app$$.use("/admin",express.static($configs$$.paths.admin||__dirname+"/admin")),$app$$.use("/templates",express.static($configs$$.paths.templates||__dirname+"/templates")),$app$$.use("/images",express.static($configs$$.paths.images||__dirname+
|
|
9
|
+
"/images")));$app$$.use(bodyParser.json({limit:$configs$$.limitRequestSize||"1mb"}));$app$$.use(bodyParser.urlencoded({limit:$configs$$.limitRequestSize||"1mb",extended:!0}));$app$$.use(passport.initialize());$_port_compress_cookieParser_morgan_multer_root_dir_uploads_session$$=require("morgan");var $accessLogStream_rfs$$=require("rotating-file-stream");const $logDirectory$$=$configs$$.paths.log||__dirname+"/log";fs.existsSync($logDirectory$$)||fs.mkdirSync($logDirectory$$);$accessLogStream_rfs$$=
|
|
10
|
+
$accessLogStream_rfs$$("access.log",{interval:"1d",path:$logDirectory$$});$app$$.use($_port_compress_cookieParser_morgan_multer_root_dir_uploads_session$$("combined",{stream:$accessLogStream_rfs$$,skip:function($req$$,$res$$){return 400>$res$$.statusCode}}));$app$$.use(function($err$$,$req$$,$res$$,$next$$){console.error($err$$.stack);$res$$.status(500).send("Server Error!")});global.mongoose.connect($configs$$.database.url,{useNewUrlParser:!0}).then(async()=>{console.log("Connected to Database");
|
|
11
|
+
const $redis$$=require("redis");global.clientRedis=$redis$$.createClient();global.clientRedis.on("error",$err$$=>console.error("Redis Client Error",$err$$));global.clientRedis.on("end",()=>{console.error("Redis connection closed.")});global.clientRedis.on("connect",function(){console.log("redis connected");0!=$options$$.createRedisCache&&require("./libs/redis-cache").set();$options$$.start_abci_handler&&global.getModel("assabcihandler").start();!0!==$options$$.lite?require("./route")($app$$,()=>{if(!1!==
|
|
12
|
+
$options$$.createServer){var $StaticPool$jscomp$0$$=require("sticky-session");$configs$$.use_ssl?($cpus_report_cpus_server_sslConfig$$=require("./sslConfig"),$cpus_report_cpus_server_sslConfig$$=https.createServer($cpus_report_cpus_server_sslConfig$$($options$$.sslDir),$app$$)):$cpus_report_cpus_server_sslConfig$$=http.createServer($app$$);$cpus_report_cpus_server_sslConfig$$.timeout=6E5;!1!==$options$$.useSocket?$User$$.initSocket($cpus_report_cpus_server_sslConfig$$):$User$$.initClientSockets();
|
|
13
|
+
if(!1!==$options$$.cluster){if(!$StaticPool$jscomp$0$$.listen($cpus_report_cpus_server_sslConfig$$,global.port))$cpus_report_cpus_server_sslConfig$$.once("listening",function(){console.log("server started on",global.port)});$StaticPool$jscomp$0$$=require("cluster");$StaticPool$jscomp$0$$.on("exit",function($worker$$,$code$$,$signal$$){console.error("worker "+$worker$$.process.pid+" died",$code$$,$signal$$)});$StaticPool$jscomp$0$$.on("online",function($worker$$){console.info("worker "+$worker$$.process.pid+
|
|
14
|
+
" is online")})}else $cpus_report_cpus_server_sslConfig$$.listen(global.port,()=>{console.log("server start at "+global.port+" port")})}var $cpus_report_cpus_server_sslConfig$$=os.cpus().length;$StaticPool$jscomp$0$$=$options$$.import_cpus||($options$$.start_import_data_pool?$options$$.start_report_pool||$options$$.start_input_data_pool?1:Math.round($cpus_report_cpus_server_sslConfig$$/2):0);var $StaticPool$jscomp$1$$=$options$$.input_cpus||($options$$.start_input_data_pool?Math.max(Math.round($cpus_report_cpus_server_sslConfig$$/
|
|
15
|
+
2),2):0);$cpus_report_cpus_server_sslConfig$$=$options$$.report_cpus||($options$$.start_import_data_pool?Math.max(Math.min($cpus_report_cpus_server_sslConfig$$-$StaticPool$jscomp$1$$-$StaticPool$jscomp$0$$,Math.round($cpus_report_cpus_server_sslConfig$$/2))-1,2):0);if($StaticPool$jscomp$1$$){const $StaticPool$$=require("./libs/WorkerStaticPool");global.inputMainPool=new $StaticPool$$(__dirname+"/workers/inputWorker.js",$options$$.max_queue_imports||0,$StaticPool$jscomp$1$$,3E5,$StaticPool$jscomp$1$$,
|
|
16
|
+
"input pool");global.inputMainPool.exec({load:!0,configs:JSON.stringify($configs$$)},()=>{console.error("Crud pool ready")})}$StaticPool$jscomp$0$$&&($StaticPool$jscomp$1$$=require("./libs/WorkerStaticPool"),global.importDataMainPool=new $StaticPool$jscomp$1$$(__dirname+"/workers/inputWorker.js",$options$$.max_queue_imports||0,$StaticPool$jscomp$0$$,36E5,1,"import pool"),global.importDataMainPool.exec({load:!0,configs:JSON.stringify($configs$$)},()=>{console.error("Import pool ready")}));$cpus_report_cpus_server_sslConfig$$&&
|
|
17
|
+
($StaticPool$jscomp$0$$=require("./libs/WorkerStaticPool"),global.reportMainPool=new $StaticPool$jscomp$0$$(__dirname+"/workers/reportWorker.js",$options$$.max_queue_reports||0,$cpus_report_cpus_server_sslConfig$$,3E5,2,"report pool"),global.reportMainPool.exec({load:!0,configs:JSON.stringify($configs$$)},()=>{console.error("Report pool ready")}));$callbackServer$$&&$callbackServer$$()}):require("./route")($app$$,()=>{$callbackServer$$&&$callbackServer$$()},!0)})}).catch($err$$=>{console.log("Not Connected to Database ERROR! ",
|
|
18
|
+
$err$$)});return $app$$};process.on("SIGINT",async()=>{global.sharedRedisConnection&&await global.sharedRedisConnection.quit();process.exit(0)});process.on("uncaughtException",function($err$jscomp$3_error$$){console.error((new Date).toUTCString()+" uncaughtException:",$err$jscomp$3_error$$.message);console.error($err$jscomp$3_error$$.stack);$err$jscomp$3_error$$=`
|
|
19
19
|
Error: ${$err$jscomp$3_error$$.message}
|
|
20
20
|
Stack: ${$err$jscomp$3_error$$.stack}
|
|
21
21
|
`;try{const $logDirectory$$=__dirname+"/log";fs.existsSync($logDirectory$$)||fs.mkdirSync($logDirectory$$);fs.writeFile(`${$logDirectory$$}/error-${(new Date).getTime()}.txt`,$err$jscomp$3_error$$,()=>{console.log("wrote log error")})}catch($e$$){console.log($e$$)}process.exit(1)});module.exports=mainServer;
|
package/server/cluster.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
'use strict';require("events").EventEmitter.defaultMaxListeners=1E7;
|
|
2
2
|
const os=require("os"),express=require("express"),bodyParser=require("body-parser"),passport=require("passport"),https=require("https"),http=require("http"),fs=require("fs"),cors=require("cors"),crypto=require("crypto"),_global=require("./global"),defaultConfigs=require("./defaultConfigs"),sslConfig=require("./sslConfig"),clusterServer=function($app$$,$sslDir$$,$_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$={},$_port_accessLogStream_rfs$$=9999,$options$$={start_import_data_pool:!1,
|
|
3
|
-
start_report_pool:!0,useAgenda:!0,createRedisCache:!0}){const $configs$$=global.configs={...defaultConfigs,...$_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$,cluster:0!=$options$$.cluster,lite:$options$$.lite};$configs$$.admins||($configs$$.admins=$configs$$.adminUsers.map($u$$=>$u$$.email));$configs$$.supportUsers||($configs$$.supportUsers=[...$configs$$.admins]);$configs$$.public_token||($configs$$.public_token="flex.public.token")
|
|
4
|
-
require("moment-timezone").tz.setDefault($configs$$.timezone||"Asia/Ho_Chi_Minh");$app$$||($app$$=express());$app$$.set("trust proxy",1);const $toobusy$$=require("toobusy-js");$configs$$.maxLag&&$toobusy$$.maxLag($configs$$.maxLag);$app$$.use(function($req$$,$res$$,$next$$){$toobusy$$()?(console.error("Server is busy right now. This request has been cancel:",$req$$.originalUrl),$res$$.status(503).send({error:"Server is busy right now, sorry."}))
|
|
5
|
-
require("express-session");$app$$.use($_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$({secret:"QV098PVT123456HLBN",resave:!1,saveUninitialized:!0,cookie:{secure:!1}}));$_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$=require("cookie-parser");$app$$.use($_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$());$app$$.use(function($req$$,$res$$,$next$$){let $uid
|
|
6
|
-
"uid:"+crypto.randomBytes(20).toString("hex"),$res$$.cookie("uid",$uid$$,{expires:new Date(Date.now()+31536E6),sameSite:"none",secure:!0}));$res$$.set("uid",$uid$$);$req$$.cookies.uid=$uid$$;$next$$()});$_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$=require("compression");$app$$.use($_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$());$_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session
|
|
7
|
-
const $limitFileSize$$=$configs$$.limitFileSize||1048576;$app$$.use(function($req$jscomp$2_size$$,$res$$,$next$$){if(($req$jscomp$2_size$$=$req$jscomp$2_size$$.headers["content-lenght"])&&$req$jscomp$2_size$$>$limitFileSize$$)return $res$$.status(400).send({error:"File too large"});$next$$()});$_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$=require("multer")({dest:$_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$,
|
|
8
|
-
|
|
9
|
-
express.static($configs$$.paths.images||__dirname+"/images"));$app$$.use(bodyParser.json({limit:$configs$$.limitRequestSize||"1mb"}));$app$$.use(bodyParser.urlencoded({limit:$configs$$.limitRequestSize||"1mb",extended:!0}));$app$$.use(passport.initialize());$_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$=require("morgan");$_port_accessLogStream_rfs$$=require("rotating-file-stream");const $logDirectory$$=$configs$$.paths.log||__dirname+
|
|
10
|
-
fs.mkdirSync($logDirectory$$);$_port_accessLogStream_rfs$$=$_port_accessLogStream_rfs$$("access-cluster.log",{interval:"1d",path:$logDirectory$$});$app$$.use($_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$("combined",{stream:$_port_accessLogStream_rfs$$,skip:function($req$$,$res$$){return 400>$res$$.statusCode}}));$app$$.use(function($err$$,$req$$,$res$$,$next$$){console.error($err$$.stack);$res$$.status(500).send("Server error!")});
|
|
11
|
-
{useNewUrlParser:!0}).then(async $clientMongo_redis$$=>{console.log("Connected to Database");global.clientMongo=$clientMongo_redis$$;$clientMongo_redis$$=require("redis");global.clientRedis=$clientMongo_redis$$.createClient();global.clientRedis.on("error",$err$$=>console.error("Redis Client Error",$err$$));global.clientRedis.on("end",()=>{console.error("Redis connection closed.")});global.clientRedis.on("connect",async function(){function $initSysData$$(){console.log("creating system data...");
|
|
12
|
-
fs.readdirSync(__dirname+"/data/sys");$async$$.mapSeries($files$$,function($file$$,$callback$jscomp$0$$){setImmediate(()=>{if(".js"==$file$$.substr(-3)){const $data$$=JSON.parse(JSON.stringify(require("./data/sys/"+$file$$).data)),$model$$=global.getModel(""+$file$$);console.log("creating system data...",$file$$);$model$$.deleteMany({},$e$$=>{console.error($e$$);$async$$.mapSeries($data$$,function($r$$,$callback$$){delete $r$$._id;delete $r$$.__v;delete $r$$.collection_name;delete $r$$.pkey
|
|
13
|
-
function($error$$){if($error$$)return $callback$$($error$$);$callback$$()})},function($error$$,$rs$$){$callback$jscomp$0$$($error$$,$rs$$)})})}else $callback$jscomp$0$$()})},function($error$$){if($error$$)return console.log($error$$);console.log("created system data")})}console.log("redis connected");0!=$options$$.createRedisCache&&require("./libs/redis-cache").set();global.getModel("schedule").start();$options$$.start_abci_handler&&global.getModel("assabcihandler").start();var $StaticPool$$=
|
|
14
|
-
|
|
15
|
-
email:$StaticPool_adminUser$$.email,active:!0},$u$$=new $StaticPool$$($StaticPool_adminUser$$),$u$$.local.password=$u$$.generateHash($StaticPool_adminUser$$.email+$StaticPool_adminUser$$.defaultPassword),$u$$.save(function($error$$,$user$$){if($error$$)return console.error($error$$);$user$$&&console.log("da tao thanh cong user "+$user$$.email)}))}const $async$$=require("async");$cpus_init_system_data_report_cpus_server$$&&$initSysData$$();require("./route")($app$$)
|
|
16
|
-
$configs$$.use_ssl?https.createServer(sslConfig($sslDir$$),$app$$):http.createServer($app$$);$cpus_init_system_data_report_cpus_server$$.timeout=6E5;$StaticPool$$.initSocket($cpus_init_system_data_report_cpus_server$$);if(!1!==$options$$.cluster){if(!require("sticky-session").listen($cpus_init_system_data_report_cpus_server$$,global.port))$cpus_init_system_data_report_cpus_server$$.once("listening",function(){console.log("server cluster started on",global.port)})
|
|
17
|
-
$StaticPool$$.on("exit",function($worker$$,$code$$,$signal$$){console.error("worker "+$worker$$.process.pid+" died",$code$$,$signal$$)});$StaticPool$$.on("online",function($worker$$){console.info("worker "+$worker$$.process.pid+" is online");global.clientRedis.set("lastworker",JSON.stringify({pid:$worker$$.process.pid}))})}else $cpus_init_system_data_report_cpus_server$$.listen(global.port,()=>{console.log("server start at "+global.port+" port")});$cpus_init_system_data_report_cpus_server$$=
|
|
18
|
-
|
|
3
|
+
start_report_pool:!0,useAgenda:!0,createRedisCache:!0}){const $configs$$=global.configs={...defaultConfigs,...$_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$,cluster:0!=$options$$.cluster,lite:$options$$.lite,port:$_port_accessLogStream_rfs$$};$configs$$.admins||($configs$$.admins=$configs$$.adminUsers.map($u$$=>$u$$.email));$configs$$.supportUsers||($configs$$.supportUsers=[...$configs$$.admins]);$configs$$.public_token||($configs$$.public_token="flex.public.token");$configs$$.port=
|
|
4
|
+
$_port_accessLogStream_rfs$$;global.port=$_port_accessLogStream_rfs$$;require("moment-timezone").tz.setDefault($configs$$.timezone||"Asia/Ho_Chi_Minh");$app$$||($app$$=express());$app$$.set("trust proxy",1);const $toobusy$$=require("toobusy-js");$configs$$.maxLag&&$toobusy$$.maxLag($configs$$.maxLag);$app$$.use(function($req$$,$res$$,$next$$){$toobusy$$()?(console.error("Server is busy right now. This request has been cancel:",$req$$.originalUrl),$res$$.status(503).send({error:"Server is busy right now, sorry."})):
|
|
5
|
+
$next$$()});$_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$=require("express-session");$app$$.use($_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$({secret:"QV098PVT123456HLBN",resave:!1,saveUninitialized:!0,cookie:{secure:!1}}));$_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$=require("cookie-parser");$app$$.use($_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$());$app$$.use(function($req$$,$res$$,$next$$){let $uid$$=
|
|
6
|
+
$req$$.cookies.uid;$uid$$||($uid$$=$req$$.headers.uid);$uid$$||($uid$$="uid:"+crypto.randomBytes(20).toString("hex"),$res$$.cookie("uid",$uid$$,{expires:new Date(Date.now()+31536E6),sameSite:"none",secure:!0}));$res$$.set("uid",$uid$$);$req$$.cookies.uid=$uid$$;$next$$()});$_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$=require("compression");$app$$.use($_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$());$_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$=
|
|
7
|
+
$configs$$.paths.uploads||__dirname+"/uploads";const $limitFileSize$$=$configs$$.limitFileSize||1048576;$app$$.use(function($req$jscomp$2_size$$,$res$$,$next$$){if(($req$jscomp$2_size$$=$req$jscomp$2_size$$.headers["content-lenght"])&&$req$jscomp$2_size$$>$limitFileSize$$)return $res$$.status(400).send({error:"File too large"});$next$$()});$_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$=require("multer")({dest:$_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$,
|
|
8
|
+
limits:{files:1,fileSize:$limitFileSize$$}});$app$$.use($_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$);$app$$.use(cors({credentials:!0,exposedHeaders:["set-cookie","uid"],origin:($origin$$,$callback$$)=>{$callback$$(null,!0)}}));$configs$$.paths||($configs$$.paths={});$app$$.use("/",express.static($configs$$.paths.public||__dirname+"/public"));$app$$.use("/admin",express.static($configs$$.paths.admin||__dirname+"/admin"));$app$$.use("/templates",express.static($configs$$.paths.templates||
|
|
9
|
+
__dirname+"/templates"));$app$$.use("/images",express.static($configs$$.paths.images||__dirname+"/images"));$app$$.use(bodyParser.json({limit:$configs$$.limitRequestSize||"1mb"}));$app$$.use(bodyParser.urlencoded({limit:$configs$$.limitRequestSize||"1mb",extended:!0}));$app$$.use(passport.initialize());$_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$=require("morgan");$_port_accessLogStream_rfs$$=require("rotating-file-stream");const $logDirectory$$=$configs$$.paths.log||__dirname+
|
|
10
|
+
"/log";fs.existsSync($logDirectory$$)||fs.mkdirSync($logDirectory$$);$_port_accessLogStream_rfs$$=$_port_accessLogStream_rfs$$("access-cluster.log",{interval:"1d",path:$logDirectory$$});$app$$.use($_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$("combined",{stream:$_port_accessLogStream_rfs$$,skip:function($req$$,$res$$){return 400>$res$$.statusCode}}));$app$$.use(function($err$$,$req$$,$res$$,$next$$){console.error($err$$.stack);$res$$.status(500).send("Server error!")});
|
|
11
|
+
global.mongoose.connect($configs$$.database.url,{useNewUrlParser:!0}).then(async $clientMongo_redis$$=>{console.log("Connected to Database");global.clientMongo=$clientMongo_redis$$;$clientMongo_redis$$=require("redis");global.clientRedis=$clientMongo_redis$$.createClient();global.clientRedis.on("error",$err$$=>console.error("Redis Client Error",$err$$));global.clientRedis.on("end",()=>{console.error("Redis connection closed.")});global.clientRedis.on("connect",async function(){function $initSysData$$(){console.log("creating system data...");
|
|
12
|
+
const $files$$=fs.readdirSync(__dirname+"/data/sys");$async$$.mapSeries($files$$,function($file$$,$callback$jscomp$0$$){setImmediate(()=>{if(".js"==$file$$.substr(-3)){const $data$$=JSON.parse(JSON.stringify(require("./data/sys/"+$file$$).data)),$model$$=global.getModel(""+$file$$);console.log("creating system data...",$file$$);$model$$.deleteMany({},$e$$=>{console.error($e$$);$async$$.mapSeries($data$$,function($r$$,$callback$$){delete $r$$._id;delete $r$$.__v;delete $r$$.collection_name;delete $r$$.pkey;
|
|
13
|
+
$model$$.create($r$$,function($error$$){if($error$$)return $callback$$($error$$);$callback$$()})},function($error$$,$rs$$){$callback$jscomp$0$$($error$$,$rs$$)})})}else $callback$jscomp$0$$()})},function($error$$){if($error$$)return console.log($error$$);console.log("created system data")})}console.log("redis connected");0!=$options$$.createRedisCache&&require("./libs/redis-cache").set();global.getModel("schedule").start();$options$$.start_abci_handler&&global.getModel("assabcihandler").start();var $StaticPool$$=
|
|
14
|
+
global.getModel("user"),$cpus_init_system_data_report_cpus_server$$=$configs$$.initSysData;$cpus_init_system_data_report_cpus_server$$||await $StaticPool$$.findOne({})||($cpus_init_system_data_report_cpus_server$$=!0);for($StaticPool$jscomp$0$$=0;$StaticPool$jscomp$0$$<$configs$$.adminUsers.length;$StaticPool$jscomp$0$$++){var $StaticPool_adminUser$$=$configs$$.adminUsers[$StaticPool$jscomp$0$$];let $u$$=await $StaticPool$$.findOne({email:$StaticPool_adminUser$$.email});$u$$||($StaticPool_adminUser$$.local=
|
|
15
|
+
{name:$StaticPool_adminUser$$.name,email:$StaticPool_adminUser$$.email,active:!0},$u$$=new $StaticPool$$($StaticPool_adminUser$$),$u$$.local.password=$u$$.generateHash($StaticPool_adminUser$$.email+$StaticPool_adminUser$$.defaultPassword),$u$$.save(function($error$$,$user$$){if($error$$)return console.error($error$$);$user$$&&console.log("da tao thanh cong user "+$user$$.email)}))}const $async$$=require("async");$cpus_init_system_data_report_cpus_server$$&&$initSysData$$();require("./route")($app$$);
|
|
16
|
+
$cpus_init_system_data_report_cpus_server$$=$configs$$.use_ssl?https.createServer(sslConfig($sslDir$$),$app$$):http.createServer($app$$);$cpus_init_system_data_report_cpus_server$$.timeout=6E5;$StaticPool$$.initSocket($cpus_init_system_data_report_cpus_server$$);if(!1!==$options$$.cluster){if(!require("sticky-session").listen($cpus_init_system_data_report_cpus_server$$,global.port))$cpus_init_system_data_report_cpus_server$$.once("listening",function(){console.log("server cluster started on",global.port)});
|
|
17
|
+
$StaticPool$$=require("cluster");$StaticPool$$.on("exit",function($worker$$,$code$$,$signal$$){console.error("worker "+$worker$$.process.pid+" died",$code$$,$signal$$)});$StaticPool$$.on("online",function($worker$$){console.info("worker "+$worker$$.process.pid+" is online");global.clientRedis.set("lastworker",JSON.stringify({pid:$worker$$.process.pid}))})}else $cpus_init_system_data_report_cpus_server$$.listen(global.port,()=>{console.log("server start at "+global.port+" port")});$cpus_init_system_data_report_cpus_server$$=
|
|
18
|
+
os.cpus().length;$StaticPool$$=$options$$.import_cpus||($options$$.start_import_data_pool?$options$$.start_report_pool||$options$$.start_input_data_pool?1:Math.round($cpus_init_system_data_report_cpus_server$$/2):0);var $StaticPool$jscomp$0$$=$options$$.input_cpus||($options$$.start_input_data_pool?Math.max(Math.round($cpus_init_system_data_report_cpus_server$$/2),2):0);$cpus_init_system_data_report_cpus_server$$=$options$$.report_cpus||($options$$.start_import_data_pool?Math.max(Math.min($cpus_init_system_data_report_cpus_server$$-
|
|
19
19
|
$StaticPool$jscomp$0$$-$StaticPool$$,Math.round($cpus_init_system_data_report_cpus_server$$/2))-1,2):0);$StaticPool$jscomp$0$$&&($StaticPool_adminUser$$=require("./libs/WorkerStaticPool"),global.inputMainPool=new $StaticPool_adminUser$$(__dirname+"/workers/inputWorker.js",$options$$.max_queue_imports||0,$StaticPool$jscomp$0$$,3E5,$StaticPool$jscomp$0$$,"input pool"),global.inputMainPool.exec({load:!0,configs:JSON.stringify($configs$$)},()=>{console.error("Crud pool ready")}));$StaticPool$$&&($StaticPool$jscomp$0$$=
|
|
20
20
|
require("./libs/WorkerStaticPool"),global.importDataMainPool=new $StaticPool$jscomp$0$$(__dirname+"/workers/inputWorker.js",$options$$.max_queue_imports||0,$StaticPool$$,36E5,1,"import pool"),global.importDataMainPool.exec({load:!0,configs:JSON.stringify($configs$$)},()=>{console.error("Import pool ready")}));$cpus_init_system_data_report_cpus_server$$&&($StaticPool$$=require("./libs/WorkerStaticPool"),global.reportMainPool=new $StaticPool$$(__dirname+"/workers/reportWorker.js",$options$$.max_queue_reports||
|
|
21
21
|
0,$cpus_init_system_data_report_cpus_server$$,3E5,2,"report pool"),global.reportMainPool.exec({load:!0,configs:JSON.stringify($configs$$)},()=>{console.error("Report pool ready")}))})}).catch($err$$=>{console.error("Not Connected to Database ERROR!",$err$$)})};process.on("SIGINT",async()=>{global.sharedRedisConnection&&await global.sharedRedisConnection.quit();process.exit(0)});
|
package/server/global.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
'use strict';const fs=require("fs"),async=require("async"),prototypes=require("./libs/prototypes.js"),TransactionPool=require("./libs/BlockchainTransactionPool"),leanID=require("./libs/mongooseLeanId"),deletePost=require("./libs/mongooseDeletePost");global.blockchainTransactionPool=new TransactionPool;global.new_schedules=[];global.rootDir=__dirname;global.ctrlVouchers={};global.controllers={};global.report_controllers={};global.postingVouchers={};global.cacheDatas={};
|
|
1
|
+
'use strict';const fs=require("fs"),async=require("async"),prototypes=require("./libs/prototypes.js"),TransactionPool=require("./libs/BlockchainTransactionPool"),leanID=require("./libs/mongooseLeanId"),deletePost=require("./libs/mongooseDeletePost");global.blockchainTransactionPool=new TransactionPool;global.new_schedules=[];global.rootDir=__dirname;global.ctrlVouchers={};global.controllers={};global.report_controllers={};global.postingVouchers={};global.cacheDatas={};
|
|
2
2
|
global.socketContainer={loadConnectionId:async()=>new Promise($res$$=>{global.clientRedis.get("client-io",function($err$$,$reply$$){if($err$$)return console.error($err$$),$res$$({});if($reply$$)try{let $ios$$=JSON.parse($reply$$);return $res$$($ios$$||{})}catch($e$$){return console.error($e$$),$res$$({})}else return $res$$({})})}),saveConnectionId:async($clientIO$$={})=>new Promise(($res$$,$rej$$)=>{global.clientRedis.set("client-io",JSON.stringify($clientIO$$),$e$$=>{if($e$$)return console.error($e$$),
|
|
3
3
|
$rej$$($e$$);$res$$($clientIO$$)})})};global.clientIO={};global.model_books="socai socaitmp socainpp sokho sokhott sokhonpp sokhokhongton sosanxuat vatvao vatra vsocai socaitmp".split(" ");global.secu_models="asskey assproduct assperiod assinvestment asssell assbuy assneedtobuy asswithdraw asscashwithdraw wallet assfindhash assbank asstransaction assissue token tokens user app listinfo right otp payload usergroup smsaccount emailaccount".split(" ");global.webPush=require("web-push");
|
|
4
4
|
global.mongoose=require("mongoose");global.mongoose.plugin(leanID);global.mongoose.plugin(deletePost);global.Schema=global.mongoose.Schema;global.mongoose.set("useFindAndModify",!1);global.mongoose.set("useCreateIndex",!0);
|
package/server/libs/utils.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';const _=require("underscore"),StaticPool=require("./WorkerStaticPool"),path=require("path"),writtenNumber=require("written-number"),async=require("async"),numeral=require("numeral"),moment=require("moment"),crypto=require("crypto");
|
|
2
2
|
function isPlainObject($proto$jscomp$3_value$$){if("object"!==typeof $proto$jscomp$3_value$$||null===$proto$jscomp$3_value$$||Array.isArray($proto$jscomp$3_value$$))return!1;$proto$jscomp$3_value$$=Object.getPrototypeOf($proto$jscomp$3_value$$);return $proto$jscomp$3_value$$===Object.prototype||null===$proto$jscomp$3_value$$}
|
|
3
3
|
function deleteEmptyObject($obj$$){if("object"!==typeof $obj$$||null===$obj$$)return $obj$$;if(Array.isArray($obj$$))$obj$$.forEach($item$$=>deleteEmptyObject($item$$));else{var $currentValue_keys$$=Object.keys($obj$$);for(const $key$$ of $currentValue_keys$$)deleteEmptyObject($obj$$[$key$$]),$currentValue_keys$$=$obj$$[$key$$],"object"===typeof $currentValue_keys$$&&null!==$currentValue_keys$$&&(isPlainObject($currentValue_keys$$)&&0===Object.keys($currentValue_keys$$).length?delete $obj$$[$key$$]:
|
|
4
|
-
"$in"!=$key
|
|
4
|
+
"$in"!=$key$$&&$key$$.startsWith("$")&&Array.isArray($currentValue_keys$$)&&0===$currentValue_keys$$.length&&delete $obj$$[$key$$])}return $obj$$}const {VM}=require("vm2");function evalute($code$$,$sandbox$$={},$timeout$$=2E3){$sandbox$$.Promise=function(){};return(new VM({timeout:$timeout$$,sandbox:$sandbox$$})).run(`(()=>{${$code$$}})()`)}function JSONParser($str_func$$){0>$str_func$$.indexOf("return ")&&($str_func$$="return "+$str_func$$);return evalute($str_func$$)}
|
|
5
5
|
function numberToWord($fractionText_number$$,$options$$){if(void 0===$fractionText_number$$||null===$fractionText_number$$)return"";if($options$$&&$options$$.lang&&"vn"!==$options$$.lang){var $kq_sign$$=writtenNumber($fractionText_number$$,{lang:$options$$.lang});return 0<$kq_sign$$.length?$kq_sign$$.substring(0,1).toUpperCase()+$kq_sign$$.substring(1):""}$kq_sign$$="";0>$fractionText_number$$&&($kq_sign$$="\u00e2m ",$fractionText_number$$=-$fractionText_number$$);$options$$=_.extend({thousand:"ng\u00e0n",
|
|
6
6
|
decimal:"ph\u1ea9y"},$options$$);$fractionText_number$$=Number($fractionText_number$$.toFixed(2));var $integerPart_integerText$$=Math.floor($fractionText_number$$),$fractionPart$$=$fractionText_number$$%1;$fractionText_number$$="";$fractionPart$$&&($fractionText_number$$=convertFractionPart($fractionPart$$),$fractionText_number$$=" "+$options$$.decimal+" "+$fractionText_number$$);var $digitGroups$$=breakDownNumber($integerPart_integerText$$).reverse();$integerPart_integerText$$=_.chain($digitGroups$$).map(function($convertedGroup_group$$,
|
|
7
7
|
$index$$){$convertedGroup_group$$=convertGroup($convertedGroup_group$$,$index$$===$digitGroups$$.length-1?!1:!0);var $unit$$=unitAt($index$$,$options$$.thousand);$convertedGroup_group$$||0===$index$$%3||($unit$$="");$convertedGroup_group$$&&$unit$$&&($unit$$=" "+$unit$$);return $convertedGroup_group$$+$unit$$}).compact().reverse().join(" ");$kq_sign$$=$kq_sign$$+$integerPart_integerText$$+$fractionText_number$$;return 0<$kq_sign$$.length?$kq_sign$$.substring(0,1).toUpperCase()+$kq_sign$$.substring(1):
|
package/server/models/user.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
'use strict';const Tokens=require("./tokens"),crypto=require("crypto"),StaticPool=require("../libs/WorkerStaticPool"),emailService=require("../libs/email"),path=require("path"),validator=require("validator"),jwt=require("jsonwebtoken"),{isSupperAdmin,generatePasswordHash}=require("../libs/utils"),EXP_TIME=144E5,underscore=require("underscore"),
|
|
1
|
+
'use strict';const Tokens=require("./tokens"),crypto=require("crypto"),StaticPool=require("../libs/WorkerStaticPool"),emailService=require("../libs/email"),path=require("path"),validator=require("validator"),jwt=require("jsonwebtoken"),{isSupperAdmin,generatePasswordHash}=require("../libs/utils"),EXP_TIME=144E5,underscore=require("underscore"),redis=require("redis"),request=require("request"),profileFacebookUrl="https://graph.facebook.com/me?fields=name",checkFacebookToken=async $access_token$$=>
|
|
2
2
|
{let $urlCheck$$=`${profileFacebookUrl}&access_token=${$access_token$$}`;return new Promise($resolve$$=>{request($urlCheck$$,($e$$,$res$$,$body$$)=>$e$$||JSON.parse($body$$).error?$resolve$$(!1):$resolve$$(!0))})},userSchema=new Schema({local:{email:{type:String,lowercase:!0,trim:!0,maxlength:128},password:String,rspassword:String,pin:String,name:{type:String,maxlength:1024},picture:{type:String,maxlength:1024},address:{type:String,maxlength:1024},phone:{type:String,trim:!0,lowercase:!0},zalo:{type:String,
|
|
3
3
|
maxlength:1024},whatsapp:{type:String,maxlength:1024},facebook:{type:String,maxlength:1024},company:{type:String,maxlength:1024},exfields:Schema.Types.Mixed,active:{type:Boolean,default:!1},key:String},google:{id:String,email:{type:String,lowercase:!0,trim:!0,maxlength:128},name:String,picture:String},facebook:{id:String,email:{type:String,lowercase:!0,trim:!0,maxlength:128},name:String,picture:String},current_id_app:String,current_user:String,email:{type:String,lowercase:!0,trim:!0,maxlength:128},
|
|
4
4
|
email2:{type:String,lowercase:!0,trim:!0,maxlength:128},name:{type:String,maxlength:1024},picture:{type:String,maxlength:1024},server:{type:String,maxlength:1024},partner:{type:String,maxlength:1024},join_date:{type:Date,default:Date.now},session_created:String,exfields:Schema.Types.Mixed,status:{type:Boolean,default:!0},date_created:{type:Date,default:Date.now},date_updated:{type:Date,default:Date.now},user_created:{type:String,default:""},user_updated:{type:String,default:""}});
|
|
@@ -16,22 +16,17 @@ User.findOne($query$$).lean().exec(function($error$$,$user$$){if($error$$)return
|
|
|
16
16
|
User.sendEmailTo=async($email_u$$,$data$$)=>{if($data$$.email_content){let $to$$;validator.isEmail($email_u$$)?$to$$=$email_u$$:($email_u$$=await global.getModel("user").findOne({email:$email_u$$},{email2:1}).lean())&&$email_u$$.email2&&validator.isEmail($email_u$$.email2)&&($to$$=$email_u$$.email2);$to$$&&emailService.sendHtml({to:{address:$to$$},subject:($data$$.title||"").replace(/<[^>]*>?/gm,""),html:$data$$.email_content,attachments:$data$$.attachments,app_info:$data$$.app_info},function($error$$){$error$$&&
|
|
17
17
|
console.error($error$$)})}};
|
|
18
18
|
User.socketSendTo=async($email$$,$event_name$$,$msg$$,$send_to_other_servers$$=!0)=>{$email$$&&$event_name$$&&(global.socketContainer.socketIO&&($email$$=$email$$.toLowerCase(),setImmediate(async()=>{try{0<[...(await global.socketContainer.socketIO.in($email$$).allSockets())].length&&(global.socketContainer.socketIO.to($email$$).emit($event_name$$,$msg$$),global.socketContainer.socketIO.to($email$$).emit("allevents",{event:$event_name$$,msg:$msg$$}))}catch($e$$){console.error("socketio error send msg ",{email:$email$$,
|
|
19
|
-
event_name:$event_name$$,msg:$msg$$},$e$$)}})),$send_to_other_servers$$&&User.socketSendToOtherServer($email$$,$event_name$$,$msg$$))};
|
|
20
|
-
User.socketSendToOtherServer=async($
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
{}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
($msg$jscomp$5_obj$$.data||{}).listinfo_id?(console.log("update api",$msg$jscomp$5_obj$$.data||{}),($msg$jscomp$5_obj$$=await global.getModel("listinfo").findOne({_id:($msg$jscomp$5_obj$$.data||{}).listinfo_id}))&&global.getModel("listinfo").createController(global.routerAPI,$msg$jscomp$5_obj$$)):console.log("don't handle msg from system",$msg$jscomp$5_obj$$):User.socketSendTo($msg$jscomp$5_obj$$.email,$msg$jscomp$5_obj$$.event,$msg$jscomp$5_obj$$.data,!1))})}else{var $_token$$=await Tokens.findOne({token:$msg$jscomp$0$$.token}).lean();
|
|
31
|
-
$_token$$?($socket$$.auth=!0,$socket$$.join($_token$$.email),$clientIO$jscomp$2_email$$=await global.socketContainer.loadConnectionId(),$clientIO$jscomp$2_email$$[$socket$$.id]={token:$msg$jscomp$0$$.token,email:$_token$$.email},global.socketContainer.saveConnectionId($clientIO$jscomp$2_email$$),$msg$jscomp$0$$.id_app?global.alertNotification($_token$$.email,$msg$jscomp$0$$.id_app):$_token$$.id_apps&&0<$_token$$.id_apps.length?$_token$$.id_apps.forEach($id_app$$=>{global.alertNotification($_token$$.email,
|
|
32
|
-
$id_app$$)}):global.alertNotification($_token$$.email,$_token$$.only_id_app),global.alertMessage($_token$$.email,$msg$jscomp$0$$.id_app),global.socketContainer.socketIO.to($socket$$.id).emit("login",{user:$_token$$.email,success:!0}),$socket$$.on("offer",function($msg$$){$msg$$.from=$_token$$.email;User.socketSendTo($msg$$.to,"offer",$msg$$,!1)}),$socket$$.on("answer",function($msg$$){$msg$$.from=$_token$$.email;User.socketSendTo($msg$$.to,"answer",$msg$$,!1)}),$socket$$.on("candidate",function($msg$$){$msg$$.from=
|
|
33
|
-
$_token$$.email;User.socketSendTo($msg$$.to,"candidate",$msg$$,!1)}),$socket$$.on("leave",function($msg$$){$msg$$.from=$_token$$.email;User.socketSendTo($msg$$.to,"leave",$msg$$,!1)})):global.socketContainer.socketIO.to($socket$$.id).emit("login",{user:$msg$jscomp$0$$.email,success:!1,message:"Token is not exists"})}});$socket$$.on("disconnect",async function(){let $clientIO$$=await global.socketContainer.loadConnectionId(),$client$$=$clientIO$$[$socket$$.id];$client$$&&$socket$$.leave($client$$.email);
|
|
34
|
-
delete $clientIO$$[$socket$$.id];global.socketContainer.saveConnectionId($clientIO$$)})})},5E3)};User.teststrengthPassword=$pwString$$=>5<$pwString$$.length&&/[A-Z]+/.test($pwString$$)&&/[a-z]+/.test($pwString$$)&&/[0-9]+/.test($pwString$$);User.teststrengthPin=$pin$$=>4===$pin$$.length&&/^-?\d+$/.test($pin$$);
|
|
19
|
+
event_name:$event_name$$,msg:$msg$$},$e$$)}})),$send_to_other_servers$$&&User.socketSendToOtherServer($email$$,$event_name$$,$msg$$))};User.isOnline=async $email$$=>{try{return global.socketContainer.socketIO?0<[...(await global.socketContainer.socketIO.in($email$$).allSockets())].length?!0:!1:!1}catch($e$$){return console.error($e$$),!1}};const channel_update_system="updatesystem";
|
|
20
|
+
User.socketSendToOtherServer=async($data$jscomp$1_email$$,$event_name$$,$msg$$)=>{global.clientRedis&&($data$jscomp$1_email$$={event:$event_name$$,email:$data$jscomp$1_email$$,data:$msg$$,from_server_port:global.configs?.port},console.log("[user] [socketSendToOtherServer] g\u1eedi s\u1ef1 ki\u1ec7n t\u1edbi k\u00eanh",channel_update_system,$data$jscomp$1_email$$),await global.clientRedis.publish(channel_update_system,JSON.stringify($data$jscomp$1_email$$)))};
|
|
21
|
+
User.initClientSockets=()=>{setTimeout(()=>{const $subscriber$$=redis.createClient();$subscriber$$.on("error",$err$$=>{console.error("[user] [socketSendToOtherServer] Redis subscriber error:",$err$$)});$subscriber$$.on("connect",()=>{$subscriber$$.subscribe(channel_update_system,$err$$=>{$err$$&&console.error(`[user] [socketSendToOtherServer] Failed to subscribe to channel '${channel_update_system}':`,$err$$)})});$subscriber$$.on("message",async($subscribedChannel$$,$msg$$)=>{try{if("string"==typeof $msg$$&&
|
|
22
|
+
($msg$$=JSON.parse($msg$$)),$subscribedChannel$$===channel_update_system&&$msg$$.from_server_port!=global.configs?.port&&(console.log("[user] [initClientSockets] nh\u1eadn s\u1ef1 ki\u1ec7n t\u1eeb k\u00eanh",channel_update_system,$msg$$),"system"===$msg$$.email))if("listinfo_updated"==$msg$$.event&&($msg$$.data||{}).listinfo_id){console.log("[user] [socketSendToOtherServer] update api",$msg$$.data||{});let $obj$$=await global.getModel("listinfo").findOne({_id:($msg$$.data||{}).listinfo_id});$obj$$&&
|
|
23
|
+
global.getModel("listinfo").createController(global.routerAPI,$obj$$)}else console.log("[user] [socketSendToOtherServer] don't handle msg from system",$msg$$)}catch($e$$){console.error("[user] [socketSendToOtherServer]",$e$$,$subscribedChannel$$,$msg$$)}})},1)};
|
|
24
|
+
User.initSocket=$server$$=>{setTimeout(()=>{console.log("[user] [initSocket] start server socket at ",global.port);global.socketContainer.socketIO=require("socket.io")($server$$,{allowEIO3:!0,cors:{origin:"*",methods:["GET","POST"],credentials:!0}});const $redisAdapter$$=require("socket.io-redis");global.socketContainer.socketIO.adapter($redisAdapter$$({host:"127.0.0.1",port:6379,key:"flexbiz"}));global.socketContainer.socketIO.on("connection",function($socket$$){$socket$$.auth=!1;setTimeout(()=>
|
|
25
|
+
{$socket$$.auth||$socket$$.disconnect("unauthorized")},1E3);$socket$$.on("join-flow",$flowInstanceId$$=>{$socket$$.join($flowInstanceId$$);console.log(`[user] [initSocket] Client ${$socket$$.id} joined flow ${$flowInstanceId$$}`)});$socket$$.on("login",async $msg$jscomp$0$$=>{if($msg$jscomp$0$$.token){var $_token$$=await Tokens.findOne({token:$msg$jscomp$0$$.token}).lean();if($_token$$){$socket$$.auth=!0;$socket$$.join($_token$$.email);let $clientIO$$=await global.socketContainer.loadConnectionId();
|
|
26
|
+
$clientIO$$[$socket$$.id]={token:$msg$jscomp$0$$.token,email:$_token$$.email};global.socketContainer.saveConnectionId($clientIO$$);$msg$jscomp$0$$.id_app?global.alertNotification($_token$$.email,$msg$jscomp$0$$.id_app):$_token$$.id_apps&&0<$_token$$.id_apps.length?$_token$$.id_apps.forEach($id_app$$=>{global.alertNotification($_token$$.email,$id_app$$)}):global.alertNotification($_token$$.email,$_token$$.only_id_app);global.alertMessage($_token$$.email,$msg$jscomp$0$$.id_app);global.socketContainer.socketIO.to($socket$$.id).emit("login",
|
|
27
|
+
{user:$_token$$.email,success:!0});$socket$$.on("offer",function($msg$$){$msg$$.from=$_token$$.email;User.socketSendTo($msg$$.to,"offer",$msg$$,!1)});$socket$$.on("answer",function($msg$$){$msg$$.from=$_token$$.email;User.socketSendTo($msg$$.to,"answer",$msg$$,!1)});$socket$$.on("candidate",function($msg$$){$msg$$.from=$_token$$.email;User.socketSendTo($msg$$.to,"candidate",$msg$$,!1)});$socket$$.on("leave",function($msg$$){$msg$$.from=$_token$$.email;User.socketSendTo($msg$$.to,"leave",$msg$$,!1)})}else global.socketContainer.socketIO.to($socket$$.id).emit("login",
|
|
28
|
+
{user:$msg$jscomp$0$$.email,success:!1,message:"Token is not exists"})}});$socket$$.on("disconnect",async function(){let $clientIO$$=await global.socketContainer.loadConnectionId(),$client$$=$clientIO$$[$socket$$.id];$client$$&&$socket$$.leave($client$$.email);delete $clientIO$$[$socket$$.id];global.socketContainer.saveConnectionId($clientIO$$)})})},5E3)};User.teststrengthPassword=$pwString$$=>5<$pwString$$.length&&/[A-Z]+/.test($pwString$$)&&/[a-z]+/.test($pwString$$)&&/[0-9]+/.test($pwString$$);
|
|
29
|
+
User.teststrengthPin=$pin$$=>4===$pin$$.length&&/^-?\d+$/.test($pin$$);
|
|
35
30
|
User.emitEvent=async function($email$$,$event$$,$_data_obj_send$$,$push$$){if($email$$){if("object"===typeof $_data_obj_send$$){var $data$$=Object.assign({},$_data_obj_send$$);$data$$.__event=$event$$}else $data$$=$_data_obj_send$$;if($data$$.body&&(0==$data$$.body.indexOf("{")||0==$data$$.body.indexOf("[")))try{var $cipher_unsub_file_link_unsub$$=JSON.parse($data$$.body);$cipher_unsub_file_link_unsub$$.data&&(0<=$cipher_unsub_file_link_unsub$$.data.indexOf("data:image")?$data$$.body="Image":$data$$.body=
|
|
36
31
|
"File")}catch($e$$){console.error("Kh\u00f4ng th\u1ec3 parse data",$data$$.body,$e$$)}if($data$$.email_content&&!$data$$.not_send_email&&$data$$.title){var $encrypted_unsub_unsub$$;0!=$data$$.allow_unsubcribe&&$data$$.id_app&&($encrypted_unsub_unsub$$=await global.getModel("subscribe").findOne({id_app:$data$$.id_app,email:$email$$,unsubcribe:!0}).lean());$encrypted_unsub_unsub$$||($_data_obj_send$$={...$data$$},$_data_obj_send$$.id_app&&($cipher_unsub_file_link_unsub$$=crypto.createCipher("aes192",
|
|
37
32
|
configs.cryptoPassword||"PVT@1"),$encrypted_unsub_unsub$$=$cipher_unsub_file_link_unsub$$.update(JSON.stringify({id_app:$data$$.id_app,email:$email$$}),"utf8","hex"),$encrypted_unsub_unsub$$+=$cipher_unsub_file_link_unsub$$.final("hex"),$cipher_unsub_file_link_unsub$$=`${configs.api_url}/public/unsubscribe/${$encrypted_unsub_unsub$$}`,0!=$data$$.allow_unsubcribe&&($_data_obj_send$$.email_content=`${$_data_obj_send$$.email_content}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
'use strict';const async=require("async"),_=require("lodash"),axios=require("axios"),moment=require("moment"),numeral=require("numeral"),PostBook=require("../../libs/post-book"),PostSocai=require("../../libs/post-socai"),Sokho=global.getModel("sokho"),Sokhott=global.getModel("sokhott"),Sokhonpp=global.getModel("
|
|
1
|
+
'use strict';const async=require("async"),_=require("lodash"),axios=require("axios"),moment=require("moment"),numeral=require("numeral"),PostBook=require("../../libs/post-book"),PostSocai=require("../../libs/post-socai"),Sokho=global.getModel("sokho"),Sokhott=global.getModel("sokhott"),Sokhonpp=global.getModel("sokhonpp"),Tdttno=global.getModel("tdttno"),Tdttno_tt=global.getModel("tdttno_tt"),Vatra=global.getModel("vatra"),Options=global.getModel("options"),dvcs=global.getModel("dvcs"),dmvt=global.getModel("dmvt"),
|
|
2
2
|
account=global.getModel("account"),dmkho=global.getModel("dmkho"),customer=global.getModel("customer"),dmnv=global.getModel("dmnv"),dmdt=global.getModel("dmdt"),dmphi=global.getModel("dmphi"),contract=global.getModel("contract"),salecontract=global.getModel("sale_contract"),model=global.getModel("hd2"),controller=require("../../controllers/controller"),utils=require("../../libs/utils"),tinhhoahong=require("../../libs/tinhhoahong"),ptthanhtoan=global.getModel("ptthanhtoan"),trangthai=global.getModel("trangthai"),
|
|
3
3
|
{QRPay}=require("vietnam-qr-pay"),ma_ct="HD2",App=global.getModel("app"),blockchainconnect=require("../../libs/blockchainconnect"),spend=async($appInfo$$,$receiver_user$$,$receiver_address$$,$amount$$,$denom$$,$memo$$,$introduce_code$$,$sub_action$$="")=>{try{await blockchainconnect.spend($appInfo$$._id,$appInfo$$.wallet_token,$appInfo$$.wallet_address,$receiver_address$$,{amount:$amount$$,denom:$denom$$,memo:$memo$$,action:"bonus",introduce_code:$introduce_code$$,sub_action:$sub_action$$})}catch($e$$){console.error("Error send coin",
|
|
4
4
|
$e$$,$receiver_user$$,$receiver_address$$,$amount$$,$denom$$,$memo$$)}},taothongtinchuyenkhoan=async($bank_bin_user$$,$r$$)=>{if("3"===$r$$.trang_thai)if($r$$.pt_thanh_toan){var $t_thue_nt_t_tt$$=$r$$.details.csum("tien_thue_nt"),$bank_name_t_tien_ct_nt$$=$r$$.details.csum("tien_ct_nt"),$bank_account_number_tc_ck_nt$$=$r$$.details.csum("tien_ck_nt")+($r$$.tien_ck_hd||0);$t_thue_nt_t_tt$$=Math.round(($bank_name_t_tien_ct_nt$$-$bank_account_number_tc_ck_nt$$+$t_thue_nt_t_tt$$+($r$$.tien_phi_vc_nt||
|
|
@@ -65,8 +65,8 @@ await spend($appInfo$$,$obj$$.be_introduced,$wallet_kho$$.address,$amount$$,$den
|
|
|
65
65
|
utils.round($detail$jscomp$0$$.tien_nt*$obj$$.ty_gia,0);$detail$jscomp$0$$.tien_ct=utils.round($detail$jscomp$0$$.tien_ct_nt*$obj$$.ty_gia,0);$detail$jscomp$0$$.gia_ban=utils.round($detail$jscomp$0$$.gia_ban_nt*$obj$$.ty_gia,0);$detail$jscomp$0$$.tien_ck=utils.round($detail$jscomp$0$$.tien_ck_nt*$obj$$.ty_gia,0);$detail$jscomp$0$$.tien_thue=utils.round($detail$jscomp$0$$.tien_thue_nt*$obj$$.ty_gia,0);$detail$jscomp$0$$.tien_xuat=$detail$jscomp$0$$.tien_xuat_nt}!$obj$$.details.find($r$$=>$r$$.ma_thue)&&
|
|
66
66
|
$obj$$.thue_suat&&($obj$$.t_thue_nt=$obj$$.tien_thue_dc_nt||utils.round(($obj$$.details.csum("tien_ct_nt")-$obj$$.details.csum("tien_ck_nt"))*$obj$$.thue_suat/100,$f_tien_nt$jscomp$1_t_thue_nt$jscomp$1_user$$),$obj$$.t_thue=utils.round($obj$$.t_thue_nt*($obj$$.ty_gia||1),0),$f_tien_nt$jscomp$1_t_thue_nt$jscomp$1_user$$=$obj$$.details.csum("tien_thue_nt"),$i_t_thue$$=$obj$$.details.csum("tien_thue"),$f_tien_nt$jscomp$1_t_thue_nt$jscomp$1_user$$!==$obj$$.t_thue_nt||$i_t_thue$$!==$obj$$.t_thue)&&(console.log("[HD2] \u0110i\u1ec1u ch\u1ec9nh ti\u1ec1n thu\u1ebf tr\u00ean master v\u00e0 t\u1ed5ng chi ti\u1ebft",
|
|
67
67
|
{t_master:$obj$$.t_thue,t_details:$i_t_thue$$}),0<$obj$$.details.length&&($detail$jscomp$0$$=$obj$$.details[$obj$$.details.length-1],$detail$jscomp$0$$.tien_thue_nt+=$obj$$.t_thue_nt-$f_tien_nt$jscomp$1_t_thue_nt$jscomp$1_user$$,$detail$jscomp$0$$.tien_thue+=$obj$$.t_thue-$i_t_thue$$));$obj$$.id_contract?salecontract.findOne({_id:$obj$$.id_contract,id_app:$obj$$.id_app}).lean().exec(($e$$,$c$$)=>{$c$$&&($obj$$.ma_hd=$c$$.ma_hd);$next$$(null,$obj$$)}):$next$$(null,$obj$$)};$contr$$.creating=function($user$$,
|
|
68
|
-
$obj$$,$next$$){$obj$$.details||($obj$$.details=[]);$valid$$($user$$,$obj$$,async function($error$$){if($error$$)return $next$$($error$$);await $obj$$.details.asyncJoinModel2($user$$.current_id_app,dmvt,{where:"ma_vt",setFields:($item$$,$ref$$)=>{$item$$.combo=$ref$$.combo||[];$item$$.ma_thue||($item$$.ma_thue=$ref$$.ma_thue);$item$$.ten_vt=$ref$$.ten_vt;$item$$.status_vt=$ref$$.status;$item$$.gia_mua=$ref$$.gia_mua_tmp}});$error$$=$obj$$.details.filter($d$$=>!$d$$.status_vt);if(0<$error$$.length)return $next$$(`C\u00e1c m\u1eb7t h\u00e0ng sau \u0111\u00e3 ng\u1eebng kinh doanh : ${$error$$.map($d$$=>
|
|
69
|
-
$d$$.ten_vt).join(",")}`);let $ngay_nay_thang_truoc$$=moment($obj$$.ngay_ct).subtract(1,"months").toDate(),$details$$=[];$obj$$.details.forEach($d$$=>{$d$$.combo&&0<$d$$.combo.length?$details$$=[...$details$$,...$d$$.combo]:$details$$.push($d$$)});await $details$$.filter($r$$=>!$r$$.gia_mua).asyncJoinModel2($obj$$.id_app,"giatb",{where:$item$$=>({ma_vt:$item$$.ma_vt,id_app:$obj$$.id_app,nam:$ngay_nay_thang_truoc$$.getFullYear(),thang:$ngay_nay_thang_truoc$$.getMonth()+1}),fields:[{gia_mua:"gia"}]});
|
|
68
|
+
$obj$$,$next$$){$obj$$.details||($obj$$.details=[]);$valid$$($user$$,$obj$$,async function($error$$){if($error$$)return $next$$($error$$);await $obj$$.details.asyncJoinModel2($user$$.current_id_app,dmvt,{where:"ma_vt",setFields:($item$$,$ref$$)=>{$item$$.combo=$ref$$.combo||[];$item$$.ma_thue||($item$$.ma_thue=$ref$$.ma_thue);$item$$.ten_vt=$ref$$.ten_vt;$item$$.status_vt=$ref$$.status;$item$$.gia_mua=$ref$$.gia_mua_tmp}});$error$$=$obj$$.details.filter($d$$=>!$d$$.status_vt);if(0<$error$$.length)return $next$$(`C\u00e1c m\u1eb7t h\u00e0ng sau \u0111\u00e3 ng\u1eebng kinh doanh ho\u1eb7c kh\u00f4ng t\u1ed3n t\u1ea1i trong h\u1ec7 th\u1ed1ng : ${$error$$.map($d$$=>
|
|
69
|
+
$d$$.ten_vt||$d$$.ma_vt).join(",")}`);let $ngay_nay_thang_truoc$$=moment($obj$$.ngay_ct).subtract(1,"months").toDate(),$details$$=[];$obj$$.details.forEach($d$$=>{$d$$.combo&&0<$d$$.combo.length?$details$$=[...$details$$,...$d$$.combo]:$details$$.push($d$$)});await $details$$.filter($r$$=>!$r$$.gia_mua).asyncJoinModel2($obj$$.id_app,"giatb",{where:$item$$=>({ma_vt:$item$$.ma_vt,id_app:$obj$$.id_app,nam:$ngay_nay_thang_truoc$$.getFullYear(),thang:$ngay_nay_thang_truoc$$.getMonth()+1}),fields:[{gia_mua:"gia"}]});
|
|
70
70
|
$ngay_nay_thang_truoc$$=moment($ngay_nay_thang_truoc$$).subtract(1,"months").toDate();await $details$$.filter($r$$=>!$r$$.gia_mua).asyncJoinModel2($obj$$.id_app,"giatb",{where:$item$$=>({ma_vt:$item$$.ma_vt,id_app:$obj$$.id_app,nam:$ngay_nay_thang_truoc$$.getFullYear(),thang:$ngay_nay_thang_truoc$$.getMonth()+1}),fields:[{gia_mua:"gia"}]});$obj$$.details.filter($d$$=>$d$$.combo&&0<$d$$.combo.length).forEach($detail$$=>{$detail$$.combo=$detail$$.combo.map($item$$=>{$item$$.sl_xuat_1_combo=$item$$.sl_xuat;
|
|
71
71
|
$item$$.sl_xuat=$item$$.sl_xuat_1_combo*$detail$$.sl_xuat;$item$$.tien_xuat=$item$$.tien_xuat_nt=$item$$.sl_xuat*($item$$.gia_von_nt||0);$item$$.tien_hang=$item$$.tien_hang_nt=0;$item$$.tien=$item$$.tien_nt=$item$$.sl_xuat*($item$$.gia_ban_nt||0);$item$$.tien_ck=$item$$.tien_ck_nt=$item$$.sl_xuat*($item$$.tien_ck_nt||0);$item$$.tt=$item$$.tt_nt=$item$$.tien_nt-($item$$.tien_ck_nt||0);return{...$item$$}});$detail$$.gia_mua=$detail$$.combo.map($c$$=>($c$$.gia_mua||0)*$c$$.sl_xuat_1_combo).reduce(($a$$,
|
|
72
72
|
$b$$)=>$a$$+$b$$,0)});$obj$$.result_export_einvoice=null;$next$$(null,$obj$$)})};$contr$$.updating=async function($user$$,$data$$,$obj$$,$next$$){$data$$.details||($data$$.details=$obj$$.details);$data$$.ngay_ct=$data$$.ngay_ct||$obj$$.ngay_ct;await $data$$.details.asyncJoinModel2($user$$.current_id_app,dmvt,{where:"ma_vt",setFields:($item$$,$ref$$)=>{let $old_combo$$=($item$$.combo||[]).map($i$$=>({ma_vt:$i$$.ma_vt,sl_xuat:$i$$.sl_xuat})),$new_combo$$=($ref$$.combo||[]).map($i$$=>({ma_vt:$i$$.ma_vt,
|
package/server/route.js
CHANGED
|
@@ -29,28 +29,24 @@ $funcs_sys_inited$$[$file$$]=$file$$)});fs.readdirSync(__dirname+"/modules/syste
|
|
|
29
29
|
global.getModel($modelName$$);if(("find"!==$action$$||!underscore.has($model$$.schema.paths,"id_app")||0<="user token otp tokens app asskey".split(" ").indexOf($modelName$$))&&!underscore.contains($usersAdmin$$,$user$$.email)&&!$isSupperAdmin$$($user$$.email.toLowerCase()))return $next$$("B\u1ea1n kh\u00f4ng c\u00f3 quy\u1ec1n th\u1ef1c hi\u1ec7n thao t\u00e1c n\u00e0y");$permission$$.isAdmin($id_app$$,$user$$.email,function($e$jscomp$0$$,$admin$$){if($e$jscomp$0$$||!$admin$$)return $next$$("B\u1ea1n kh\u00f4ng c\u00f3 quy\u1ec1n th\u1ef1c hi\u1ec7n thao t\u00e1c n\u00e0y");
|
|
30
30
|
$e$jscomp$0$$={};if($req$$.query.q)try{$e$jscomp$0$$=$evalute$$(`return ${$req$$.query.q}`,{})}catch($e$$){return $res$$.status(400).send($e$$.message)}try{switch(underscore.has($model$$.schema.paths,"id_app")&&($e$jscomp$0$$.id_app=$id_app$$),$action$$){case "find":let $limit$$=$req$$.query.limit||1E3,$fields$$;$req$$.query.fields&&($fields$$={},$req$$.query.fields.split(",").forEach($field$$=>{$fields$$[$field$$]=1}));try{$limit$$=Number($limit$$)}catch($e$$){return $res$$.status(400).send($e$$.message)}$limit$$||
|
|
31
31
|
($limit$$=1E3);$model$$.find($e$jscomp$0$$,$fields$$).limit($limit$$).lean().exec(($e$$,$rs$$)=>{if($e$$)return $res$$.status(400).send($e$$);$res$$.send($rs$$)});break;case "update":let $data$$=$req$$.query.fields;if(!$data$$)return $res$$.status(400).send("Data to update is empty");try{$data$$=JSON.parse($data$$),$model$$.updateMany($e$jscomp$0$$,$data$$,($e$$,$rs$$)=>{if($e$$)return $res$$.status(400).send($e$$);$res$$.send($rs$$)})}catch($e$$){$res$$.status(400).send($e$$.message)}break;case "remove":$model$$.deleteMany($e$jscomp$0$$,
|
|
32
|
-
($e$$,$rs$$)=>{if($e$$)return $res$$.status(400).send($e$$);$res$$.send($rs$$)});break;default:$res$$.status(400).send(`Action ${$action$$} is not support`)}}catch($e$$){$res$$.status(400).send($e$$.message)}})});const $
|
|
33
|
-
|
|
34
|
-
$
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
"
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
{}
|
|
42
|
-
$
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
$
|
|
49
|
-
$
|
|
50
|
-
$
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return $res$$.send($document$jscomp$2_req$$)});$app$$.get("/api-docs-report/:code",$createRateLimiterMiddleware_limiter_others$$,async function($document$jscomp$3_req$$,$res$$){$document$jscomp$3_req$$=await docs.apiReport($document$jscomp$3_req$$.params.code,$document$jscomp$3_req$$.query.id_app);return $res$$.send($document$jscomp$3_req$$)});if(configs.has_api_barcode){const $qr$$=require("qr-image");$app$$.get("/qrcode",$createRateLimiterMiddleware_limiter_others$$,function($req$$,$res$$){let $report$$=
|
|
54
|
-
$req$$.query.report,$type$$=$req$$.query.type||"svg",$size$$=5;if($req$$.query.size)try{$size$$=Number($req$$.query.size),isNaN($size$$)&&($size$$=void 0)}catch($e$$){console.error("size qrcode is not valid",$e$$)}else $size$$=5;$report$$||($report$$=$req$$.query.data)&&($report$$=Buffer.from($report$$,"base64").toString("utf8"));if(!$report$$)return $res$$.status(400).send("miss parameter 'report'");setImmediate(()=>{const $code$$=$qr$$.image($report$$,{type:$type$$,size:$size$$});$res$$.type($type$$);
|
|
55
|
-
$code$$.pipe($res$$)})});const $bwipjs$$=require("bwip-js"),$stream$$=require("stream");$app$$.get("/barcode",$createRateLimiterMiddleware_limiter_others$$,function($height_req$$,$res$$){let $code$$=$height_req$$.query.code||"code128",$data$$=$height_req$$.query.data;$height_req$$=Number($height_req$$.query.height||10);if(!$data$$)return $res$$.status(400).send({error:"Thi\u1ebfu c\u00e1c tham s\u1ed1 data"});$bwipjs$$.toBuffer({bcid:$code$$,text:$data$$,scale:3,height:$height_req$$,includetext:!0,
|
|
56
|
-
textxalign:"center"},function($bufferStream_e$$,$png$$){$bufferStream_e$$?(console.error($bufferStream_e$$,$code$$,$data$$),$res$$.status(400).send({error:$bufferStream_e$$.message||$bufferStream_e$$.error||$bufferStream_e$$})):($bufferStream_e$$=new $stream$$.PassThrough,$bufferStream_e$$.end($png$$),$bufferStream_e$$.pipe($res$$))})})}}$cb$$()};
|
|
32
|
+
($e$$,$rs$$)=>{if($e$$)return $res$$.status(400).send($e$$);$res$$.send($rs$$)});break;default:$res$$.status(400).send(`Action ${$action$$} is not support`)}}catch($e$$){$res$$.status(400).send($e$$.message)}})});const $bot_router$$=express.Router();configs.limitRequest.bot&&($limiter$jscomp$2_limiter$$=await $createRateLimiterMiddleware_limiter_others$$(configs.limitRequest.bot,"bot"),$router$$.use($limiter$jscomp$2_limiter$$));$app$$.use("/bot",$bot_router$$);fs.existsSync(__dirname+"/modules/bot")&&
|
|
33
|
+
(console.log("init bot..."),fs.readdirSync(__dirname+"/modules/bot").forEach(function($file$$){".js"===$file$$.substr(-3)&&require("./modules/bot/"+$file$$)($bot_router$$)}));const $public_router$$=express.Router();configs.limitRequest.public&&($limiter$jscomp$2_limiter$$=await $createRateLimiterMiddleware_limiter_others$$(configs.limitRequest.public,"public"),$router$$.use($limiter$jscomp$2_limiter$$));$public_router$$.use(function($req$$,$res$$,$next$$){for(let $key$$ in $req$$.query)"true"==$req$$.query[$key$$]&&
|
|
34
|
+
($req$$.query[$key$$]=!0),"false"==$req$$.query[$key$$]&&($req$$.query[$key$$]=!1);if($req$$.query.id_app){let $id_app$$=$req$$.query.id_app;appModel.findOne({_id:$id_app$$},function($error$$,$app$$){if($error$$)return $next$$($error$$);if($app$$)$req$$.user={current_id_app:$id_app$$,email:"public"},$req$$.query.id_app=$id_app$$,$next$$();else return $res$$.status(400).send("Kh\u00f4ng t\u1ed3n t\u1ea1i c\u00f4ng ty n\u00e0y")})}else $next$$()});$app$$.use("/public",$public_router$$);const $funcs_public_inited$$=
|
|
35
|
+
{};configs.paths.modules&&fs.existsSync(configs.paths.modules+"/public")&&(console.log("init custom public..."),fs.readdirSync(configs.paths.modules+"/public").forEach(function($file$$){".js"==$file$$.substr(-3)&&(require(configs.paths.modules+"/public/"+$file$$)($public_router$$),$funcs_public_inited$$[$file$$]=$file$$)}));fs.existsSync(__dirname+"/modules/public")&&(console.log("init default public..."),fs.readdirSync(__dirname+"/modules/public").filter($file$$=>!$funcs_public_inited$$[$file$$]).forEach(function($file$$){".js"==
|
|
36
|
+
$file$$.substr(-3)&&(require("./modules/public/"+$file$$)($public_router$$),$funcs_public_inited$$[$file$$]=$file$$)}));configs.useFlow&&require("./flow/FlowEngine")($app$$);$createRateLimiterMiddleware_limiter_others$$=await $createRateLimiterMiddleware_limiter_others$$(configs.limitRequest.other||{},"other");$app$$.get("/getfile/:folder/:filename",$createRateLimiterMiddleware_limiter_others$$,async function($orgin_file_size$jscomp$2_req$$,$res$$){let $root_dir$$=configs.paths.images||path.join(__dirname,
|
|
37
|
+
"images"),$imgPath$$=path.join($root_dir$$,$orgin_file_size$jscomp$2_req$$.params.folder,$orgin_file_size$jscomp$2_req$$.params.filename);if(fs.existsSync($imgPath$$)){let $size$$,$cache$$;if($orgin_file_size$jscomp$2_req$$.query.size||$orgin_file_size$jscomp$2_req$$.query.resize)switch(String($orgin_file_size$jscomp$2_req$$.query.size||$orgin_file_size$jscomp$2_req$$.query.resize).toUpperCase()){case "64":case "X":$size$$=64;$cache$$=!0;break;case "128":$size$$=128;$cache$$=!0;break;case "320":case "S":$size$$=
|
|
38
|
+
320;$cache$$=!0;break;case "512":case "M":$size$$=512;$cache$$=!0;break;case "1024":case "L":$size$$=1024;$cache$$=!0;break;default:try{$size$$=Number($orgin_file_size$jscomp$2_req$$.query.size||$orgin_file_size$jscomp$2_req$$.query.resize);if(isNaN($size$$)||!$size$$)$size$$=1024;$cache$$=!0}catch($e$$){console.log("size param must be X or S or M or L or a number")}}if($size$$){let $file_name_resize$$=path.join($root_dir$$,$orgin_file_size$jscomp$2_req$$.params.folder,String($size$$)+"."+$orgin_file_size$jscomp$2_req$$.params.filename);
|
|
39
|
+
if(fs.existsSync($file_name_resize$$))return sharp($file_name_resize$$,{failOnError:!1}).pipe($res$$);let $_gm$$=sharp($imgPath$$,{failOnError:!1});($orgin_file_size$jscomp$2_req$$=await $_gm$$.metadata())&&$size$$&&$size$$<$orgin_file_size$jscomp$2_req$$.width&&$size$$<$orgin_file_size$jscomp$2_req$$.height&&($_gm$$=$_gm$$.resize({width:$size$$}).rotate());$orgin_file_size$jscomp$2_req$$&&"webp"!=$orgin_file_size$jscomp$2_req$$.format&&($_gm$$=$_gm$$.webp({lossless:!1}));$cache$$&&setImmediate(()=>
|
|
40
|
+
{$_gm$$.toFile($file_name_resize$$,$error$$=>{if($error$$)return console.error("save resize image:",$error$$.message);console.log("cache file",$file_name_resize$$)})});$_gm$$.pipe($res$$)}else $res$$.sendFile($imgPath$$)}else $res$$.sendFile(path.join(__dirname,"images","others","noimage.png"))});const $Labelinfo$$=global.getModel("labelinfo");$app$$.get("/labels/:labelid",$createRateLimiterMiddleware_limiter_others$$,function($labelid_req$$,$res$$){$labelid_req$$=$labelid_req$$.params.labelid.toUpperCase();
|
|
41
|
+
$Labelinfo$$.find({labelid:$labelid_req$$}).lean().exec(($e$$,$labels$$)=>{if($e$$)return $res$$.status(400).send($e$$);let $_labels$$={};$labels$$.forEach($l$$=>{$_labels$$[$l$$.textid]=$l$$});$res$$.send($_labels$$)})});$app$$.get("/aff/:_id",$createRateLimiterMiddleware_limiter_others$$,async function($id_afflink_req$$,$res$$){$id_afflink_req$$=$id_afflink_req$$.params._id;if(!$id_afflink_req$$)return $res$$.status(404).send("Page not found");var $afflink_page_link$$=await global.getModel("afflink").findOne({_id:$id_afflink_req$$});
|
|
42
|
+
$afflink_page_link$$?(await global.getModel("afflink").updateOne({_id:$id_afflink_req$$},{$inc:{da_truy_cap:1}}),$afflink_page_link$$=$afflink_page_link$$.page_link,$afflink_page_link$$=0>$afflink_page_link$$.indexOf("?")?`${$afflink_page_link$$}?afflink=${$id_afflink_req$$}`:`${$afflink_page_link$$}&afflink=${$id_afflink_req$$}`,$res$$.redirect($afflink_page_link$$)):$res$$.status(404).send("Page not found")});const $axios$$=require("axios"),$querystring$$=require("querystring");$app$$.get("/oa/:id_app",
|
|
43
|
+
$createRateLimiterMiddleware_limiter_others$$,async function($data$jscomp$3_req$$,$res$$){var $app$jscomp$2_id_app$$=$data$jscomp$3_req$$.params.id_app,$headers_zalo_oa_id$$=$data$jscomp$3_req$$.query.oa_id;$data$jscomp$3_req$$=$data$jscomp$3_req$$.query.code;if(!$headers_zalo_oa_id$$||!$data$jscomp$3_req$$||!isValidObjectId($app$jscomp$2_id_app$$))return $res$$.status(400).send({error:"Y\u00eau c\u1ea7u kh\u00f4ng h\u1ee3p l\u1ec7"});$app$jscomp$2_id_app$$=await global.getModel("app").findOne({_id:$app$jscomp$2_id_app$$});
|
|
44
|
+
if(!$app$jscomp$2_id_app$$)return $res$$.status(400).send({error:"App kh\u00f4ng t\u1ed3n t\u1ea1i"});$app$jscomp$2_id_app$$.zalo_oa_id=$headers_zalo_oa_id$$;$app$jscomp$2_id_app$$.zalo_code=$data$jscomp$3_req$$;if($app$jscomp$2_id_app$$.zalo_secret_key&&$app$jscomp$2_id_app$$.zalo_app_id){$headers_zalo_oa_id$$={"Content-Type":"application/x-www-form-urlencoded",secret_key:$app$jscomp$2_id_app$$.zalo_secret_key};$data$jscomp$3_req$$={code:$app$jscomp$2_id_app$$.zalo_code,app_id:$app$jscomp$2_id_app$$.zalo_app_id,
|
|
45
|
+
grant_type:"authorization_code"};try{var $message_zalo_token$$=(await $axios$$.post("https://oauth.zaloapp.com/v4/oa/access_token",$querystring$$.stringify($data$jscomp$3_req$$),{headers:$headers_zalo_oa_id$$})).data;$app$jscomp$2_id_app$$.zalo_access_token=$message_zalo_token$$.access_token;$app$jscomp$2_id_app$$.zalo_refresh_token=$message_zalo_token$$.refresh_token;$app$jscomp$2_id_app$$.zalo_expires_in=$message_zalo_token$$.expires_in;$app$jscomp$2_id_app$$.zalo_updated=new Date}catch($e$$){return $message_zalo_token$$=
|
|
46
|
+
(($e$$.response||{}).data||{}).message,console.error("Can't get access token from zalo",$message_zalo_token$$||$e$$),$res$$.status(400).send({error:$message_zalo_token$$||$e$$.message||$e$$})}}else return $res$$.status(400).send({error:"Ch\u01b0a khai b\u00e1o th\u00f4ng tin zalo app id v\u00e0 secret key cho c\u00f4ng ty n\u00e0y"});await $app$jscomp$2_id_app$$.save();$res$$.send({ok:!0})});$app$$.get("/task-status/:id",$createRateLimiterMiddleware_limiter_others$$,async function($req$$,$res$$){try{let $task$$=
|
|
47
|
+
await $redisCache$$.getObject($req$$.params.id);return $res$$.send($task$$)}catch($e$$){$res$$.status(400).send($e$$)}});$app$$.get("/api-docs-auth",$createRateLimiterMiddleware_limiter_others$$,async function($document_req$$,$res$$){$document_req$$=await docs.apiAuth();return $res$$.send($document_req$$)});$app$$.get("/api-docs-fields/:code",$createRateLimiterMiddleware_limiter_others$$,async function($document$jscomp$1_req$$,$res$$){$document$jscomp$1_req$$=await docs.apiFields($document$jscomp$1_req$$.params.code,
|
|
48
|
+
$document$jscomp$1_req$$.query.id_app,$document$jscomp$1_req$$.query.import_yn);return $res$$.send($document$jscomp$1_req$$)});$app$$.get("/api-docs-input/:code",$createRateLimiterMiddleware_limiter_others$$,async function($document$jscomp$2_req$$,$res$$){$document$jscomp$2_req$$=await docs.apiDocs($document$jscomp$2_req$$.params.code,$document$jscomp$2_req$$.query.id_app);return $res$$.send($document$jscomp$2_req$$)});$app$$.get("/api-docs-report/:code",$createRateLimiterMiddleware_limiter_others$$,
|
|
49
|
+
async function($document$jscomp$3_req$$,$res$$){$document$jscomp$3_req$$=await docs.apiReport($document$jscomp$3_req$$.params.code,$document$jscomp$3_req$$.query.id_app);return $res$$.send($document$jscomp$3_req$$)});if(configs.has_api_barcode){const $qr$$=require("qr-image");$app$$.get("/qrcode",$createRateLimiterMiddleware_limiter_others$$,function($req$$,$res$$){let $report$$=$req$$.query.report,$type$$=$req$$.query.type||"svg",$size$$=5;if($req$$.query.size)try{$size$$=Number($req$$.query.size),
|
|
50
|
+
isNaN($size$$)&&($size$$=void 0)}catch($e$$){console.error("size qrcode is not valid",$e$$)}else $size$$=5;$report$$||($report$$=$req$$.query.data)&&($report$$=Buffer.from($report$$,"base64").toString("utf8"));if(!$report$$)return $res$$.status(400).send("miss parameter 'report'");setImmediate(()=>{const $code$$=$qr$$.image($report$$,{type:$type$$,size:$size$$});$res$$.type($type$$);$code$$.pipe($res$$)})});const $bwipjs$$=require("bwip-js"),$stream$$=require("stream");$app$$.get("/barcode",$createRateLimiterMiddleware_limiter_others$$,
|
|
51
|
+
function($height_req$$,$res$$){let $code$$=$height_req$$.query.code||"code128",$data$$=$height_req$$.query.data;$height_req$$=Number($height_req$$.query.height||10);if(!$data$$)return $res$$.status(400).send({error:"Thi\u1ebfu c\u00e1c tham s\u1ed1 data"});$bwipjs$$.toBuffer({bcid:$code$$,text:$data$$,scale:3,height:$height_req$$,includetext:!0,textxalign:"center"},function($bufferStream_e$$,$png$$){$bufferStream_e$$?(console.error($bufferStream_e$$,$code$$,$data$$),$res$$.status(400).send({error:$bufferStream_e$$.message||
|
|
52
|
+
$bufferStream_e$$.error||$bufferStream_e$$})):($bufferStream_e$$=new $stream$$.PassThrough,$bufferStream_e$$.end($png$$),$bufferStream_e$$.pipe($res$$))})})}}$cb$$()};
|