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.
Files changed (376) hide show
  1. package/README.en.md +61 -0
  2. package/README.md +44 -29
  3. package/dist/cache/cache.js +98 -98
  4. package/dist/cache/config.js +19 -19
  5. package/dist/cache/index.js +27 -27
  6. package/dist/cache/purge-task.js +46 -46
  7. package/dist/cache/stat.js +47 -47
  8. package/dist/config/convert.js +36 -36
  9. package/dist/config/exception.js +14 -14
  10. package/dist/config/index.js +81 -81
  11. package/dist/http-client/index.js +136 -136
  12. package/dist/i18n/ar.js +17 -17
  13. package/dist/i18n/de.js +17 -17
  14. package/dist/i18n/en-us.js +17 -17
  15. package/dist/i18n/es.js +17 -17
  16. package/dist/i18n/fr.js +17 -17
  17. package/dist/i18n/i18n.js +231 -231
  18. package/dist/i18n/index.js +52 -52
  19. package/dist/i18n/ja.js +17 -17
  20. package/dist/i18n/ko.js +17 -17
  21. package/dist/i18n/msg.js +2 -2
  22. package/dist/i18n/pt.js +17 -17
  23. package/dist/i18n/ru.js +17 -17
  24. package/dist/i18n/tag.js +18 -18
  25. package/dist/i18n/zh-HK.js +17 -17
  26. package/dist/i18n/zh-TW.js +17 -17
  27. package/dist/i18n/zh-cn.js +17 -17
  28. package/dist/index.js +14 -14
  29. package/dist/lock/index.js +114 -114
  30. package/dist/log/config.js +35 -29
  31. package/dist/log/date.js +21 -21
  32. package/dist/log/file.js +198 -72
  33. package/dist/log/index.js +135 -105
  34. package/dist/log/level.js +33 -33
  35. package/dist/log/log.js +56 -0
  36. package/dist/log/store.js +19 -16
  37. package/dist/mongodb/collection.js +2 -2
  38. package/dist/mongodb/config.js +34 -34
  39. package/dist/mongodb/doc.js +2 -2
  40. package/dist/mongodb/exception.js +14 -14
  41. package/dist/mongodb/index.js +58 -58
  42. package/dist/mongodb/manager/base.js +563 -563
  43. package/dist/mongodb/manager/index.js +63 -63
  44. package/dist/mongodb/manager/tx-strict.js +84 -84
  45. package/dist/mongodb/manager/tx.js +30 -30
  46. package/dist/mongodb/migration.js +52 -52
  47. package/dist/mvc/access-log.js +33 -33
  48. package/dist/mvc/config.js +27 -27
  49. package/dist/mvc/exchange.js +113 -113
  50. package/dist/mvc/handler/index.js +7 -6
  51. package/dist/mvc/handler/json.js +65 -65
  52. package/dist/mvc/handler/restful.js +35 -35
  53. package/dist/mvc/handler/sse.js +65 -0
  54. package/dist/mvc/handler/upload.js +31 -31
  55. package/dist/mvc/index.js +50 -50
  56. package/dist/mvc/interceptor.js +2 -2
  57. package/dist/mvc/query.js +43 -43
  58. package/dist/mvc/render/file.js +132 -132
  59. package/dist/mvc/render/html/html.js +90 -90
  60. package/dist/mvc/render/html/index.js +18 -18
  61. package/dist/mvc/render/html/style.js +2 -2
  62. package/dist/mvc/render/index.js +7 -7
  63. package/dist/mvc/render/json.js +26 -26
  64. package/dist/mvc/render/text.js +16 -16
  65. package/dist/mvc/router.js +2 -2
  66. package/dist/mvc/server.js +272 -272
  67. package/dist/mvc/static/header.js +67 -67
  68. package/dist/mvc/static/index.js +6 -6
  69. package/dist/mvc/static/mime-type.js +84 -84
  70. package/dist/mvc/static/server-cache-config.js +66 -66
  71. package/dist/mvc/static/server-cache.js +133 -133
  72. package/dist/mvc/static/static-handler.js +372 -372
  73. package/dist/mysql/config.js +51 -51
  74. package/dist/mysql/exception.js +14 -14
  75. package/dist/mysql/index.js +87 -87
  76. package/dist/mysql/manager/base.js +239 -231
  77. package/dist/mysql/manager/index.js +107 -107
  78. package/dist/mysql/manager/ops/count.js +20 -20
  79. package/dist/mysql/manager/ops/criteria.js +356 -356
  80. package/dist/mysql/manager/ops/delete.js +65 -65
  81. package/dist/mysql/manager/ops/exist.js +26 -26
  82. package/dist/mysql/manager/ops/find.js +169 -130
  83. package/dist/mysql/manager/ops/index.js +14 -14
  84. package/dist/mysql/manager/ops/insert.js +106 -106
  85. package/dist/mysql/manager/ops/modify.js +10 -10
  86. package/dist/mysql/manager/ops/paginate.js +23 -23
  87. package/dist/mysql/manager/ops/query.js +9 -9
  88. package/dist/mysql/manager/ops/update.js +216 -216
  89. package/dist/mysql/manager/ops/utils.js +24 -24
  90. package/dist/mysql/manager/tx-strict.js +103 -100
  91. package/dist/mysql/manager/tx.js +30 -30
  92. package/dist/mysql/manager/utils.js +56 -56
  93. package/dist/mysql/migration.js +136 -136
  94. package/dist/mysql/table-info.js +8 -8
  95. package/dist/task/daily.js +59 -59
  96. package/dist/task/fixed-delay.js +38 -38
  97. package/dist/task/fixed-rate.js +42 -42
  98. package/dist/task/index.js +9 -9
  99. package/dist/task/task.js +56 -56
  100. package/dist/validation/exception.js +36 -36
  101. package/dist/validation/index.js +40 -40
  102. package/dist/validation/validator/array.js +34 -34
  103. package/dist/validation/validator/enum.js +28 -28
  104. package/dist/validation/validator/index.js +14 -14
  105. package/dist/validation/validator/length.js +40 -40
  106. package/dist/validation/validator/max-length.js +35 -35
  107. package/dist/validation/validator/max.js +29 -29
  108. package/dist/validation/validator/min-length.js +33 -33
  109. package/dist/validation/validator/min.js +29 -29
  110. package/dist/validation/validator/not-blank.js +33 -33
  111. package/dist/validation/validator/not-null.js +21 -21
  112. package/dist/validation/validator/plain-obj.js +32 -32
  113. package/dist/validation/validator/regexp.js +34 -34
  114. package/documentation/en/cache.md +56 -0
  115. package/documentation/en/config.md +96 -0
  116. package/documentation/en/engineering.md +256 -0
  117. package/documentation/en/http-client.md +32 -0
  118. package/documentation/en/i18n.md +143 -0
  119. package/documentation/en/index.md +24 -0
  120. package/documentation/en/lock.md +51 -0
  121. package/documentation/en/log.md +109 -0
  122. package/documentation/en/mongodb.md +256 -0
  123. package/documentation/en/mvc.md +688 -0
  124. package/documentation/en/mysql.md +552 -0
  125. package/documentation/en/task.md +45 -0
  126. package/documentation/en/test.md +56 -0
  127. package/documentation/en/validate.md +130 -0
  128. package/documentation/zh-cn/engineering.md +1 -1
  129. package/documentation/zh-cn/log.md +81 -8
  130. package/documentation/zh-cn/mvc.md +66 -24
  131. package/documentation/zh-cn/mysql.md +24 -23
  132. package/documentation/zh-cn/validate.md +2 -2
  133. package/package.json +3 -1
  134. package/skills/wok-server-api-rules/SKILL.md +350 -0
  135. package/skills/wok-server-cache/SKILL.md +216 -0
  136. package/skills/wok-server-config/SKILL.md +200 -0
  137. package/skills/wok-server-getting-started/SKILL.md +123 -0
  138. package/skills/wok-server-getting-started/references/engineering.md +169 -0
  139. package/skills/wok-server-http-client/SKILL.md +164 -0
  140. package/skills/wok-server-i18n/SKILL.md +214 -0
  141. package/skills/wok-server-lock/SKILL.md +144 -0
  142. package/skills/wok-server-log/SKILL.md +218 -0
  143. package/skills/wok-server-mongodb/SKILL.md +235 -0
  144. package/skills/wok-server-mvc/SKILL.md +251 -0
  145. package/skills/wok-server-mvc/references/respond-html.md +157 -0
  146. package/skills/wok-server-mvc/references/sse.md +121 -0
  147. package/skills/wok-server-mvc/references/static-files.md +47 -0
  148. package/skills/wok-server-mvc/references/upload.md +62 -0
  149. package/skills/wok-server-mvc/references/websocket.md +30 -0
  150. package/skills/wok-server-mysql/SKILL.md +315 -0
  151. package/skills/wok-server-mysql/references/multi-datasource.md +76 -0
  152. package/skills/wok-server-mysql/references/version-control.md +22 -0
  153. package/skills/wok-server-task/SKILL.md +158 -0
  154. package/skills/wok-server-validate/SKILL.md +167 -0
  155. package/src/cache/cache.ts +118 -0
  156. package/src/cache/config.ts +53 -0
  157. package/src/cache/index.ts +27 -0
  158. package/src/cache/purge-task.ts +53 -0
  159. package/src/cache/stat.ts +47 -0
  160. package/src/config/convert.ts +27 -0
  161. package/src/config/exception.ts +8 -0
  162. package/src/config/index.ts +92 -0
  163. package/src/http-client/index.ts +202 -0
  164. package/src/i18n/ar.ts +16 -0
  165. package/src/i18n/de.ts +16 -0
  166. package/src/i18n/en-us.ts +16 -0
  167. package/src/i18n/es.ts +16 -0
  168. package/src/i18n/fr.ts +16 -0
  169. package/src/i18n/i18n.ts +230 -0
  170. package/src/i18n/index.ts +50 -0
  171. package/src/i18n/ja.ts +16 -0
  172. package/src/i18n/ko.ts +16 -0
  173. package/src/i18n/msg.ts +50 -0
  174. package/src/i18n/pt.ts +16 -0
  175. package/src/i18n/ru.ts +16 -0
  176. package/src/i18n/tag.ts +18 -0
  177. package/src/i18n/zh-HK.ts +16 -0
  178. package/src/i18n/zh-TW.ts +16 -0
  179. package/src/i18n/zh-cn.ts +16 -0
  180. package/src/index.ts +11 -0
  181. package/src/lock/index.ts +164 -0
  182. package/src/log/config.ts +71 -0
  183. package/src/log/date.ts +19 -0
  184. package/src/log/file.ts +215 -0
  185. package/src/log/index.ts +136 -0
  186. package/src/log/level.ts +29 -0
  187. package/src/log/log.ts +77 -0
  188. package/src/log/store.ts +31 -0
  189. package/src/mongodb/collection.ts +25 -0
  190. package/src/mongodb/config.ts +69 -0
  191. package/src/mongodb/doc.ts +12 -0
  192. package/src/mongodb/exception.ts +8 -0
  193. package/src/mongodb/index.ts +71 -0
  194. package/src/mongodb/manager/base.ts +674 -0
  195. package/src/mongodb/manager/index.ts +80 -0
  196. package/src/mongodb/manager/tx-strict.ts +153 -0
  197. package/src/mongodb/manager/tx.ts +34 -0
  198. package/src/mongodb/migration.ts +66 -0
  199. package/src/mvc/access-log.ts +33 -0
  200. package/src/mvc/config.ts +70 -0
  201. package/src/mvc/exchange.ts +126 -0
  202. package/src/mvc/handler/index.ts +4 -0
  203. package/src/mvc/handler/json.ts +96 -0
  204. package/src/mvc/handler/restful.ts +39 -0
  205. package/src/mvc/handler/sse.ts +90 -0
  206. package/src/mvc/handler/upload.ts +54 -0
  207. package/src/mvc/index.ts +48 -0
  208. package/src/mvc/interceptor.ts +12 -0
  209. package/src/mvc/query.ts +36 -0
  210. package/src/mvc/render/file.ts +148 -0
  211. package/src/mvc/render/html/html.ts +187 -0
  212. package/src/mvc/render/html/index.ts +16 -0
  213. package/src/mvc/render/html/style.ts +1201 -0
  214. package/src/mvc/render/index.ts +4 -0
  215. package/src/mvc/render/json.ts +24 -0
  216. package/src/mvc/render/text.ts +14 -0
  217. package/src/mvc/router.ts +13 -0
  218. package/src/mvc/server.ts +315 -0
  219. package/src/mvc/static/header.ts +86 -0
  220. package/src/mvc/static/index.ts +3 -0
  221. package/src/mvc/static/mime-type.ts +81 -0
  222. package/src/mvc/static/server-cache-config.ts +92 -0
  223. package/src/mvc/static/server-cache.ts +171 -0
  224. package/src/mvc/static/static-handler.ts +445 -0
  225. package/src/mysql/config.ts +130 -0
  226. package/src/mysql/exception.ts +8 -0
  227. package/src/mysql/index.ts +88 -0
  228. package/src/mysql/manager/base.ts +285 -0
  229. package/src/mysql/manager/index.ts +112 -0
  230. package/src/mysql/manager/ops/count.ts +30 -0
  231. package/src/mysql/manager/ops/criteria.ts +412 -0
  232. package/src/mysql/manager/ops/delete.ts +96 -0
  233. package/src/mysql/manager/ops/exist.ts +41 -0
  234. package/src/mysql/manager/ops/find.ts +226 -0
  235. package/src/mysql/manager/ops/index.ts +11 -0
  236. package/src/mysql/manager/ops/insert.ts +120 -0
  237. package/src/mysql/manager/ops/modify.ts +14 -0
  238. package/src/mysql/manager/ops/paginate.ts +60 -0
  239. package/src/mysql/manager/ops/query.ts +13 -0
  240. package/src/mysql/manager/ops/update.ts +294 -0
  241. package/src/mysql/manager/ops/utils.ts +20 -0
  242. package/src/mysql/manager/tx-strict.ts +138 -0
  243. package/src/mysql/manager/tx.ts +31 -0
  244. package/src/mysql/manager/utils.ts +75 -0
  245. package/src/mysql/migration.ts +149 -0
  246. package/src/mysql/table-info.ts +41 -0
  247. package/src/task/daily.ts +70 -0
  248. package/src/task/fixed-delay.ts +45 -0
  249. package/src/task/fixed-rate.ts +49 -0
  250. package/src/task/index.ts +4 -0
  251. package/src/task/task.ts +70 -0
  252. package/src/validation/exception.ts +27 -0
  253. package/src/validation/index.ts +61 -0
  254. package/src/validation/validator/array.ts +32 -0
  255. package/src/validation/validator/enum.ts +25 -0
  256. package/src/validation/validator/index.ts +11 -0
  257. package/src/validation/validator/length.ts +42 -0
  258. package/src/validation/validator/max-length.ts +33 -0
  259. package/src/validation/validator/max.ts +26 -0
  260. package/src/validation/validator/min-length.ts +31 -0
  261. package/src/validation/validator/min.ts +26 -0
  262. package/src/validation/validator/not-blank.ts +31 -0
  263. package/src/validation/validator/not-null.ts +19 -0
  264. package/src/validation/validator/plain-obj.ts +30 -0
  265. package/src/validation/validator/regexp.ts +32 -0
  266. package/types/cache/cache.d.ts +52 -52
  267. package/types/cache/config.d.ts +32 -32
  268. package/types/cache/index.d.ts +2 -2
  269. package/types/cache/purge-task.d.ts +11 -11
  270. package/types/cache/stat.d.ts +26 -26
  271. package/types/config/convert.d.ts +6 -6
  272. package/types/config/exception.d.ts +7 -7
  273. package/types/config/index.d.ts +25 -25
  274. package/types/http-client/index.d.ts +71 -71
  275. package/types/i18n/ar.d.ts +2 -2
  276. package/types/i18n/de.d.ts +2 -2
  277. package/types/i18n/en-us.d.ts +2 -2
  278. package/types/i18n/es.d.ts +2 -2
  279. package/types/i18n/fr.d.ts +2 -2
  280. package/types/i18n/i18n.d.ts +102 -102
  281. package/types/i18n/index.d.ts +9 -9
  282. package/types/i18n/ja.d.ts +2 -2
  283. package/types/i18n/ko.d.ts +2 -2
  284. package/types/i18n/msg.d.ts +50 -50
  285. package/types/i18n/pt.d.ts +2 -2
  286. package/types/i18n/ru.d.ts +2 -2
  287. package/types/i18n/tag.d.ts +11 -11
  288. package/types/i18n/zh-HK.d.ts +2 -2
  289. package/types/i18n/zh-TW.d.ts +2 -2
  290. package/types/i18n/zh-cn.d.ts +2 -2
  291. package/types/index.d.ts +11 -11
  292. package/types/lock/index.d.ts +64 -64
  293. package/types/log/config.d.ts +35 -27
  294. package/types/log/date.d.ts +2 -2
  295. package/types/log/file.d.ts +13 -5
  296. package/types/log/index.d.ts +53 -34
  297. package/types/log/level.d.ts +14 -14
  298. package/types/log/log.d.ts +40 -0
  299. package/types/log/store.d.ts +19 -12
  300. package/types/mongodb/collection.d.ts +25 -25
  301. package/types/mongodb/config.d.ts +45 -45
  302. package/types/mongodb/doc.d.ts +11 -11
  303. package/types/mongodb/exception.d.ts +7 -7
  304. package/types/mongodb/index.d.ts +29 -29
  305. package/types/mongodb/manager/base.d.ts +188 -188
  306. package/types/mongodb/manager/index.d.ts +38 -38
  307. package/types/mongodb/manager/tx-strict.d.ts +41 -41
  308. package/types/mongodb/manager/tx.d.ts +21 -21
  309. package/types/mongodb/migration.d.ts +12 -12
  310. package/types/mvc/access-log.d.ts +7 -7
  311. package/types/mvc/config.d.ts +42 -42
  312. package/types/mvc/exchange.d.ts +72 -72
  313. package/types/mvc/handler/index.d.ts +4 -3
  314. package/types/mvc/handler/json.d.ts +44 -44
  315. package/types/mvc/handler/restful.d.ts +11 -11
  316. package/types/mvc/handler/sse.d.ts +34 -0
  317. package/types/mvc/handler/upload.d.ts +36 -36
  318. package/types/mvc/index.d.ts +22 -22
  319. package/types/mvc/interceptor.d.ts +11 -11
  320. package/types/mvc/query.d.ts +13 -13
  321. package/types/mvc/render/file.d.ts +10 -10
  322. package/types/mvc/render/html/html.d.ts +98 -98
  323. package/types/mvc/render/html/index.d.ts +11 -11
  324. package/types/mvc/render/html/style.d.ts +1201 -1201
  325. package/types/mvc/render/index.d.ts +4 -4
  326. package/types/mvc/render/json.d.ts +17 -17
  327. package/types/mvc/render/text.d.ts +10 -10
  328. package/types/mvc/router.d.ts +11 -11
  329. package/types/mvc/server.d.ts +90 -90
  330. package/types/mvc/static/header.d.ts +27 -27
  331. package/types/mvc/static/index.d.ts +3 -3
  332. package/types/mvc/static/mime-type.d.ts +2 -2
  333. package/types/mvc/static/server-cache-config.d.ts +30 -30
  334. package/types/mvc/static/server-cache.d.ts +76 -76
  335. package/types/mvc/static/static-handler.d.ts +77 -77
  336. package/types/mysql/config.d.ts +90 -90
  337. package/types/mysql/exception.d.ts +7 -7
  338. package/types/mysql/index.d.ts +16 -16
  339. package/types/mysql/manager/base.d.ts +165 -159
  340. package/types/mysql/manager/index.d.ts +36 -36
  341. package/types/mysql/manager/ops/count.d.ts +13 -13
  342. package/types/mysql/manager/ops/criteria.d.ts +134 -134
  343. package/types/mysql/manager/ops/delete.d.ts +46 -46
  344. package/types/mysql/manager/ops/exist.d.ts +6 -6
  345. package/types/mysql/manager/ops/find.d.ts +86 -70
  346. package/types/mysql/manager/ops/index.d.ts +10 -10
  347. package/types/mysql/manager/ops/insert.d.ts +18 -18
  348. package/types/mysql/manager/ops/modify.d.ts +3 -3
  349. package/types/mysql/manager/ops/paginate.d.ts +36 -36
  350. package/types/mysql/manager/ops/query.d.ts +3 -3
  351. package/types/mysql/manager/ops/update.d.ts +76 -76
  352. package/types/mysql/manager/ops/utils.d.ts +5 -5
  353. package/types/mysql/manager/tx-strict.d.ts +36 -35
  354. package/types/mysql/manager/tx.d.ts +15 -15
  355. package/types/mysql/manager/utils.d.ts +17 -17
  356. package/types/mysql/migration.d.ts +8 -8
  357. package/types/mysql/table-info.d.ts +36 -36
  358. package/types/task/daily.d.ts +16 -16
  359. package/types/task/fixed-delay.d.ts +9 -9
  360. package/types/task/fixed-rate.d.ts +9 -9
  361. package/types/task/index.d.ts +4 -4
  362. package/types/task/task.d.ts +34 -34
  363. package/types/validation/exception.d.ts +38 -38
  364. package/types/validation/index.d.ts +32 -32
  365. package/types/validation/validator/array.d.ts +5 -5
  366. package/types/validation/validator/enum.d.ts +8 -8
  367. package/types/validation/validator/index.d.ts +11 -11
  368. package/types/validation/validator/length.d.ts +10 -10
  369. package/types/validation/validator/max-length.d.ts +8 -8
  370. package/types/validation/validator/max.d.ts +7 -7
  371. package/types/validation/validator/min-length.d.ts +6 -6
  372. package/types/validation/validator/min.d.ts +7 -7
  373. package/types/validation/validator/not-blank.d.ts +7 -7
  374. package/types/validation/validator/not-null.d.ts +6 -6
  375. package/types/validation/validator/plain-obj.d.ts +7 -7
  376. 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
+ }