ts-glitter 20.6.8 → 20.6.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lowcode/Entry.js +2 -2
- package/lowcode/Entry.ts +2 -2
- package/lowcode/backend-manager/bg-blog.js +617 -621
- package/lowcode/backend-manager/bg-blog.ts +2323 -2325
- package/lowcode/backend-manager/bg-line.js +5 -4
- package/lowcode/backend-manager/bg-line.ts +5 -4
- package/lowcode/backend-manager/bg-list-component.js +9 -0
- package/lowcode/backend-manager/bg-list-component.ts +15 -1
- package/lowcode/backend-manager/bg-notify.js +6 -4
- package/lowcode/backend-manager/bg-notify.ts +6 -4
- package/lowcode/backend-manager/bg-product.js +145 -0
- package/lowcode/backend-manager/bg-product.ts +153 -0
- package/lowcode/backend-manager/bg-sns.js +5 -3
- package/lowcode/backend-manager/bg-sns.ts +5 -3
- package/lowcode/backend-manager/bg-widget.js +92 -4
- package/lowcode/backend-manager/bg-widget.ts +122 -6
- package/lowcode/backend-manager/splitPage.js +0 -39
- package/lowcode/backend-manager/splitPage.ts +0 -40
- package/lowcode/cms-plugin/auto-fcm-advertise.js +17 -5
- package/lowcode/cms-plugin/auto-fcm-advertise.ts +19 -6
- package/lowcode/cms-plugin/auto-fcm-history.js +2732 -0
- package/lowcode/cms-plugin/auto-fcm-history.ts +2995 -0
- package/lowcode/cms-plugin/cms-router.js +5 -0
- package/lowcode/cms-plugin/cms-router.ts +6 -0
- package/lowcode/cms-plugin/filter-options.js +80 -27
- package/lowcode/cms-plugin/filter-options.ts +83 -27
- package/lowcode/cms-plugin/language-backend.js +50 -39
- package/lowcode/cms-plugin/language-backend.ts +109 -95
- package/lowcode/cms-plugin/menus-setting.js +175 -151
- package/lowcode/cms-plugin/menus-setting.ts +620 -591
- package/lowcode/cms-plugin/model/order.d.ts +1 -0
- package/lowcode/cms-plugin/module/data.js +7 -7
- package/lowcode/cms-plugin/module/data.ts +262 -233
- package/lowcode/cms-plugin/module/delivery-html.js +18 -10
- package/lowcode/cms-plugin/module/delivery-html.ts +26 -10
- package/lowcode/cms-plugin/module/order-setting.js +458 -328
- package/lowcode/cms-plugin/module/order-setting.ts +622 -351
- package/lowcode/cms-plugin/module/product-excel.js +1 -1
- package/lowcode/cms-plugin/module/product-excel.ts +2 -1
- package/lowcode/cms-plugin/order/order-module.js +90 -1
- package/lowcode/cms-plugin/order/order-module.ts +106 -1
- package/lowcode/cms-plugin/pos-pages/payment-page.js +11 -8
- package/lowcode/cms-plugin/pos-pages/payment-page.ts +28 -15
- package/lowcode/cms-plugin/pos-pages/products-page.js +0 -39
- package/lowcode/cms-plugin/pos-pages/products-page.ts +0 -40
- package/lowcode/cms-plugin/shopping-collections.ts +1 -3
- package/lowcode/cms-plugin/shopping-finance-setting.js +19 -80
- package/lowcode/cms-plugin/shopping-finance-setting.ts +19 -87
- package/lowcode/cms-plugin/shopping-order-manager.js +122 -38
- package/lowcode/cms-plugin/shopping-order-manager.ts +160 -58
- package/lowcode/cms-plugin/shopping-product-setting.js +364 -376
- package/lowcode/cms-plugin/shopping-product-setting.ts +406 -415
- package/lowcode/cms-plugin/shopping-setting-advance.js +57 -16
- package/lowcode/cms-plugin/shopping-setting-advance.ts +69 -18
- package/lowcode/cms-plugin/user/user-module.js +2 -43
- package/lowcode/cms-plugin/user/user-module.ts +2 -46
- package/lowcode/cms-plugin/user-list.js +4 -6
- package/lowcode/cms-plugin/user-list.ts +35 -38
- package/lowcode/css/editor.css +42 -3
- package/lowcode/glitter-base/global/language.js +6 -1
- package/lowcode/glitter-base/global/language.ts +10 -4
- package/lowcode/glitter-base/global/payment-config.js +19 -16
- package/lowcode/glitter-base/global/payment-config.ts +22 -16
- package/lowcode/glitter-base/global/shipment-config.js +6 -5
- package/lowcode/glitter-base/global/shipment-config.ts +12 -10
- package/lowcode/glitter-base/route/fcm.js +21 -1
- package/lowcode/glitter-base/route/fcm.ts +22 -2
- package/lowcode/glitter-base/route/shopping.js +8 -32
- package/lowcode/glitter-base/route/shopping.ts +10 -33
- package/lowcode/glitter-base/route/user.js +11 -2
- package/lowcode/glitter-base/route/user.ts +23 -12
- package/lowcode/jspage/function-page/setting_editor.js +9 -0
- package/lowcode/jspage/function-page/setting_editor.ts +9 -0
- package/lowcode/public-components/blogs/list.js +223 -195
- package/lowcode/public-components/blogs/list.ts +383 -352
- package/lowcode/public-components/product/product-list.js +8 -4
- package/lowcode/public-components/product/product-list.ts +9 -4
- package/lowcode/public-components/terms-related/index.js +1 -1
- package/lowcode/public-components/terms-related/index.ts +1 -1
- package/lowcode/public-components/user-manager/um-login.js +1 -1
- package/lowcode/public-components/user-manager/um-login.ts +2 -2
- package/lowcode/public-components/user-manager/um-order.js +41 -5
- package/lowcode/public-components/user-manager/um-order.ts +58 -20
- package/lowcode/public-components/user-manager/um-voucher.ts +2 -2
- package/nhi4veq3gk.json +1 -0
- package/package.json +1 -1
- package/src/Language.d.ts +2 -0
- package/src/Language.js +66 -65
- package/src/Language.js.map +1 -1
- package/src/Language.ts +719 -715
- package/src/api-public/config/shipment-config.js +3 -2
- package/src/api-public/config/shipment-config.js.map +1 -1
- package/src/api-public/config/shipment-config.ts +3 -2
- package/src/api-public/controllers/ai-chat.js.map +1 -1
- package/src/api-public/controllers/ai-chat.ts +1 -2
- package/src/api-public/controllers/fcm.js +23 -58
- package/src/api-public/controllers/fcm.js.map +1 -1
- package/src/api-public/controllers/fcm.ts +28 -56
- package/src/api-public/controllers/shop.js +7 -1
- package/src/api-public/controllers/shop.js.map +1 -1
- package/src/api-public/controllers/shop.ts +17 -10
- package/src/api-public/controllers/user.js +1 -0
- package/src/api-public/controllers/user.js.map +1 -1
- package/src/api-public/controllers/user.ts +2 -0
- package/src/api-public/services/auto-send-email.js +247 -187
- package/src/api-public/services/auto-send-email.js.map +1 -1
- package/src/api-public/services/auto-send-email.ts +568 -505
- package/src/api-public/services/delivery.js +1 -1
- package/src/api-public/services/delivery.js.map +1 -1
- package/src/api-public/services/delivery.ts +6 -5
- package/src/api-public/services/financial-service.js +1 -2
- package/src/api-public/services/financial-service.js.map +1 -1
- package/src/api-public/services/financial-service.ts +4 -6
- package/src/api-public/services/manager.d.ts +4 -3
- package/src/api-public/services/manager.js +8 -12
- package/src/api-public/services/manager.js.map +1 -1
- package/src/api-public/services/manager.ts +57 -59
- package/src/api-public/services/model/handlePaymentTransaction.d.ts +1 -1
- package/src/api-public/services/model/handlePaymentTransaction.js +23 -3
- package/src/api-public/services/model/handlePaymentTransaction.js.map +1 -1
- package/src/api-public/services/model/handlePaymentTransaction.ts +25 -36
- package/src/api-public/services/schedule.d.ts +1 -0
- package/src/api-public/services/schedule.js +27 -0
- package/src/api-public/services/schedule.js.map +1 -1
- package/src/api-public/services/schedule.ts +30 -0
- package/src/api-public/services/shopping.d.ts +22 -2
- package/src/api-public/services/shopping.js +362 -90
- package/src/api-public/services/shopping.js.map +1 -1
- package/src/api-public/services/shopping.ts +481 -134
- package/src/api-public/services/user.d.ts +1 -0
- package/src/api-public/services/user.js +32 -12
- package/src/api-public/services/user.js.map +1 -1
- package/src/api-public/services/user.ts +38 -19
- package/src/api-public/services/workers.js +3 -3
- package/src/api-public/services/workers.js.map +1 -1
- package/src/api-public/services/workers.ts +103 -103
- package/src/app-project/serverless/src/modules/database.js +1 -1
- package/src/app-project/serverless/src/modules/database.js.map +1 -1
- package/src/app-project/serverless/src/modules/database.ts +171 -171
- package/src/controllers/template.d.ts +1 -1
- package/src/controllers/template.js +16 -16
- package/src/controllers/template.js.map +1 -1
- package/src/controllers/template.ts +98 -84
- package/src/modules/database.js +3 -1
- package/src/modules/database.js.map +1 -1
- package/src/modules/database.ts +185 -181
- package/src/modules/firebase.d.ts +17 -0
- package/src/modules/firebase.js +126 -0
- package/src/modules/firebase.js.map +1 -1
- package/src/modules/firebase.ts +169 -0
- package/src/public-config-initial/auto-fcm.js +8 -2
- package/src/public-config-initial/auto-fcm.js.map +1 -1
- package/src/public-config-initial/auto-fcm.ts +15 -6
- package/src/services/app.d.ts +2 -1
- package/src/services/app.js.map +1 -1
- package/src/services/app.ts +2 -1
- package/src/services/template.d.ts +3 -2
- package/src/services/template.js +2 -1
- package/src/services/template.js.map +1 -1
- package/src/services/template.ts +13 -20
package/src/modules/database.ts
CHANGED
|
@@ -7,224 +7,228 @@ const TAG = '[Database]';
|
|
|
7
7
|
let pool: mysql.Pool;
|
|
8
8
|
|
|
9
9
|
const createPool = async () => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
10
|
+
const logger = new Logger();
|
|
11
|
+
pool = mysql.createPool({
|
|
12
|
+
connectionLimit: config.DB_CONN_LIMIT,
|
|
13
|
+
queueLimit: config.DB_QUEUE_LIMIT,
|
|
14
|
+
host: config.DB_URL,
|
|
15
|
+
port: config.DB_PORT,
|
|
16
|
+
user: config.DB_USER,
|
|
17
|
+
password: config.DB_PWD,
|
|
18
|
+
supportBigNumbers: true,
|
|
19
|
+
// 啟用連線保持活躍
|
|
20
|
+
enableKeepAlive: true,
|
|
21
|
+
// 每 10 秒發送一次保持活躍訊號
|
|
22
|
+
keepAliveInitialDelay: 10000,
|
|
23
|
+
});
|
|
24
|
+
try {
|
|
25
|
+
return pool;
|
|
26
|
+
} catch (err) {
|
|
27
|
+
logger.error(TAG, 'Failed to create connection pool for mysql because ' + err);
|
|
28
|
+
throw exception.ServerError('INTERNAL_SERVER_ERROR', 'Failed to create connection pool.');
|
|
29
|
+
}
|
|
26
30
|
};
|
|
27
31
|
|
|
28
32
|
async function createNewPool() {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
33
|
+
const logger = new Logger();
|
|
34
|
+
const new_pool: mysql.Pool = mysql.createPool({
|
|
35
|
+
connectionLimit: config.DB_CONN_LIMIT,
|
|
36
|
+
queueLimit: config.DB_QUEUE_LIMIT,
|
|
37
|
+
host: config.DB_URL,
|
|
38
|
+
port: config.DB_PORT,
|
|
39
|
+
user: config.DB_USER,
|
|
40
|
+
password: config.DB_PWD,
|
|
41
|
+
supportBigNumbers: true,
|
|
42
|
+
});
|
|
43
|
+
try {
|
|
44
|
+
config.DB_SHOW_INFO && logger.info(TAG, 'Pool has been created. (function: createNewPool)');
|
|
45
|
+
return new_pool;
|
|
46
|
+
} catch (err) {
|
|
47
|
+
logger.error(TAG, '(createNewPool) Failed to create connection pool for mysql because ' + err);
|
|
48
|
+
throw exception.ServerError('INTERNAL_SERVER_ERROR', 'Failed to create connection pool.');
|
|
49
|
+
}
|
|
46
50
|
}
|
|
47
51
|
|
|
48
52
|
const execute = async (sql: string, params: any[]): Promise<any> => {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
53
|
+
const logger = new Logger();
|
|
54
|
+
const TAG = '[Database][Execute]';
|
|
55
|
+
if (params.indexOf(undefined) !== -1) {
|
|
56
|
+
logger.error(TAG, 'Failed to exect statement ' + sql + ' because params=null');
|
|
57
|
+
throw exception.ServerError('INTERNAL_SERVER_ERROR', 'Failed to exect statement because params=null');
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const connection = await pool.getConnection();
|
|
61
|
+
const [results] = await pool.execute(sql, params);
|
|
62
|
+
connection.release();
|
|
63
|
+
return results;
|
|
64
|
+
} catch (err) {
|
|
65
|
+
logger.error(TAG, 'Failed to exect statement ' + sql + ' because ' + err);
|
|
66
|
+
throw exception.ServerError('INTERNAL_SERVER_ERROR', 'Failed to execute statement.');
|
|
67
|
+
}
|
|
64
68
|
};
|
|
65
69
|
|
|
66
70
|
export const limit = (map: any) => {
|
|
67
|
-
|
|
71
|
+
return ` limit ${parseInt(map.page, 10) * parseInt(map.limit, 10)}, ${parseInt(map.limit, 10)} `;
|
|
68
72
|
};
|
|
69
73
|
const query = async (sql: string, params: unknown[]): Promise<any> => {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
74
|
+
const logger = new Logger();
|
|
75
|
+
const TAG = '[Database][Query]';
|
|
76
|
+
try {
|
|
77
|
+
const connection = await pool.getConnection();
|
|
78
|
+
await pool.query(`SET time_zone = '+00:00';`, []);
|
|
79
|
+
const [results] = await pool.query(sql, params);
|
|
80
|
+
connection.release();
|
|
81
|
+
return results;
|
|
82
|
+
} catch (err) {
|
|
83
|
+
logger.error(TAG, 'Failed to query statement ' + sql + ' because ' + err);
|
|
84
|
+
throw exception.ServerError('INTERNAL_SERVER_ERROR', 'Failed to execute statement.');
|
|
85
|
+
}
|
|
82
86
|
};
|
|
83
87
|
|
|
84
88
|
export const queryLambada = async (
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
+
cf: {
|
|
90
|
+
database?: string;
|
|
91
|
+
},
|
|
92
|
+
fun: (v: { query(sql: string, params: unknown[]): Promise<any> }) => any
|
|
89
93
|
) => {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
});
|
|
123
|
-
},
|
|
94
|
+
const logger = new Logger();
|
|
95
|
+
const cs: any = {
|
|
96
|
+
connectionLimit: config.DB_CONN_LIMIT,
|
|
97
|
+
queueLimit: config.DB_QUEUE_LIMIT,
|
|
98
|
+
host: config.DB_URL,
|
|
99
|
+
port: config.DB_PORT,
|
|
100
|
+
user: config.DB_USER,
|
|
101
|
+
password: config.DB_PWD,
|
|
102
|
+
supportBigNumbers: true,
|
|
103
|
+
};
|
|
104
|
+
Object.keys(cf).map(key => {
|
|
105
|
+
cs[key] = (cf as any)[key];
|
|
106
|
+
});
|
|
107
|
+
const sp = mysql.createPool(cs);
|
|
108
|
+
const connection = await sp.getConnection();
|
|
109
|
+
if (connection) {
|
|
110
|
+
connection.release();
|
|
111
|
+
config.DB_SHOW_INFO && logger.info(TAG, 'Pool has been created. (function: queryLambada)');
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
const data = await fun({
|
|
115
|
+
query(sql: string, params: unknown[]): Promise<any> {
|
|
116
|
+
return new Promise<any>(async (resolve, reject) => {
|
|
117
|
+
const logger = new Logger();
|
|
118
|
+
const TAG = '[Database][Query]';
|
|
119
|
+
try {
|
|
120
|
+
const [results] = await sp.query(sql, params);
|
|
121
|
+
resolve(results);
|
|
122
|
+
} catch (err) {
|
|
123
|
+
logger.error(TAG, 'Failed to query statement ' + sql + ' because ' + err);
|
|
124
|
+
reject(err);
|
|
125
|
+
}
|
|
124
126
|
});
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
//Close connection
|
|
130
|
+
connection.release();
|
|
131
|
+
sp.end();
|
|
132
|
+
return data;
|
|
133
|
+
} catch (err) {
|
|
134
|
+
//Close connection
|
|
135
|
+
connection.release();
|
|
136
|
+
sp.end();
|
|
137
|
+
logger.error(TAG, 'Failed to create connection pool for mysql because ' + err);
|
|
138
|
+
throw exception.ServerError('INTERNAL_SERVER_ERROR', 'Failed to create connection pool.');
|
|
139
|
+
}
|
|
136
140
|
};
|
|
137
141
|
|
|
138
142
|
class Transaction {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
+
private pool?: mysql.Pool;
|
|
144
|
+
private trans: any;
|
|
145
|
+
connectionId: any;
|
|
146
|
+
private TAG: any;
|
|
143
147
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
}
|
|
148
|
+
static async build(): Promise<Transaction> {
|
|
149
|
+
const logger = new Logger();
|
|
150
|
+
const Trans = new Transaction();
|
|
151
|
+
try {
|
|
152
|
+
Trans.pool = (await createNewPool())!;
|
|
153
|
+
Trans.trans = await Trans.pool.getConnection();
|
|
154
|
+
Trans.TAG = `[Database][Transaction][CID:${Trans.trans.threadId}]`;
|
|
155
|
+
Trans.trans.beginTransaction();
|
|
156
|
+
return Trans;
|
|
157
|
+
} catch (err) {
|
|
158
|
+
logger.error(Trans.TAG, 'Failed to create transaction when call transaction.init because ' + err);
|
|
159
|
+
await Trans.release();
|
|
160
|
+
throw exception.ServerError('INTERNAL_SERVER_ERROR', 'Failed to create transaction when connecting database.');
|
|
158
161
|
}
|
|
162
|
+
}
|
|
159
163
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
}
|
|
165
|
-
try {
|
|
166
|
-
const [result] = await this.trans.query(sql, params);
|
|
167
|
-
return result;
|
|
168
|
-
} catch (err) {
|
|
169
|
-
//rollback transaction and release connection when error occurred.
|
|
170
|
-
logger.error(this.TAG, `Failed to execute statement ${sql} from transaction because ${err}`);
|
|
171
|
-
await this.release();
|
|
172
|
-
throw err;
|
|
173
|
-
}
|
|
164
|
+
public async execute(sql: string, params: any[] | any): Promise<any> {
|
|
165
|
+
const logger = new Logger();
|
|
166
|
+
if (!this.trans) {
|
|
167
|
+
throw exception.ServerError('INTERNAL_SERVER_ERROR', 'Can not use Transaction class without build.');
|
|
174
168
|
}
|
|
169
|
+
try {
|
|
170
|
+
const [result] = await this.trans.query(sql, params);
|
|
171
|
+
return result;
|
|
172
|
+
} catch (err) {
|
|
173
|
+
//rollback transaction and release connection when error occurred.
|
|
174
|
+
logger.error(this.TAG, `Failed to execute statement ${sql} from transaction because ${err}`);
|
|
175
|
+
await this.release();
|
|
176
|
+
throw err;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
175
179
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
}
|
|
180
|
+
async commit() {
|
|
181
|
+
const logger = new Logger();
|
|
182
|
+
try {
|
|
183
|
+
await this.trans.commit();
|
|
184
|
+
await this.release();
|
|
185
|
+
config.DB_SHOW_INFO && logger.info(this.TAG, 'Commited successfully');
|
|
186
|
+
} catch (err) {
|
|
187
|
+
logger.error(this.TAG, 'Failed to commit from transaction because ' + err);
|
|
188
|
+
await this.release();
|
|
189
|
+
throw exception.ServerError('INTERNAL_SERVER_ERROR', 'Failed to commit from transaction.');
|
|
187
190
|
}
|
|
191
|
+
}
|
|
188
192
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
}
|
|
193
|
+
async release() {
|
|
194
|
+
const logger = new Logger();
|
|
195
|
+
try {
|
|
196
|
+
if (this.trans) {
|
|
197
|
+
await this.trans.release();
|
|
198
|
+
await this.trans.destroy();
|
|
199
|
+
this.trans = null;
|
|
200
|
+
await this.pool?.end();
|
|
201
|
+
config.DB_SHOW_INFO && logger.info(this.TAG, 'Release successfully');
|
|
202
|
+
}
|
|
203
|
+
} catch (err) {
|
|
204
|
+
logger.error(this.TAG, 'Failed to commit from transaction because ' + err);
|
|
205
|
+
await this.pool?.end();
|
|
206
|
+
throw exception.ServerError('INTERNAL_SERVER_ERROR', 'Failed to release transaction.');
|
|
204
207
|
}
|
|
208
|
+
}
|
|
205
209
|
}
|
|
206
210
|
|
|
207
211
|
const getPagination = (sql: string, page: number, pageCount: number) => {
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
212
|
+
let newSql = sql;
|
|
213
|
+
newSql += ' LIMIT ' + pageCount + ' OFFSET ' + (page - 1) * pageCount;
|
|
214
|
+
return newSql;
|
|
211
215
|
};
|
|
212
216
|
|
|
213
217
|
const escape = (parameter: any) => {
|
|
214
|
-
|
|
218
|
+
return mysql.escape(parameter);
|
|
215
219
|
};
|
|
216
220
|
|
|
217
221
|
const checkExists = async (sql: string) => {
|
|
218
|
-
|
|
222
|
+
return (await query('select count(1) from ' + sql, []))[0]['count(1)'] > 0;
|
|
219
223
|
};
|
|
220
224
|
|
|
221
225
|
export default {
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
226
|
+
createPool,
|
|
227
|
+
execute,
|
|
228
|
+
query,
|
|
229
|
+
Transaction,
|
|
230
|
+
getPagination,
|
|
231
|
+
escape,
|
|
232
|
+
queryLambada,
|
|
233
|
+
checkExists,
|
|
230
234
|
};
|
|
@@ -22,4 +22,21 @@ export declare class Firebase {
|
|
|
22
22
|
app?: string;
|
|
23
23
|
pass_store?: boolean;
|
|
24
24
|
}): Promise<unknown>;
|
|
25
|
+
postFCM(data: any): Promise<{
|
|
26
|
+
result: boolean;
|
|
27
|
+
message: string;
|
|
28
|
+
}>;
|
|
29
|
+
chunkSendFcm(data: any, id: number, date?: string): Promise<void>;
|
|
30
|
+
getFCM(query: {
|
|
31
|
+
type: string;
|
|
32
|
+
page: number;
|
|
33
|
+
limit: number;
|
|
34
|
+
search?: string;
|
|
35
|
+
searchType?: string;
|
|
36
|
+
mailType?: string;
|
|
37
|
+
status?: string;
|
|
38
|
+
}): Promise<{
|
|
39
|
+
data: any;
|
|
40
|
+
total: any;
|
|
41
|
+
}>;
|
|
25
42
|
}
|
package/src/modules/firebase.js
CHANGED
|
@@ -10,6 +10,7 @@ const config_1 = require("../config");
|
|
|
10
10
|
const database_1 = __importDefault(require("../modules/database"));
|
|
11
11
|
const web_socket_js_1 = require("../services/web-socket.js");
|
|
12
12
|
const caught_error_js_1 = require("./caught-error.js");
|
|
13
|
+
const exception_js_1 = __importDefault(require("./exception.js"));
|
|
13
14
|
class Firebase {
|
|
14
15
|
constructor(app) {
|
|
15
16
|
this.app = '';
|
|
@@ -144,6 +145,131 @@ class Firebase {
|
|
|
144
145
|
resolve(true);
|
|
145
146
|
});
|
|
146
147
|
}
|
|
148
|
+
async postFCM(data) {
|
|
149
|
+
data.msgid = '';
|
|
150
|
+
try {
|
|
151
|
+
if (Boolean(data.sendTime)) {
|
|
152
|
+
if (isLater(data.sendTime)) {
|
|
153
|
+
return { result: false, message: '排定發送的時間需大於現在時間' };
|
|
154
|
+
}
|
|
155
|
+
const insertData = await database_1.default.query(`INSERT INTO \`${this.app}\`.\`t_triggers\`
|
|
156
|
+
SET ?;`, [
|
|
157
|
+
{
|
|
158
|
+
tag: 'sendFCM',
|
|
159
|
+
content: JSON.stringify(data),
|
|
160
|
+
trigger_time: formatDateTime(data.sendTime),
|
|
161
|
+
status: 0,
|
|
162
|
+
},
|
|
163
|
+
]);
|
|
164
|
+
this.chunkSendFcm(data, insertData.insertId, formatDateTime(data.sendTime));
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
const insertData = await database_1.default.query(`INSERT INTO \`${this.app}\`.\`t_triggers\`
|
|
168
|
+
SET ?;`, [
|
|
169
|
+
{
|
|
170
|
+
tag: 'sendFCM',
|
|
171
|
+
content: JSON.stringify(data),
|
|
172
|
+
trigger_time: formatDateTime(),
|
|
173
|
+
status: 1,
|
|
174
|
+
},
|
|
175
|
+
]);
|
|
176
|
+
this.chunkSendFcm(data, insertData.insertId);
|
|
177
|
+
}
|
|
178
|
+
return { result: true, message: '寄送成功' };
|
|
179
|
+
}
|
|
180
|
+
catch (e) {
|
|
181
|
+
throw exception_js_1.default.BadRequestError('BAD_REQUEST', 'postMail Error:' + e, null);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async chunkSendFcm(data, id, date) {
|
|
185
|
+
try {
|
|
186
|
+
let msgid = '';
|
|
187
|
+
for (const b of chunkArray(Array.from(new Set(data.userList.map((dd) => {
|
|
188
|
+
return dd.id;
|
|
189
|
+
}))), 10)) {
|
|
190
|
+
let check = b.length;
|
|
191
|
+
await new Promise(resolve => {
|
|
192
|
+
for (const d of b) {
|
|
193
|
+
this.sendMessage({
|
|
194
|
+
userID: d,
|
|
195
|
+
title: data.title,
|
|
196
|
+
body: data.content,
|
|
197
|
+
tag: 'promote',
|
|
198
|
+
link: data.link,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
catch (e) {
|
|
205
|
+
throw exception_js_1.default.BadRequestError('BAD_REQUEST', 'chunkSendSns Error:' + e, null);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
async getFCM(query) {
|
|
209
|
+
var _a, _b;
|
|
210
|
+
try {
|
|
211
|
+
const whereList = ['1 = 1'];
|
|
212
|
+
switch (query.searchType) {
|
|
213
|
+
case 'email':
|
|
214
|
+
break;
|
|
215
|
+
case 'name':
|
|
216
|
+
whereList.push(`(UPPER(JSON_EXTRACT(content, '$.name')) LIKE UPPER('%${(_a = query.search) !== null && _a !== void 0 ? _a : ''}%'))`);
|
|
217
|
+
break;
|
|
218
|
+
case 'title':
|
|
219
|
+
whereList.push(`(UPPER(JSON_EXTRACT(content, '$.title')) LIKE UPPER('%${(_b = query.search) !== null && _b !== void 0 ? _b : ''}%'))`);
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
if (query.status) {
|
|
223
|
+
whereList.push(`(status in (${query.status}))`);
|
|
224
|
+
}
|
|
225
|
+
if (query.mailType) {
|
|
226
|
+
const maiTypeString = query.mailType.replace(/[^,]+/g, "'$&'");
|
|
227
|
+
whereList.push(`(JSON_EXTRACT(content, '$.type') in (${maiTypeString}))`);
|
|
228
|
+
}
|
|
229
|
+
const whereSQL = `(tag = 'sendFCM') AND ${whereList.join(' AND ')}`;
|
|
230
|
+
const emails = await database_1.default.query(`SELECT * FROM \`${this.app}\`.t_triggers
|
|
231
|
+
WHERE ${whereSQL}
|
|
232
|
+
ORDER BY id DESC
|
|
233
|
+
${query.type === 'download' ? '' : `LIMIT ${query.page * query.limit}, ${query.limit}`};`, []);
|
|
234
|
+
const total = await database_1.default.query(`SELECT count(id) as c FROM \`${this.app}\`.t_triggers
|
|
235
|
+
WHERE ${whereSQL};`, []);
|
|
236
|
+
for (const email of emails) {
|
|
237
|
+
email.content.typeName = "手動發送";
|
|
238
|
+
}
|
|
239
|
+
return { data: emails, total: total[0].c };
|
|
240
|
+
}
|
|
241
|
+
catch (e) {
|
|
242
|
+
throw exception_js_1.default.BadRequestError('BAD_REQUEST', 'getMail Error:' + e, null);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
147
245
|
}
|
|
148
246
|
exports.Firebase = Firebase;
|
|
247
|
+
function isLater(dateTimeObj) {
|
|
248
|
+
const currentDateTime = new Date();
|
|
249
|
+
const { date, time } = dateTimeObj;
|
|
250
|
+
const dateTimeString = `${date}T${time}:00`;
|
|
251
|
+
const providedDateTime = new Date(dateTimeString);
|
|
252
|
+
return currentDateTime > providedDateTime;
|
|
253
|
+
}
|
|
254
|
+
function chunkArray(array, groupSize) {
|
|
255
|
+
const result = [];
|
|
256
|
+
for (let i = 0; i < array.length; i += groupSize) {
|
|
257
|
+
result.push(array.slice(i, i + groupSize));
|
|
258
|
+
}
|
|
259
|
+
return result;
|
|
260
|
+
}
|
|
261
|
+
function formatDate(date) {
|
|
262
|
+
const year = date.getFullYear();
|
|
263
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
264
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
265
|
+
const hours = String(date.getHours()).padStart(2, '0');
|
|
266
|
+
const minutes = String(date.getMinutes()).padStart(2, '0');
|
|
267
|
+
const seconds = String(date.getSeconds()).padStart(2, '0');
|
|
268
|
+
return `${year}${month}${day}${hours}${minutes}${seconds}`;
|
|
269
|
+
}
|
|
270
|
+
function formatDateTime(sendTime) {
|
|
271
|
+
const dateTimeString = sendTime ? sendTime.date + ' ' + sendTime.time : undefined;
|
|
272
|
+
const dateObject = dateTimeString ? new Date(dateTimeString) : new Date();
|
|
273
|
+
return formatDate(dateObject);
|
|
274
|
+
}
|
|
149
275
|
//# sourceMappingURL=firebase.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firebase.js","sourceRoot":"","sources":["firebase.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AACxB,oEAAmC;AACnC,sCAAwC;AACxC,mEAAqC;AACrC,6DAAoD;AACpD,uDAAgD;
|
|
1
|
+
{"version":3,"file":"firebase.js","sourceRoot":"","sources":["firebase.ts"],"names":[],"mappings":"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"}
|