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
@@ -1,216 +1,222 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.updateMany = exports.updateOne = exports.partialUpdate = exports.update = void 0;
4
- const exception_1 = require("../../exception");
5
- const criteria_1 = require("./criteria");
6
- const utils_1 = require("../utils");
7
- const utils_2 = require("./utils");
8
- /**
9
- * 更新
10
- * @param config
11
- * @param connection
12
- * @param mapping
13
- * @param data
14
- * @returns
15
- */
16
- async function update(config, connection, table, data) {
17
- // 列信息
18
- let columns = [...table.columns];
19
- // 创建时间不更新
20
- if (table.createdDate) {
21
- const { column } = table.createdDate;
22
- columns = columns.filter(col => col !== column);
23
- }
24
- if (table.updatedDate) {
25
- const updatedDate = table.updatedDate.type === 'date' ? new Date() : new Date().getTime();
26
- data[table.updatedDate.column] = updatedDate;
27
- columns.push(table.updatedDate.column);
28
- }
29
- // 构建 sql
30
- const sql = `update ?? set ${columns.map(() => ' ?? = ? ').join(',')} where ?? = ?`;
31
- //
32
- const values = [
33
- table.tableName,
34
- ...columns.flatMap(col => [col, (0, utils_2.processColumnValue)(data[col])]),
35
- table.id,
36
- data[table.id]
37
- ];
38
- const res = await (0, utils_1.promiseQuery)(config, connection, sql, values);
39
- const packet = res;
40
- if (packet.affectedRows !== 1) {
41
- throw new exception_1.MysqlException(`Failed to update record, possibly due to non-existent record,table:${table.tableName},primary key: ${data[table.id]}`);
42
- }
43
- return data;
44
- }
45
- exports.update = update;
46
- /**
47
- * 转换更新器
48
- * @param table
49
- * @param updater
50
- * @returns
51
- */
52
- function updatorToSql(table, updater) {
53
- const values = [];
54
- // 更新操作
55
- const updateFragList = [];
56
- // 更新时间
57
- if (table.updatedDate) {
58
- const updatedDate = table.updatedDate.type === 'date' ? new Date() : new Date().getTime();
59
- updateFragList.push(' ?? = ?');
60
- values.push(table.updatedDate.column, updatedDate);
61
- }
62
- for (const column in updater) {
63
- // 过滤掉id
64
- if (column === table.id) {
65
- continue;
66
- }
67
- const val = updater[column];
68
- // undefined 表示不参与更新,作用是方便编写一些特殊的逻辑,比如特定情况下不更新
69
- if (val === undefined) {
70
- continue;
71
- }
72
- // 兼容将值设置成 null 的情况,和 ['setNull’] 等同
73
- if (val === null) {
74
- updateFragList.push(' ?? = NULL ');
75
- values.push(column);
76
- continue;
77
- }
78
- if (Array.isArray(val)) {
79
- // set null
80
- if (val[0] === 'setNull') {
81
- updateFragList.push(' ?? = NULL ');
82
- values.push(column);
83
- continue;
84
- }
85
- if (val[0] === 'inc') {
86
- updateFragList.push(' ?? = ?? + ? ');
87
- values.push(column, column, val[1]);
88
- continue;
89
- }
90
- if (val[0] === 'set') {
91
- updateFragList.push(' ?? = ? ');
92
- values.push(column, (0, utils_2.processColumnValue)(val[1]));
93
- continue;
94
- }
95
- }
96
- updateFragList.push(' ?? = ? ');
97
- values.push(column, (0, utils_2.processColumnValue)(val));
98
- }
99
- return { sql: updateFragList.join(','), values };
100
- }
101
- /**
102
- * 部分更新
103
- * @param connection
104
- * @param mapping
105
- * @param type
106
- * @param data
107
- */
108
- async function partialUpdate(config, connection, table, data) {
109
- if (!data[table.id]) {
110
- throw new exception_1.MysqlException(`Can't do a partial update, the data to be updated does not contain a primary key,table: ${table.tableName},column:${JSON.stringify(data)}`);
111
- }
112
- const id = data[table.id];
113
- if (typeof id !== 'string' && typeof id !== 'number') {
114
- throw new exception_1.MysqlException('Primary key can only be of string or number type');
115
- }
116
- if (Object.keys(data).length < 2) {
117
- throw new exception_1.MysqlException(`Can't do a partial update, data must contain at least one column outside of the primary key,table: ${table.tableName},column:${JSON.stringify(data)}`);
118
- }
119
- const fieldNames = Object.keys(data);
120
- for (const name of fieldNames) {
121
- if (name !== table.id && !table.columns.some(col => col === name)) {
122
- throw new exception_1.MysqlException(`Can't do a partial update,there are unconfigured columns in the data,table: ${table.tableName},unconfigured column:${name}`);
123
- }
124
- }
125
- let sql = ` update ?? `;
126
- const values = [table.tableName];
127
- // 更新操作
128
- const convertRes = updatorToSql(table, data);
129
- if (!convertRes.sql) {
130
- throw new exception_1.MysqlException('No fields were specified to be updated!');
131
- }
132
- values.push(...convertRes.values);
133
- sql += ` set ${convertRes.sql} where ?? = ?`;
134
- values.push(table.id, id);
135
- const res = await (0, utils_1.promiseQuery)(config, connection, sql, values);
136
- const packet = res;
137
- return packet.affectedRows === 1;
138
- }
139
- exports.partialUpdate = partialUpdate;
140
- /**
141
- * 更新指定的一条记录
142
- * @param config
143
- * @param connection
144
- * @param table
145
- * @param query
146
- * @param data
147
- */
148
- async function updateOne(config, connection, table, query, updater) {
149
- const values = [];
150
- const mysqlQuery = (0, criteria_1.buildQuery)(query);
151
- if (!mysqlQuery) {
152
- throw new exception_1.MysqlException('No valid criteria specified.');
153
- }
154
- let sql = ` update ?? `;
155
- values.push(table.tableName);
156
- // 更新操作
157
- const convertRes = updatorToSql(table, updater);
158
- if (!convertRes.sql) {
159
- throw new exception_1.MysqlException('No fields were specified to be updated!');
160
- }
161
- sql += ` set ${convertRes.sql} `;
162
- values.push(...convertRes.values);
163
- sql += ` where ${mysqlQuery.sql} limit 1`;
164
- values.push(...mysqlQuery.values);
165
- const res = await (0, utils_1.promiseQuery)(config, connection, sql, values);
166
- const packet = res;
167
- return packet.affectedRows === 1;
168
- }
169
- exports.updateOne = updateOne;
170
- /**
171
- * 更新所有匹配条件的记录
172
- * @param config
173
- * @param connection 连接
174
- * @param table
175
- * @param query 查询条件
176
- * @param updater 更新操作,支持置空和递增(需要使用元组)
177
- */
178
- async function updateMany(config, connection, opts) {
179
- const values = [];
180
- const mysqlQuery = (0, criteria_1.buildQuery)(opts.query);
181
- if (!mysqlQuery) {
182
- throw new exception_1.MysqlException('No valid criteria specified.');
183
- }
184
- let sql = ` update ?? `;
185
- values.push(opts.table.tableName);
186
- // 更新操作
187
- const convertRes = updatorToSql(opts.table, opts.updater);
188
- if (!convertRes.sql) {
189
- throw new exception_1.MysqlException('No fields were specified to be updated!');
190
- }
191
- sql += ` set ${convertRes.sql} `;
192
- values.push(...convertRes.values);
193
- sql += ` where ${mysqlQuery.sql} `;
194
- values.push(...mysqlQuery.values);
195
- // 排序
196
- if (opts.orderBy && opts.orderBy.length) {
197
- opts.orderBy.forEach((orderBy, idx) => {
198
- const [field, sort] = orderBy;
199
- if (idx == 0) {
200
- sql += ` order by ?? ${sort} `;
201
- }
202
- else {
203
- sql += ` , ?? ${sort} `;
204
- }
205
- values.push(field);
206
- });
207
- }
208
- // 数量限制
209
- if (opts.limit) {
210
- sql += ` limit ${opts.limit} `;
211
- }
212
- const res = await (0, utils_1.promiseQuery)(config, connection, sql, values);
213
- const packet = res;
214
- return packet.affectedRows;
215
- }
216
- exports.updateMany = updateMany;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateMany = exports.updateOne = exports.partialUpdate = exports.updatorToSql = exports.update = void 0;
4
+ const exception_1 = require("../../exception");
5
+ const criteria_1 = require("./criteria");
6
+ const utils_1 = require("../utils");
7
+ const utils_2 = require("./utils");
8
+ const order_by_1 = require("./order-by");
9
+ /**
10
+ * 更新
11
+ * @param config
12
+ * @param connection
13
+ * @param mapping
14
+ * @param data
15
+ * @returns
16
+ */
17
+ async function update(config, connection, table, data) {
18
+ // 列信息
19
+ let columns = [...table.columns];
20
+ // 创建时间不更新
21
+ if (table.createdDate) {
22
+ const { column } = table.createdDate;
23
+ columns = columns.filter(col => col !== column);
24
+ }
25
+ if (table.updatedDate) {
26
+ const updatedDate = table.updatedDate.type === 'date' ? new Date() : new Date().getTime();
27
+ data[table.updatedDate.column] = updatedDate;
28
+ columns.push(table.updatedDate.column);
29
+ }
30
+ // 构建 sql
31
+ const sql = `update ?? set ${columns.map(() => ' ?? = ? ').join(',')} where ?? = ?`;
32
+ //
33
+ const values = [
34
+ table.tableName,
35
+ ...columns.flatMap(col => [col, (0, utils_2.processColumnValue)(data[col])]),
36
+ table.id,
37
+ data[table.id]
38
+ ];
39
+ const res = await (0, utils_1.promiseQuery)(config, connection, sql, values);
40
+ const packet = res;
41
+ if (packet.affectedRows !== 1) {
42
+ throw new exception_1.MysqlException(`Failed to update record, possibly due to non-existent record,table:${table.tableName},primary key: ${data[table.id]}`);
43
+ }
44
+ return data;
45
+ }
46
+ exports.update = update;
47
+ /**
48
+ * 转换更新器
49
+ * @param table
50
+ * @param updater
51
+ * @param autoUpdateTime 是否自动添加更新时间
52
+ * @returns
53
+ */
54
+ function updatorToSql(table, updater) {
55
+ const values = [];
56
+ const updateFragList = [];
57
+ for (const column in updater) {
58
+ // 过滤掉 id
59
+ if (column === table.id) {
60
+ continue;
61
+ }
62
+ // 过滤掉 createdDate / updatedDate(自动处理)
63
+ if ((table.createdDate && column === table.createdDate.column)
64
+ || (table.updatedDate && column === table.updatedDate.column)) {
65
+ continue;
66
+ }
67
+ const val = updater[column];
68
+ // undefined 表示不参与更新
69
+ if (val === undefined) {
70
+ continue;
71
+ }
72
+ // 0.7.0 版本开始,null undefined 一样被忽略更新
73
+ // 如需设置字段为 NULL,请使用 ['setNull']
74
+ if (val === null) {
75
+ continue;
76
+ }
77
+ if (Array.isArray(val)) {
78
+ if (val[0] === 'setNull') {
79
+ updateFragList.push(' ?? = NULL ');
80
+ values.push(column);
81
+ continue;
82
+ }
83
+ if (val[0] === 'inc') {
84
+ const incBy = val.length === 1 ? 1 : val[1];
85
+ updateFragList.push(' ?? = ?? + ? ');
86
+ values.push(column, column, incBy);
87
+ continue;
88
+ }
89
+ if (val[0] === 'now') {
90
+ updateFragList.push(' ?? = NOW() ');
91
+ values.push(column);
92
+ continue;
93
+ }
94
+ if (val[0] === 'set') {
95
+ updateFragList.push(' ?? = ? ');
96
+ values.push(column, (0, utils_2.processColumnValue)(val[1]));
97
+ continue;
98
+ }
99
+ if (val[0] === 'concat') {
100
+ updateFragList.push(' ?? = CONCAT(IFNULL(??, \'\'), ?) ');
101
+ values.push(column, column, val[1]);
102
+ continue;
103
+ }
104
+ if (val[0] === 'expr') {
105
+ updateFragList.push(' ?? = ' + val[1] + ' ');
106
+ values.push(column, ...(val[2] || []));
107
+ continue;
108
+ }
109
+ }
110
+ updateFragList.push(' ?? = ? ');
111
+ values.push(column, (0, utils_2.processColumnValue)(val));
112
+ }
113
+ // 如果没有有效更新字段,抛出异常
114
+ if (updateFragList.length === 0) {
115
+ throw new exception_1.MysqlException(`No effective fields to update (null values are ignored since v0.7.0), table: ${table.tableName}, updater: ${JSON.stringify(updater)}`);
116
+ }
117
+ // 自动添加更新时间
118
+ if (table.updatedDate) {
119
+ const updatedDate = table.updatedDate.type === 'date' ? new Date() : new Date().getTime();
120
+ updateFragList.push(' ?? = ?');
121
+ values.push(table.updatedDate.column, updatedDate);
122
+ }
123
+ return { sql: updateFragList.join(','), values };
124
+ }
125
+ exports.updatorToSql = updatorToSql;
126
+ /**
127
+ * 部分更新
128
+ * @param connection
129
+ * @param mapping
130
+ * @param type
131
+ * @param data
132
+ */
133
+ async function partialUpdate(config, connection, table, data) {
134
+ if (!data[table.id]) {
135
+ throw new exception_1.MysqlException(`Can't do a partial update, the data to be updated does not contain a primary key,table: ${table.tableName},column:${JSON.stringify(data)}`);
136
+ }
137
+ const id = data[table.id];
138
+ if (typeof id !== 'string' && typeof id !== 'number') {
139
+ throw new exception_1.MysqlException('Primary key can only be of string or number type');
140
+ }
141
+ const fieldNames = Object.keys(data);
142
+ for (const name of fieldNames) {
143
+ if (name !== table.id && !table.columns.some(col => col === name)) {
144
+ throw new exception_1.MysqlException(`Can't do a partial update,there are unconfigured columns in the data,table: ${table.tableName},unconfigured column:${name}`);
145
+ }
146
+ }
147
+ let sql = ` update ?? `;
148
+ const values = [table.tableName];
149
+ // 更新操作
150
+ const convertRes = updatorToSql(table, data);
151
+ values.push(...convertRes.values);
152
+ sql += ` set ${convertRes.sql} where ?? = ?`;
153
+ values.push(table.id, id);
154
+ const res = await (0, utils_1.promiseQuery)(config, connection, sql, values);
155
+ const packet = res;
156
+ return packet.affectedRows === 1;
157
+ }
158
+ exports.partialUpdate = partialUpdate;
159
+ /**
160
+ * 更新指定的一条记录
161
+ * @param config
162
+ * @param connection
163
+ * @param table
164
+ * @param query
165
+ * @param data
166
+ */
167
+ async function updateOne(config, connection, table, query, updater) {
168
+ const values = [];
169
+ const mysqlQuery = (0, criteria_1.buildQuery)(query);
170
+ if (!mysqlQuery) {
171
+ throw new exception_1.MysqlException('No valid criteria specified.');
172
+ }
173
+ let sql = ` update ?? `;
174
+ values.push(table.tableName);
175
+ // 更新操作
176
+ const convertRes = updatorToSql(table, updater);
177
+ sql += ` set ${convertRes.sql} `;
178
+ values.push(...convertRes.values);
179
+ sql += ` where ${mysqlQuery.sql} limit 1`;
180
+ values.push(...mysqlQuery.values);
181
+ const res = await (0, utils_1.promiseQuery)(config, connection, sql, values);
182
+ const packet = res;
183
+ return packet.affectedRows === 1;
184
+ }
185
+ exports.updateOne = updateOne;
186
+ /**
187
+ * 更新所有匹配条件的记录
188
+ * @param config
189
+ * @param connection 连接
190
+ * @param table 表
191
+ * @param query 查询条件
192
+ * @param updater 更新操作,支持置空和递增(需要使用元组)
193
+ */
194
+ async function updateMany(config, connection, opts) {
195
+ const values = [];
196
+ const mysqlQuery = (0, criteria_1.buildQuery)(opts.query);
197
+ if (!mysqlQuery) {
198
+ throw new exception_1.MysqlException('No valid criteria specified.');
199
+ }
200
+ let sql = ` update ?? `;
201
+ values.push(opts.table.tableName);
202
+ // 更新操作
203
+ const convertRes = updatorToSql(opts.table, opts.updater);
204
+ sql += ` set ${convertRes.sql} `;
205
+ values.push(...convertRes.values);
206
+ sql += ` where ${mysqlQuery.sql} `;
207
+ values.push(...mysqlQuery.values);
208
+ // 排序
209
+ if (opts.orderBy && opts.orderBy.length) {
210
+ const ob = (0, order_by_1.buildOrderBy)(opts.orderBy);
211
+ sql += ob.sql;
212
+ values.push(...ob.values);
213
+ }
214
+ // 数量限制
215
+ if (opts.limit) {
216
+ sql += ` limit ${opts.limit} `;
217
+ }
218
+ const res = await (0, utils_1.promiseQuery)(config, connection, sql, values);
219
+ const packet = res;
220
+ return packet.affectedRows;
221
+ }
222
+ exports.updateMany = updateMany;
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.upsertWithUpdater = exports.upsertMany = exports.upsert = void 0;
4
+ const utils_1 = require("../utils");
5
+ const insert_1 = require("./insert");
6
+ const update_1 = require("./update");
7
+ /**
8
+ * Upsert 单条数据
9
+ * 如果主键冲突则更新,否则插入
10
+ * @param config
11
+ * @param connection
12
+ * @param table
13
+ * @param data
14
+ * @returns
15
+ */
16
+ async function upsert(config, connection, table, data) {
17
+ let columnsSet = new Set();
18
+ if (data[table.id]) {
19
+ columnsSet.add(table.id);
20
+ }
21
+ table.columns.forEach(col => columnsSet.add(col));
22
+ const now = new Date();
23
+ const nowTimestamp = now.getTime();
24
+ if (table.createdDate) {
25
+ const createdData = table.createdDate.type === 'date' ? now : nowTimestamp;
26
+ data[table.createdDate.column] = createdData;
27
+ columnsSet.add(table.createdDate.column);
28
+ }
29
+ if (table.updatedDate) {
30
+ const updatedDate = table.updatedDate.type === 'date' ? now : nowTimestamp;
31
+ data[table.updatedDate.column] = updatedDate;
32
+ columnsSet.add(table.updatedDate.column);
33
+ }
34
+ const columns = Array.from(columnsSet);
35
+ // 构建 insert values
36
+ const fragList = [];
37
+ const insertValues = [];
38
+ for (const col of columns) {
39
+ const { frag, values: vs } = (0, insert_1.processInsertValue)(data[col]);
40
+ fragList.push(frag);
41
+ insertValues.push(...vs);
42
+ }
43
+ const insertSql = `insert into ??(${columns.map(() => '??').join(',')}) values(${fragList.join(',')})`;
44
+ // 构建 on duplicate key update(排除 id)
45
+ const updateColumns = columns.filter(col => col !== table.id);
46
+ const updateFragments = [];
47
+ const updateValues = [];
48
+ for (const col of updateColumns) {
49
+ const { frag, values: vs } = (0, insert_1.processInsertValue)(data[col]);
50
+ updateFragments.push(`?? = ${frag}`);
51
+ updateValues.push(col, ...vs);
52
+ }
53
+ const updateSql = ` on duplicate key update ${updateFragments.join(',')}`;
54
+ const sql = insertSql + updateSql;
55
+ const values = [table.tableName, ...columns, ...insertValues, ...updateValues];
56
+ const res = await (0, utils_1.promiseQuery)(config, connection, sql, values);
57
+ const packet = res;
58
+ if (packet.insertId && (data[table.id] === undefined || data[table.id] === null)) {
59
+ data[table.id] = packet.insertId;
60
+ }
61
+ return data;
62
+ }
63
+ exports.upsert = upsert;
64
+ /**
65
+ * Upsert 多条数据
66
+ * 如果主键冲突则更新,否则插入
67
+ * @param config
68
+ * @param connection
69
+ * @param table
70
+ * @param list
71
+ * @returns 影响的行数
72
+ */
73
+ async function upsertMany(config, connection, table, list) {
74
+ if (!list.length) {
75
+ return 0;
76
+ }
77
+ let columnsSet = new Set();
78
+ if (list[0][table.id]) {
79
+ columnsSet.add(table.id);
80
+ }
81
+ table.columns.forEach(col => columnsSet.add(col));
82
+ const now = new Date();
83
+ const nowTimestamp = now.getTime();
84
+ let createdData = undefined;
85
+ if (table.createdDate) {
86
+ createdData = table.createdDate.type === 'date' ? now : nowTimestamp;
87
+ columnsSet.add(table.createdDate.column);
88
+ }
89
+ let updatedDate = undefined;
90
+ if (table.updatedDate) {
91
+ updatedDate = table.updatedDate.type === 'date' ? now : nowTimestamp;
92
+ columnsSet.add(table.updatedDate.column);
93
+ }
94
+ const columns = Array.from(columnsSet);
95
+ let sql = `insert into ??(${columns.map(() => '??').join(',')}) values`;
96
+ const values = [table.tableName, ...columns];
97
+ list.forEach((data, idx) => {
98
+ if (idx > 0) {
99
+ sql += ',';
100
+ }
101
+ const fragList = [];
102
+ const rowValues = [];
103
+ if (table.createdDate) {
104
+ data[table.createdDate.column] = createdData;
105
+ }
106
+ if (table.updatedDate) {
107
+ data[table.updatedDate.column] = updatedDate;
108
+ }
109
+ for (const col of columns) {
110
+ const { frag, values: vs } = (0, insert_1.processInsertValue)(data[col]);
111
+ fragList.push(frag);
112
+ rowValues.push(...vs);
113
+ }
114
+ sql += `(${fragList.join(',')})`;
115
+ values.push(...rowValues);
116
+ });
117
+ const updateColumns = columns.filter(col => col !== table.id);
118
+ sql += ` on duplicate key update ${updateColumns.map(() => '?? = values(??)').join(',')}`;
119
+ updateColumns.forEach(col => values.push(col, col));
120
+ const res = await (0, utils_1.promiseQuery)(config, connection, sql, values);
121
+ const packet = res;
122
+ return packet.affectedRows;
123
+ }
124
+ exports.upsertMany = upsertMany;
125
+ /**
126
+ * Upsert 单条数据(支持自定义更新器)
127
+ * 如果主键冲突则按自定义逻辑更新,否则插入
128
+ * @param config
129
+ * @param connection
130
+ * @param table
131
+ * @param data 插入的数据
132
+ * @param updater 冲突时的更新器
133
+ * @returns
134
+ */
135
+ async function upsertWithUpdater(config, connection, table, data, updater) {
136
+ let columnsSet = new Set();
137
+ if (data[table.id]) {
138
+ columnsSet.add(table.id);
139
+ }
140
+ table.columns.forEach(col => {
141
+ if (data[col] !== undefined) {
142
+ columnsSet.add(col);
143
+ }
144
+ });
145
+ const now = new Date();
146
+ const nowTimestamp = now.getTime();
147
+ if (table.createdDate) {
148
+ const createdData = table.createdDate.type === 'date' ? now : nowTimestamp;
149
+ data[table.createdDate.column] = createdData;
150
+ columnsSet.add(table.createdDate.column);
151
+ }
152
+ if (table.updatedDate) {
153
+ const updatedDate = table.updatedDate.type === 'date' ? now : nowTimestamp;
154
+ data[table.updatedDate.column] = updatedDate;
155
+ columnsSet.add(table.updatedDate.column);
156
+ }
157
+ const columns = Array.from(columnsSet);
158
+ // 构建 insert values
159
+ const fragList = [];
160
+ const insertValues = [];
161
+ for (const col of columns) {
162
+ const { frag, values: vs } = (0, insert_1.processInsertValue)(data[col]);
163
+ fragList.push(frag);
164
+ insertValues.push(...vs);
165
+ }
166
+ const insertSql = `insert into ??(${columns.map(() => '??').join(',')}) values(${fragList.join(',')})`;
167
+ const convertRes = (0, update_1.updatorToSql)(table, updater);
168
+ const updateSql = ` on duplicate key update ${convertRes.sql}`;
169
+ const sql = insertSql + updateSql;
170
+ const values = [table.tableName, ...columns, ...insertValues, ...convertRes.values];
171
+ const res = await (0, utils_1.promiseQuery)(config, connection, sql, values);
172
+ const packet = res;
173
+ if (packet.insertId && (data[table.id] === undefined || data[table.id] === null)) {
174
+ data[table.id] = packet.insertId;
175
+ }
176
+ return data;
177
+ }
178
+ exports.upsertWithUpdater = upsertWithUpdater;