@dosgato/api 0.0.2

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 (330) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +74 -0
  3. package/dist/access/access.model.d.ts +2 -0
  4. package/dist/access/access.model.js +14 -0
  5. package/dist/access/access.model.js.map +1 -0
  6. package/dist/access/access.resolver.d.ts +15 -0
  7. package/dist/access/access.resolver.js +133 -0
  8. package/dist/access/access.resolver.js.map +1 -0
  9. package/dist/asset/asset.database.d.ts +12 -0
  10. package/dist/asset/asset.database.js +116 -0
  11. package/dist/asset/asset.database.js.map +1 -0
  12. package/dist/asset/asset.model.d.ts +81 -0
  13. package/dist/asset/asset.model.js +271 -0
  14. package/dist/asset/asset.model.js.map +1 -0
  15. package/dist/asset/asset.resolver.d.ts +32 -0
  16. package/dist/asset/asset.resolver.js +325 -0
  17. package/dist/asset/asset.resolver.js.map +1 -0
  18. package/dist/asset/asset.service.d.ts +35 -0
  19. package/dist/asset/asset.service.js +225 -0
  20. package/dist/asset/asset.service.js.map +1 -0
  21. package/dist/assetfolder/assetfolder.database.d.ts +7 -0
  22. package/dist/assetfolder/assetfolder.database.js +85 -0
  23. package/dist/assetfolder/assetfolder.database.js.map +1 -0
  24. package/dist/assetfolder/assetfolder.model.d.ts +56 -0
  25. package/dist/assetfolder/assetfolder.model.js +160 -0
  26. package/dist/assetfolder/assetfolder.model.js.map +1 -0
  27. package/dist/assetfolder/assetfolder.resolver.d.ts +25 -0
  28. package/dist/assetfolder/assetfolder.resolver.js +255 -0
  29. package/dist/assetfolder/assetfolder.resolver.js.map +1 -0
  30. package/dist/assetfolder/assetfolder.service.d.ts +39 -0
  31. package/dist/assetfolder/assetfolder.service.js +355 -0
  32. package/dist/assetfolder/assetfolder.service.js.map +1 -0
  33. package/dist/assetrule/assetrule.database.d.ts +5 -0
  34. package/dist/assetrule/assetrule.database.js +161 -0
  35. package/dist/assetrule/assetrule.database.js.map +1 -0
  36. package/dist/assetrule/assetrule.model.d.ts +71 -0
  37. package/dist/assetrule/assetrule.model.js +221 -0
  38. package/dist/assetrule/assetrule.model.js.map +1 -0
  39. package/dist/assetrule/assetrule.resolver.d.ts +12 -0
  40. package/dist/assetrule/assetrule.resolver.js +100 -0
  41. package/dist/assetrule/assetrule.resolver.js.map +1 -0
  42. package/dist/assetrule/assetrule.service.d.ts +26 -0
  43. package/dist/assetrule/assetrule.service.js +184 -0
  44. package/dist/assetrule/assetrule.service.js.map +1 -0
  45. package/dist/createdb.d.ts +2 -0
  46. package/dist/createdb.js +541 -0
  47. package/dist/createdb.js.map +1 -0
  48. package/dist/data/data.database.d.ts +7 -0
  49. package/dist/data/data.database.js +265 -0
  50. package/dist/data/data.database.js.map +1 -0
  51. package/dist/data/data.indexing.d.ts +2 -0
  52. package/dist/data/data.indexing.js +23 -0
  53. package/dist/data/data.indexing.js.map +1 -0
  54. package/dist/data/data.model.d.ts +69 -0
  55. package/dist/data/data.model.js +206 -0
  56. package/dist/data/data.model.js.map +1 -0
  57. package/dist/data/data.resolver.d.ts +36 -0
  58. package/dist/data/data.resolver.js +384 -0
  59. package/dist/data/data.resolver.js.map +1 -0
  60. package/dist/data/data.service.d.ts +41 -0
  61. package/dist/data/data.service.js +374 -0
  62. package/dist/data/data.service.js.map +1 -0
  63. package/dist/datafolder/datafolder.database.d.ts +7 -0
  64. package/dist/datafolder/datafolder.database.js +72 -0
  65. package/dist/datafolder/datafolder.database.js.map +1 -0
  66. package/dist/datafolder/datafolder.model.d.ts +48 -0
  67. package/dist/datafolder/datafolder.model.js +139 -0
  68. package/dist/datafolder/datafolder.model.js.map +1 -0
  69. package/dist/datafolder/datafolder.resolver.d.ts +24 -0
  70. package/dist/datafolder/datafolder.resolver.js +243 -0
  71. package/dist/datafolder/datafolder.resolver.js.map +1 -0
  72. package/dist/datafolder/datafolder.service.d.ts +32 -0
  73. package/dist/datafolder/datafolder.service.js +223 -0
  74. package/dist/datafolder/datafolder.service.js.map +1 -0
  75. package/dist/dataroot/dataroot.model.d.ts +19 -0
  76. package/dist/dataroot/dataroot.model.js +72 -0
  77. package/dist/dataroot/dataroot.model.js.map +1 -0
  78. package/dist/dataroot/dataroot.resolver.d.ts +11 -0
  79. package/dist/dataroot/dataroot.resolver.js +87 -0
  80. package/dist/dataroot/dataroot.resolver.js.map +1 -0
  81. package/dist/dataroot/dataroot.service.d.ts +12 -0
  82. package/dist/dataroot/dataroot.service.js +62 -0
  83. package/dist/dataroot/dataroot.service.js.map +1 -0
  84. package/dist/datarule/datarule.database.d.ts +5 -0
  85. package/dist/datarule/datarule.database.js +144 -0
  86. package/dist/datarule/datarule.database.js.map +1 -0
  87. package/dist/datarule/datarule.model.d.ts +55 -0
  88. package/dist/datarule/datarule.model.js +200 -0
  89. package/dist/datarule/datarule.model.js.map +1 -0
  90. package/dist/datarule/datarule.resolver.d.ts +13 -0
  91. package/dist/datarule/datarule.resolver.js +114 -0
  92. package/dist/datarule/datarule.resolver.js.map +1 -0
  93. package/dist/datarule/datarule.service.d.ts +27 -0
  94. package/dist/datarule/datarule.service.js +191 -0
  95. package/dist/datarule/datarule.service.js.map +1 -0
  96. package/dist/fixtures.d.ts +1 -0
  97. package/dist/fixtures.js +697 -0
  98. package/dist/fixtures.js.map +1 -0
  99. package/dist/fixturetemplates.d.ts +110 -0
  100. package/dist/fixturetemplates.js +178 -0
  101. package/dist/fixturetemplates.js.map +1 -0
  102. package/dist/globalrule/globalrule.database.d.ts +5 -0
  103. package/dist/globalrule/globalrule.database.js +65 -0
  104. package/dist/globalrule/globalrule.database.js.map +1 -0
  105. package/dist/globalrule/globalrule.model.d.ts +34 -0
  106. package/dist/globalrule/globalrule.model.js +120 -0
  107. package/dist/globalrule/globalrule.model.js.map +1 -0
  108. package/dist/globalrule/globalrule.resolver.d.ts +11 -0
  109. package/dist/globalrule/globalrule.resolver.js +85 -0
  110. package/dist/globalrule/globalrule.resolver.js.map +1 -0
  111. package/dist/globalrule/globalrule.service.d.ts +18 -0
  112. package/dist/globalrule/globalrule.service.js +111 -0
  113. package/dist/globalrule/globalrule.service.js.map +1 -0
  114. package/dist/group/group.database.d.ts +41 -0
  115. package/dist/group/group.database.js +190 -0
  116. package/dist/group/group.database.js.map +1 -0
  117. package/dist/group/group.model.d.ts +19 -0
  118. package/dist/group/group.model.js +70 -0
  119. package/dist/group/group.model.js.map +1 -0
  120. package/dist/group/group.resolver.d.ts +27 -0
  121. package/dist/group/group.resolver.js +275 -0
  122. package/dist/group/group.resolver.js.map +1 -0
  123. package/dist/group/group.service.d.ts +46 -0
  124. package/dist/group/group.service.js +384 -0
  125. package/dist/group/group.service.js.map +1 -0
  126. package/dist/index.d.ts +18 -0
  127. package/dist/index.js +109 -0
  128. package/dist/index.js.map +1 -0
  129. package/dist/internal.d.ts +88 -0
  130. package/dist/internal.js +89 -0
  131. package/dist/internal.js.map +1 -0
  132. package/dist/migrations.d.ts +2 -0
  133. package/dist/migrations.js +41 -0
  134. package/dist/migrations.js.map +1 -0
  135. package/dist/organization/organization.database.d.ts +2 -0
  136. package/dist/organization/organization.database.js +16 -0
  137. package/dist/organization/organization.database.js.map +1 -0
  138. package/dist/organization/organization.model.d.ts +5 -0
  139. package/dist/organization/organization.model.js +35 -0
  140. package/dist/organization/organization.model.js.map +1 -0
  141. package/dist/organization/organization.resolver.d.ts +6 -0
  142. package/dist/organization/organization.resolver.js +43 -0
  143. package/dist/organization/organization.resolver.js.map +1 -0
  144. package/dist/organization/organization.service.d.ts +12 -0
  145. package/dist/organization/organization.service.js +35 -0
  146. package/dist/organization/organization.service.js.map +1 -0
  147. package/dist/page/page.database.d.ts +10 -0
  148. package/dist/page/page.database.js +269 -0
  149. package/dist/page/page.database.js.map +1 -0
  150. package/dist/page/page.indexing.d.ts +3 -0
  151. package/dist/page/page.indexing.js +26 -0
  152. package/dist/page/page.indexing.js.map +1 -0
  153. package/dist/page/page.migrations.d.ts +13 -0
  154. package/dist/page/page.migrations.js +55 -0
  155. package/dist/page/page.migrations.js.map +1 -0
  156. package/dist/page/page.model.d.ts +88 -0
  157. package/dist/page/page.model.js +272 -0
  158. package/dist/page/page.model.js.map +1 -0
  159. package/dist/page/page.resolver.d.ts +48 -0
  160. package/dist/page/page.resolver.js +542 -0
  161. package/dist/page/page.resolver.js.map +1 -0
  162. package/dist/page/page.service.d.ts +59 -0
  163. package/dist/page/page.service.js +399 -0
  164. package/dist/page/page.service.js.map +1 -0
  165. package/dist/page/page.util.d.ts +3 -0
  166. package/dist/page/page.util.js +16 -0
  167. package/dist/page/page.util.js.map +1 -0
  168. package/dist/page/page.validation.d.ts +2 -0
  169. package/dist/page/page.validation.js +21 -0
  170. package/dist/page/page.validation.js.map +1 -0
  171. package/dist/pagerule/pagerule.database.d.ts +5 -0
  172. package/dist/pagerule/pagerule.database.js +212 -0
  173. package/dist/pagerule/pagerule.database.js.map +1 -0
  174. package/dist/pagerule/pagerule.model.d.ts +71 -0
  175. package/dist/pagerule/pagerule.model.js +272 -0
  176. package/dist/pagerule/pagerule.model.js.map +1 -0
  177. package/dist/pagerule/pagerule.resolver.d.ts +13 -0
  178. package/dist/pagerule/pagerule.resolver.js +114 -0
  179. package/dist/pagerule/pagerule.resolver.js.map +1 -0
  180. package/dist/pagerule/pagerule.service.d.ts +23 -0
  181. package/dist/pagerule/pagerule.service.js +180 -0
  182. package/dist/pagerule/pagerule.service.js.map +1 -0
  183. package/dist/pagetree/pagetree.database.d.ts +13 -0
  184. package/dist/pagetree/pagetree.database.js +84 -0
  185. package/dist/pagetree/pagetree.database.js.map +1 -0
  186. package/dist/pagetree/pagetree.model.d.ts +43 -0
  187. package/dist/pagetree/pagetree.model.js +146 -0
  188. package/dist/pagetree/pagetree.model.js.map +1 -0
  189. package/dist/pagetree/pagetree.resolver.d.ts +23 -0
  190. package/dist/pagetree/pagetree.resolver.js +238 -0
  191. package/dist/pagetree/pagetree.resolver.js.map +1 -0
  192. package/dist/pagetree/pagetree.service.d.ts +25 -0
  193. package/dist/pagetree/pagetree.service.js +221 -0
  194. package/dist/pagetree/pagetree.service.js.map +1 -0
  195. package/dist/role/role.database.d.ts +17 -0
  196. package/dist/role/role.database.js +74 -0
  197. package/dist/role/role.database.js.map +1 -0
  198. package/dist/role/role.model.d.ts +26 -0
  199. package/dist/role/role.model.js +84 -0
  200. package/dist/role/role.model.js.map +1 -0
  201. package/dist/role/role.resolver.d.ts +27 -0
  202. package/dist/role/role.resolver.js +294 -0
  203. package/dist/role/role.resolver.js.map +1 -0
  204. package/dist/role/role.service.d.ts +33 -0
  205. package/dist/role/role.service.js +265 -0
  206. package/dist/role/role.service.js.map +1 -0
  207. package/dist/run.d.ts +1 -0
  208. package/dist/run.js +29 -0
  209. package/dist/run.js.map +1 -0
  210. package/dist/scalars/datetime.d.ts +2 -0
  211. package/dist/scalars/datetime.js +19 -0
  212. package/dist/scalars/datetime.js.map +1 -0
  213. package/dist/scalars/index.d.ts +3 -0
  214. package/dist/scalars/index.js +4 -0
  215. package/dist/scalars/index.js.map +1 -0
  216. package/dist/scalars/jsondata.d.ts +2 -0
  217. package/dist/scalars/jsondata.js +15 -0
  218. package/dist/scalars/jsondata.js.map +1 -0
  219. package/dist/scalars/urlsafestring.d.ts +4 -0
  220. package/dist/scalars/urlsafestring.js +28 -0
  221. package/dist/scalars/urlsafestring.js.map +1 -0
  222. package/dist/site/site.database.d.ts +15 -0
  223. package/dist/site/site.database.js +164 -0
  224. package/dist/site/site.database.js.map +1 -0
  225. package/dist/site/site.model.d.ts +62 -0
  226. package/dist/site/site.model.js +197 -0
  227. package/dist/site/site.model.js.map +1 -0
  228. package/dist/site/site.resolver.d.ts +30 -0
  229. package/dist/site/site.resolver.js +326 -0
  230. package/dist/site/site.resolver.js.map +1 -0
  231. package/dist/site/site.service.d.ts +35 -0
  232. package/dist/site/site.service.js +199 -0
  233. package/dist/site/site.service.js.map +1 -0
  234. package/dist/siterule/siterule.database.d.ts +5 -0
  235. package/dist/siterule/siterule.database.js +139 -0
  236. package/dist/siterule/siterule.database.js.map +1 -0
  237. package/dist/siterule/siterule.model.d.ts +53 -0
  238. package/dist/siterule/siterule.model.js +203 -0
  239. package/dist/siterule/siterule.model.js.map +1 -0
  240. package/dist/siterule/siterule.resolver.d.ts +12 -0
  241. package/dist/siterule/siterule.resolver.js +100 -0
  242. package/dist/siterule/siterule.resolver.js.map +1 -0
  243. package/dist/siterule/siterule.service.d.ts +23 -0
  244. package/dist/siterule/siterule.service.js +148 -0
  245. package/dist/siterule/siterule.service.js.map +1 -0
  246. package/dist/template/template.database.d.ts +15 -0
  247. package/dist/template/template.database.js +61 -0
  248. package/dist/template/template.database.js.map +1 -0
  249. package/dist/template/template.model.d.ts +32 -0
  250. package/dist/template/template.model.js +124 -0
  251. package/dist/template/template.model.js.map +1 -0
  252. package/dist/template/template.resolver.d.ts +22 -0
  253. package/dist/template/template.resolver.js +216 -0
  254. package/dist/template/template.resolver.js.map +1 -0
  255. package/dist/template/template.service.d.ts +27 -0
  256. package/dist/template/template.service.js +192 -0
  257. package/dist/template/template.service.js.map +1 -0
  258. package/dist/templaterule/templaterule.database.d.ts +5 -0
  259. package/dist/templaterule/templaterule.database.js +80 -0
  260. package/dist/templaterule/templaterule.database.js.map +1 -0
  261. package/dist/templaterule/templaterule.model.d.ts +38 -0
  262. package/dist/templaterule/templaterule.model.js +136 -0
  263. package/dist/templaterule/templaterule.model.js.map +1 -0
  264. package/dist/templaterule/templaterule.resolver.d.ts +12 -0
  265. package/dist/templaterule/templaterule.resolver.js +100 -0
  266. package/dist/templaterule/templaterule.resolver.js.map +1 -0
  267. package/dist/templaterule/templaterule.service.d.ts +19 -0
  268. package/dist/templaterule/templaterule.service.js +123 -0
  269. package/dist/templaterule/templaterule.service.js.map +1 -0
  270. package/dist/user/user.database.d.ts +22 -0
  271. package/dist/user/user.database.js +116 -0
  272. package/dist/user/user.database.js.map +1 -0
  273. package/dist/user/user.model.d.ts +42 -0
  274. package/dist/user/user.model.js +122 -0
  275. package/dist/user/user.model.js.map +1 -0
  276. package/dist/user/user.resolver.d.ts +16 -0
  277. package/dist/user/user.resolver.js +140 -0
  278. package/dist/user/user.resolver.js.map +1 -0
  279. package/dist/user/user.service.d.ts +29 -0
  280. package/dist/user/user.service.js +195 -0
  281. package/dist/user/user.service.js.map +1 -0
  282. package/dist/util/authservice.d.ts +28 -0
  283. package/dist/util/authservice.js +131 -0
  284. package/dist/util/authservice.js.map +1 -0
  285. package/dist/util/dates.d.ts +2 -0
  286. package/dist/util/dates.js +4 -0
  287. package/dist/util/dates.js.map +1 -0
  288. package/dist/util/filehandler.d.ts +15 -0
  289. package/dist/util/filehandler.js +48 -0
  290. package/dist/util/filehandler.js.map +1 -0
  291. package/dist/util/index.d.ts +13 -0
  292. package/dist/util/index.js +26 -0
  293. package/dist/util/index.js.map +1 -0
  294. package/dist/util/indexing.d.ts +12 -0
  295. package/dist/util/indexing.js +74 -0
  296. package/dist/util/indexing.js.map +1 -0
  297. package/dist/util/migrations.d.ts +15 -0
  298. package/dist/util/migrations.js +2 -0
  299. package/dist/util/migrations.js.map +1 -0
  300. package/dist/util/mutationlogger.d.ts +1 -0
  301. package/dist/util/mutationlogger.js +9 -0
  302. package/dist/util/mutationlogger.js.map +1 -0
  303. package/dist/util/registry.d.ts +25 -0
  304. package/dist/util/registry.js +66 -0
  305. package/dist/util/registry.js.map +1 -0
  306. package/dist/util/rules.d.ts +6 -0
  307. package/dist/util/rules.js +31 -0
  308. package/dist/util/rules.js.map +1 -0
  309. package/dist/util/sharedtypes.d.ts +3 -0
  310. package/dist/util/sharedtypes.js +2 -0
  311. package/dist/util/sharedtypes.js.map +1 -0
  312. package/dist/util/stopwords.d.ts +1 -0
  313. package/dist/util/stopwords.js +152 -0
  314. package/dist/util/stopwords.js.map +1 -0
  315. package/dist/version/version.model.d.ts +11 -0
  316. package/dist/version/version.model.js +46 -0
  317. package/dist/version/version.model.js.map +1 -0
  318. package/dist/version/version.resolver.d.ts +6 -0
  319. package/dist/version/version.resolver.js +45 -0
  320. package/dist/version/version.resolver.js.map +1 -0
  321. package/dist/versionedservice/service.d.ts +148 -0
  322. package/dist/versionedservice/service.js +547 -0
  323. package/dist/versionedservice/service.js.map +1 -0
  324. package/dist/versionedservice/types.d.ts +87 -0
  325. package/dist/versionedservice/types.js +11 -0
  326. package/dist/versionedservice/types.js.map +1 -0
  327. package/package.json +50 -0
  328. package/readme/DosGato.mwb +0 -0
  329. package/readme/DosGato.mwb.bak +0 -0
  330. package/readme/upgradeflow2.png +0 -0
