wok-server 0.5.0 → 0.7.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 (380) 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 -35
  31. package/dist/log/date.js +21 -21
  32. package/dist/log/file.js +198 -198
  33. package/dist/log/index.js +135 -135
  34. package/dist/log/level.js +33 -33
  35. package/dist/log/log.js +56 -56
  36. package/dist/log/store.js +19 -19
  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 +278 -239
  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 +381 -356
  80. package/dist/mysql/manager/ops/delete.js +59 -65
  81. package/dist/mysql/manager/ops/exist.js +26 -26
  82. package/dist/mysql/manager/ops/find.js +149 -169
  83. package/dist/mysql/manager/ops/index.js +16 -14
  84. package/dist/mysql/manager/ops/insert.js +132 -106
  85. package/dist/mysql/manager/ops/modify.js +10 -10
  86. package/dist/mysql/manager/ops/order-by.js +28 -0
  87. package/dist/mysql/manager/ops/paginate.js +48 -23
  88. package/dist/mysql/manager/ops/query.js +9 -9
  89. package/dist/mysql/manager/ops/update.js +222 -216
  90. package/dist/mysql/manager/ops/upsert.js +178 -0
  91. package/dist/mysql/manager/ops/utils.js +28 -24
  92. package/dist/mysql/manager/tx-strict.js +103 -103
  93. package/dist/mysql/manager/tx.js +30 -30
  94. package/dist/mysql/manager/utils.js +56 -56
  95. package/dist/mysql/migration.js +136 -136
  96. package/dist/mysql/table-info.js +8 -8
  97. package/dist/task/daily.js +59 -59
  98. package/dist/task/fixed-delay.js +38 -38
  99. package/dist/task/fixed-rate.js +42 -42
  100. package/dist/task/index.js +9 -9
  101. package/dist/task/task.js +56 -56
  102. package/dist/validation/exception.js +36 -36
  103. package/dist/validation/index.js +40 -40
  104. package/dist/validation/validator/array.js +34 -34
  105. package/dist/validation/validator/enum.js +28 -28
  106. package/dist/validation/validator/index.js +14 -14
  107. package/dist/validation/validator/length.js +40 -40
  108. package/dist/validation/validator/max-length.js +35 -35
  109. package/dist/validation/validator/max.js +29 -29
  110. package/dist/validation/validator/min-length.js +33 -33
  111. package/dist/validation/validator/min.js +29 -29
  112. package/dist/validation/validator/not-blank.js +33 -33
  113. package/dist/validation/validator/not-null.js +21 -21
  114. package/dist/validation/validator/plain-obj.js +32 -32
  115. package/dist/validation/validator/regexp.js +34 -34
  116. package/documentation/en/cache.md +56 -0
  117. package/documentation/en/config.md +96 -0
  118. package/documentation/en/engineering.md +256 -0
  119. package/documentation/en/http-client.md +32 -0
  120. package/documentation/en/i18n.md +143 -0
  121. package/documentation/en/index.md +24 -0
  122. package/documentation/en/lock.md +51 -0
  123. package/documentation/en/log.md +109 -0
  124. package/documentation/en/mongodb.md +256 -0
  125. package/documentation/en/mvc.md +688 -0
  126. package/documentation/en/mysql.md +682 -0
  127. package/documentation/en/task.md +45 -0
  128. package/documentation/en/test.md +56 -0
  129. package/documentation/en/validate.md +130 -0
  130. package/documentation/zh-cn/mvc.md +66 -24
  131. package/documentation/zh-cn/mysql.md +146 -17
  132. package/package.json +4 -1
  133. package/skills/wok-server-api-rules/SKILL.md +350 -0
  134. package/skills/wok-server-cache/SKILL.md +216 -0
  135. package/skills/wok-server-code-navigation/SKILL.md +153 -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 +388 -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 +332 -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 +446 -0
  232. package/src/mysql/manager/ops/delete.ts +91 -0
  233. package/src/mysql/manager/ops/exist.ts +41 -0
  234. package/src/mysql/manager/ops/find.ts +209 -0
  235. package/src/mysql/manager/ops/index.ts +13 -0
  236. package/src/mysql/manager/ops/insert.ts +158 -0
  237. package/src/mysql/manager/ops/modify.ts +14 -0
  238. package/src/mysql/manager/ops/order-by.ts +58 -0
  239. package/src/mysql/manager/ops/paginate.ts +100 -0
  240. package/src/mysql/manager/ops/query.ts +13 -0
  241. package/src/mysql/manager/ops/update.ts +318 -0
  242. package/src/mysql/manager/ops/upsert.ts +224 -0
  243. package/src/mysql/manager/ops/utils.ts +24 -0
  244. package/src/mysql/manager/tx-strict.ts +138 -0
  245. package/src/mysql/manager/tx.ts +31 -0
  246. package/src/mysql/manager/utils.ts +75 -0
  247. package/src/mysql/migration.ts +149 -0
  248. package/src/mysql/table-info.ts +41 -0
  249. package/src/task/daily.ts +70 -0
  250. package/src/task/fixed-delay.ts +45 -0
  251. package/src/task/fixed-rate.ts +49 -0
  252. package/src/task/index.ts +4 -0
  253. package/src/task/task.ts +70 -0
  254. package/src/validation/exception.ts +27 -0
  255. package/src/validation/index.ts +61 -0
  256. package/src/validation/validator/array.ts +32 -0
  257. package/src/validation/validator/enum.ts +25 -0
  258. package/src/validation/validator/index.ts +11 -0
  259. package/src/validation/validator/length.ts +42 -0
  260. package/src/validation/validator/max-length.ts +33 -0
  261. package/src/validation/validator/max.ts +26 -0
  262. package/src/validation/validator/min-length.ts +31 -0
  263. package/src/validation/validator/min.ts +26 -0
  264. package/src/validation/validator/not-blank.ts +31 -0
  265. package/src/validation/validator/not-null.ts +19 -0
  266. package/src/validation/validator/plain-obj.ts +30 -0
  267. package/src/validation/validator/regexp.ts +32 -0
  268. package/types/cache/cache.d.ts +52 -52
  269. package/types/cache/config.d.ts +32 -32
  270. package/types/cache/index.d.ts +2 -2
  271. package/types/cache/purge-task.d.ts +11 -11
  272. package/types/cache/stat.d.ts +26 -26
  273. package/types/config/convert.d.ts +6 -6
  274. package/types/config/exception.d.ts +7 -7
  275. package/types/config/index.d.ts +25 -25
  276. package/types/http-client/index.d.ts +71 -71
  277. package/types/i18n/ar.d.ts +2 -2
  278. package/types/i18n/de.d.ts +2 -2
  279. package/types/i18n/en-us.d.ts +2 -2
  280. package/types/i18n/es.d.ts +2 -2
  281. package/types/i18n/fr.d.ts +2 -2
  282. package/types/i18n/i18n.d.ts +102 -102
  283. package/types/i18n/index.d.ts +9 -9
  284. package/types/i18n/ja.d.ts +2 -2
  285. package/types/i18n/ko.d.ts +2 -2
  286. package/types/i18n/msg.d.ts +50 -50
  287. package/types/i18n/pt.d.ts +2 -2
  288. package/types/i18n/ru.d.ts +2 -2
  289. package/types/i18n/tag.d.ts +11 -11
  290. package/types/i18n/zh-HK.d.ts +2 -2
  291. package/types/i18n/zh-TW.d.ts +2 -2
  292. package/types/i18n/zh-cn.d.ts +2 -2
  293. package/types/index.d.ts +11 -11
  294. package/types/lock/index.d.ts +64 -64
  295. package/types/log/config.d.ts +35 -35
  296. package/types/log/date.d.ts +2 -2
  297. package/types/log/file.d.ts +13 -13
  298. package/types/log/index.d.ts +53 -53
  299. package/types/log/level.d.ts +14 -14
  300. package/types/log/log.d.ts +40 -40
  301. package/types/log/store.d.ts +19 -19
  302. package/types/mongodb/collection.d.ts +25 -25
  303. package/types/mongodb/config.d.ts +45 -45
  304. package/types/mongodb/doc.d.ts +11 -11
  305. package/types/mongodb/exception.d.ts +7 -7
  306. package/types/mongodb/index.d.ts +29 -29
  307. package/types/mongodb/manager/base.d.ts +188 -188
  308. package/types/mongodb/manager/index.d.ts +38 -38
  309. package/types/mongodb/manager/tx-strict.d.ts +41 -41
  310. package/types/mongodb/manager/tx.d.ts +21 -21
  311. package/types/mongodb/migration.d.ts +12 -12
  312. package/types/mvc/access-log.d.ts +7 -7
  313. package/types/mvc/config.d.ts +42 -42
  314. package/types/mvc/exchange.d.ts +72 -72
  315. package/types/mvc/handler/index.d.ts +4 -3
  316. package/types/mvc/handler/json.d.ts +44 -44
  317. package/types/mvc/handler/restful.d.ts +11 -11
  318. package/types/mvc/handler/sse.d.ts +34 -0
  319. package/types/mvc/handler/upload.d.ts +36 -36
  320. package/types/mvc/index.d.ts +22 -22
  321. package/types/mvc/interceptor.d.ts +11 -11
  322. package/types/mvc/query.d.ts +13 -13
  323. package/types/mvc/render/file.d.ts +10 -10
  324. package/types/mvc/render/html/html.d.ts +98 -98
  325. package/types/mvc/render/html/index.d.ts +11 -11
  326. package/types/mvc/render/html/style.d.ts +1201 -1201
  327. package/types/mvc/render/index.d.ts +4 -4
  328. package/types/mvc/render/json.d.ts +17 -17
  329. package/types/mvc/render/text.d.ts +10 -10
  330. package/types/mvc/router.d.ts +11 -11
  331. package/types/mvc/server.d.ts +90 -90
  332. package/types/mvc/static/header.d.ts +27 -27
  333. package/types/mvc/static/index.d.ts +3 -3
  334. package/types/mvc/static/mime-type.d.ts +2 -2
  335. package/types/mvc/static/server-cache-config.d.ts +30 -30
  336. package/types/mvc/static/server-cache.d.ts +76 -76
  337. package/types/mvc/static/static-handler.d.ts +77 -77
  338. package/types/mysql/config.d.ts +90 -90
  339. package/types/mysql/exception.d.ts +7 -7
  340. package/types/mysql/index.d.ts +16 -16
  341. package/types/mysql/manager/base.d.ts +196 -165
  342. package/types/mysql/manager/index.d.ts +36 -36
  343. package/types/mysql/manager/ops/count.d.ts +13 -13
  344. package/types/mysql/manager/ops/criteria.d.ts +144 -134
  345. package/types/mysql/manager/ops/delete.d.ts +47 -46
  346. package/types/mysql/manager/ops/exist.d.ts +6 -6
  347. package/types/mysql/manager/ops/find.d.ts +87 -86
  348. package/types/mysql/manager/ops/index.d.ts +12 -10
  349. package/types/mysql/manager/ops/insert.d.ts +32 -18
  350. package/types/mysql/manager/ops/modify.d.ts +3 -3
  351. package/types/mysql/manager/ops/order-by.d.ts +38 -0
  352. package/types/mysql/manager/ops/paginate.d.ts +53 -36
  353. package/types/mysql/manager/ops/query.d.ts +3 -3
  354. package/types/mysql/manager/ops/update.d.ts +99 -76
  355. package/types/mysql/manager/ops/upsert.d.ts +36 -0
  356. package/types/mysql/manager/ops/utils.d.ts +5 -5
  357. package/types/mysql/manager/tx-strict.d.ts +36 -36
  358. package/types/mysql/manager/tx.d.ts +15 -15
  359. package/types/mysql/manager/utils.d.ts +17 -17
  360. package/types/mysql/migration.d.ts +8 -8
  361. package/types/mysql/table-info.d.ts +36 -36
  362. package/types/task/daily.d.ts +16 -16
  363. package/types/task/fixed-delay.d.ts +9 -9
  364. package/types/task/fixed-rate.d.ts +9 -9
  365. package/types/task/index.d.ts +4 -4
  366. package/types/task/task.d.ts +34 -34
  367. package/types/validation/exception.d.ts +38 -38
  368. package/types/validation/index.d.ts +32 -32
  369. package/types/validation/validator/array.d.ts +5 -5
  370. package/types/validation/validator/enum.d.ts +8 -8
  371. package/types/validation/validator/index.d.ts +11 -11
  372. package/types/validation/validator/length.d.ts +10 -10
  373. package/types/validation/validator/max-length.d.ts +8 -8
  374. package/types/validation/validator/max.d.ts +7 -7
  375. package/types/validation/validator/min-length.d.ts +6 -6
  376. package/types/validation/validator/min.d.ts +7 -7
  377. package/types/validation/validator/not-blank.d.ts +7 -7
  378. package/types/validation/validator/not-null.d.ts +6 -6
  379. package/types/validation/validator/plain-obj.d.ts +7 -7
  380. package/types/validation/validator/regexp.d.ts +8 -8
