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.
@@ -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
@@ -2,7 +2,7 @@
2
2
  "name": "flexbiz-server",
3
3
  "main": "./server/app.js",
4
4
  "description": "Flexible Server",
5
- "version": "12.3.29",
5
+ "version": "12.3.31",
6
6
  "author": {
7
7
  "name": "Van Truong Pham",
8
8
  "email": "invncur@gmail.com"
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");global.port=$options$$.port||$configs$$.PORT||443;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);
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$$()});var $compress_cookieParser_morgan_multer_root_dir_uploads_session$$=require("express-session");$app$$.use($compress_cookieParser_morgan_multer_root_dir_uploads_session$$({secret:"QV098PVT123456HLBN",resave:!1,saveUninitialized:!0,cookie:{secure:!1}}));$compress_cookieParser_morgan_multer_root_dir_uploads_session$$=
5
- require("cookie-parser");$app$$.use($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:"+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$$()});$compress_cookieParser_morgan_multer_root_dir_uploads_session$$=require("compression");
6
- $app$$.use($compress_cookieParser_morgan_multer_root_dir_uploads_session$$());$compress_cookieParser_morgan_multer_root_dir_uploads_session$$=$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$$()});$compress_cookieParser_morgan_multer_root_dir_uploads_session$$=
7
- require("multer")({dest:$compress_cookieParser_morgan_multer_root_dir_uploads_session$$,limits:{files:1,fileSize:$limitFileSize$$}});$app$$.use($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={});!0!==$options$$.lite&&($app$$.use("/",express.static($configs$$.paths.public||__dirname+"/public")),$app$$.use("/admin",express.static($configs$$.paths.admin||
8
- __dirname+"/admin")),$app$$.use("/templates",express.static($configs$$.paths.templates||__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());$compress_cookieParser_morgan_multer_root_dir_uploads_session$$=require("morgan");var $accessLogStream_rfs$$=
9
- require("rotating-file-stream");const $logDirectory$$=$configs$$.paths.log||__dirname+"/log";fs.existsSync($logDirectory$$)||fs.mkdirSync($logDirectory$$);$accessLogStream_rfs$$=$accessLogStream_rfs$$("access.log",{interval:"1d",path:$logDirectory$$});$app$$.use($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);
10
- $res$$.status(500).send("Server Error!")});global.mongoose.connect($configs$$.database.url,{useNewUrlParser:!0}).then(async()=>{console.log("Connected to Database");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&&
11
- require("./libs/redis-cache").set();$options$$.start_abci_handler&&global.getModel("assabcihandler").start();!0!==$options$$.lite?require("./route")($app$$,()=>{if(!1!==$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$$);
12
- $cpus_report_cpus_server_sslConfig$$.timeout=6E5;!1!==$options$$.useSocket?$User$$.initSocket($cpus_report_cpus_server_sslConfig$$):$User$$.initClientSockets();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 "+
13
- $worker$$.process.pid+" died",$code$$,$signal$$)});$StaticPool$jscomp$0$$.on("online",function($worker$$){console.info("worker "+$worker$$.process.pid+" 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$$/
14
- 2):0);var $StaticPool$jscomp$1$$=$options$$.input_cpus||($options$$.start_input_data_pool?Math.max(Math.round($cpus_report_cpus_server_sslConfig$$/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=
15
- new $StaticPool$$(__dirname+"/workers/inputWorker.js",$options$$.max_queue_imports||0,$StaticPool$jscomp$1$$,3E5,$StaticPool$jscomp$1$$,"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"),
16
- global.importDataMainPool.exec({load:!0,configs:JSON.stringify($configs$$)},()=>{console.error("Import pool ready")}));$cpus_report_cpus_server_sslConfig$$&&($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")}));
17
- $callbackServer$$&&$callbackServer$$()}):require("./route")($app$$,()=>{$callbackServer$$&&$callbackServer$$()},!0)})}).catch($err$$=>{console.log("Not Connected to Database ERROR! ",$err$$)});return $app$$};process.on("SIGINT",async()=>{global.sharedRedisConnection&&await global.sharedRedisConnection.quit();process.exit(0)});
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");global.port=$_port_accessLogStream_rfs$$;
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$$()});$_configs_compress_cookieParser_morgan_multer_root_dir_uploads_session$$=
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$$=$req$$.cookies.uid;$uid$$||($uid$$=$req$$.headers.uid);$uid$$||($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$$=$configs$$.paths.uploads||__dirname+"/uploads";
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$$,limits:{files:1,fileSize:$limitFileSize$$}});
8
- $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||__dirname+"/templates"));$app$$.use("/images",
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+"/log";fs.existsSync($logDirectory$$)||
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!")});global.mongoose.connect($configs$$.database.url,
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...");const $files$$=
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;$model$$.create($r$$,
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$$=global.getModel("user"),
14
- $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={name:$StaticPool_adminUser$$.name,
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$$);$cpus_init_system_data_report_cpus_server$$=
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)});$StaticPool$$=require("cluster");
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$$=os.cpus().length;
18
- $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$$-
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={};global.clientSockets={};
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);
@@ -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$$&&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$$)}
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):
@@ -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"),async=require("async"),request=require("request"),profileFacebookUrl="https://graph.facebook.com/me?fields=name",checkFacebookToken=async $access_token$$=>
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($email$$,$event_name$$,$msg$$)=>{if(global.socketContainer.socketIO){let $clientIO$$=await global.socketContainer.loadConnectionId();global.configs.clientSockets&&0<global.configs.clientSockets.length&&async.mapSeries(global.configs.clientSockets.filter($s$$=>$s$$.name&&$s$$.port&&$s$$.port!=global.port),($s$$,$callback$$)=>{setImmediate(async()=>{try{let $u$$=`${$s$$.name}-${global.port}`;Object.values($clientIO$$).find($c$$=>$c$$.email===$u$$)&&0<[...(await global.socketContainer.socketIO.in($u$$).allSockets())].length&&
21
- global.socketContainer.socketIO.to($u$$).emit("otherserver",{event:$event_name$$,email:$email$$,data:$msg$$,from_server_port:global.port})}catch($e$$){console.error("socket io error when send msg to server",$s$$.name,{email:$email$$,event_name:$event_name$$,msg:$msg$$},$e$$)}$callback$$()})},()=>{})}else console.log("socket servers",Object.keys(global.clientSockets||{})),Object.values(global.clientSockets||{}).forEach($socket$$=>{console.log("send to server socket...");$socket$$.emit("otherserver",
22
- {event:$event_name$$,email:$email$$,data:$msg$$,from_server_port:global.port})})};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 ioClient=require("socket.io-client");
23
- User.initClientSockets=()=>{setTimeout(()=>{const $config$$=(global.configs.clientSockets||[]).find($s$$=>$s$$.port==global.port);$config$$&&async.mapSeries(global.configs.serverSockets.filter($s$$=>$s$$.name&&$s$$.port&&$s$$.port!=$config$$.port),($s$$,$callback$$)=>{setImmediate(()=>{let $url$$=`https://127.0.0.1:${$s$$.port}`;console.log("connecting to server socket",$url$$);try{const $socketClient$$=ioClient($url$$,{rejectUnauthorized:!1});$socketClient$$.on("connect",function(){console.log("socket Connected to server. Loging...",
24
- $url$$);$socketClient$$.emit("login",{token:$config$$.token,server:$config$$.name})});$socketClient$$.on("disconnect",function(){delete global.clientSockets[$url$$]});$socketClient$$.on("connect_error",function(){delete global.clientSockets[$url$$]});$socketClient$$.on("connect_timeout",()=>{delete global.clientSockets[$url$$]});$socketClient$$.io.on("reconnect",function(){$socketClient$$.emit("login",{token:$config$$.token,server:$config$$.name})});$socketClient$$.on("login",$msg$$=>{$msg$$.success?
25
- global.clientSockets[$url$$]=$socketClient$$:console.error("Error login to server",$s$$.name,$s$$.port,". Error: ",$msg$$.message)});$socketClient$$.on("otherserver",async function($msg$jscomp$3_obj$$){$msg$jscomp$3_obj$$.from_server_port!=global.port&&"system"===$msg$jscomp$3_obj$$.email&&("listinfo_updated"==$msg$jscomp$3_obj$$.event&&($msg$jscomp$3_obj$$.data||{}).listinfo_id?(console.log("update api",$msg$jscomp$3_obj$$.data||{}),($msg$jscomp$3_obj$$=await global.getModel("listinfo").findOne({_id:($msg$jscomp$3_obj$$.data||
26
- {}).listinfo_id}))&&global.getModel("listinfo").createController(global.routerAPI,$msg$jscomp$3_obj$$)):console.log("don't handle msg from system",$msg$jscomp$3_obj$$))})}catch($e$$){console.error("error connect to io server",$url$$,$e$$)}$callback$$()})},()=>{console.log("finish connect client socket")})},5E3)};
27
- User.initSocket=$server$$=>{setTimeout(()=>{console.log("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(()=>{$socket$$.auth||$socket$$.disconnect("unauthorized")},
28
- 1E3);$socket$$.on("join-flow",$flowInstanceId$$=>{$socket$$.join($flowInstanceId$$);console.log(`Client ${$socket$$.id} joined flow ${$flowInstanceId$$}`)});$socket$$.on("login",async $msg$jscomp$0$$=>{if($msg$jscomp$0$$.token)if(global.configs.clientSockets&&0<global.configs.clientSockets.length&&global.configs.clientSockets.find($s$$=>$s$$.token==$msg$jscomp$0$$.token)){var $clientIO$jscomp$2_email$$=`${$msg$jscomp$0$$.server}-${global.port}`;$socket$$.auth=!0;$socket$$.join($clientIO$jscomp$2_email$$);
29
- let $clientIO$$=await global.socketContainer.loadConnectionId();$clientIO$$[$socket$$.id]={token:$msg$jscomp$0$$.token,email:$clientIO$jscomp$2_email$$};global.socketContainer.saveConnectionId($clientIO$$);global.socketContainer.socketIO.to($socket$$.id).emit("login",{user:$msg$jscomp$0$$.server,success:!0});$socket$$.on("otherserver",async function($msg$jscomp$5_obj$$){$msg$jscomp$5_obj$$.from_server_port!=global.port&&("system"===$msg$jscomp$5_obj$$.email?"listinfo_updated"==$msg$jscomp$5_obj$$.event&&
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("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"),
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 $Menu$$=require(configs.paths.menu||"./menu");$router$$.route("/modules").get(function($req$$,$res$$){$Menu$$.getMenu($menu_modules_o_rs$$=>{$menu_modules_o_rs$$=JSON.parse(JSON.stringify($menu_modules_o_rs$$));$menu_modules_o_rs$$=$Menu$$.getModules($menu_modules_o_rs$$);let $modules_a$$=
33
- [];for(let $key$$ in $menu_modules_o_rs$$)$modules_a$$.push($menu_modules_o_rs$$[$key$$].command);$res$$.send($modules_a$$)})});$router$$.route("/:id_app/menu").get(function($req$$,$res$$){$Menu$$.getMenu($Menu_menu$$=>{const $id_app$$=$req$$.params.id_app,$user$$=$req$$.user;appModel.findById($id_app$$).lean().exec(function($e$jscomp$1$$,$app$$){if($e$jscomp$1$$||!$app$$)return $res$$.status(400).send("Kh\u00f4ng th\u1ec3 l\u1ea5y th\u00f4ng tin c\u1ee7a c\u00f4ng ty n\u00e0y.\n");$permission$$.isAdmin($id_app$$,
34
- $user$$.email,function($e$jscomp$0$$,$admin$$){if($e$jscomp$0$$)return $res$$.status(403).send({error:$e$jscomp$0$$});const $menu$$={menu:JSON.parse(JSON.stringify($Menu_menu$$))};let $_menu$$=$menu$$.menu=$menu$$.menu.filter($m$$=>!$m$$.appAllow||0===$m$$.appAllow.length||0<=$m$$.appAllow.indexOf($id_app$$));$menu$$.modules=$Menu$$.getModules($_menu$$);$admin$$?$res$$.send($menu$$):async.mapSeries(underscore.values($menu$$.modules),function($module$$,$callback$$){var $m$$=$module$$.command;$permission$$.hasRight($id_app$$,
35
- $user$$.email,$m$$.module?$m$$.module:$m$$.path,"view",function($e$$,$right$$){$m$$.visible=$right$$;$callback$$()})},function($e$$){if($e$$)return $res$$.status(400).send($e$$);$_menu$$.forEach(function($child_menu$$){$child_menu$$.visible=!1;if("1"==$child_menu$$.type)for(let $i$$ of $child_menu$$.input)if($i$$.items)for(let $_i$$ of $i$$.items){if($_i$$.visible){$i$$.visible=!0;$child_menu$$.visible=!0;break}}else if($i$$.visible){$child_menu$$.visible=!0;break}"2"==$child_menu$$.type&&$child_menu$$.input.forEach(function($module$$){$module$$.visible=
36
- !1;$module$$.items.forEach(function($item$$){$item$$.visible&&($module$$.visible=!0,$child_menu$$.visible=!0)})});"3"==$child_menu$$.type&&$child_menu$$.input.forEach(function($module$$){$module$$.visible=!1;$module$$.items.forEach(function($group$$){$group$$.visible=!1;$group$$.items.forEach(function($item$$){$item$$.visible&&($group$$.visible=!0,$module$$.visible=!0,$child_menu$$.visible=!0)})})})});$res$$.send($menu$$)})})})})});const $bot_router$$=express.Router();configs.limitRequest.bot&&($limiter$jscomp$2_limiter$$=
37
- await $createRateLimiterMiddleware_limiter_others$$(configs.limitRequest.bot,"bot"),$router$$.use($limiter$jscomp$2_limiter$$));$app$$.use("/bot",$bot_router$$);fs.existsSync(__dirname+"/modules/bot")&&(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,
38
- "public"),$router$$.use($limiter$jscomp$2_limiter$$));$public_router$$.use(function($req$$,$res$$,$next$$){for(let $key$$ in $req$$.query)"true"==$req$$.query[$key$$]&&($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$$();
39
- 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$$={};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$$)}));
40
- 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"==$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||
41
- {},"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,"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||
42
- $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$$=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$$=
43
- path.join($root_dir$$,$orgin_file_size$jscomp$2_req$$.params.folder,String($size$$)+"."+$orgin_file_size$jscomp$2_req$$.params.filename);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$$&&
44
- "webp"!=$orgin_file_size$jscomp$2_req$$.format&&($_gm$$=$_gm$$.webp({lossless:!1}));$cache$$&&setImmediate(()=>{$_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$$,
45
- function($labelid_req$$,$res$$){$labelid_req$$=$labelid_req$$.params.labelid.toUpperCase();$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");
46
- var $afflink_page_link$$=await global.getModel("afflink").findOne({_id:$id_afflink_req$$});$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")});
47
- const $axios$$=require("axios"),$querystring$$=require("querystring");$app$$.get("/oa/:id_app",$createRateLimiterMiddleware_limiter_others$$,async function($data$jscomp$3_req$$,$res$$){var $app$jscomp$3_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$3_id_app$$))return $res$$.status(400).send({error:"Y\u00eau c\u1ea7u kh\u00f4ng h\u1ee3p l\u1ec7"});
48
- $app$jscomp$3_id_app$$=await global.getModel("app").findOne({_id:$app$jscomp$3_id_app$$});if(!$app$jscomp$3_id_app$$)return $res$$.status(400).send({error:"App kh\u00f4ng t\u1ed3n t\u1ea1i"});$app$jscomp$3_id_app$$.zalo_oa_id=$headers_zalo_oa_id$$;$app$jscomp$3_id_app$$.zalo_code=$data$jscomp$3_req$$;if($app$jscomp$3_id_app$$.zalo_secret_key&&$app$jscomp$3_id_app$$.zalo_app_id){$headers_zalo_oa_id$$={"Content-Type":"application/x-www-form-urlencoded",secret_key:$app$jscomp$3_id_app$$.zalo_secret_key};
49
- $data$jscomp$3_req$$={code:$app$jscomp$3_id_app$$.zalo_code,app_id:$app$jscomp$3_id_app$$.zalo_app_id,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$3_id_app$$.zalo_access_token=$message_zalo_token$$.access_token;$app$jscomp$3_id_app$$.zalo_refresh_token=$message_zalo_token$$.refresh_token;$app$jscomp$3_id_app$$.zalo_expires_in=
50
- $message_zalo_token$$.expires_in;$app$jscomp$3_id_app$$.zalo_updated=new Date}catch($e$$){return $message_zalo_token$$=(($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$3_id_app$$.save();$res$$.send({ok:!0})});
51
- $app$$.get("/task-status/:id",$createRateLimiterMiddleware_limiter_others$$,async function($req$$,$res$$){try{let $task$$=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$$,
52
- async function($document$jscomp$1_req$$,$res$$){$document$jscomp$1_req$$=await docs.apiFields($document$jscomp$1_req$$.params.code,$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);
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$$()};