@dnax/core 0.69.22 → 0.69.23
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/define/index.ts +13 -0
- package/lib/collection.ts +12 -65
- package/package.json +1 -1
- package/types/index.ts +127 -0
package/define/index.ts
CHANGED
|
@@ -13,6 +13,7 @@ import type {
|
|
|
13
13
|
routeCtx,
|
|
14
14
|
sessionCtx,
|
|
15
15
|
Script,
|
|
16
|
+
TimeSeriesCollection,
|
|
16
17
|
} from "../types";
|
|
17
18
|
import { Cfg } from "../config/";
|
|
18
19
|
import { deepMerge, freeze } from "../utils";
|
|
@@ -36,6 +37,18 @@ function Config(
|
|
|
36
37
|
return config;
|
|
37
38
|
}
|
|
38
39
|
|
|
40
|
+
function TimeSeriesCollection(col: TimeSeriesCollection) {
|
|
41
|
+
col.timestamps = col?.timestamps ?? true;
|
|
42
|
+
if (!col?.timeseries?.granularity) {
|
|
43
|
+
col.timeseries.granularity = "seconds";
|
|
44
|
+
}
|
|
45
|
+
if (!col?.type) {
|
|
46
|
+
col.type = "timeseries";
|
|
47
|
+
}
|
|
48
|
+
if (!col?.fields) col.fields = [];
|
|
49
|
+
return col;
|
|
50
|
+
}
|
|
51
|
+
|
|
39
52
|
function Collection(col: Collection) {
|
|
40
53
|
col.timestamps = col?.timestamps ?? true;
|
|
41
54
|
if (!col?.fields) col.fields = [];
|
package/lib/collection.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import cleanDeep from "clean-deep";
|
|
2
2
|
import { omit } from "radash";
|
|
3
3
|
import { deepEqual } from "json-joy/lib/json-equal/deepEqual";
|
|
4
|
-
import type { Collection, Field } from "./../types/index";
|
|
4
|
+
import type { Collection, Field, TimeSeriesCollection } from "./../types/index";
|
|
5
5
|
import { Glob } from "bun";
|
|
6
6
|
import { Cfg } from "../config";
|
|
7
7
|
import { useRest } from "../driver/mongo/rest";
|
|
8
8
|
import { buildSchema } from "./schema";
|
|
9
9
|
import { cleanPath, resolvePath } from "../utils";
|
|
10
10
|
import { hookDatabase } from "../lib/database";
|
|
11
|
+
type combinedCollection = Collection & TimeSeriesCollection;
|
|
11
12
|
|
|
12
13
|
import path from "path";
|
|
13
14
|
import consola from "consola";
|
|
@@ -68,63 +69,11 @@ async function syncCollectionDatabase() {
|
|
|
68
69
|
//t.database.db.
|
|
69
70
|
|
|
70
71
|
if (t.database.driver == "mongodb") {
|
|
71
|
-
const collections: Collection[] | undefined =
|
|
72
|
-
(cn) => cn.tenant_id == t.id
|
|
73
|
-
);
|
|
72
|
+
const collections: (Collection & TimeSeriesCollection[]) | undefined =
|
|
73
|
+
Cfg.collections?.filter((cn) => cn.tenant_id == t.id);
|
|
74
74
|
if (collections?.length) {
|
|
75
75
|
// searchEngine Section
|
|
76
|
-
if (t?.searchEngine?.meilisearch?.enabled) {
|
|
77
|
-
let allIndex_ = await t?.searchEngine?.meilisearch?.client
|
|
78
|
-
?.getIndexes()
|
|
79
|
-
.then((e) => e.results)
|
|
80
|
-
.catch((err) => []);
|
|
81
76
|
|
|
82
|
-
for await (let c of collections) {
|
|
83
|
-
if (c?.searchEngine?.meilisearch?.index) {
|
|
84
|
-
if (c?.searchEngine?.meilisearch?.dispatchAction) {
|
|
85
|
-
c.searchEngine.meilisearch.dispatchAction = "auto";
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
let indexExist = allIndex_?.find(
|
|
89
|
-
(index) => index?.uid == c?.searchEngine?.meilisearch?.index
|
|
90
|
-
);
|
|
91
|
-
if (!indexExist) {
|
|
92
|
-
await t.searchEngine.meilisearch.client
|
|
93
|
-
?.createIndex(c?.searchEngine?.meilisearch?.index, {
|
|
94
|
-
primaryKey:
|
|
95
|
-
c?.searchEngine?.meilisearch?.primaryKey || "_id",
|
|
96
|
-
})
|
|
97
|
-
.catch((err) => {
|
|
98
|
-
//consola.error(err?.message);
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
let attributes = await t?.searchEngine?.meilisearch?.client
|
|
103
|
-
?.index(c?.searchEngine?.meilisearch?.index)
|
|
104
|
-
.getFilterableAttributes()
|
|
105
|
-
.catch();
|
|
106
|
-
|
|
107
|
-
if (
|
|
108
|
-
c?.searchEngine?.meilisearch?.filterableAttributes?.length
|
|
109
|
-
) {
|
|
110
|
-
let s = false;
|
|
111
|
-
if (
|
|
112
|
-
!deepEqual(
|
|
113
|
-
attributes,
|
|
114
|
-
c?.searchEngine?.meilisearch?.filterableAttributes
|
|
115
|
-
)
|
|
116
|
-
) {
|
|
117
|
-
await t?.searchEngine?.meilisearch?.client
|
|
118
|
-
?.index(c?.searchEngine?.meilisearch?.index)
|
|
119
|
-
.updateFilterableAttributes(
|
|
120
|
-
c?.searchEngine?.meilisearch?.filterableAttributes
|
|
121
|
-
)
|
|
122
|
-
.catch();
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
77
|
// DatabaseSection
|
|
129
78
|
for await (let c of collections) {
|
|
130
79
|
// boucle sur les collections
|
|
@@ -138,25 +87,23 @@ async function syncCollectionDatabase() {
|
|
|
138
87
|
});
|
|
139
88
|
}
|
|
140
89
|
|
|
141
|
-
if (c?.cache?.enabled && c?.cache?.init) {
|
|
142
|
-
c?.cache?.init({
|
|
143
|
-
rest: new useRest({
|
|
144
|
-
tenant_id: t.id,
|
|
145
|
-
}),
|
|
146
|
-
state: c?.cache?.state || {},
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
|
|
150
90
|
let collectionExist = collectionsInDatabase?.find(
|
|
151
91
|
(col) => col?.name == c.slug
|
|
152
92
|
);
|
|
153
93
|
|
|
154
94
|
//console.log(c.slug, collectionExist);
|
|
155
95
|
|
|
156
|
-
if (!collectionExist) {
|
|
96
|
+
if (!collectionExist && c?.type != "timeseries") {
|
|
157
97
|
await t.database.db?.createCollection(c.slug);
|
|
158
98
|
}
|
|
159
99
|
|
|
100
|
+
if (!collectionExist && c?.type == "timeseries") {
|
|
101
|
+
await t.database.db?.createCollection(c.slug, {
|
|
102
|
+
timeseries: c?.timeseries,
|
|
103
|
+
expireAfterSeconds: c?.expireAfterSeconds,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
160
107
|
// suppression d'index
|
|
161
108
|
c?.fields?.map((f) => {
|
|
162
109
|
if (f?.unique === false) {
|
package/package.json
CHANGED
package/types/index.ts
CHANGED
|
@@ -423,6 +423,133 @@ export type Collection = {
|
|
|
423
423
|
}; */
|
|
424
424
|
};
|
|
425
425
|
|
|
426
|
+
export type TimeSeriesCollection = {
|
|
427
|
+
type: "timeseries";
|
|
428
|
+
init?: (ctx: {
|
|
429
|
+
rest: InstanceType<typeof useRest>;
|
|
430
|
+
collection: string;
|
|
431
|
+
}) => void;
|
|
432
|
+
customApi?: {
|
|
433
|
+
aggregate?: (ctx: ctxApi) => Array<object> | null | undefined | typeof fn.error;
|
|
434
|
+
insertOne?: (ctx: ctxApi) => object | null | undefined | typeof fn.error;
|
|
435
|
+
insertMany?: (ctx: ctxApi) => Array<any> | null | undefined | typeof fn.error;
|
|
436
|
+
updateOne?: (ctx: ctxApi) => object | null | undefined | typeof fn.error;
|
|
437
|
+
updateMany?: (ctx: ctxApi) => object | null | undefined | typeof fn.error;
|
|
438
|
+
deleteOne?: (ctx: ctxApi) => object | null | undefined | typeof fn.error;
|
|
439
|
+
deleteMany?: (ctx: ctxApi) => object | null | undefined | typeof fn.error;
|
|
440
|
+
find?: (ctx: ctxApi) => Array<object> | null | undefined | typeof fn.error;
|
|
441
|
+
findWithMeta?: (ctx: ctxApi) => { meta: object; data: Array<object> } | null | undefined | typeof fn.error;
|
|
442
|
+
findOne?: (ctx: ctxApi) => object | null | undefined | typeof fn.error;
|
|
443
|
+
count?: (ctx: ctxApi) => number | null | undefined | typeof fn.error;
|
|
444
|
+
};
|
|
445
|
+
|
|
446
|
+
schema?: object;
|
|
447
|
+
auth?: {
|
|
448
|
+
enabled?: boolean;
|
|
449
|
+
handler?: (ctx: {
|
|
450
|
+
data: {
|
|
451
|
+
payload: any;
|
|
452
|
+
};
|
|
453
|
+
error: typeof fn.error;
|
|
454
|
+
c: Context;
|
|
455
|
+
rest: InstanceType<typeof useRest>;
|
|
456
|
+
session: sessionCtx;
|
|
457
|
+
}) => boolean | any;
|
|
458
|
+
};
|
|
459
|
+
middlewares?: Array<middlewareCtx>;
|
|
460
|
+
hooks?: {
|
|
461
|
+
beforeOperation?: hooksCtx;
|
|
462
|
+
beforeFind?: hooksCtx;
|
|
463
|
+
afterFind?: hooksCtx;
|
|
464
|
+
beforeUpdate?: hooksCtx;
|
|
465
|
+
afterUpdate?: hooksCtx;
|
|
466
|
+
beforeDelete?: hooksCtx;
|
|
467
|
+
afterDelete?: hooksCtx;
|
|
468
|
+
beforeInsert?: hooksCtx;
|
|
469
|
+
afterInsert?: hooksCtx;
|
|
470
|
+
beforeFindWithMeta?: hooksCtx;
|
|
471
|
+
afterFindWithMeta?: hooksCtx;
|
|
472
|
+
beforeAggregate?: hooksCtx;
|
|
473
|
+
afterAggregate?: hooksCtx;
|
|
474
|
+
beforeCount?: hooksCtx;
|
|
475
|
+
afterCount?: hooksCtx;
|
|
476
|
+
beforeUpload?: hooksCtx;
|
|
477
|
+
afterUpload?: hooksCtx;
|
|
478
|
+
beforeSearch?: hooksCtx;
|
|
479
|
+
afterSearch?: hooksCtx;
|
|
480
|
+
beforeListActivity?: hooksCtx;
|
|
481
|
+
afterListActivity?: hooksCtx;
|
|
482
|
+
};
|
|
483
|
+
access?: {
|
|
484
|
+
"*"?: accessCtx;
|
|
485
|
+
beforeAction?: accessCtx;
|
|
486
|
+
allAction?: accessCtx;
|
|
487
|
+
find?: accessCtx;
|
|
488
|
+
findOne?: accessCtx;
|
|
489
|
+
findOneAndUpdate?: accessCtx;
|
|
490
|
+
insertOne?: accessCtx;
|
|
491
|
+
insertMany?: accessCtx;
|
|
492
|
+
updateMany?: accessCtx;
|
|
493
|
+
updateOne?: accessCtx;
|
|
494
|
+
deleteOne?: accessCtx;
|
|
495
|
+
deleteMany?: accessCtx;
|
|
496
|
+
aggregate?: accessCtx;
|
|
497
|
+
upload?: accessCtx;
|
|
498
|
+
count?: accessCtx;
|
|
499
|
+
search?: accessCtx;
|
|
500
|
+
listActivity?: accessCtx;
|
|
501
|
+
findWithMeta?: accessCtx;
|
|
502
|
+
};
|
|
503
|
+
tenant_id?: string;
|
|
504
|
+
slug: string;
|
|
505
|
+
privateFields?: string[];
|
|
506
|
+
timestamps?: boolean;
|
|
507
|
+
description?: string;
|
|
508
|
+
timeseries:{
|
|
509
|
+
timeField:string;
|
|
510
|
+
metaField:string;
|
|
511
|
+
granularity:'seconds'|'minutes'|'hours';
|
|
512
|
+
};
|
|
513
|
+
fields?: Field[];
|
|
514
|
+
api?: {
|
|
515
|
+
//privateFields?: string[];
|
|
516
|
+
fields: {
|
|
517
|
+
readOnly?:string[];
|
|
518
|
+
select?:
|
|
519
|
+
| string[]
|
|
520
|
+
| ((ctx: {
|
|
521
|
+
action: Actions;
|
|
522
|
+
c: Context;
|
|
523
|
+
rest: InstanceType<typeof useRest>;
|
|
524
|
+
session: sessionCtx;
|
|
525
|
+
}) => string[]);
|
|
526
|
+
hidden?:
|
|
527
|
+
| string[]
|
|
528
|
+
| ((ctx: {
|
|
529
|
+
action: Actions;
|
|
530
|
+
c: Context;
|
|
531
|
+
rest: InstanceType<typeof useRest>;
|
|
532
|
+
session: sessionCtx;
|
|
533
|
+
}) => string[]);
|
|
534
|
+
};
|
|
535
|
+
};
|
|
536
|
+
allow?: ["dropCollection", "renameCollection"];
|
|
537
|
+
expireAfterSeconds?:number;
|
|
538
|
+
indexes?: Array<{
|
|
539
|
+
[key: string]: any;
|
|
540
|
+
unique?: Boolean;
|
|
541
|
+
expireAfterSeconds?: number;
|
|
542
|
+
partialFilterExpression?: any;
|
|
543
|
+
}>;
|
|
544
|
+
autoRemoveIndexes?: Array<{
|
|
545
|
+
[key: string]: any;
|
|
546
|
+
}>;
|
|
547
|
+
/* validate?:{
|
|
548
|
+
updateSchema?:AnySchema;
|
|
549
|
+
}; */
|
|
550
|
+
};
|
|
551
|
+
|
|
552
|
+
|
|
426
553
|
interface ApiError {
|
|
427
554
|
code: number;
|
|
428
555
|
message: string;
|