@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.
- package/LICENSE +21 -0
- package/README.md +74 -0
- package/dist/access/access.model.d.ts +2 -0
- package/dist/access/access.model.js +14 -0
- package/dist/access/access.model.js.map +1 -0
- package/dist/access/access.resolver.d.ts +15 -0
- package/dist/access/access.resolver.js +133 -0
- package/dist/access/access.resolver.js.map +1 -0
- package/dist/asset/asset.database.d.ts +12 -0
- package/dist/asset/asset.database.js +116 -0
- package/dist/asset/asset.database.js.map +1 -0
- package/dist/asset/asset.model.d.ts +81 -0
- package/dist/asset/asset.model.js +271 -0
- package/dist/asset/asset.model.js.map +1 -0
- package/dist/asset/asset.resolver.d.ts +32 -0
- package/dist/asset/asset.resolver.js +325 -0
- package/dist/asset/asset.resolver.js.map +1 -0
- package/dist/asset/asset.service.d.ts +35 -0
- package/dist/asset/asset.service.js +225 -0
- package/dist/asset/asset.service.js.map +1 -0
- package/dist/assetfolder/assetfolder.database.d.ts +7 -0
- package/dist/assetfolder/assetfolder.database.js +85 -0
- package/dist/assetfolder/assetfolder.database.js.map +1 -0
- package/dist/assetfolder/assetfolder.model.d.ts +56 -0
- package/dist/assetfolder/assetfolder.model.js +160 -0
- package/dist/assetfolder/assetfolder.model.js.map +1 -0
- package/dist/assetfolder/assetfolder.resolver.d.ts +25 -0
- package/dist/assetfolder/assetfolder.resolver.js +255 -0
- package/dist/assetfolder/assetfolder.resolver.js.map +1 -0
- package/dist/assetfolder/assetfolder.service.d.ts +39 -0
- package/dist/assetfolder/assetfolder.service.js +355 -0
- package/dist/assetfolder/assetfolder.service.js.map +1 -0
- package/dist/assetrule/assetrule.database.d.ts +5 -0
- package/dist/assetrule/assetrule.database.js +161 -0
- package/dist/assetrule/assetrule.database.js.map +1 -0
- package/dist/assetrule/assetrule.model.d.ts +71 -0
- package/dist/assetrule/assetrule.model.js +221 -0
- package/dist/assetrule/assetrule.model.js.map +1 -0
- package/dist/assetrule/assetrule.resolver.d.ts +12 -0
- package/dist/assetrule/assetrule.resolver.js +100 -0
- package/dist/assetrule/assetrule.resolver.js.map +1 -0
- package/dist/assetrule/assetrule.service.d.ts +26 -0
- package/dist/assetrule/assetrule.service.js +184 -0
- package/dist/assetrule/assetrule.service.js.map +1 -0
- package/dist/createdb.d.ts +2 -0
- package/dist/createdb.js +541 -0
- package/dist/createdb.js.map +1 -0
- package/dist/data/data.database.d.ts +7 -0
- package/dist/data/data.database.js +265 -0
- package/dist/data/data.database.js.map +1 -0
- package/dist/data/data.indexing.d.ts +2 -0
- package/dist/data/data.indexing.js +23 -0
- package/dist/data/data.indexing.js.map +1 -0
- package/dist/data/data.model.d.ts +69 -0
- package/dist/data/data.model.js +206 -0
- package/dist/data/data.model.js.map +1 -0
- package/dist/data/data.resolver.d.ts +36 -0
- package/dist/data/data.resolver.js +384 -0
- package/dist/data/data.resolver.js.map +1 -0
- package/dist/data/data.service.d.ts +41 -0
- package/dist/data/data.service.js +374 -0
- package/dist/data/data.service.js.map +1 -0
- package/dist/datafolder/datafolder.database.d.ts +7 -0
- package/dist/datafolder/datafolder.database.js +72 -0
- package/dist/datafolder/datafolder.database.js.map +1 -0
- package/dist/datafolder/datafolder.model.d.ts +48 -0
- package/dist/datafolder/datafolder.model.js +139 -0
- package/dist/datafolder/datafolder.model.js.map +1 -0
- package/dist/datafolder/datafolder.resolver.d.ts +24 -0
- package/dist/datafolder/datafolder.resolver.js +243 -0
- package/dist/datafolder/datafolder.resolver.js.map +1 -0
- package/dist/datafolder/datafolder.service.d.ts +32 -0
- package/dist/datafolder/datafolder.service.js +223 -0
- package/dist/datafolder/datafolder.service.js.map +1 -0
- package/dist/dataroot/dataroot.model.d.ts +19 -0
- package/dist/dataroot/dataroot.model.js +72 -0
- package/dist/dataroot/dataroot.model.js.map +1 -0
- package/dist/dataroot/dataroot.resolver.d.ts +11 -0
- package/dist/dataroot/dataroot.resolver.js +87 -0
- package/dist/dataroot/dataroot.resolver.js.map +1 -0
- package/dist/dataroot/dataroot.service.d.ts +12 -0
- package/dist/dataroot/dataroot.service.js +62 -0
- package/dist/dataroot/dataroot.service.js.map +1 -0
- package/dist/datarule/datarule.database.d.ts +5 -0
- package/dist/datarule/datarule.database.js +144 -0
- package/dist/datarule/datarule.database.js.map +1 -0
- package/dist/datarule/datarule.model.d.ts +55 -0
- package/dist/datarule/datarule.model.js +200 -0
- package/dist/datarule/datarule.model.js.map +1 -0
- package/dist/datarule/datarule.resolver.d.ts +13 -0
- package/dist/datarule/datarule.resolver.js +114 -0
- package/dist/datarule/datarule.resolver.js.map +1 -0
- package/dist/datarule/datarule.service.d.ts +27 -0
- package/dist/datarule/datarule.service.js +191 -0
- package/dist/datarule/datarule.service.js.map +1 -0
- package/dist/fixtures.d.ts +1 -0
- package/dist/fixtures.js +697 -0
- package/dist/fixtures.js.map +1 -0
- package/dist/fixturetemplates.d.ts +110 -0
- package/dist/fixturetemplates.js +178 -0
- package/dist/fixturetemplates.js.map +1 -0
- package/dist/globalrule/globalrule.database.d.ts +5 -0
- package/dist/globalrule/globalrule.database.js +65 -0
- package/dist/globalrule/globalrule.database.js.map +1 -0
- package/dist/globalrule/globalrule.model.d.ts +34 -0
- package/dist/globalrule/globalrule.model.js +120 -0
- package/dist/globalrule/globalrule.model.js.map +1 -0
- package/dist/globalrule/globalrule.resolver.d.ts +11 -0
- package/dist/globalrule/globalrule.resolver.js +85 -0
- package/dist/globalrule/globalrule.resolver.js.map +1 -0
- package/dist/globalrule/globalrule.service.d.ts +18 -0
- package/dist/globalrule/globalrule.service.js +111 -0
- package/dist/globalrule/globalrule.service.js.map +1 -0
- package/dist/group/group.database.d.ts +41 -0
- package/dist/group/group.database.js +190 -0
- package/dist/group/group.database.js.map +1 -0
- package/dist/group/group.model.d.ts +19 -0
- package/dist/group/group.model.js +70 -0
- package/dist/group/group.model.js.map +1 -0
- package/dist/group/group.resolver.d.ts +27 -0
- package/dist/group/group.resolver.js +275 -0
- package/dist/group/group.resolver.js.map +1 -0
- package/dist/group/group.service.d.ts +46 -0
- package/dist/group/group.service.js +384 -0
- package/dist/group/group.service.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +109 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +88 -0
- package/dist/internal.js +89 -0
- package/dist/internal.js.map +1 -0
- package/dist/migrations.d.ts +2 -0
- package/dist/migrations.js +41 -0
- package/dist/migrations.js.map +1 -0
- package/dist/organization/organization.database.d.ts +2 -0
- package/dist/organization/organization.database.js +16 -0
- package/dist/organization/organization.database.js.map +1 -0
- package/dist/organization/organization.model.d.ts +5 -0
- package/dist/organization/organization.model.js +35 -0
- package/dist/organization/organization.model.js.map +1 -0
- package/dist/organization/organization.resolver.d.ts +6 -0
- package/dist/organization/organization.resolver.js +43 -0
- package/dist/organization/organization.resolver.js.map +1 -0
- package/dist/organization/organization.service.d.ts +12 -0
- package/dist/organization/organization.service.js +35 -0
- package/dist/organization/organization.service.js.map +1 -0
- package/dist/page/page.database.d.ts +10 -0
- package/dist/page/page.database.js +269 -0
- package/dist/page/page.database.js.map +1 -0
- package/dist/page/page.indexing.d.ts +3 -0
- package/dist/page/page.indexing.js +26 -0
- package/dist/page/page.indexing.js.map +1 -0
- package/dist/page/page.migrations.d.ts +13 -0
- package/dist/page/page.migrations.js +55 -0
- package/dist/page/page.migrations.js.map +1 -0
- package/dist/page/page.model.d.ts +88 -0
- package/dist/page/page.model.js +272 -0
- package/dist/page/page.model.js.map +1 -0
- package/dist/page/page.resolver.d.ts +48 -0
- package/dist/page/page.resolver.js +542 -0
- package/dist/page/page.resolver.js.map +1 -0
- package/dist/page/page.service.d.ts +59 -0
- package/dist/page/page.service.js +399 -0
- package/dist/page/page.service.js.map +1 -0
- package/dist/page/page.util.d.ts +3 -0
- package/dist/page/page.util.js +16 -0
- package/dist/page/page.util.js.map +1 -0
- package/dist/page/page.validation.d.ts +2 -0
- package/dist/page/page.validation.js +21 -0
- package/dist/page/page.validation.js.map +1 -0
- package/dist/pagerule/pagerule.database.d.ts +5 -0
- package/dist/pagerule/pagerule.database.js +212 -0
- package/dist/pagerule/pagerule.database.js.map +1 -0
- package/dist/pagerule/pagerule.model.d.ts +71 -0
- package/dist/pagerule/pagerule.model.js +272 -0
- package/dist/pagerule/pagerule.model.js.map +1 -0
- package/dist/pagerule/pagerule.resolver.d.ts +13 -0
- package/dist/pagerule/pagerule.resolver.js +114 -0
- package/dist/pagerule/pagerule.resolver.js.map +1 -0
- package/dist/pagerule/pagerule.service.d.ts +23 -0
- package/dist/pagerule/pagerule.service.js +180 -0
- package/dist/pagerule/pagerule.service.js.map +1 -0
- package/dist/pagetree/pagetree.database.d.ts +13 -0
- package/dist/pagetree/pagetree.database.js +84 -0
- package/dist/pagetree/pagetree.database.js.map +1 -0
- package/dist/pagetree/pagetree.model.d.ts +43 -0
- package/dist/pagetree/pagetree.model.js +146 -0
- package/dist/pagetree/pagetree.model.js.map +1 -0
- package/dist/pagetree/pagetree.resolver.d.ts +23 -0
- package/dist/pagetree/pagetree.resolver.js +238 -0
- package/dist/pagetree/pagetree.resolver.js.map +1 -0
- package/dist/pagetree/pagetree.service.d.ts +25 -0
- package/dist/pagetree/pagetree.service.js +221 -0
- package/dist/pagetree/pagetree.service.js.map +1 -0
- package/dist/role/role.database.d.ts +17 -0
- package/dist/role/role.database.js +74 -0
- package/dist/role/role.database.js.map +1 -0
- package/dist/role/role.model.d.ts +26 -0
- package/dist/role/role.model.js +84 -0
- package/dist/role/role.model.js.map +1 -0
- package/dist/role/role.resolver.d.ts +27 -0
- package/dist/role/role.resolver.js +294 -0
- package/dist/role/role.resolver.js.map +1 -0
- package/dist/role/role.service.d.ts +33 -0
- package/dist/role/role.service.js +265 -0
- package/dist/role/role.service.js.map +1 -0
- package/dist/run.d.ts +1 -0
- package/dist/run.js +29 -0
- package/dist/run.js.map +1 -0
- package/dist/scalars/datetime.d.ts +2 -0
- package/dist/scalars/datetime.js +19 -0
- package/dist/scalars/datetime.js.map +1 -0
- package/dist/scalars/index.d.ts +3 -0
- package/dist/scalars/index.js +4 -0
- package/dist/scalars/index.js.map +1 -0
- package/dist/scalars/jsondata.d.ts +2 -0
- package/dist/scalars/jsondata.js +15 -0
- package/dist/scalars/jsondata.js.map +1 -0
- package/dist/scalars/urlsafestring.d.ts +4 -0
- package/dist/scalars/urlsafestring.js +28 -0
- package/dist/scalars/urlsafestring.js.map +1 -0
- package/dist/site/site.database.d.ts +15 -0
- package/dist/site/site.database.js +164 -0
- package/dist/site/site.database.js.map +1 -0
- package/dist/site/site.model.d.ts +62 -0
- package/dist/site/site.model.js +197 -0
- package/dist/site/site.model.js.map +1 -0
- package/dist/site/site.resolver.d.ts +30 -0
- package/dist/site/site.resolver.js +326 -0
- package/dist/site/site.resolver.js.map +1 -0
- package/dist/site/site.service.d.ts +35 -0
- package/dist/site/site.service.js +199 -0
- package/dist/site/site.service.js.map +1 -0
- package/dist/siterule/siterule.database.d.ts +5 -0
- package/dist/siterule/siterule.database.js +139 -0
- package/dist/siterule/siterule.database.js.map +1 -0
- package/dist/siterule/siterule.model.d.ts +53 -0
- package/dist/siterule/siterule.model.js +203 -0
- package/dist/siterule/siterule.model.js.map +1 -0
- package/dist/siterule/siterule.resolver.d.ts +12 -0
- package/dist/siterule/siterule.resolver.js +100 -0
- package/dist/siterule/siterule.resolver.js.map +1 -0
- package/dist/siterule/siterule.service.d.ts +23 -0
- package/dist/siterule/siterule.service.js +148 -0
- package/dist/siterule/siterule.service.js.map +1 -0
- package/dist/template/template.database.d.ts +15 -0
- package/dist/template/template.database.js +61 -0
- package/dist/template/template.database.js.map +1 -0
- package/dist/template/template.model.d.ts +32 -0
- package/dist/template/template.model.js +124 -0
- package/dist/template/template.model.js.map +1 -0
- package/dist/template/template.resolver.d.ts +22 -0
- package/dist/template/template.resolver.js +216 -0
- package/dist/template/template.resolver.js.map +1 -0
- package/dist/template/template.service.d.ts +27 -0
- package/dist/template/template.service.js +192 -0
- package/dist/template/template.service.js.map +1 -0
- package/dist/templaterule/templaterule.database.d.ts +5 -0
- package/dist/templaterule/templaterule.database.js +80 -0
- package/dist/templaterule/templaterule.database.js.map +1 -0
- package/dist/templaterule/templaterule.model.d.ts +38 -0
- package/dist/templaterule/templaterule.model.js +136 -0
- package/dist/templaterule/templaterule.model.js.map +1 -0
- package/dist/templaterule/templaterule.resolver.d.ts +12 -0
- package/dist/templaterule/templaterule.resolver.js +100 -0
- package/dist/templaterule/templaterule.resolver.js.map +1 -0
- package/dist/templaterule/templaterule.service.d.ts +19 -0
- package/dist/templaterule/templaterule.service.js +123 -0
- package/dist/templaterule/templaterule.service.js.map +1 -0
- package/dist/user/user.database.d.ts +22 -0
- package/dist/user/user.database.js +116 -0
- package/dist/user/user.database.js.map +1 -0
- package/dist/user/user.model.d.ts +42 -0
- package/dist/user/user.model.js +122 -0
- package/dist/user/user.model.js.map +1 -0
- package/dist/user/user.resolver.d.ts +16 -0
- package/dist/user/user.resolver.js +140 -0
- package/dist/user/user.resolver.js.map +1 -0
- package/dist/user/user.service.d.ts +29 -0
- package/dist/user/user.service.js +195 -0
- package/dist/user/user.service.js.map +1 -0
- package/dist/util/authservice.d.ts +28 -0
- package/dist/util/authservice.js +131 -0
- package/dist/util/authservice.js.map +1 -0
- package/dist/util/dates.d.ts +2 -0
- package/dist/util/dates.js +4 -0
- package/dist/util/dates.js.map +1 -0
- package/dist/util/filehandler.d.ts +15 -0
- package/dist/util/filehandler.js +48 -0
- package/dist/util/filehandler.js.map +1 -0
- package/dist/util/index.d.ts +13 -0
- package/dist/util/index.js +26 -0
- package/dist/util/index.js.map +1 -0
- package/dist/util/indexing.d.ts +12 -0
- package/dist/util/indexing.js +74 -0
- package/dist/util/indexing.js.map +1 -0
- package/dist/util/migrations.d.ts +15 -0
- package/dist/util/migrations.js +2 -0
- package/dist/util/migrations.js.map +1 -0
- package/dist/util/mutationlogger.d.ts +1 -0
- package/dist/util/mutationlogger.js +9 -0
- package/dist/util/mutationlogger.js.map +1 -0
- package/dist/util/registry.d.ts +25 -0
- package/dist/util/registry.js +66 -0
- package/dist/util/registry.js.map +1 -0
- package/dist/util/rules.d.ts +6 -0
- package/dist/util/rules.js +31 -0
- package/dist/util/rules.js.map +1 -0
- package/dist/util/sharedtypes.d.ts +3 -0
- package/dist/util/sharedtypes.js +2 -0
- package/dist/util/sharedtypes.js.map +1 -0
- package/dist/util/stopwords.d.ts +1 -0
- package/dist/util/stopwords.js +152 -0
- package/dist/util/stopwords.js.map +1 -0
- package/dist/version/version.model.d.ts +11 -0
- package/dist/version/version.model.js +46 -0
- package/dist/version/version.model.js.map +1 -0
- package/dist/version/version.resolver.d.ts +6 -0
- package/dist/version/version.resolver.js +45 -0
- package/dist/version/version.resolver.js.map +1 -0
- package/dist/versionedservice/service.d.ts +148 -0
- package/dist/versionedservice/service.js +547 -0
- package/dist/versionedservice/service.js.map +1 -0
- package/dist/versionedservice/types.d.ts +87 -0
- package/dist/versionedservice/types.js +11 -0
- package/dist/versionedservice/types.js.map +1 -0
- package/package.json +50 -0
- package/readme/DosGato.mwb +0 -0
- package/readme/DosGato.mwb.bak +0 -0
- 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
|