@@ -0,0 +1,547 @@
1
+ /* eslint-disable no-multi-str */
2
+ import { BaseService } from '@txstate-mws/graphql-server';
3
+ import { OneToManyLoader, PrimaryKeyLoader } from 'dataloader-factory';
4
+ import jsonPatch from 'fast-json-patch';
5
+ import db from 'mysql2-async/db';
6
+ import { nanoid } from 'nanoid';
7
+ import { clone } from 'txstate-utils';
8
+ import { NotFoundError, UpdateConflictError } from '../internal.js';
9
+ const { applyPatch, compare } = jsonPatch;
10
+ const storageLoader = new PrimaryKeyLoader({
11
+ fetch: async (ids) => {
12
+ const binds = [];
13
+ const rows = await db.getall(`SELECT * FROM storage WHERE id IN (${db.in(binds, ids)})`, binds);
14
+ return rows.map(r => ({ ...r, data: JSON.parse(r.data) }));
15
+ }
16
+ });
17
+ const tagLoader = new PrimaryKeyLoader({
18
+ fetch: async (keys) => {
19
+ const binds = [];
20
+ return await db.getall(`SELECT * FROM tags WHERE (id, tag) IN (${db.in(binds, keys.map(k => [k.id, k.tag]))})`, binds);
21
+ },
22
+ extractId: tag => ({ id: tag.id, tag: tag.tag })
23
+ });
24
+ const versionsByNumberLoader = new OneToManyLoader({
25
+ fetch: async (keys) => {
26
+ const binds = [];
27
+ const where = [];
28
+ for (const { id, version, current } of keys) {
29
+ where.push('id=? AND version >= ? AND version < ?');
30
+ binds.push(id, version, current);
31
+ }
32
+ const rows = await db.getall(`SELECT * FROM versions WHERE (${where.join(') OR (')}) ORDER BY version DESC`, binds);
33
+ return rows.map(r => ({ ...r, undo: JSON.parse(r.undo) }));
34
+ },
35
+ matchKey: ({ id, version, current }, entry) => entry.id === id && entry.version >= version && entry.version < current,
36
+ maxBatchSize: 50
37
+ });
38
+ function zerofill(n) {
39
+ return typeof n === 'number' ? String(Math.floor(n)).padStart(12, '0') + (2.3 % 1).toFixed(4).substring(1) : n;
40
+ }
41
+ function zerofillIndexes(indexes) {
42
+ let index;
43
+ for (let i = 0; i < indexes.length; i++) {
44
+ index = indexes[i];
45
+ for (let j = 0; j < index.values.length; j++) {
46
+ index.values[j] = zerofill(index.values[j]);
47
+ }
48
+ }
49
+ return indexes;
50
+ }
51
+ export class VersionedService extends BaseService {
52
+ /**
53
+ * Retrieve an object with a specific version or tag.
54
+ *
55
+ * This method is dataloaded so don't be afraid to make massively concurrent
56
+ * requests for many objects.
57
+ *
58
+ * If you ask for a specific tag that doesn't exist, you'll receive undefined.
59
+ */
60
+ async get(id, { version, tag } = {}) {
61
+ let versioned = await this.loaders.get(storageLoader).load(id);
62
+ if (!versioned)
63
+ return undefined;
64
+ if (tag && tag !== 'latest') {
65
+ const verNum = (await this.loaders.get(tagLoader).load({ id, tag }))?.version;
66
+ if (typeof verNum === 'undefined')
67
+ return undefined;
68
+ version = verNum;
69
+ }
70
+ if (version && versioned.version !== version) {
71
+ versioned = clone(versioned);
72
+ const versionEntries = await this.loaders.get(versionsByNumberLoader).load({ id, version, current: versioned.version });
73
+ for (const entry of versionEntries) {
74
+ applyPatch(versioned.data, entry.undo);
75
+ }
76
+ const lastEntry = versionEntries[versionEntries.length - 1];
77
+ versioned.modified = lastEntry.date;
78
+ versioned.modifiedBy = lastEntry.user;
79
+ versioned.comment = lastEntry.comment;
80
+ versioned.version = lastEntry.version;
81
+ if (versioned.version !== version)
82
+ return undefined;
83
+ }
84
+ return versioned;
85
+ }
86
+ /**
87
+ * Indexed search for objects. Tag required, use 'latest' for current version.
88
+ */
89
+ async find(rules, tag, type) {
90
+ // TODO: This is not working the way it should. It needs to take into account the indexName
91
+ // for the rules. There's also a problem on line 143. Search will be too strict?
92
+ const binds = [];
93
+ const where = [];
94
+ const join = [];
95
+ if (tag === 'latest') {
96
+ where.push('s.version = i.version');
97
+ }
98
+ else {
99
+ join.push('INNER JOIN tags t ON t.id=i.id AND t.version=i.version');
100
+ where.push('t.tag = ?');
101
+ binds.push(tag);
102
+ }
103
+ if (type?.length) {
104
+ where.push('s.type = ?');
105
+ binds.push(type);
106
+ }
107
+ for (let i = 0; i < rules.length; i++) {
108
+ const rule = rules[i];
109
+ if ('in' in rule)
110
+ where.push(`v.value IN (${db.in(binds, rule.in.map(zerofill))})`);
111
+ else if ('notIn' in rule)
112
+ where.push(`v.value NOT IN (${db.in(binds, rule.notIn.map(zerofill))})`);
113
+ else if ('greaterThan' in rule) {
114
+ where.push(`v.value >${rule.orEqual ? '=' : ''} ?`);
115
+ binds.push(zerofill(rule.greaterThan));
116
+ }
117
+ else if ('lessThan' in rule) {
118
+ where.push(`v.value <${rule.orEqual ? '=' : ''} ?`);
119
+ binds.push(zerofill(rule.lessThan));
120
+ }
121
+ else if ('equal' in rule) {
122
+ where.push('v.value = ?');
123
+ binds.push(zerofill(rule.equal));
124
+ }
125
+ else if ('notEqual' in rule) {
126
+ where.push('v.value != ?');
127
+ binds.push(zerofill(rule.notEqual));
128
+ }
129
+ else if ('startsWith' in rule) {
130
+ where.push('v.value LIKE ?');
131
+ binds.push(zerofill(rule.startsWith) + '%');
132
+ }
133
+ }
134
+ return await db.getvals(`
135
+ SELECT DISTINCT s.id
136
+ FROM storage s
137
+ INNER JOIN indexes i ON i.id=s.id
138
+ INNER JOIN indexvalues v ON i.value_id=v.id
139
+ ${join.join('\n')}
140
+ WHERE (${where.join(') AND (')})`, binds);
141
+ }
142
+ /**
143
+ * See the indexes associated with a particular version
144
+ *
145
+ * Note that any numbers you passed in as indexes will have been stringified with
146
+ * zerofill to 10 digits. This is to help normalize lexical vs numerical comparisons.
147
+ */
148
+ async getIndexes(id, version) {
149
+ var _a;
150
+ const indexrows = await db.getall('SELECT i.*, v.value FROM indexes i INNER JOIN indexvalues v ON v.id=i.value_id WHERE i.id=? AND i.version=? ORDER BY i.name, v.value', [id, version]);
151
+ const indexhash = {};
152
+ for (const row of indexrows) {
153
+ indexhash[_a = row.name] ?? (indexhash[_a] = { name: row.name, values: [] });
154
+ indexhash[row.name].values.push(row.value);
155
+ }
156
+ return Object.values(indexhash);
157
+ }
158
+ /**
159
+ * Completely overwrite all the indexes for a specific version of an object.
160
+ */
161
+ async setIndexes(id, version, indexes) {
162
+ await db.transaction(async (db) => {
163
+ // this method expects to already be in a transaction because it's shared by
164
+ // create, update, and restore and they all do more work in the same transaction
165
+ await this._setIndexes(id, version, indexes, db);
166
+ });
167
+ }
168
+ /**
169
+ * Only overwrite a single index type, leave the others alone.
170
+ */
171
+ async setIndex(id, version, index) {
172
+ const [sindex] = zerofillIndexes([index]);
173
+ await db.transaction(async (db) => {
174
+ const existing = await db.getvals('SELECT v.value FROM indexes i INNER JOIN indexvalues v ON v.id=i.value_id WHERE i.id=? AND i.version=? AND i.name=?', [id, version, sindex.name]);
175
+ const currentSet = new Set(existing);
176
+ const nextSet = new Set(sindex.values);
177
+ const eliminate = existing.filter(v => !nextSet.has(v));
178
+ if (eliminate.length) {
179
+ const deletebinds = [id, version, sindex.name];
180
+ await db.delete(`
181
+ DELETE i FROM indexes i
182
+ INNER JOIN indexvalues v ON v.id=i.value_id
183
+ WHERE i.id=? AND i.version=? AND i.name=?
184
+ AND v.value IN (${db.in(deletebinds, eliminate)})
185
+ `, deletebinds);
186
+ }
187
+ const tobeadded = sindex.values.filter(v => !currentSet.has(v));
188
+ const valuehash = await this.getIndexValueIds(tobeadded, db);
189
+ const indexEntries = tobeadded.map(value => [id, version, index.name, valuehash[value]]);
190
+ const binds = [];
191
+ await db.insert(`
192
+ INSERT INTO indexes (id, version, name, value_id) VALUES ${db.in(binds, indexEntries)}
193
+ `, binds);
194
+ });
195
+ }
196
+ /**
197
+ * Create a new versioned object. Returns its auto-generated id (a 10 character string).
198
+ *
199
+ * You are expected to provide your own index strings; they will be stored and kept for
200
+ * the entire version history.
201
+ *
202
+ * You may optionally provide a user who is responsible for the update.
203
+ *
204
+ * @param tdb Optional transaction in which to perform creation.
205
+ */
206
+ async create(type, data, indexes, user, tdb) {
207
+ const id = nanoid(10);
208
+ try {
209
+ const action = async (db) => {
210
+ await db.insert(`
211
+ INSERT INTO storage (id, type, version, data, created, createdBy, modified, modifiedBy, comment)
212
+ VALUES (?, ?, 1, ?, NOW(), ?, NOW(), ?, '')
213
+ `, [id, type, JSON.stringify(data), user ?? '', user ?? '', '']);
214
+ await this._setIndexes(id, 1, indexes, db);
215
+ };
216
+ if (tdb)
217
+ await action(tdb);
218
+ else
219
+ await db.transaction(action);
220
+ return id;
221
+ }
222
+ catch (e) {
223
+ if (e.errno === 1062)
224
+ return await this.create(type, data, indexes, user, tdb);
225
+ throw e;
226
+ }
227
+ }
228
+ /**
229
+ * Update an object, retaining the version history.
230
+ *
231
+ * You are expected to provide your own index strings; they will be stored and kept for
232
+ * the entire version history.
233
+ *
234
+ * You may optionally provide a user who is responsible for the update and a comment string.
235
+ *
236
+ * You may also optionally provide the version that you had when you started the update for
237
+ * an optimistic concurrency check.
238
+ */
239
+ async update(id, data, indexes, { user, comment, version } = {}) {
240
+ await db.transaction(async (db) => {
241
+ const current = await db.getrow('SELECT * FROM storage WHERE id=?', [id]);
242
+ if (!current)
243
+ throw new NotFoundError('Unable to find node with id: ' + id);
244
+ if (typeof version !== 'undefined' && version !== current.version)
245
+ throw new UpdateConflictError(id);
246
+ const currentdata = JSON.parse(current.data);
247
+ const newversion = current.version + 1;
248
+ const undo = compare(data, currentdata);
249
+ await db.update(`
250
+ UPDATE storage SET modified=NOW(), version=?, data=?, modifiedBy=?, comment=? WHERE id=?
251
+ `, [newversion, JSON.stringify(data), user ?? '', comment ?? '', current.id]);
252
+ await db.insert(`
253
+ INSERT INTO versions (id, version, date, user, comment, \`undo\`)
254
+ VALUES (?, ?, ?, ?, ?, ?)
255
+ `, [current.id, current.version, current.modified, current.modifiedBy, current.comment, JSON.stringify(undo)]);
256
+ await this._setIndexes(current.id, newversion, indexes, db);
257
+ this.loaders.get(storageLoader).clear(id);
258
+ });
259
+ }
260
+ /**
261
+ * Restore a previous version of the object. Creates a new version. You could do
262
+ * this with a .get and subsequent .update, but this is here for convenience.
263
+ *
264
+ * If you provide an indexes array, it will be used. Otherwise the indexes for the version
265
+ * being restored will be restored as well.
266
+ */
267
+ async restore(id, { tag, version }, { indexes, user, comment } = {}) {
268
+ const toberestored = await this.get(id, { tag, version });
269
+ if (!toberestored)
270
+ throw new NotFoundError('Could not restore version for non-existing id: ' + id);
271
+ indexes ?? (indexes = await this.getIndexes(id, toberestored.version));
272
+ await this.update(id, toberestored.data, indexes, { user: user, comment: `restored from earlier version ${toberestored.version}${comment ? '\n' + comment : ''}` });
273
+ }
274
+ /**
275
+ * Completely remove an object and its entire version history. Use with caution. May be
276
+ * better to place a soft delete flag inside the object data.
277
+ */
278
+ async delete(id) {
279
+ await db.transaction(async (db) => {
280
+ await db.execute('DELETE FROM indexes WHERE id=?', [id]);
281
+ await db.execute('DELETE FROM tags WHERE id=?', [id]);
282
+ await db.execute('DELETE FROM versions WHERE id=?', [id]);
283
+ await db.execute('DELETE FROM storage WHERE id=?', [id]);
284
+ });
285
+ VersionedService.cleanIndexValues().catch((e) => console.error(e));
286
+ this.loaders.get(storageLoader).clear(id);
287
+ }
288
+ /**
289
+ * Tag a specific version of an object. A tag can only point to one version at a time, so this
290
+ * replaces an existing tag on another version. Cannot be undone.
291
+ *
292
+ * A common example will be tagging a version as 'published' or 'approved' as part of a workflow.
293
+ *
294
+ * 'latest' is reserved for the most current version of an object.
295
+ *
296
+ * @param version If undefined, tags latest version.
297
+ * @param user Person responsible for applying the tag.
298
+ */
299
+ async tag(id, tag, version, user) {
300
+ version ?? (version = await db.getval('SELECT version FROM storage WHERE id=?', [id]));
301
+ if (typeof version === 'undefined')
302
+ throw new NotFoundError('Unable to tag non-existing object with id ' + id);
303
+ if (tag === 'latest')
304
+ throw new Error('Object versions may not be manually tagged as latest. That tag is managed automatically.');
305
+ await db.insert('INSERT INTO tags (id, tag, version, date, user) VALUES (?, ?, ?, NOW(), ?) ON DUPLICATE KEY UPDATE version=VALUES(version), user=VALUES(user), date=VALUES(date)', [id, tag, version, user ?? '']);
306
+ this.loaders.get(tagLoader).clear({ id, tag });
307
+ }
308
+ /**
309
+ * Get the version number, user, and date associated with a tag on a given object.
310
+ *
311
+ * This method is dataloaded so it is safe to call it many times concurrently.
312
+ *
313
+ * If the object does not have the given tag, returns undefined.
314
+ */
315
+ async getTag(id, tag) {
316
+ return await this.loaders.get(tagLoader).load({ id, tag });
317
+ }
318
+ /**
319
+ * Remove a tag from an object, no matter which version it might be pointing at. Cannot be undone.
320
+ */
321
+ async removeTag(id, tag) {
322
+ await db.execute('DELETE FROM tags WHERE id=? AND tag=?', [id, tag]);
323
+ this.loaders.get(tagLoader).clear({ id, tag });
324
+ }
325
+ /**
326
+ * Remove a tag from the system. Important to do this for obsolete tags so that versions
327
+ * can be properly cleaned up. Any tag on a version will prevent it from being deleted by
328
+ * retention policy.
329
+ *
330
+ * Use with caution, this cannot be undone.
331
+ */
332
+ async globalRemoveTag(tag) {
333
+ await db.execute('DELETE FROM tags WHERE tag=?', [tag]);
334
+ this.loaders.get(tagLoader).clearAll();
335
+ }
336
+ /**
337
+ * List versions of an object so one can be picked for retrieval.
338
+ */
339
+ async listVersions(id) {
340
+ const versions = await db.getall(`
341
+ SELECT v.version, v.date, v.user, v.comment, t.tag
342
+ FROM versions v LEFT JOIN tags t ON t.id=v.id AND t.version=v.version
343
+ WHERE v.id=?
344
+ `, [id]);
345
+ const versionhash = {};
346
+ for (const { version, date, user, comment, tag } of versions) {
347
+ versionhash[version] ?? (versionhash[version] = { id, version, date, user, comment, tags: [] });
348
+ if (tag)
349
+ versionhash[version].tags.push(tag);
350
+ }
351
+ return Object.values(versionhash);
352
+ }
353
+ /**
354
+ * internal method to map a set of index strings to their id in indexvalues table
355
+ * inserts any values that do not already exist
356
+ */
357
+ async getIndexValueIds(values, db) {
358
+ await db.insert(`INSERT INTO indexvalues (value) VALUES (${values.map(v => '?').join('),(')}) ON DUPLICATE KEY UPDATE value=value`, values);
359
+ const valuerows = await db.getall(`SELECT id, value FROM indexvalues WHERE value IN (${values.map(v => '?').join(',')})`, values, { rowsAsArray: true });
360
+ const valuehash = {};
361
+ for (const [id, value] of valuerows) {
362
+ valuehash[value] = id;
363
+ }
364
+ return valuehash;
365
+ }
366
+ /**
367
+ * internal method to replace all indexes for a given version of a versioned object
368
+ * the public create, update, and setIndexes all share this common logic
369
+ */
370
+ async _setIndexes(id, version, indexes, db) {
371
+ const sindexes = zerofillIndexes(indexes);
372
+ const values = sindexes.flatMap(ind => ind.values);
373
+ const valuehash = await this.getIndexValueIds(values, db);
374
+ const indexEntries = sindexes.flatMap(ind => ind.values.map(value => [id, version, ind.name, valuehash[value]]));
375
+ const wanted = new Set(indexEntries.map(e => `${e[2]}.${e[3]}`));
376
+ const currentEntries = await db.getall('SELECT * FROM indexes WHERE id=? AND version=?', [id, version]);
377
+ const eliminate = currentEntries
378
+ .filter(e => !wanted.has(`${e.name}.${e.value_id}`))
379
+ .map(e => [e.name, e.value_id]);
380
+ if (eliminate.length) {
381
+ const deletebinds = [id, version];
382
+ await db.execute(`DELETE FROM indexes WHERE id=? AND version=? AND (name, value_id) IN (${db.in(deletebinds, eliminate)})`, deletebinds);
383
+ }
384
+ const alreadyhave = new Set(currentEntries.map(r => `${r.name}.${r.value_id}`));
385
+ const tobeadded = indexEntries.filter(e => !alreadyhave.has(`${e[2]}.${e[3]}`));
386
+ const binds = [];
387
+ await db.insert(`
388
+ INSERT INTO indexes (id, version, name, value_id) VALUES ${db.in(binds, tobeadded)}
389
+ `, binds);
390
+ }
391
+ /**
392
+ * Delete old versions in the system to implement a retention policy. Will not
393
+ * delete any versions newer than the oldest active tag. For instance, if an object on
394
+ * version 7 has a version 2 made many years ago but still tagged as 'published', version 2
395
+ * and greater will be retained. Make sure any tags you use are managed carefully.
396
+ */
397
+ static async deleteOldVersions(olderThan) {
398
+ await db.transaction(async (db) => {
399
+ // delete every version older than the date, except versions newer than the oldest tag
400
+ // for instance, "published" is a planned tag, so we would not want a version to be wiped
401
+ // out if it was still marked as published - we would have to hang on to it
402
+ await db.execute(`
403
+ DELETE v FROM versions v
404
+ LEFT JOIN (
405
+ SELECT t.id, MIN(t.version) as version
406
+ FROM tags t
407
+ INNER JOIN versions v ON v.id=t.id AND v.version=t.version
408
+ WHERE v.date < ?
409
+ GROUP BY t.id
410
+ ) t ON t.id=v.id
411
+ WHERE v.date < ? AND (t.version IS NULL OR v.version < t.version)
412
+ `, [olderThan, olderThan]);
413
+ // delete (newly) orphaned indexes
414
+ // this query is a bit slow as it requires a table scan of indexes but it
415
+ // reliably cleans up orphans
416
+ // it could be changed to clean up indexes specifically for the versions
417
+ // identified above but then it's possible some orphaned indexes would accrue
418
+ // in the system
419
+ await db.execute(`
420
+ DELETE i FROM indexes i
421
+ LEFT JOIN versions v ON i.id=v.id AND i.version=v.version
422
+ LEFT JOIN storage s ON i.id=s.id AND i.version=s.version
423
+ WHERE v.id IS NULL AND s.id IS NULL
424
+ `);
425
+ });
426
+ await this.cleanIndexValues();
427
+ await this.optimize();
428
+ }
429
+ /**
430
+ * internal method to defragment and optimize the database tables
431
+ */
432
+ static async optimize() {
433
+ if (VersionedService.optimizingTables)
434
+ return;
435
+ try {
436
+ VersionedService.optimizingTables = true;
437
+ const tables = await db.getvals(`
438
+ SELECT table_name
439
+ FROM information_schema.tables
440
+ WHERE data_free > 50*1024*1024 AND data_free / data_length > 0.25
441
+ AND table_schema=DATABASE()
442
+ AND table_name IN ('storage','versions','tags','indexes','indexvalues')
443
+ order by data_free
444
+ `);
445
+ for (const table of tables)
446
+ await db.execute(`OPTIMIZE TABLE ${table}`);
447
+ }
448
+ finally {
449
+ VersionedService.optimizingTables = false;
450
+ }
451
+ }
452
+ /**
453
+ * internal method to clean out value strings from the indexvalues table when they are no longer
454
+ * used
455
+ */
456
+ static async cleanIndexValues() {
457
+ if (VersionedService.cleaningIndexValues)
458
+ return;
459
+ try {
460
+ VersionedService.cleaningIndexValues = true;
461
+ await db.execute('DELETE v FROM indexvalues v LEFT JOIN indexes i ON v.id=i.value_id WHERE i.value_id IS NULL');
462
+ }
463
+ finally {
464
+ VersionedService.cleaningIndexValues = false;
465
+ }
466
+ }
467
+ static async init(db) {
468
+ await db.execute("\
469
+ CREATE TABLE IF NOT EXISTS `storage` ( \
470
+ `id` CHAR(10) CHARACTER SET 'ascii' COLLATE 'ascii_bin' NOT NULL, \
471
+ `type` VARCHAR(255) NOT NULL, \
472
+ `version` MEDIUMINT UNSIGNED NOT NULL, \
473
+ `data` LONGTEXT CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_bin' NOT NULL, \
474
+ `created` DATETIME NOT NULL, \
475
+ `createdBy` VARCHAR(255) NOT NULL, \
476
+ `modified` DATETIME NOT NULL, \
477
+ `modifiedBy` VARCHAR(255) NOT NULL, \
478
+ `comment` VARCHAR(255) NOT NULL, \
479
+ PRIMARY KEY (`id`), \
480
+ INDEX `type_modified` (`type`, `modified` DESC)) \
481
+ ENGINE = InnoDB \
482
+ DEFAULT CHARACTER SET = utf8mb4 \
483
+ DEFAULT COLLATE = utf8mb4_general_ci");
484
+ await db.execute("\
485
+ CREATE TABLE IF NOT EXISTS `versions` ( \
486
+ `id` CHAR(10) CHARACTER SET 'ascii' COLLATE 'ascii_bin' NOT NULL, \
487
+ `version` MEDIUMINT UNSIGNED NOT NULL, \
488
+ `date` DATETIME NOT NULL, \
489
+ `user` VARCHAR(255) NOT NULL, \
490
+ `comment` VARCHAR(255) NOT NULL, \
491
+ `undo` LONGTEXT CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_bin' NOT NULL, \
492
+ PRIMARY KEY (`id`, `version`), \
493
+ INDEX `date` (`date` ASC), \
494
+ CONSTRAINT `id` \
495
+ FOREIGN KEY (`id`) \
496
+ REFERENCES `storage` (`id`) \
497
+ ) \
498
+ ENGINE = InnoDB \
499
+ DEFAULT CHARACTER SET = utf8mb4 \
500
+ DEFAULT COLLATE = utf8mb4_general_ci");
501
+ await db.execute("\
502
+ CREATE TABLE IF NOT EXISTS `tags` ( \
503
+ `id` CHAR(10) CHARACTER SET 'ascii' COLLATE 'ascii_bin' NOT NULL, \
504
+ `tag` VARCHAR(255) CHARACTER SET 'ascii' NOT NULL, \
505
+ `version` MEDIUMINT UNSIGNED NOT NULL, \
506
+ `user` VARCHAR(255) NOT NULL, \
507
+ `date` DATETIME NOT NULL, \
508
+ PRIMARY KEY (`id`, `tag`(255)), \
509
+ CONSTRAINT `storage` \
510
+ FOREIGN KEY (`id`) \
511
+ REFERENCES `storage` (`id`) \
512
+ ) \
513
+ ENGINE = InnoDB \
514
+ DEFAULT CHARACTER SET = utf8mb4 \
515
+ DEFAULT COLLATE = utf8mb4_general_ci");
516
+ await db.execute('\
517
+ CREATE TABLE IF NOT EXISTS `indexvalues` ( \
518
+ `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, \
519
+ `value` VARCHAR(255) NOT NULL, \
520
+ PRIMARY KEY (`id`), \
521
+ UNIQUE `value` (`value`) \
522
+ ) \
523
+ ENGINE = InnoDB \
524
+ DEFAULT CHARACTER SET = utf8mb4 \
525
+ DEFAULT COLLATE = utf8mb4_general_ci');
526
+ await db.execute("\
527
+ CREATE TABLE IF NOT EXISTS `indexes` ( \
528
+ `id` CHAR(10) CHARACTER SET 'ascii' COLLATE 'ascii_bin' NOT NULL, \
529
+ `version` MEDIUMINT UNSIGNED NOT NULL, \
530
+ `name` VARCHAR(255) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL, \
531
+ `value_id` INT UNSIGNED NOT NULL, \
532
+ INDEX `value_idx` (`value_id` ASC), \
533
+ INDEX `name_value` (`name` ASC, `value_id` ASC), \
534
+ PRIMARY KEY (`id`, `version`, `name`, `value_id`), \
535
+ CONSTRAINT `value` \
536
+ FOREIGN KEY (`value_id`) \
537
+ REFERENCES `indexvalues` (`id`), \
538
+ CONSTRAINT `value_foreign` \
539
+ FOREIGN KEY (`id`) \
540
+ REFERENCES `storage` (`id`) \
541
+ ) \
542
+ ENGINE = InnoDB \
543
+ DEFAULT CHARACTER SET = utf8mb4 \
544
+ DEFAULT COLLATE = utf8mb4_general_ci");
545
+ }
546
+ }
547
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/versionedservice/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ interface VersionedCommon {
2
+ id: string;
3
+ type: string;
4
+ version: number;
5
+ created: Date;
6
+ createdBy: string;
7
+ modified: Date;
8
+ modifiedBy: string;
9
+ comment: string;
10
+ }
11
+ export interface Versioned<DataType = any> extends VersionedCommon {
12
+ data: DataType;
13
+ }
14
+ export interface VersionedStorage extends VersionedCommon {
15
+ data: string;
16
+ }
17
+ interface VersionCommon {
18
+ id: string;
19
+ version: number;
20
+ date: Date;
21
+ user: string;
22
+ comment: string;
23
+ }
24
+ export interface VersionStorage extends VersionCommon {
25
+ undo: string;
26
+ }
27
+ export interface Version extends VersionCommon {
28
+ tags: string[];
29
+ }
30
+ export interface Tag {
31
+ id: string;
32
+ version: number;
33
+ tag: string;
34
+ user: string;
35
+ date: Date;
36
+ }
37
+ export interface Index {
38
+ name: string;
39
+ values: (string | number)[];
40
+ }
41
+ export interface IndexStringified {
42
+ name: string;
43
+ values: string[];
44
+ }
45
+ export interface IndexStorage {
46
+ id: string;
47
+ version: number;
48
+ name: string;
49
+ value_id: number;
50
+ }
51
+ export interface IndexJoinedStorage extends IndexStorage {
52
+ value: string;
53
+ }
54
+ export interface SearchBaseRule {
55
+ indexName: string;
56
+ }
57
+ export interface SearchGreaterRule extends SearchBaseRule {
58
+ greaterThan: string | number;
59
+ orEqual?: boolean;
60
+ }
61
+ export interface SearchLessRule extends SearchBaseRule {
62
+ lessThan: string | number;
63
+ orEqual?: boolean;
64
+ }
65
+ export interface SearchEqualRule extends SearchBaseRule {
66
+ equal: string | number;
67
+ }
68
+ export interface SearchNotEqualRule extends SearchBaseRule {
69
+ notEqual: string | number;
70
+ }
71
+ export interface SearchInRule extends SearchBaseRule {
72
+ in: (string | number)[];
73
+ }
74
+ export interface SearchNotInRule extends SearchBaseRule {
75
+ notIn: (string | number)[];
76
+ }
77
+ export interface SearchStartsWithRule extends SearchBaseRule {
78
+ startsWith: string | number;
79
+ }
80
+ export declare type SearchRule = SearchEqualRule | SearchNotEqualRule | SearchInRule | SearchNotInRule | SearchGreaterRule | SearchLessRule | SearchStartsWithRule;
81
+ export declare class NotFoundError extends Error {
82
+ constructor(message?: string);
83
+ }
84
+ export declare class UpdateConflictError extends Error {
85
+ constructor(id: string);
86
+ }
87
+ export {};
@@ -0,0 +1,11 @@
1
+ export class NotFoundError extends Error {
2
+ constructor(message) {
3
+ super(message ?? 'Object not found.');
4
+ }
5
+ }
6
+ export class UpdateConflictError extends Error {
7
+ constructor(id) {
8
+ super(`Unable to update object with id: ${id}. Another user has updated the object since you loaded it.`);
9
+ }
10
+ }
11
+ //# sourceMappingURL=types.js.map