@@ -0,0 +1,209 @@
1
+ import { PoolConnection, 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
+ import { OrderBy, buildOrderBy } from './order-by'
7
+
8
+ /**
9
+ * 按 id 查询
10
+ * @param connection
11
+ * @param mapping
12
+ * @param type
13
+ * @param id
14
+ */
15
+ export async function findById<T>(
16
+ config: MysqlConfig,
17
+ connection: PoolConnection,
18
+ table: Table<T>,
19
+ id: string | number
20
+ ): Promise<T | null> {
21
+ const res = await promiseQuery(config, connection, `select * from ?? where ?? = ?`, [
22
+ table.tableName,
23
+ table.id,
24
+ id
25
+ ])
26
+ const rows = res as RowDataPacket[]
27
+ if (!rows.length) {
28
+ return null
29
+ }
30
+ return rows[0] as T
31
+ }
32
+
33
+ /**
34
+ * 查询表中所有数据。需谨慎操作,全表查询有可能会产生大列表问题。
35
+ * @param connection
36
+ * @param mapping
37
+ * @param type
38
+ * @returns
39
+ */
40
+ export async function findAll<T>(
41
+ config: MysqlConfig,
42
+ connection: PoolConnection,
43
+ table: Table<T>
44
+ ): Promise<T[]> {
45
+ const res = await promiseQuery(config, connection, `select * from ??`, [table.tableName])
46
+ return res as RowDataPacket[] as T[]
47
+ }
48
+
49
+ export interface FindOpts<T> {
50
+ /**
51
+ * 表
52
+ */
53
+ table: Table<T>
54
+ /**
55
+ * 查询条件
56
+ * @param criteria
57
+ * @returns
58
+ */
59
+ criteria?: MixCriteria<T>
60
+ /**
61
+ * 偏移,需要 limit 有值才可以
62
+ */
63
+ offset?: number
64
+ /**
65
+ * 限制返回的数量
66
+ */
67
+ limit?: number
68
+ /**
69
+ * 排序规则,按先后顺序放入,每个规则是一个元组,第一个元素是字段名称,第二个元素是顺序
70
+ */
71
+ orderBy?: OrderBy<T>
72
+ }
73
+ /**
74
+ * 条件查询
75
+ * @param opts
76
+ * @returns
77
+ */
78
+ export async function find<T>(
79
+ config: MysqlConfig,
80
+ conn: PoolConnection,
81
+ opts: FindOpts<T>
82
+ ): Promise<T[]> {
83
+ let query = opts.criteria ? buildQuery(opts.criteria) : undefined
84
+ const values: any[] = []
85
+ let sql = `select * from ?? `
86
+ values.push(opts.table.tableName)
87
+ if (query) {
88
+ sql += ` where ${query.sql} `
89
+ values.push(...query.values)
90
+ }
91
+ // 排序
92
+ if (opts.orderBy && opts.orderBy.length) {
93
+ const ob = buildOrderBy(opts.orderBy)
94
+ sql += ob.sql
95
+ values.push(...ob.values)
96
+ }
97
+ // 数量限制
98
+ if (opts.limit) {
99
+ sql += ` limit ${opts.limit} `
100
+ if (opts.offset) {
101
+ sql += ` offset ${opts.offset}`
102
+ }
103
+ }
104
+ const res = await promiseQuery(config, conn, sql, values)
105
+ return res as RowDataPacket[] as T[]
106
+ }
107
+
108
+ /**
109
+ * 指定字段条件查询选项
110
+ */
111
+ export interface FindSelectOpts<T, K extends keyof T> extends FindOpts<T> {
112
+ /**
113
+ * 要查询的字段
114
+ */
115
+ select: K[]
116
+ }
117
+
118
+ /**
119
+ * 查询指定的字段,返回值类型与选择的字段有关
120
+ * @param onfig
121
+ * @param conn
122
+ * @param opts
123
+ */
124
+ export async function findSelect<T, K extends keyof T>(
125
+ config: MysqlConfig,
126
+ conn: PoolConnection,
127
+ opts: FindSelectOpts<T, K>
128
+ ): Promise<Array<Pick<T, K>>> {
129
+ let query = opts.criteria ? buildQuery(opts.criteria) : undefined
130
+ const values: any[] = []
131
+ let sql = `select ${opts.select.map(() => '??').join(',')} from ?? `
132
+ values.push(...opts.select, opts.table.tableName)
133
+ if (query) {
134
+ sql += ` where ${query.sql} `
135
+ values.push(...query.values)
136
+ }
137
+ // 排序
138
+ if (opts.orderBy && opts.orderBy.length) {
139
+ const ob = buildOrderBy(opts.orderBy)
140
+ sql += ob.sql
141
+ values.push(...ob.values)
142
+ }
143
+ // 数量限制
144
+ if (opts.limit) {
145
+ sql += ` limit ${opts.limit} `
146
+ if (opts.offset) {
147
+ sql += ` offset ${opts.offset}`
148
+ }
149
+ }
150
+ const res = await promiseQuery(config, conn, sql, values)
151
+ return res as RowDataPacket[] as Pick<T, K>[]
152
+ }
153
+ /**
154
+ * 根据 id 列表查询记录
155
+ * @param connection
156
+ * @param table
157
+ * @param ids
158
+ * @returns
159
+ */
160
+ export async function findByIdIn<T>(
161
+ config: MysqlConfig,
162
+ connection: PoolConnection,
163
+ table: Table<T>,
164
+ ids: Array<string | number>
165
+ ): Promise<T[]> {
166
+ if (!ids.length) {
167
+ return []
168
+ }
169
+ return find(config, connection, {
170
+ table,
171
+ criteria: c => c.in(table.id, ids)
172
+ })
173
+ }
174
+
175
+ /**
176
+ * 查找符合条件的第一条记录
177
+ * @param conn
178
+ * @param table
179
+ * @param criteria
180
+ * @returns
181
+ */
182
+ export async function findFirst<T>(
183
+ config: MysqlConfig,
184
+ conn: PoolConnection,
185
+ table: Table<T>,
186
+ criteria?: MixCriteria<T>,
187
+ /**
188
+ * 排序规则,按先后顺序放入,每个规则是一个元组,第一个元素是字段名称,第二个元素是顺序
189
+ */
190
+ orderBy?: OrderBy<T>
191
+ ): Promise<T | null> {
192
+ let query = criteria ? buildQuery(criteria) : undefined
193
+ let sql = `select * from ?? `
194
+ const values: any[] = [table.tableName]
195
+ if (query) {
196
+ sql += ` where ${query.sql} `
197
+ values.push(...query.values)
198
+ }
199
+ // 排序
200
+ if (orderBy && orderBy.length) {
201
+ const ob = buildOrderBy(orderBy)
202
+ sql += ob.sql
203
+ values.push(...ob.values)
204
+ }
205
+ sql += ' limit 1'
206
+ const res = await promiseQuery(config, conn, sql, values)
207
+ const list = res as RowDataPacket[] as T[]
208
+ return list.length ? list[0] : null
209
+ }
@@ -0,0 +1,13 @@
1
+ // 各类操作封装
2
+ export * from './count'
3
+ export * from './criteria'
4
+ export * from './delete'
5
+ export * from './exist'
6
+ export * from './find'
7
+ export * from './insert'
8
+ export * from './modify'
9
+ export * from './order-by'
10
+ export * from './upsert'
11
+ export * from './paginate'
12
+ export * from './query'
13
+ export * from './update'
@@ -0,0 +1,158 @@
1
+ import { PoolConnection, ResultSetHeader } from 'mysql2'
2
+ import { MysqlException } from '../../exception'
3
+ import { Table } from '../../table-info'
4
+ import { promiseQuery } from '../utils'
5
+ import { MysqlConfig } from '../../config'
6
+ import { processColumnValue } from './utils'
7
+
8
+ /**
9
+ * 插入值类型,支持在 INSERT VALUES 中使用表达式
10
+ */
11
+ export type InsertValue<T> = {
12
+ [K in keyof T]?:
13
+ | T[K]
14
+ | ['now']
15
+ | ['set', T[K]]
16
+ | ['expr', string]
17
+ | ['expr', string, any[]]
18
+ }
19
+
20
+ /**
21
+ * 处理 insert value,支持表达式
22
+ * @returns { frag: SQL 片段, values: 参数值数组 }
23
+ */
24
+ export function processInsertValue(value: any): { frag: string; values: any[] } {
25
+ if (Array.isArray(value)) {
26
+ if (value[0] === 'now') {
27
+ return { frag: 'NOW()', values: [] }
28
+ }
29
+ if (value[0] === 'set') {
30
+ return { frag: '?', values: [processColumnValue(value[1])] }
31
+ }
32
+ if (value[0] === 'expr') {
33
+ return { frag: value[1], values: value[2] || [] }
34
+ }
35
+ }
36
+ return { frag: '?', values: [processColumnValue(value)] }
37
+ }
38
+
39
+ /**
40
+ * 为表插入数据
41
+ * @param connection
42
+ * @param table
43
+ * @param data
44
+ * @returns
45
+ */
46
+ export async function insert<T>(
47
+ config: MysqlConfig,
48
+ connection: PoolConnection,
49
+ table: Table<T>,
50
+ data: InsertValue<T>
51
+ ): Promise<T> {
52
+ // 列信息,使用 set 防止 columns 中重复配置 id 和更新创建时间列
53
+ let columnsSet: Set<keyof T> = new Set()
54
+ // 判定下 id ,如果有值,才在 insert 语句中出现 id 列,否则不出现
55
+ if (data[table.id]) {
56
+ columnsSet.add(table.id)
57
+ }
58
+ table.columns.forEach(col => columnsSet.add(col))
59
+ if (table.createdDate) {
60
+ const createdData = table.createdDate.type === 'date' ? new Date() : new Date().getTime()
61
+ data[table.createdDate.column] = createdData as any
62
+ columnsSet.add(table.createdDate.column)
63
+ }
64
+ if (table.updatedDate) {
65
+ const updatedDate = table.updatedDate.type === 'date' ? new Date() : new Date().getTime()
66
+ data[table.updatedDate.column] = updatedDate as any
67
+ columnsSet.add(table.updatedDate.column)
68
+ }
69
+ const columns = Array.from(columnsSet)
70
+ // 构建 sql,逐列处理以支持表达式
71
+ const fragList: string[] = []
72
+ const insertValues: any[] = []
73
+ for (const col of columns) {
74
+ const { frag, values: vs } = processInsertValue(data[col])
75
+ fragList.push(frag)
76
+ insertValues.push(...vs)
77
+ }
78
+ const sql = `insert into ??(${columns.map(() => '??').join(',')}) values(${fragList.join(',')})`
79
+ const values: any[] = [table.tableName, ...columns, ...insertValues]
80
+ const res = await promiseQuery(config, connection, sql, values)
81
+ const packet = res as ResultSetHeader
82
+ if (packet.affectedRows !== 1) {
83
+ throw new MysqlException(
84
+ `Insert failed,table:${table.tableName},primary key: ${data[table.id]}`
85
+ )
86
+ }
87
+ // 自动生成的id处理
88
+ if (packet.insertId && (data[table.id] === undefined || data[table.id] === null)) {
89
+ data[table.id] = packet.insertId as any
90
+ }
91
+ return data as unknown as T
92
+ }
93
+ /**
94
+ * 一次插入多条记录
95
+ * @param connection 连接
96
+ * @param table 表
97
+ * @param list 要插入的记录列表
98
+ */
99
+ export async function insertMany<T>(
100
+ config: MysqlConfig,
101
+ connection: PoolConnection,
102
+ table: Table<T>,
103
+ list: InsertValue<T>[]
104
+ ): Promise<void> {
105
+ if (!list.length) {
106
+ return
107
+ }
108
+ // 列信息,使用 set 防止 columns 中重复配置 id 和更新创建时间列
109
+ let columnsSet: Set<keyof T> = new Set()
110
+ // 批量插入必须统一使用 id 或不使用 id,以第一条记录为准
111
+ if (list[0][table.id]) {
112
+ columnsSet.add(table.id)
113
+ }
114
+ table.columns.forEach(col => columnsSet.add(col))
115
+ let createdData: Date | number | undefined = undefined
116
+ if (table.createdDate) {
117
+ createdData = table.createdDate.type === 'date' ? new Date() : new Date().getTime()
118
+ columnsSet.add(table.createdDate.column)
119
+ }
120
+ let updatedDate: Date | number | undefined = undefined
121
+ if (table.updatedDate) {
122
+ updatedDate = table.updatedDate.type === 'date' ? new Date() : new Date().getTime()
123
+ columnsSet.add(table.updatedDate.column)
124
+ }
125
+ const columns = Array.from(columnsSet)
126
+ // 构建 sql
127
+ let sql = `insert into ??(${columns.map(() => '??').join(',')}) values`
128
+ const values: any[] = [table.tableName, ...columns]
129
+ list.forEach((data, idx) => {
130
+ if (idx > 0) {
131
+ sql += ','
132
+ }
133
+ const fragList: string[] = []
134
+ const rowValues: any[] = []
135
+ if (table.createdDate) {
136
+ data[table.createdDate.column] = createdData as any
137
+ }
138
+ if (table.updatedDate) {
139
+ data[table.updatedDate.column] = updatedDate as any
140
+ }
141
+ for (const col of columns) {
142
+ const { frag, values: vs } = processInsertValue(data[col])
143
+ fragList.push(frag)
144
+ rowValues.push(...vs)
145
+ }
146
+ sql += `(${fragList.join(',')})`
147
+ values.push(...rowValues)
148
+ })
149
+
150
+ const res = await promiseQuery(config, connection, sql, values)
151
+ const rsh = res as ResultSetHeader
152
+ if (rsh.affectedRows !== list.length) {
153
+ throw new MysqlException(
154
+ `Insert many for table ${table.tableName} failed,expected to insert ${list.length} records, actually ${rsh.affectedRows}.`
155
+ )
156
+ }
157
+ // insert 插入多条记录是不会返回生成的 id 的,所以就没有办法自动处理
158
+ }
@@ -0,0 +1,14 @@
1
+ import { PoolConnection, ResultSetHeader } from 'mysql2'
2
+ import { promiseQuery } from '../utils'
3
+ import { MysqlConfig } from '../../config'
4
+
5
+ export async function modify(
6
+ config: MysqlConfig,
7
+ connection: PoolConnection,
8
+ sql: string,
9
+ values?: any[]
10
+ ): Promise<number> {
11
+ const res = await promiseQuery(config, connection, sql, values || [])
12
+ const pck = res as ResultSetHeader
13
+ return pck.affectedRows
14
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * 排序规则类型.
3
+ *
4
+ * T 为表类型.
5
+ *
6
+ * 普通列排序:
7
+ * [keyof T, 'asc' | 'desc']
8
+ * 例: ['balance', 'asc'] → ORDER BY `balance` asc
9
+ *
10
+ * 自定义表达式排序:
11
+ * ['expr', SQL片段, 参数值数组, 'asc' | 'desc']
12
+ * 例: ['expr', '?? * ?', ['balance', 2], 'desc']
13
+ * → ORDER BY `balance` * 2 desc
14
+ *
15
+ * 例: ['expr', 'CHAR_LENGTH(??)', ['name'], 'desc']
16
+ * → ORDER BY CHAR_LENGTH(`name`) desc
17
+ *
18
+ * 例: ['expr', 'VECTOR_DISTANCE(??, STRING_TO_VECTOR(?))', ['content_vec', embedding], 'asc']
19
+ * → ORDER BY VECTOR_DISTANCE(`content_vec`, STRING_TO_VECTOR(?)) asc
20
+ *
21
+ * 混合使用:
22
+ * [
23
+ * ['active', 'asc'],
24
+ * ['expr', '?? * ?', ['balance', 2], 'desc']
25
+ * ]
26
+ * → ORDER BY `active` asc , `balance` * 2 desc
27
+ */
28
+ export type OrderBy<T> = Array<
29
+ | [keyof T, 'asc' | 'desc']
30
+ | ['expr', string, any[], 'asc' | 'desc']
31
+ >
32
+
33
+ /**
34
+ * 构建 ORDER BY 子句.
35
+ *
36
+ * @param orderBy 排序规则
37
+ * @returns { sql: SQL 片段, values: 参数值数组 }
38
+ */
39
+ export function buildOrderBy<T>(orderBy: OrderBy<T>): { sql: string; values: any[] } {
40
+ const fragments: string[] = []
41
+ const values: any[] = []
42
+
43
+ orderBy.forEach((item, idx) => {
44
+ const prefix = idx === 0 ? ' order by ' : ' , '
45
+
46
+ if (item.length === 4 && item[0] === 'expr') {
47
+ const [, exprSql, exprValues, sort] = item as ['expr', string, any[], 'asc' | 'desc']
48
+ fragments.push(`${prefix}${exprSql} ${sort}`)
49
+ values.push(...exprValues)
50
+ } else {
51
+ const [field, sort] = item as [keyof T, 'asc' | 'desc']
52
+ fragments.push(`${prefix}?? ${sort}`)
53
+ values.push(field)
54
+ }
55
+ })
56
+
57
+ return { sql: fragments.join(''), values }
58
+ }
@@ -0,0 +1,100 @@
1
+ import { PoolConnection } from 'mysql2'
2
+ import { Table } from '../../table-info'
3
+ import { count } from './count'
4
+ import { MixCriteria } from './criteria'
5
+ import { find, findSelect } from './find'
6
+ import { MysqlConfig } from '../../config'
7
+ import { OrderBy } from './order-by'
8
+
9
+ export interface MysqlPaginateOpts<T> {
10
+ /**
11
+ * 表
12
+ */
13
+ table: Table<T>
14
+ /**
15
+ * 查询条件
16
+ * @param criteria
17
+ * @returns
18
+ */
19
+ criteria?: MixCriteria<T>
20
+ /**
21
+ * 而码,默认1
22
+ */
23
+ pn?: number
24
+ /**
25
+ * 每页的数据量大小,默认 20, 必须在 1-1000 之间
26
+ */
27
+ pz?: number
28
+ /**
29
+ * 排序规则,按先后顺序放入,每个规则是一个元组,第一个元素是字段名称,第二个元素是顺序
30
+ */
31
+ orderBy?: OrderBy<T>
32
+ }
33
+ /**
34
+ * mysql 分页查询结果
35
+ */
36
+ export interface MysqlPage<T> {
37
+ total: number
38
+ list: T[]
39
+ }
40
+
41
+ export async function paginate<T>(
42
+ config: MysqlConfig,
43
+ conn: PoolConnection,
44
+ opts: MysqlPaginateOpts<T>
45
+ ): Promise<MysqlPage<T>> {
46
+ const pn = opts.pn && opts.pn >= 1 ? opts.pn : 1
47
+ const limit = opts.pz && opts.pz >= 1 && opts.pz <= 1000 ? opts.pz : 20
48
+ const offset = (pn - 1) * limit
49
+ const list = await find(config, conn, {
50
+ table: opts.table,
51
+ criteria: opts.criteria,
52
+ offset,
53
+ limit,
54
+ orderBy: opts.orderBy
55
+ })
56
+ const total = await count(config, conn, opts.table, opts.criteria)
57
+ return {
58
+ total,
59
+ list
60
+ }
61
+ }
62
+
63
+ /**
64
+ * 指定字段分页查询选项
65
+ */
66
+ export interface MysqlPaginateSelectOpts<T, K extends keyof T> extends MysqlPaginateOpts<T> {
67
+ /**
68
+ * 要查询的字段
69
+ */
70
+ select: K[]
71
+ }
72
+
73
+ /**
74
+ * 指定字段分页查询
75
+ * @param config
76
+ * @param conn
77
+ * @param opts
78
+ */
79
+ export async function paginateSelect<T, K extends keyof T>(
80
+ config: MysqlConfig,
81
+ conn: PoolConnection,
82
+ opts: MysqlPaginateSelectOpts<T, K>
83
+ ): Promise<MysqlPage<Pick<T, K>>> {
84
+ const pn = opts.pn && opts.pn >= 1 ? opts.pn : 1
85
+ const limit = opts.pz && opts.pz >= 1 && opts.pz <= 1000 ? opts.pz : 20
86
+ const offset = (pn - 1) * limit
87
+ const list = await findSelect(config, conn, {
88
+ table: opts.table,
89
+ criteria: opts.criteria,
90
+ offset,
91
+ limit,
92
+ orderBy: opts.orderBy,
93
+ select: opts.select
94
+ })
95
+ const total = await count(config, conn, opts.table, opts.criteria)
96
+ return {
97
+ total,
98
+ list
99
+ }
100
+ }
@@ -0,0 +1,13 @@
1
+ import { PoolConnection, RowDataPacket } from 'mysql2'
2
+ import { promiseQuery } from '../utils'
3
+ import { MysqlConfig } from '../../config'
4
+
5
+ export async function query<T>(
6
+ config: MysqlConfig,
7
+ connection: PoolConnection,
8
+ sql: string,
9
+ values?: any[]
10
+ ): Promise<T[]> {
11
+ const res = await promiseQuery(config, connection, sql, values || [])
12
+ return res as RowDataPacket[] as T[]
13
+ }