wok-server 0.4.13 → 0.6.0
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/README.en.md +61 -0
- package/README.md +44 -29
- package/dist/cache/cache.js +98 -98
- package/dist/cache/config.js +19 -19
- package/dist/cache/index.js +27 -27
- package/dist/cache/purge-task.js +46 -46
- package/dist/cache/stat.js +47 -47
- package/dist/config/convert.js +36 -36
- package/dist/config/exception.js +14 -14
- package/dist/config/index.js +81 -81
- package/dist/http-client/index.js +136 -136
- package/dist/i18n/ar.js +17 -17
- package/dist/i18n/de.js +17 -17
- package/dist/i18n/en-us.js +17 -17
- package/dist/i18n/es.js +17 -17
- package/dist/i18n/fr.js +17 -17
- package/dist/i18n/i18n.js +231 -231
- package/dist/i18n/index.js +52 -52
- package/dist/i18n/ja.js +17 -17
- package/dist/i18n/ko.js +17 -17
- package/dist/i18n/msg.js +2 -2
- package/dist/i18n/pt.js +17 -17
- package/dist/i18n/ru.js +17 -17
- package/dist/i18n/tag.js +18 -18
- package/dist/i18n/zh-HK.js +17 -17
- package/dist/i18n/zh-TW.js +17 -17
- package/dist/i18n/zh-cn.js +17 -17
- package/dist/index.js +14 -14
- package/dist/lock/index.js +114 -114
- package/dist/log/config.js +35 -29
- package/dist/log/date.js +21 -21
- package/dist/log/file.js +198 -72
- package/dist/log/index.js +135 -105
- package/dist/log/level.js +33 -33
- package/dist/log/log.js +56 -0
- package/dist/log/store.js +19 -16
- package/dist/mongodb/collection.js +2 -2
- package/dist/mongodb/config.js +34 -34
- package/dist/mongodb/doc.js +2 -2
- package/dist/mongodb/exception.js +14 -14
- package/dist/mongodb/index.js +58 -58
- package/dist/mongodb/manager/base.js +563 -563
- package/dist/mongodb/manager/index.js +63 -63
- package/dist/mongodb/manager/tx-strict.js +84 -84
- package/dist/mongodb/manager/tx.js +30 -30
- package/dist/mongodb/migration.js +52 -52
- package/dist/mvc/access-log.js +33 -33
- package/dist/mvc/config.js +27 -27
- package/dist/mvc/exchange.js +113 -113
- package/dist/mvc/handler/index.js +7 -6
- package/dist/mvc/handler/json.js +65 -65
- package/dist/mvc/handler/restful.js +35 -35
- package/dist/mvc/handler/sse.js +65 -0
- package/dist/mvc/handler/upload.js +31 -31
- package/dist/mvc/index.js +50 -50
- package/dist/mvc/interceptor.js +2 -2
- package/dist/mvc/query.js +43 -43
- package/dist/mvc/render/file.js +132 -132
- package/dist/mvc/render/html/html.js +90 -90
- package/dist/mvc/render/html/index.js +18 -18
- package/dist/mvc/render/html/style.js +2 -2
- package/dist/mvc/render/index.js +7 -7
- package/dist/mvc/render/json.js +26 -26
- package/dist/mvc/render/text.js +16 -16
- package/dist/mvc/router.js +2 -2
- package/dist/mvc/server.js +272 -272
- package/dist/mvc/static/header.js +67 -67
- package/dist/mvc/static/index.js +6 -6
- package/dist/mvc/static/mime-type.js +84 -84
- package/dist/mvc/static/server-cache-config.js +66 -66
- package/dist/mvc/static/server-cache.js +133 -133
- package/dist/mvc/static/static-handler.js +372 -372
- package/dist/mysql/config.js +51 -51
- package/dist/mysql/exception.js +14 -14
- package/dist/mysql/index.js +87 -87
- package/dist/mysql/manager/base.js +239 -231
- package/dist/mysql/manager/index.js +107 -107
- package/dist/mysql/manager/ops/count.js +20 -20
- package/dist/mysql/manager/ops/criteria.js +356 -356
- package/dist/mysql/manager/ops/delete.js +65 -65
- package/dist/mysql/manager/ops/exist.js +26 -26
- package/dist/mysql/manager/ops/find.js +169 -130
- package/dist/mysql/manager/ops/index.js +14 -14
- package/dist/mysql/manager/ops/insert.js +106 -106
- package/dist/mysql/manager/ops/modify.js +10 -10
- package/dist/mysql/manager/ops/paginate.js +23 -23
- package/dist/mysql/manager/ops/query.js +9 -9
- package/dist/mysql/manager/ops/update.js +216 -216
- package/dist/mysql/manager/ops/utils.js +24 -24
- package/dist/mysql/manager/tx-strict.js +103 -100
- package/dist/mysql/manager/tx.js +30 -30
- package/dist/mysql/manager/utils.js +56 -56
- package/dist/mysql/migration.js +136 -136
- package/dist/mysql/table-info.js +8 -8
- package/dist/task/daily.js +59 -59
- package/dist/task/fixed-delay.js +38 -38
- package/dist/task/fixed-rate.js +42 -42
- package/dist/task/index.js +9 -9
- package/dist/task/task.js +56 -56
- package/dist/validation/exception.js +36 -36
- package/dist/validation/index.js +40 -40
- package/dist/validation/validator/array.js +34 -34
- package/dist/validation/validator/enum.js +28 -28
- package/dist/validation/validator/index.js +14 -14
- package/dist/validation/validator/length.js +40 -40
- package/dist/validation/validator/max-length.js +35 -35
- package/dist/validation/validator/max.js +29 -29
- package/dist/validation/validator/min-length.js +33 -33
- package/dist/validation/validator/min.js +29 -29
- package/dist/validation/validator/not-blank.js +33 -33
- package/dist/validation/validator/not-null.js +21 -21
- package/dist/validation/validator/plain-obj.js +32 -32
- package/dist/validation/validator/regexp.js +34 -34
- package/documentation/en/cache.md +56 -0
- package/documentation/en/config.md +96 -0
- package/documentation/en/engineering.md +256 -0
- package/documentation/en/http-client.md +32 -0
- package/documentation/en/i18n.md +143 -0
- package/documentation/en/index.md +24 -0
- package/documentation/en/lock.md +51 -0
- package/documentation/en/log.md +109 -0
- package/documentation/en/mongodb.md +256 -0
- package/documentation/en/mvc.md +688 -0
- package/documentation/en/mysql.md +552 -0
- package/documentation/en/task.md +45 -0
- package/documentation/en/test.md +56 -0
- package/documentation/en/validate.md +130 -0
- package/documentation/zh-cn/engineering.md +1 -1
- package/documentation/zh-cn/log.md +81 -8
- package/documentation/zh-cn/mvc.md +66 -24
- package/documentation/zh-cn/mysql.md +24 -23
- package/documentation/zh-cn/validate.md +2 -2
- package/package.json +3 -1
- package/skills/wok-server-api-rules/SKILL.md +350 -0
- package/skills/wok-server-cache/SKILL.md +216 -0
- package/skills/wok-server-config/SKILL.md +200 -0
- package/skills/wok-server-getting-started/SKILL.md +123 -0
- package/skills/wok-server-getting-started/references/engineering.md +169 -0
- package/skills/wok-server-http-client/SKILL.md +164 -0
- package/skills/wok-server-i18n/SKILL.md +214 -0
- package/skills/wok-server-lock/SKILL.md +144 -0
- package/skills/wok-server-log/SKILL.md +218 -0
- package/skills/wok-server-mongodb/SKILL.md +235 -0
- package/skills/wok-server-mvc/SKILL.md +251 -0
- package/skills/wok-server-mvc/references/respond-html.md +157 -0
- package/skills/wok-server-mvc/references/sse.md +121 -0
- package/skills/wok-server-mvc/references/static-files.md +47 -0
- package/skills/wok-server-mvc/references/upload.md +62 -0
- package/skills/wok-server-mvc/references/websocket.md +30 -0
- package/skills/wok-server-mysql/SKILL.md +315 -0
- package/skills/wok-server-mysql/references/multi-datasource.md +76 -0
- package/skills/wok-server-mysql/references/version-control.md +22 -0
- package/skills/wok-server-task/SKILL.md +158 -0
- package/skills/wok-server-validate/SKILL.md +167 -0
- package/src/cache/cache.ts +118 -0
- package/src/cache/config.ts +53 -0
- package/src/cache/index.ts +27 -0
- package/src/cache/purge-task.ts +53 -0
- package/src/cache/stat.ts +47 -0
- package/src/config/convert.ts +27 -0
- package/src/config/exception.ts +8 -0
- package/src/config/index.ts +92 -0
- package/src/http-client/index.ts +202 -0
- package/src/i18n/ar.ts +16 -0
- package/src/i18n/de.ts +16 -0
- package/src/i18n/en-us.ts +16 -0
- package/src/i18n/es.ts +16 -0
- package/src/i18n/fr.ts +16 -0
- package/src/i18n/i18n.ts +230 -0
- package/src/i18n/index.ts +50 -0
- package/src/i18n/ja.ts +16 -0
- package/src/i18n/ko.ts +16 -0
- package/src/i18n/msg.ts +50 -0
- package/src/i18n/pt.ts +16 -0
- package/src/i18n/ru.ts +16 -0
- package/src/i18n/tag.ts +18 -0
- package/src/i18n/zh-HK.ts +16 -0
- package/src/i18n/zh-TW.ts +16 -0
- package/src/i18n/zh-cn.ts +16 -0
- package/src/index.ts +11 -0
- package/src/lock/index.ts +164 -0
- package/src/log/config.ts +71 -0
- package/src/log/date.ts +19 -0
- package/src/log/file.ts +215 -0
- package/src/log/index.ts +136 -0
- package/src/log/level.ts +29 -0
- package/src/log/log.ts +77 -0
- package/src/log/store.ts +31 -0
- package/src/mongodb/collection.ts +25 -0
- package/src/mongodb/config.ts +69 -0
- package/src/mongodb/doc.ts +12 -0
- package/src/mongodb/exception.ts +8 -0
- package/src/mongodb/index.ts +71 -0
- package/src/mongodb/manager/base.ts +674 -0
- package/src/mongodb/manager/index.ts +80 -0
- package/src/mongodb/manager/tx-strict.ts +153 -0
- package/src/mongodb/manager/tx.ts +34 -0
- package/src/mongodb/migration.ts +66 -0
- package/src/mvc/access-log.ts +33 -0
- package/src/mvc/config.ts +70 -0
- package/src/mvc/exchange.ts +126 -0
- package/src/mvc/handler/index.ts +4 -0
- package/src/mvc/handler/json.ts +96 -0
- package/src/mvc/handler/restful.ts +39 -0
- package/src/mvc/handler/sse.ts +90 -0
- package/src/mvc/handler/upload.ts +54 -0
- package/src/mvc/index.ts +48 -0
- package/src/mvc/interceptor.ts +12 -0
- package/src/mvc/query.ts +36 -0
- package/src/mvc/render/file.ts +148 -0
- package/src/mvc/render/html/html.ts +187 -0
- package/src/mvc/render/html/index.ts +16 -0
- package/src/mvc/render/html/style.ts +1201 -0
- package/src/mvc/render/index.ts +4 -0
- package/src/mvc/render/json.ts +24 -0
- package/src/mvc/render/text.ts +14 -0
- package/src/mvc/router.ts +13 -0
- package/src/mvc/server.ts +315 -0
- package/src/mvc/static/header.ts +86 -0
- package/src/mvc/static/index.ts +3 -0
- package/src/mvc/static/mime-type.ts +81 -0
- package/src/mvc/static/server-cache-config.ts +92 -0
- package/src/mvc/static/server-cache.ts +171 -0
- package/src/mvc/static/static-handler.ts +445 -0
- package/src/mysql/config.ts +130 -0
- package/src/mysql/exception.ts +8 -0
- package/src/mysql/index.ts +88 -0
- package/src/mysql/manager/base.ts +285 -0
- package/src/mysql/manager/index.ts +112 -0
- package/src/mysql/manager/ops/count.ts +30 -0
- package/src/mysql/manager/ops/criteria.ts +412 -0
- package/src/mysql/manager/ops/delete.ts +96 -0
- package/src/mysql/manager/ops/exist.ts +41 -0
- package/src/mysql/manager/ops/find.ts +226 -0
- package/src/mysql/manager/ops/index.ts +11 -0
- package/src/mysql/manager/ops/insert.ts +120 -0
- package/src/mysql/manager/ops/modify.ts +14 -0
- package/src/mysql/manager/ops/paginate.ts +60 -0
- package/src/mysql/manager/ops/query.ts +13 -0
- package/src/mysql/manager/ops/update.ts +294 -0
- package/src/mysql/manager/ops/utils.ts +20 -0
- package/src/mysql/manager/tx-strict.ts +138 -0
- package/src/mysql/manager/tx.ts +31 -0
- package/src/mysql/manager/utils.ts +75 -0
- package/src/mysql/migration.ts +149 -0
- package/src/mysql/table-info.ts +41 -0
- package/src/task/daily.ts +70 -0
- package/src/task/fixed-delay.ts +45 -0
- package/src/task/fixed-rate.ts +49 -0
- package/src/task/index.ts +4 -0
- package/src/task/task.ts +70 -0
- package/src/validation/exception.ts +27 -0
- package/src/validation/index.ts +61 -0
- package/src/validation/validator/array.ts +32 -0
- package/src/validation/validator/enum.ts +25 -0
- package/src/validation/validator/index.ts +11 -0
- package/src/validation/validator/length.ts +42 -0
- package/src/validation/validator/max-length.ts +33 -0
- package/src/validation/validator/max.ts +26 -0
- package/src/validation/validator/min-length.ts +31 -0
- package/src/validation/validator/min.ts +26 -0
- package/src/validation/validator/not-blank.ts +31 -0
- package/src/validation/validator/not-null.ts +19 -0
- package/src/validation/validator/plain-obj.ts +30 -0
- package/src/validation/validator/regexp.ts +32 -0
- package/types/cache/cache.d.ts +52 -52
- package/types/cache/config.d.ts +32 -32
- package/types/cache/index.d.ts +2 -2
- package/types/cache/purge-task.d.ts +11 -11
- package/types/cache/stat.d.ts +26 -26
- package/types/config/convert.d.ts +6 -6
- package/types/config/exception.d.ts +7 -7
- package/types/config/index.d.ts +25 -25
- package/types/http-client/index.d.ts +71 -71
- package/types/i18n/ar.d.ts +2 -2
- package/types/i18n/de.d.ts +2 -2
- package/types/i18n/en-us.d.ts +2 -2
- package/types/i18n/es.d.ts +2 -2
- package/types/i18n/fr.d.ts +2 -2
- package/types/i18n/i18n.d.ts +102 -102
- package/types/i18n/index.d.ts +9 -9
- package/types/i18n/ja.d.ts +2 -2
- package/types/i18n/ko.d.ts +2 -2
- package/types/i18n/msg.d.ts +50 -50
- package/types/i18n/pt.d.ts +2 -2
- package/types/i18n/ru.d.ts +2 -2
- package/types/i18n/tag.d.ts +11 -11
- package/types/i18n/zh-HK.d.ts +2 -2
- package/types/i18n/zh-TW.d.ts +2 -2
- package/types/i18n/zh-cn.d.ts +2 -2
- package/types/index.d.ts +11 -11
- package/types/lock/index.d.ts +64 -64
- package/types/log/config.d.ts +35 -27
- package/types/log/date.d.ts +2 -2
- package/types/log/file.d.ts +13 -5
- package/types/log/index.d.ts +53 -34
- package/types/log/level.d.ts +14 -14
- package/types/log/log.d.ts +40 -0
- package/types/log/store.d.ts +19 -12
- package/types/mongodb/collection.d.ts +25 -25
- package/types/mongodb/config.d.ts +45 -45
- package/types/mongodb/doc.d.ts +11 -11
- package/types/mongodb/exception.d.ts +7 -7
- package/types/mongodb/index.d.ts +29 -29
- package/types/mongodb/manager/base.d.ts +188 -188
- package/types/mongodb/manager/index.d.ts +38 -38
- package/types/mongodb/manager/tx-strict.d.ts +41 -41
- package/types/mongodb/manager/tx.d.ts +21 -21
- package/types/mongodb/migration.d.ts +12 -12
- package/types/mvc/access-log.d.ts +7 -7
- package/types/mvc/config.d.ts +42 -42
- package/types/mvc/exchange.d.ts +72 -72
- package/types/mvc/handler/index.d.ts +4 -3
- package/types/mvc/handler/json.d.ts +44 -44
- package/types/mvc/handler/restful.d.ts +11 -11
- package/types/mvc/handler/sse.d.ts +34 -0
- package/types/mvc/handler/upload.d.ts +36 -36
- package/types/mvc/index.d.ts +22 -22
- package/types/mvc/interceptor.d.ts +11 -11
- package/types/mvc/query.d.ts +13 -13
- package/types/mvc/render/file.d.ts +10 -10
- package/types/mvc/render/html/html.d.ts +98 -98
- package/types/mvc/render/html/index.d.ts +11 -11
- package/types/mvc/render/html/style.d.ts +1201 -1201
- package/types/mvc/render/index.d.ts +4 -4
- package/types/mvc/render/json.d.ts +17 -17
- package/types/mvc/render/text.d.ts +10 -10
- package/types/mvc/router.d.ts +11 -11
- package/types/mvc/server.d.ts +90 -90
- package/types/mvc/static/header.d.ts +27 -27
- package/types/mvc/static/index.d.ts +3 -3
- package/types/mvc/static/mime-type.d.ts +2 -2
- package/types/mvc/static/server-cache-config.d.ts +30 -30
- package/types/mvc/static/server-cache.d.ts +76 -76
- package/types/mvc/static/static-handler.d.ts +77 -77
- package/types/mysql/config.d.ts +90 -90
- package/types/mysql/exception.d.ts +7 -7
- package/types/mysql/index.d.ts +16 -16
- package/types/mysql/manager/base.d.ts +165 -159
- package/types/mysql/manager/index.d.ts +36 -36
- package/types/mysql/manager/ops/count.d.ts +13 -13
- package/types/mysql/manager/ops/criteria.d.ts +134 -134
- package/types/mysql/manager/ops/delete.d.ts +46 -46
- package/types/mysql/manager/ops/exist.d.ts +6 -6
- package/types/mysql/manager/ops/find.d.ts +86 -70
- package/types/mysql/manager/ops/index.d.ts +10 -10
- package/types/mysql/manager/ops/insert.d.ts +18 -18
- package/types/mysql/manager/ops/modify.d.ts +3 -3
- package/types/mysql/manager/ops/paginate.d.ts +36 -36
- package/types/mysql/manager/ops/query.d.ts +3 -3
- package/types/mysql/manager/ops/update.d.ts +76 -76
- package/types/mysql/manager/ops/utils.d.ts +5 -5
- package/types/mysql/manager/tx-strict.d.ts +36 -35
- package/types/mysql/manager/tx.d.ts +15 -15
- package/types/mysql/manager/utils.d.ts +17 -17
- package/types/mysql/migration.d.ts +8 -8
- package/types/mysql/table-info.d.ts +36 -36
- package/types/task/daily.d.ts +16 -16
- package/types/task/fixed-delay.d.ts +9 -9
- package/types/task/fixed-rate.d.ts +9 -9
- package/types/task/index.d.ts +4 -4
- package/types/task/task.d.ts +34 -34
- package/types/validation/exception.d.ts +38 -38
- package/types/validation/index.d.ts +32 -32
- package/types/validation/validator/array.d.ts +5 -5
- package/types/validation/validator/enum.d.ts +8 -8
- package/types/validation/validator/index.d.ts +11 -11
- package/types/validation/validator/length.d.ts +10 -10
- package/types/validation/validator/max-length.d.ts +8 -8
- package/types/validation/validator/max.d.ts +7 -7
- package/types/validation/validator/min-length.d.ts +6 -6
- package/types/validation/validator/min.d.ts +7 -7
- package/types/validation/validator/not-blank.d.ts +7 -7
- package/types/validation/validator/not-null.d.ts +6 -6
- package/types/validation/validator/plain-obj.d.ts +7 -7
- package/types/validation/validator/regexp.d.ts +8 -8
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
import { MysqlException } from '../../exception'
|
|
2
|
+
|
|
3
|
+
export interface MysqlQuery {
|
|
4
|
+
sql: string
|
|
5
|
+
values: any[]
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* mysql 查询条件中的键,左侧表达式,可以是提取信息的表达式,也可以直接是列名
|
|
10
|
+
*
|
|
11
|
+
* keyof T 列名,直接用列的值来比较
|
|
12
|
+
* ['json_extract', keyof T, string] 使用 json_extract 函数提取 json 信息,第二个参数是列名,最后一个参数是表达式(如:'$.name')
|
|
13
|
+
* ['json_length',keyof T] 使用 json_length 函数提取 json 数组的元素数量
|
|
14
|
+
*/
|
|
15
|
+
export type MysqlCriteriaKey<T> =
|
|
16
|
+
| keyof T
|
|
17
|
+
| ['json_extract', keyof T, string]
|
|
18
|
+
| ['json_length', keyof T]
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* 生成条件查询中键的sql片段,包含 sql 内容和要传递的值
|
|
22
|
+
*/
|
|
23
|
+
function generateMysqlCriteriaKeySqlSeg<T>(key: MysqlCriteriaKey<T>): {
|
|
24
|
+
sqlSeg: string
|
|
25
|
+
value: keyof T
|
|
26
|
+
} {
|
|
27
|
+
if (Array.isArray(key)) {
|
|
28
|
+
if (key[0] === 'json_extract') {
|
|
29
|
+
return { sqlSeg: `JSON_EXTRACT(??, ${JSON.stringify(key[2])})`, value: key[1] }
|
|
30
|
+
}
|
|
31
|
+
if (key[0] === 'json_length') {
|
|
32
|
+
return { sqlSeg: `JSON_LENGTH(??)`, value: key[1] }
|
|
33
|
+
}
|
|
34
|
+
throw new MysqlException(`Unsupported MysqlCriteriaKey type: ${key[0]}`)
|
|
35
|
+
}
|
|
36
|
+
return { sqlSeg: '??', value: key }
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
interface Criterion<T> {
|
|
40
|
+
type:
|
|
41
|
+
| 'eq'
|
|
42
|
+
| 'neq'
|
|
43
|
+
| 'gt'
|
|
44
|
+
| 'gte'
|
|
45
|
+
| 'lt'
|
|
46
|
+
| 'lte'
|
|
47
|
+
| 'in'
|
|
48
|
+
| 'notIn'
|
|
49
|
+
| 'or'
|
|
50
|
+
| 'and'
|
|
51
|
+
| 'like'
|
|
52
|
+
| 'isNull'
|
|
53
|
+
| 'isNotNull'
|
|
54
|
+
| 'notLike'
|
|
55
|
+
| 'between'
|
|
56
|
+
key?: MysqlCriteriaKey<T>
|
|
57
|
+
value?: any
|
|
58
|
+
/**
|
|
59
|
+
* 嵌套的其它查询, or 和 and 条件下有效
|
|
60
|
+
*/
|
|
61
|
+
criteria?: MysqlCriteria<T>
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* mysql 查询条件( query criterion ),默认查询条件都是并且关系(and), 部分方法会有例外,在使用的时候请注意方法说明。
|
|
66
|
+
*
|
|
67
|
+
* @param <T> 表类型
|
|
68
|
+
*/
|
|
69
|
+
export class MysqlCriteria<T> {
|
|
70
|
+
/**
|
|
71
|
+
* 条件列表.
|
|
72
|
+
*/
|
|
73
|
+
private criteria: Criterion<T>[] = []
|
|
74
|
+
/**
|
|
75
|
+
* 相等.
|
|
76
|
+
* @param column
|
|
77
|
+
* @param value
|
|
78
|
+
*/
|
|
79
|
+
eq(column: MysqlCriteriaKey<T>, value: any) {
|
|
80
|
+
this.criteria.push({ type: 'eq', key: column, value })
|
|
81
|
+
return this
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 不等于,注意不相等不能走索引,谨慎使用
|
|
85
|
+
* @param column
|
|
86
|
+
* @param value
|
|
87
|
+
*/
|
|
88
|
+
neq(column: MysqlCriteriaKey<T>, value: any) {
|
|
89
|
+
this.criteria.push({ type: 'neq', key: column, value })
|
|
90
|
+
return this
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* like
|
|
94
|
+
* @param column
|
|
95
|
+
* @param value
|
|
96
|
+
* @returns
|
|
97
|
+
*/
|
|
98
|
+
like(column: MysqlCriteriaKey<T>, value: string) {
|
|
99
|
+
this.criteria.push({ type: 'like', key: column, value })
|
|
100
|
+
return this
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* not like
|
|
104
|
+
* @param column
|
|
105
|
+
* @param value
|
|
106
|
+
* @returns
|
|
107
|
+
*/
|
|
108
|
+
notLike(column: MysqlCriteriaKey<T>, value: string) {
|
|
109
|
+
this.criteria.push({ type: 'notLike', key: column, value })
|
|
110
|
+
return this
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* BETWEEN x and y
|
|
114
|
+
*/
|
|
115
|
+
between(column: MysqlCriteriaKey<T>, min: number, max: number) {
|
|
116
|
+
this.criteria.push({ type: 'between', key: column, value: [min, max] })
|
|
117
|
+
return this
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* 大于
|
|
121
|
+
* @param column
|
|
122
|
+
* @param value
|
|
123
|
+
*/
|
|
124
|
+
gt(column: MysqlCriteriaKey<T>, value: number | Date | string) {
|
|
125
|
+
this.criteria.push({ type: 'gt', key: column, value })
|
|
126
|
+
return this
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 大于等于
|
|
130
|
+
* @param column
|
|
131
|
+
* @param value
|
|
132
|
+
*/
|
|
133
|
+
gte(column: MysqlCriteriaKey<T>, value: number | Date | string) {
|
|
134
|
+
this.criteria.push({ type: 'gte', key: column, value })
|
|
135
|
+
return this
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* 小于
|
|
139
|
+
* @param column
|
|
140
|
+
* @param value
|
|
141
|
+
*/
|
|
142
|
+
lt(column: MysqlCriteriaKey<T>, value: number | Date | string) {
|
|
143
|
+
this.criteria.push({ type: 'lt', key: column, value })
|
|
144
|
+
return this
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* 小于等于
|
|
148
|
+
* @param column
|
|
149
|
+
* @param value
|
|
150
|
+
*/
|
|
151
|
+
lte(column: MysqlCriteriaKey<T>, value: number | Date | string) {
|
|
152
|
+
this.criteria.push({ type: 'lte', key: column, value })
|
|
153
|
+
return this
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* in 条件
|
|
157
|
+
* @param column
|
|
158
|
+
* @param values
|
|
159
|
+
*/
|
|
160
|
+
in(column: MysqlCriteriaKey<T>, values: Array<string | number>) {
|
|
161
|
+
this.criteria.push({ type: 'in', key: column, value: values })
|
|
162
|
+
return this
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* not in 条件
|
|
166
|
+
* @param column
|
|
167
|
+
* @param values
|
|
168
|
+
*/
|
|
169
|
+
notIn(column: MysqlCriteriaKey<T>, values: Array<string | number>) {
|
|
170
|
+
this.criteria.push({ type: 'notIn', key: column, value: values })
|
|
171
|
+
return this
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* 嵌入其它的查询条件,与现有的查询条件是或者关系.
|
|
175
|
+
* @param criteria
|
|
176
|
+
*/
|
|
177
|
+
or(orCriteria: (criteria: MysqlCriteria<T>) => void) {
|
|
178
|
+
const criteria = new MysqlCriteria<T>()
|
|
179
|
+
orCriteria(criteria)
|
|
180
|
+
this.criteria.push({ type: 'or', criteria })
|
|
181
|
+
return this
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* 嵌入其它的查询条件,与现有的查询条件是并且关系.
|
|
185
|
+
* @param criteria
|
|
186
|
+
*/
|
|
187
|
+
and(andCriteria: (criteria: MysqlCriteria<T>) => void) {
|
|
188
|
+
const criteria = new MysqlCriteria<T>()
|
|
189
|
+
andCriteria(criteria)
|
|
190
|
+
this.criteria.push({ type: 'and', criteria })
|
|
191
|
+
return this
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* 字段为空
|
|
195
|
+
* @param field
|
|
196
|
+
* @returns
|
|
197
|
+
*/
|
|
198
|
+
isNull(field: MysqlCriteriaKey<T>) {
|
|
199
|
+
this.criteria.push({ type: 'isNull', key: field })
|
|
200
|
+
return this
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* 字段非空
|
|
204
|
+
* @param field
|
|
205
|
+
* @returns
|
|
206
|
+
*/
|
|
207
|
+
isNotNull(field: MysqlCriteriaKey<T>) {
|
|
208
|
+
this.criteria.push({ type: 'isNotNull', key: field })
|
|
209
|
+
return this
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* 判定是否空,未设置条件.
|
|
213
|
+
* @returns
|
|
214
|
+
*/
|
|
215
|
+
isEmpty() {
|
|
216
|
+
return !this.criteria.length
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* 检查条件信息是否有效,在出错时能给予较详细的提示,以方便排查.
|
|
220
|
+
*/
|
|
221
|
+
check() {
|
|
222
|
+
for (const criterion of this.criteria) {
|
|
223
|
+
if (criterion.type === 'or' || criterion.type === 'and') {
|
|
224
|
+
if (!criterion.criteria) {
|
|
225
|
+
throw new MysqlException(`${criterion.type} clause cannot be empty`)
|
|
226
|
+
}
|
|
227
|
+
criterion.criteria.check()
|
|
228
|
+
continue
|
|
229
|
+
}
|
|
230
|
+
if (!criterion.key) {
|
|
231
|
+
throw new MysqlException('The column name of the query criteria cannot be blank.')
|
|
232
|
+
}
|
|
233
|
+
if (criterion.type === 'isNull' || criterion.type === 'isNotNull') {
|
|
234
|
+
continue
|
|
235
|
+
}
|
|
236
|
+
if (criterion.type === 'in' || criterion.type === 'notIn') {
|
|
237
|
+
if (!Array.isArray(criterion.value)) {
|
|
238
|
+
throw new MysqlException(
|
|
239
|
+
`Invalid ${
|
|
240
|
+
criterion.type
|
|
241
|
+
} condition,the condition value is not a array type,column name:${criterion.key.toString()}`
|
|
242
|
+
)
|
|
243
|
+
}
|
|
244
|
+
if (!criterion.value.length) {
|
|
245
|
+
throw new MysqlException(
|
|
246
|
+
`Invalid ${
|
|
247
|
+
criterion.type
|
|
248
|
+
} condition,the condition value cannot be an empty array,column name:${criterion.key.toString()}`
|
|
249
|
+
)
|
|
250
|
+
}
|
|
251
|
+
continue
|
|
252
|
+
}
|
|
253
|
+
if (criterion.type === 'between') {
|
|
254
|
+
if (!Array.isArray(criterion.value)) {
|
|
255
|
+
throw new MysqlException(
|
|
256
|
+
`Invalid between condition,the condition value is not an array type,column name:${criterion.key.toString()}, value:${
|
|
257
|
+
criterion.value
|
|
258
|
+
}`
|
|
259
|
+
)
|
|
260
|
+
}
|
|
261
|
+
if (criterion.value.length !== 2) {
|
|
262
|
+
throw new MysqlException(
|
|
263
|
+
`Invalid between condition,the condition value must be an array of length 2,column: ${criterion.key.toString()},value:${
|
|
264
|
+
criterion.value.length
|
|
265
|
+
}`
|
|
266
|
+
)
|
|
267
|
+
}
|
|
268
|
+
continue
|
|
269
|
+
}
|
|
270
|
+
if (
|
|
271
|
+
typeof criterion.value !== 'number' &&
|
|
272
|
+
typeof criterion.value !== 'string' &&
|
|
273
|
+
typeof criterion.value !== 'boolean' &&
|
|
274
|
+
!(criterion.value instanceof Date)
|
|
275
|
+
) {
|
|
276
|
+
throw new MysqlException(
|
|
277
|
+
'The value of the query criteria is invalid,only number,string,boolean and Date are supported,' +
|
|
278
|
+
`column name : ${criterion.key.toString()},value : ${criterion.value} .`
|
|
279
|
+
)
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/**
|
|
285
|
+
* 生成查询数据
|
|
286
|
+
*/
|
|
287
|
+
generateQuery(): MysqlQuery {
|
|
288
|
+
this.check()
|
|
289
|
+
const sqlFragments: string[] = []
|
|
290
|
+
const values: any[] = []
|
|
291
|
+
for (const criterion of this.criteria) {
|
|
292
|
+
// 普通的查询
|
|
293
|
+
if (criterion.key && criterion.value !== undefined) {
|
|
294
|
+
// between 特殊处理
|
|
295
|
+
if (criterion.type === 'between') {
|
|
296
|
+
sqlFragments.push('and ?? between ? and ? ')
|
|
297
|
+
values.push(criterion.key, criterion.value[0], criterion.value[1])
|
|
298
|
+
continue
|
|
299
|
+
}
|
|
300
|
+
// 符号
|
|
301
|
+
let sign = ''
|
|
302
|
+
if (criterion.type === 'eq') {
|
|
303
|
+
sign = '='
|
|
304
|
+
} else if (criterion.type === 'neq') {
|
|
305
|
+
sign = '!='
|
|
306
|
+
} else if (criterion.type === 'gt') {
|
|
307
|
+
sign = '>'
|
|
308
|
+
} else if (criterion.type === 'gte') {
|
|
309
|
+
sign = '>='
|
|
310
|
+
} else if (criterion.type === 'lt') {
|
|
311
|
+
sign = '<'
|
|
312
|
+
} else if (criterion.type === 'lte') {
|
|
313
|
+
sign = '<='
|
|
314
|
+
} else if (criterion.type === 'in') {
|
|
315
|
+
sign = 'in'
|
|
316
|
+
} else if (criterion.type === 'notIn') {
|
|
317
|
+
sign = 'not in'
|
|
318
|
+
} else if (criterion.type === 'like') {
|
|
319
|
+
sign = 'like'
|
|
320
|
+
} else if (criterion.type === 'notLike') {
|
|
321
|
+
sign = 'not like'
|
|
322
|
+
}
|
|
323
|
+
if (sign) {
|
|
324
|
+
const keySeg = generateMysqlCriteriaKeySqlSeg(criterion.key)
|
|
325
|
+
if (criterion.type === 'in' || criterion.type === 'notIn') {
|
|
326
|
+
sqlFragments.push(`and ${keySeg.sqlSeg} ${sign} (?) `)
|
|
327
|
+
} else {
|
|
328
|
+
sqlFragments.push(`and ${keySeg.sqlSeg} ${sign} ? `)
|
|
329
|
+
}
|
|
330
|
+
values.push(keySeg.value, criterion.value)
|
|
331
|
+
}
|
|
332
|
+
continue
|
|
333
|
+
} else if (criterion.key) {
|
|
334
|
+
const keySeg = generateMysqlCriteriaKeySqlSeg(criterion.key)
|
|
335
|
+
if (criterion.type === 'isNull') {
|
|
336
|
+
sqlFragments.push(`and ${keySeg.sqlSeg} is null `)
|
|
337
|
+
values.push(keySeg.value)
|
|
338
|
+
continue
|
|
339
|
+
}
|
|
340
|
+
if (criterion.type === 'isNotNull') {
|
|
341
|
+
sqlFragments.push(`and ${keySeg.sqlSeg} is not null `)
|
|
342
|
+
values.push(keySeg.value)
|
|
343
|
+
continue
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// 特殊查询 or 和 and
|
|
347
|
+
else if (criterion.criteria) {
|
|
348
|
+
const query = criterion.criteria.generateQuery()
|
|
349
|
+
if (criterion.type === 'or') {
|
|
350
|
+
sqlFragments.push(`or (${query.sql}) `)
|
|
351
|
+
values.push(...query.values)
|
|
352
|
+
continue
|
|
353
|
+
}
|
|
354
|
+
if (criterion.type === 'and') {
|
|
355
|
+
sqlFragments.push(`and (${query.sql}) `)
|
|
356
|
+
values.push(...query.values)
|
|
357
|
+
continue
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
if (!sqlFragments.length) {
|
|
362
|
+
throw new MysqlException('No valid query criteria have been set.')
|
|
363
|
+
}
|
|
364
|
+
let sql = sqlFragments.join('')
|
|
365
|
+
// 去除掉第一个条件的连接关键字,可能是 and 或 or
|
|
366
|
+
if (sql.startsWith('and')) {
|
|
367
|
+
sql = sql.substring(3)
|
|
368
|
+
} else if (sql.startsWith('or')) {
|
|
369
|
+
sql = sql.substring(2)
|
|
370
|
+
}
|
|
371
|
+
return { sql, values }
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* 混合的查询对象.
|
|
377
|
+
*/
|
|
378
|
+
export type MixCriteria<T> = Partial<T> | ((criteria: MysqlCriteria<T>) => void) | MysqlCriteria<T>
|
|
379
|
+
|
|
380
|
+
function convertToCriteria<T>(example: Partial<T>): MysqlCriteria<keyof T> {
|
|
381
|
+
const criteria = new MysqlCriteria<keyof T>()
|
|
382
|
+
Object.entries(example as any).forEach(entry => {
|
|
383
|
+
const [key, value] = entry
|
|
384
|
+
criteria.eq(key as any, value)
|
|
385
|
+
})
|
|
386
|
+
return criteria
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* 将混合的查询条件转换成查询语句,如果最终构建的条件是空的,返回 undefined
|
|
391
|
+
* @param criteria
|
|
392
|
+
* @returns
|
|
393
|
+
*/
|
|
394
|
+
export function buildQuery<T>(criteria: MixCriteria<T>): MysqlQuery | undefined {
|
|
395
|
+
if (criteria instanceof Function) {
|
|
396
|
+
const c = new MysqlCriteria<T>()
|
|
397
|
+
criteria(c)
|
|
398
|
+
if (!c.isEmpty()) {
|
|
399
|
+
return c.generateQuery()
|
|
400
|
+
}
|
|
401
|
+
} else if (criteria instanceof MysqlCriteria) {
|
|
402
|
+
if (!criteria.isEmpty()) {
|
|
403
|
+
return criteria.generateQuery()
|
|
404
|
+
}
|
|
405
|
+
} else {
|
|
406
|
+
const c = convertToCriteria<T>(criteria)
|
|
407
|
+
if (!c.isEmpty()) {
|
|
408
|
+
return c.generateQuery()
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
return undefined
|
|
412
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { PoolConnection, ResultSetHeader } from 'mysql2'
|
|
2
|
+
import { MysqlException } from '../../exception'
|
|
3
|
+
import { Table } from '../../table-info'
|
|
4
|
+
import { promiseQuery } from '../utils'
|
|
5
|
+
import { MixCriteria, buildQuery } from './criteria'
|
|
6
|
+
import { MysqlConfig } from '../../config'
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 按 id 删除.
|
|
10
|
+
*
|
|
11
|
+
* @param config
|
|
12
|
+
* @param connection
|
|
13
|
+
* @param mapping
|
|
14
|
+
* @param type
|
|
15
|
+
* @param id
|
|
16
|
+
*/
|
|
17
|
+
export async function deleteById<T>(
|
|
18
|
+
config: MysqlConfig,
|
|
19
|
+
connection: PoolConnection,
|
|
20
|
+
table: Table<T>,
|
|
21
|
+
id: string | number
|
|
22
|
+
): Promise<boolean> {
|
|
23
|
+
const res = await promiseQuery(config, connection, `delete from ?? where ?? = ?`, [
|
|
24
|
+
table.tableName,
|
|
25
|
+
table.id,
|
|
26
|
+
id
|
|
27
|
+
])
|
|
28
|
+
const ok = res as ResultSetHeader
|
|
29
|
+
return ok.affectedRows === 1
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 批量删除的选项
|
|
33
|
+
*/
|
|
34
|
+
export interface DeleteManyOpts<T> {
|
|
35
|
+
/**
|
|
36
|
+
* 表.
|
|
37
|
+
*/
|
|
38
|
+
table: Table<T>
|
|
39
|
+
/**
|
|
40
|
+
* 查询条件
|
|
41
|
+
* @param criteria
|
|
42
|
+
* @returns
|
|
43
|
+
*/
|
|
44
|
+
criteria: MixCriteria<T>
|
|
45
|
+
/**
|
|
46
|
+
* 限制数量
|
|
47
|
+
*/
|
|
48
|
+
limit?: number
|
|
49
|
+
/**
|
|
50
|
+
* 排序规则,按先后顺序放入,每个规则是一个元组,第一个元素是字段名称,第二个元素是顺序
|
|
51
|
+
*/
|
|
52
|
+
orderBy?: Array<[keyof T, 'asc' | 'desc']>
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* 按条件删除,返回被删除的记录数.
|
|
57
|
+
* 务必谨慎使用,大批量删除容易带来性能问题,造成线上事故.
|
|
58
|
+
* @param config
|
|
59
|
+
* @param connection
|
|
60
|
+
* @param table
|
|
61
|
+
* @param criteria
|
|
62
|
+
*/
|
|
63
|
+
export async function deleteMany<T>(
|
|
64
|
+
config: MysqlConfig,
|
|
65
|
+
connection: PoolConnection,
|
|
66
|
+
opts: DeleteManyOpts<T>
|
|
67
|
+
): Promise<number> {
|
|
68
|
+
let sql = 'delete from ?? '
|
|
69
|
+
const values: any[] = [opts.table.tableName]
|
|
70
|
+
let query = buildQuery(opts.criteria)
|
|
71
|
+
if (!query) {
|
|
72
|
+
throw new MysqlException('No valid criteria specified.')
|
|
73
|
+
}
|
|
74
|
+
if (query) {
|
|
75
|
+
sql += ` where ${query.sql} `
|
|
76
|
+
values.push(...query.values)
|
|
77
|
+
}
|
|
78
|
+
// 排序
|
|
79
|
+
if (opts.orderBy && opts.orderBy.length) {
|
|
80
|
+
opts.orderBy.forEach((orderBy, idx) => {
|
|
81
|
+
const [field, sort] = orderBy
|
|
82
|
+
if (idx == 0) {
|
|
83
|
+
sql += ` order by ?? ${sort} `
|
|
84
|
+
} else {
|
|
85
|
+
sql += ` , ?? ${sort} `
|
|
86
|
+
}
|
|
87
|
+
values.push(field)
|
|
88
|
+
})
|
|
89
|
+
}
|
|
90
|
+
// 数量限制
|
|
91
|
+
if (opts.limit) {
|
|
92
|
+
sql += ` limit ${opts.limit} `
|
|
93
|
+
}
|
|
94
|
+
const res = await promiseQuery(config, connection, sql, values)
|
|
95
|
+
return (res as ResultSetHeader).affectedRows
|
|
96
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { PoolConnection, ResultSetHeader, RowDataPacket } from 'mysql2'
|
|
2
|
+
import { Table } from '../../table-info'
|
|
3
|
+
import { MixCriteria, buildQuery } from './criteria'
|
|
4
|
+
import { promiseQuery } from '../utils'
|
|
5
|
+
import { MysqlConfig } from '../../config'
|
|
6
|
+
|
|
7
|
+
export async function existsById<T>(
|
|
8
|
+
config: MysqlConfig,
|
|
9
|
+
connection: PoolConnection,
|
|
10
|
+
table: Table<T>,
|
|
11
|
+
id: string | number
|
|
12
|
+
): Promise<boolean> {
|
|
13
|
+
const res = await promiseQuery(config, connection, `select 1 from ?? where ?? = ?`, [
|
|
14
|
+
table.tableName,
|
|
15
|
+
table.id,
|
|
16
|
+
id
|
|
17
|
+
])
|
|
18
|
+
const rows = res as RowDataPacket[]
|
|
19
|
+
return !!rows.length
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export async function existsBy<T>(
|
|
23
|
+
config: MysqlConfig,
|
|
24
|
+
connection: PoolConnection,
|
|
25
|
+
table: Table<T>,
|
|
26
|
+
criteria?: MixCriteria<T>
|
|
27
|
+
): Promise<boolean> {
|
|
28
|
+
let query = criteria ? buildQuery(criteria) : undefined
|
|
29
|
+
let sql = `select 1 from ?? `
|
|
30
|
+
if (query) {
|
|
31
|
+
sql += ` where ${query.sql} `
|
|
32
|
+
}
|
|
33
|
+
const res = await promiseQuery(
|
|
34
|
+
config,
|
|
35
|
+
connection,
|
|
36
|
+
sql,
|
|
37
|
+
[table.tableName].concat(query ? query.values : [])
|
|
38
|
+
)
|
|
39
|
+
const rows = res as ResultSetHeader[]
|
|
40
|
+
return !!rows.length
|
|
41
|
+
}
|