@snowtop/ent 0.1.0-alpha160-test6 → 0.1.0-alpha160
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/core/query/shared_assoc_test.d.ts +2 -0
- package/core/query/shared_assoc_test.js +804 -0
- package/core/query/shared_test.d.ts +21 -0
- package/core/query/shared_test.js +736 -0
- package/graphql/query/shared_assoc_test.d.ts +1 -0
- package/graphql/query/shared_assoc_test.js +203 -0
- package/package.json +6 -48
- package/{dist/scripts → scripts}/custom_compiler.js +0 -0
- package/{dist/scripts → scripts}/custom_graphql.js +0 -0
- package/dist/package.json +0 -64
- package/src/action/action.ts +0 -330
- package/src/action/executor.ts +0 -453
- package/src/action/experimental_action.ts +0 -277
- package/src/action/index.ts +0 -31
- package/src/action/operations.ts +0 -967
- package/src/action/orchestrator.ts +0 -1527
- package/src/action/privacy.ts +0 -37
- package/src/action/relative_value.ts +0 -242
- package/src/action/transaction.ts +0 -38
- package/src/auth/auth.ts +0 -77
- package/src/auth/index.ts +0 -8
- package/src/core/base.ts +0 -367
- package/src/core/clause.ts +0 -1065
- package/src/core/config.ts +0 -219
- package/src/core/const.ts +0 -5
- package/src/core/context.ts +0 -135
- package/src/core/convert.ts +0 -106
- package/src/core/date.ts +0 -23
- package/src/core/db.ts +0 -498
- package/src/core/ent.ts +0 -1740
- package/src/core/global_schema.ts +0 -49
- package/src/core/loaders/assoc_count_loader.ts +0 -99
- package/src/core/loaders/assoc_edge_loader.ts +0 -250
- package/src/core/loaders/index.ts +0 -12
- package/src/core/loaders/loader.ts +0 -66
- package/src/core/loaders/object_loader.ts +0 -489
- package/src/core/loaders/query_loader.ts +0 -314
- package/src/core/loaders/raw_count_loader.ts +0 -175
- package/src/core/logger.ts +0 -49
- package/src/core/privacy.ts +0 -660
- package/src/core/query/assoc_query.ts +0 -240
- package/src/core/query/custom_clause_query.ts +0 -174
- package/src/core/query/custom_query.ts +0 -302
- package/src/core/query/index.ts +0 -9
- package/src/core/query/query.ts +0 -674
- package/src/core/query_impl.ts +0 -32
- package/src/core/viewer.ts +0 -52
- package/src/ent.code-workspace +0 -73
- package/src/graphql/builtins/connection.ts +0 -25
- package/src/graphql/builtins/edge.ts +0 -16
- package/src/graphql/builtins/node.ts +0 -12
- package/src/graphql/graphql.ts +0 -891
- package/src/graphql/graphql_field_helpers.ts +0 -221
- package/src/graphql/index.ts +0 -42
- package/src/graphql/mutations/union.ts +0 -39
- package/src/graphql/node_resolver.ts +0 -122
- package/src/graphql/query/connection_type.ts +0 -113
- package/src/graphql/query/edge_connection.ts +0 -171
- package/src/graphql/query/page_info.ts +0 -34
- package/src/graphql/query/shared_edge_connection.ts +0 -287
- package/src/graphql/scalars/orderby_direction.ts +0 -13
- package/src/graphql/scalars/time.ts +0 -38
- package/src/imports/dataz/example1/_auth.ts +0 -51
- package/src/imports/dataz/example1/_viewer.ts +0 -35
- package/src/imports/index.ts +0 -213
- package/src/index.ts +0 -145
- package/src/parse_schema/parse.ts +0 -585
- package/src/schema/base_schema.ts +0 -224
- package/src/schema/field.ts +0 -1087
- package/src/schema/index.ts +0 -53
- package/src/schema/json_field.ts +0 -94
- package/src/schema/schema.ts +0 -1028
- package/src/schema/struct_field.ts +0 -234
- package/src/schema/union_field.ts +0 -105
- package/src/scripts/custom_compiler.ts +0 -331
- package/src/scripts/custom_graphql.ts +0 -550
- package/src/scripts/migrate_v0.1.ts +0 -41
- package/src/scripts/move_types.ts +0 -131
- package/src/scripts/read_schema.ts +0 -67
- package/src/setupPackage.js +0 -42
- package/src/testutils/action/complex_schemas.ts +0 -517
- package/src/testutils/builder.ts +0 -422
- package/src/testutils/context/test_context.ts +0 -25
- package/src/testutils/db/fixture.ts +0 -32
- package/src/testutils/db/temp_db.ts +0 -941
- package/src/testutils/db/value.ts +0 -294
- package/src/testutils/db_mock.ts +0 -351
- package/src/testutils/db_time_zone.ts +0 -40
- package/src/testutils/ent-graphql-tests/index.ts +0 -653
- package/src/testutils/fake_comms.ts +0 -50
- package/src/testutils/fake_data/const.ts +0 -64
- package/src/testutils/fake_data/events_query.ts +0 -145
- package/src/testutils/fake_data/fake_contact.ts +0 -150
- package/src/testutils/fake_data/fake_event.ts +0 -150
- package/src/testutils/fake_data/fake_tag.ts +0 -139
- package/src/testutils/fake_data/fake_user.ts +0 -232
- package/src/testutils/fake_data/index.ts +0 -1
- package/src/testutils/fake_data/internal.ts +0 -8
- package/src/testutils/fake_data/tag_query.ts +0 -56
- package/src/testutils/fake_data/test_helpers.ts +0 -388
- package/src/testutils/fake_data/user_query.ts +0 -524
- package/src/testutils/fake_log.ts +0 -52
- package/src/testutils/mock_date.ts +0 -10
- package/src/testutils/mock_log.ts +0 -39
- package/src/testutils/parse_sql.ts +0 -685
- package/src/testutils/test_edge_global_schema.ts +0 -49
- package/src/testutils/write.ts +0 -70
- package/src/tsc/ast.ts +0 -351
- package/src/tsc/compilerOptions.ts +0 -85
- package/src/tsc/move_generated.ts +0 -191
- package/src/tsc/transform.ts +0 -226
- package/src/tsc/transform_action.ts +0 -224
- package/src/tsc/transform_ent.ts +0 -66
- package/src/tsc/transform_schema.ts +0 -546
- package/tsconfig.json +0 -20
- /package/{dist/action → action}/action.d.ts +0 -0
- /package/{dist/action → action}/action.js +0 -0
- /package/{dist/action → action}/executor.d.ts +0 -0
- /package/{dist/action → action}/executor.js +0 -0
- /package/{dist/action → action}/experimental_action.d.ts +0 -0
- /package/{dist/action → action}/experimental_action.js +0 -0
- /package/{dist/action → action}/index.d.ts +0 -0
- /package/{dist/action → action}/index.js +0 -0
- /package/{dist/action → action}/operations.d.ts +0 -0
- /package/{dist/action → action}/operations.js +0 -0
- /package/{dist/action → action}/orchestrator.d.ts +0 -0
- /package/{dist/action → action}/orchestrator.js +0 -0
- /package/{dist/action → action}/privacy.d.ts +0 -0
- /package/{dist/action → action}/privacy.js +0 -0
- /package/{dist/action → action}/relative_value.d.ts +0 -0
- /package/{dist/action → action}/relative_value.js +0 -0
- /package/{dist/action → action}/transaction.d.ts +0 -0
- /package/{dist/action → action}/transaction.js +0 -0
- /package/{dist/auth → auth}/auth.d.ts +0 -0
- /package/{dist/auth → auth}/auth.js +0 -0
- /package/{dist/auth → auth}/index.d.ts +0 -0
- /package/{dist/auth → auth}/index.js +0 -0
- /package/{dist/core → core}/base.d.ts +0 -0
- /package/{dist/core → core}/base.js +0 -0
- /package/{dist/core → core}/clause.d.ts +0 -0
- /package/{dist/core → core}/clause.js +0 -0
- /package/{dist/core → core}/config.d.ts +0 -0
- /package/{dist/core → core}/config.js +0 -0
- /package/{dist/core → core}/const.d.ts +0 -0
- /package/{dist/core → core}/const.js +0 -0
- /package/{dist/core → core}/context.d.ts +0 -0
- /package/{dist/core → core}/context.js +0 -0
- /package/{dist/core → core}/convert.d.ts +0 -0
- /package/{dist/core → core}/convert.js +0 -0
- /package/{dist/core → core}/date.d.ts +0 -0
- /package/{dist/core → core}/date.js +0 -0
- /package/{dist/core → core}/db.d.ts +0 -0
- /package/{dist/core → core}/db.js +0 -0
- /package/{dist/core → core}/ent.d.ts +0 -0
- /package/{dist/core → core}/ent.js +0 -0
- /package/{dist/core → core}/global_schema.d.ts +0 -0
- /package/{dist/core → core}/global_schema.js +0 -0
- /package/{dist/core → core}/loaders/assoc_count_loader.d.ts +0 -0
- /package/{dist/core → core}/loaders/assoc_count_loader.js +0 -0
- /package/{dist/core → core}/loaders/assoc_edge_loader.d.ts +0 -0
- /package/{dist/core → core}/loaders/assoc_edge_loader.js +0 -0
- /package/{dist/core → core}/loaders/index.d.ts +0 -0
- /package/{dist/core → core}/loaders/index.js +0 -0
- /package/{dist/core → core}/loaders/loader.d.ts +0 -0
- /package/{dist/core → core}/loaders/loader.js +0 -0
- /package/{dist/core → core}/loaders/object_loader.d.ts +0 -0
- /package/{dist/core → core}/loaders/object_loader.js +0 -0
- /package/{dist/core → core}/loaders/query_loader.d.ts +0 -0
- /package/{dist/core → core}/loaders/query_loader.js +0 -0
- /package/{dist/core → core}/loaders/raw_count_loader.d.ts +0 -0
- /package/{dist/core → core}/loaders/raw_count_loader.js +0 -0
- /package/{dist/core → core}/logger.d.ts +0 -0
- /package/{dist/core → core}/logger.js +0 -0
- /package/{dist/core → core}/privacy.d.ts +0 -0
- /package/{dist/core → core}/privacy.js +0 -0
- /package/{dist/core → core}/query/assoc_query.d.ts +0 -0
- /package/{dist/core → core}/query/assoc_query.js +0 -0
- /package/{dist/core → core}/query/custom_clause_query.d.ts +0 -0
- /package/{dist/core → core}/query/custom_clause_query.js +0 -0
- /package/{dist/core → core}/query/custom_query.d.ts +0 -0
- /package/{dist/core → core}/query/custom_query.js +0 -0
- /package/{dist/core → core}/query/index.d.ts +0 -0
- /package/{dist/core → core}/query/index.js +0 -0
- /package/{dist/core → core}/query/query.d.ts +0 -0
- /package/{dist/core → core}/query/query.js +0 -0
- /package/{dist/core → core}/query_impl.d.ts +0 -0
- /package/{dist/core → core}/query_impl.js +0 -0
- /package/{dist/core → core}/viewer.d.ts +0 -0
- /package/{dist/core → core}/viewer.js +0 -0
- /package/{dist/graphql → graphql}/builtins/connection.d.ts +0 -0
- /package/{dist/graphql → graphql}/builtins/connection.js +0 -0
- /package/{dist/graphql → graphql}/builtins/edge.d.ts +0 -0
- /package/{dist/graphql → graphql}/builtins/edge.js +0 -0
- /package/{dist/graphql → graphql}/builtins/node.d.ts +0 -0
- /package/{dist/graphql → graphql}/builtins/node.js +0 -0
- /package/{dist/graphql → graphql}/graphql.d.ts +0 -0
- /package/{dist/graphql → graphql}/graphql.js +0 -0
- /package/{dist/graphql → graphql}/graphql_field_helpers.d.ts +0 -0
- /package/{dist/graphql → graphql}/graphql_field_helpers.js +0 -0
- /package/{dist/graphql → graphql}/index.d.ts +0 -0
- /package/{dist/graphql → graphql}/index.js +0 -0
- /package/{dist/graphql → graphql}/mutations/union.d.ts +0 -0
- /package/{dist/graphql → graphql}/mutations/union.js +0 -0
- /package/{dist/graphql → graphql}/node_resolver.d.ts +0 -0
- /package/{dist/graphql → graphql}/node_resolver.js +0 -0
- /package/{dist/graphql → graphql}/query/connection_type.d.ts +0 -0
- /package/{dist/graphql → graphql}/query/connection_type.js +0 -0
- /package/{dist/graphql → graphql}/query/edge_connection.d.ts +0 -0
- /package/{dist/graphql → graphql}/query/edge_connection.js +0 -0
- /package/{dist/graphql → graphql}/query/page_info.d.ts +0 -0
- /package/{dist/graphql → graphql}/query/page_info.js +0 -0
- /package/{dist/graphql → graphql}/query/shared_edge_connection.d.ts +0 -0
- /package/{dist/graphql → graphql}/query/shared_edge_connection.js +0 -0
- /package/{dist/graphql → graphql}/scalars/orderby_direction.d.ts +0 -0
- /package/{dist/graphql → graphql}/scalars/orderby_direction.js +0 -0
- /package/{dist/graphql → graphql}/scalars/time.d.ts +0 -0
- /package/{dist/graphql → graphql}/scalars/time.js +0 -0
- /package/{dist/imports → imports}/dataz/example1/_auth.d.ts +0 -0
- /package/{dist/imports → imports}/dataz/example1/_auth.js +0 -0
- /package/{dist/imports → imports}/dataz/example1/_viewer.d.ts +0 -0
- /package/{dist/imports → imports}/dataz/example1/_viewer.js +0 -0
- /package/{dist/imports → imports}/index.d.ts +0 -0
- /package/{dist/imports → imports}/index.js +0 -0
- /package/{dist/index.d.ts → index.d.ts} +0 -0
- /package/{dist/index.js → index.js} +0 -0
- /package/{dist/parse_schema → parse_schema}/parse.d.ts +0 -0
- /package/{dist/parse_schema → parse_schema}/parse.js +0 -0
- /package/{dist/schema → schema}/base_schema.d.ts +0 -0
- /package/{dist/schema → schema}/base_schema.js +0 -0
- /package/{dist/schema → schema}/field.d.ts +0 -0
- /package/{dist/schema → schema}/field.js +0 -0
- /package/{dist/schema → schema}/index.d.ts +0 -0
- /package/{dist/schema → schema}/index.js +0 -0
- /package/{dist/schema → schema}/json_field.d.ts +0 -0
- /package/{dist/schema → schema}/json_field.js +0 -0
- /package/{dist/schema → schema}/schema.d.ts +0 -0
- /package/{dist/schema → schema}/schema.js +0 -0
- /package/{dist/schema → schema}/struct_field.d.ts +0 -0
- /package/{dist/schema → schema}/struct_field.js +0 -0
- /package/{dist/schema → schema}/union_field.d.ts +0 -0
- /package/{dist/schema → schema}/union_field.js +0 -0
- /package/{dist/scripts → scripts}/custom_compiler.d.ts +0 -0
- /package/{dist/scripts → scripts}/custom_graphql.d.ts +0 -0
- /package/{dist/scripts → scripts}/migrate_v0.1.d.ts +0 -0
- /package/{dist/scripts → scripts}/migrate_v0.1.js +0 -0
- /package/{dist/scripts → scripts}/move_types.d.ts +0 -0
- /package/{dist/scripts → scripts}/move_types.js +0 -0
- /package/{dist/scripts → scripts}/read_schema.d.ts +0 -0
- /package/{dist/scripts → scripts}/read_schema.js +0 -0
- /package/{dist/testutils → testutils}/action/complex_schemas.d.ts +0 -0
- /package/{dist/testutils → testutils}/action/complex_schemas.js +0 -0
- /package/{dist/testutils → testutils}/builder.d.ts +0 -0
- /package/{dist/testutils → testutils}/builder.js +0 -0
- /package/{dist/testutils → testutils}/context/test_context.d.ts +0 -0
- /package/{dist/testutils → testutils}/context/test_context.js +0 -0
- /package/{dist/testutils → testutils}/db/fixture.d.ts +0 -0
- /package/{dist/testutils → testutils}/db/fixture.js +0 -0
- /package/{dist/testutils → testutils}/db/temp_db.d.ts +0 -0
- /package/{dist/testutils → testutils}/db/temp_db.js +0 -0
- /package/{dist/testutils → testutils}/db/value.d.ts +0 -0
- /package/{dist/testutils → testutils}/db/value.js +0 -0
- /package/{dist/testutils → testutils}/db_mock.d.ts +0 -0
- /package/{dist/testutils → testutils}/db_mock.js +0 -0
- /package/{dist/testutils → testutils}/db_time_zone.d.ts +0 -0
- /package/{dist/testutils → testutils}/db_time_zone.js +0 -0
- /package/{dist/testutils → testutils}/ent-graphql-tests/index.d.ts +0 -0
- /package/{dist/testutils → testutils}/ent-graphql-tests/index.js +0 -0
- /package/{dist/testutils → testutils}/fake_comms.d.ts +0 -0
- /package/{dist/testutils → testutils}/fake_comms.js +0 -0
- /package/{dist/testutils → testutils}/fake_data/const.d.ts +0 -0
- /package/{dist/testutils → testutils}/fake_data/const.js +0 -0
- /package/{dist/testutils → testutils}/fake_data/events_query.d.ts +0 -0
- /package/{dist/testutils → testutils}/fake_data/events_query.js +0 -0
- /package/{dist/testutils → testutils}/fake_data/fake_contact.d.ts +0 -0
- /package/{dist/testutils → testutils}/fake_data/fake_contact.js +0 -0
- /package/{dist/testutils → testutils}/fake_data/fake_event.d.ts +0 -0
- /package/{dist/testutils → testutils}/fake_data/fake_event.js +0 -0
- /package/{dist/testutils → testutils}/fake_data/fake_tag.d.ts +0 -0
- /package/{dist/testutils → testutils}/fake_data/fake_tag.js +0 -0
- /package/{dist/testutils → testutils}/fake_data/fake_user.d.ts +0 -0
- /package/{dist/testutils → testutils}/fake_data/fake_user.js +0 -0
- /package/{dist/testutils → testutils}/fake_data/index.d.ts +0 -0
- /package/{dist/testutils → testutils}/fake_data/index.js +0 -0
- /package/{dist/testutils → testutils}/fake_data/internal.d.ts +0 -0
- /package/{dist/testutils → testutils}/fake_data/internal.js +0 -0
- /package/{dist/testutils → testutils}/fake_data/tag_query.d.ts +0 -0
- /package/{dist/testutils → testutils}/fake_data/tag_query.js +0 -0
- /package/{dist/testutils → testutils}/fake_data/test_helpers.d.ts +0 -0
- /package/{dist/testutils → testutils}/fake_data/test_helpers.js +0 -0
- /package/{dist/testutils → testutils}/fake_data/user_query.d.ts +0 -0
- /package/{dist/testutils → testutils}/fake_data/user_query.js +0 -0
- /package/{dist/testutils → testutils}/fake_log.d.ts +0 -0
- /package/{dist/testutils → testutils}/fake_log.js +0 -0
- /package/{dist/testutils → testutils}/mock_date.d.ts +0 -0
- /package/{dist/testutils → testutils}/mock_date.js +0 -0
- /package/{dist/testutils → testutils}/mock_log.d.ts +0 -0
- /package/{dist/testutils → testutils}/mock_log.js +0 -0
- /package/{dist/testutils → testutils}/parse_sql.d.ts +0 -0
- /package/{dist/testutils → testutils}/parse_sql.js +0 -0
- /package/{dist/testutils → testutils}/test_edge_global_schema.d.ts +0 -0
- /package/{dist/testutils → testutils}/test_edge_global_schema.js +0 -0
- /package/{dist/testutils → testutils}/write.d.ts +0 -0
- /package/{dist/testutils → testutils}/write.js +0 -0
- /package/{dist/tsc → tsc}/ast.d.ts +0 -0
- /package/{dist/tsc → tsc}/ast.js +0 -0
- /package/{dist/tsc → tsc}/compilerOptions.d.ts +0 -0
- /package/{dist/tsc → tsc}/compilerOptions.js +0 -0
- /package/{dist/tsc → tsc}/move_generated.d.ts +0 -0
- /package/{dist/tsc → tsc}/move_generated.js +0 -0
- /package/{dist/tsc → tsc}/transform.d.ts +0 -0
- /package/{dist/tsc → tsc}/transform.js +0 -0
- /package/{dist/tsc → tsc}/transform_action.d.ts +0 -0
- /package/{dist/tsc → tsc}/transform_action.js +0 -0
- /package/{dist/tsc → tsc}/transform_ent.d.ts +0 -0
- /package/{dist/tsc → tsc}/transform_ent.js +0 -0
- /package/{dist/tsc → tsc}/transform_schema.d.ts +0 -0
- /package/{dist/tsc → tsc}/transform_schema.js +0 -0
package/src/action/executor.ts
DELETED
|
@@ -1,453 +0,0 @@
|
|
|
1
|
-
import { Graph } from "graph-data-structure";
|
|
2
|
-
import { ID, Ent, Viewer, Context, Data } from "../core/base";
|
|
3
|
-
import { logQuery } from "../core/ent";
|
|
4
|
-
import { Changeset, Executor } from "../action/action";
|
|
5
|
-
import { Builder, WriteOperation } from "../action";
|
|
6
|
-
import { OrchestratorOptions } from "./orchestrator";
|
|
7
|
-
import DB, { Client, Queryer, SyncClient } from "../core/db";
|
|
8
|
-
import { log } from "../core/logger";
|
|
9
|
-
import {
|
|
10
|
-
ConditionalNodeOperation,
|
|
11
|
-
ConditionalOperation,
|
|
12
|
-
DataOperation,
|
|
13
|
-
} from "./operations";
|
|
14
|
-
|
|
15
|
-
// private to ent
|
|
16
|
-
export class ListBasedExecutor<T extends Ent> implements Executor {
|
|
17
|
-
private idx: number = 0;
|
|
18
|
-
public builder?: Builder<Ent> | undefined;
|
|
19
|
-
constructor(
|
|
20
|
-
private viewer: Viewer,
|
|
21
|
-
public placeholderID: ID,
|
|
22
|
-
private operations: DataOperation<T>[],
|
|
23
|
-
private options?: OrchestratorOptions<T, Data, Viewer>,
|
|
24
|
-
private complexOptions?: ComplexExecutorOptions,
|
|
25
|
-
) {
|
|
26
|
-
this.builder = options?.builder;
|
|
27
|
-
}
|
|
28
|
-
private lastOp: DataOperation<T> | undefined;
|
|
29
|
-
private createdEnt: T | null = null;
|
|
30
|
-
private changedOps: Map<ID, WriteOperation> = new Map();
|
|
31
|
-
|
|
32
|
-
resolveValue(val: ID): Ent | null {
|
|
33
|
-
if (val === this.placeholderID && val !== undefined) {
|
|
34
|
-
return this.createdEnt;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
return null;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
builderOpChanged(builder: Builder<any>): boolean {
|
|
41
|
-
const v = this.changedOps.get(builder.placeholderID);
|
|
42
|
-
return v !== undefined && v !== builder.operation;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
[Symbol.iterator]() {
|
|
46
|
-
return this;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// returns true and null|undefined when done
|
|
50
|
-
next(): IteratorResult<DataOperation<T>> {
|
|
51
|
-
let createdEnt = getCreatedEnt(this.viewer, this.lastOp);
|
|
52
|
-
if (createdEnt) {
|
|
53
|
-
this.createdEnt = createdEnt;
|
|
54
|
-
}
|
|
55
|
-
maybeFlagOpOperationAsChanged(this.lastOp, this.changedOps);
|
|
56
|
-
|
|
57
|
-
const done = this.idx >= this.operations.length;
|
|
58
|
-
const op = maybeChangeOp(this.operations[this.idx], this.complexOptions);
|
|
59
|
-
|
|
60
|
-
this.idx++;
|
|
61
|
-
this.lastOp = op;
|
|
62
|
-
|
|
63
|
-
if (done || op === undefined) {
|
|
64
|
-
return {
|
|
65
|
-
value: op,
|
|
66
|
-
done: true,
|
|
67
|
-
};
|
|
68
|
-
}
|
|
69
|
-
return {
|
|
70
|
-
value: op,
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
async executeObservers() {
|
|
75
|
-
const action = this.options?.action;
|
|
76
|
-
if (!this.options || !action || !action.getObservers) {
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const builder = this.options.builder;
|
|
81
|
-
await Promise.all(
|
|
82
|
-
action.getObservers().map(async (observer) => {
|
|
83
|
-
try {
|
|
84
|
-
await observer.observe(builder, action.getInput());
|
|
85
|
-
} catch (err) {
|
|
86
|
-
// TODO we eventually want a global observer error handler so that this can be logged or whatever...
|
|
87
|
-
// TODO https://github.com/lolopinto/ent/issues/1429
|
|
88
|
-
}
|
|
89
|
-
}),
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
async execute(): Promise<void> {
|
|
94
|
-
await executeOperations(this, this.viewer.context);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
async preFetch?(queryer: Queryer, context: Context): Promise<void> {
|
|
98
|
-
const prefetches: Promise<void>[] = [];
|
|
99
|
-
|
|
100
|
-
for (const op of this.operations) {
|
|
101
|
-
if (op.preFetch) {
|
|
102
|
-
prefetches.push(op.preFetch(queryer, context));
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
await Promise.all(prefetches);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
async postFetch?(queryer: Queryer, context: Context): Promise<void> {
|
|
109
|
-
const postfetches: Promise<void>[] = [];
|
|
110
|
-
|
|
111
|
-
for (const op of this.operations) {
|
|
112
|
-
if (op.postFetch) {
|
|
113
|
-
postfetches.push(op.postFetch(queryer, context));
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
await Promise.all(postfetches);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
function getCreatedEnt<T extends Ent>(
|
|
121
|
-
viewer: Viewer,
|
|
122
|
-
op: DataOperation<T> | undefined,
|
|
123
|
-
): T | null {
|
|
124
|
-
if (op && op.createdEnt) {
|
|
125
|
-
return op.createdEnt(viewer);
|
|
126
|
-
}
|
|
127
|
-
return null;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
function maybeFlagOpOperationAsChanged<T extends Ent>(
|
|
131
|
-
op: DataOperation<T> | undefined,
|
|
132
|
-
changedOps: Map<ID, WriteOperation>,
|
|
133
|
-
) {
|
|
134
|
-
if (!op || !op.updatedOperation) {
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
137
|
-
const r = op.updatedOperation();
|
|
138
|
-
if (!r || r.builder.operation === r.operation) {
|
|
139
|
-
return;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
changedOps.set(r.builder.placeholderID, r.operation);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
interface ComplexExecutorOptions {
|
|
146
|
-
conditionalOverride: boolean;
|
|
147
|
-
builder: Builder<any, any>;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
export class ComplexExecutor<T extends Ent> implements Executor {
|
|
151
|
-
private idx: number = 0;
|
|
152
|
-
private mapper: Map<ID, Ent> = new Map();
|
|
153
|
-
private lastOp: DataOperation<Ent> | undefined;
|
|
154
|
-
private allOperations: DataOperation<Ent>[] = [];
|
|
155
|
-
private executors: Executor[] = [];
|
|
156
|
-
private changedOps: Map<ID, WriteOperation> = new Map();
|
|
157
|
-
public builder?: Builder<Ent> | undefined;
|
|
158
|
-
|
|
159
|
-
constructor(
|
|
160
|
-
private viewer: Viewer,
|
|
161
|
-
public placeholderID: ID,
|
|
162
|
-
operations: DataOperation[],
|
|
163
|
-
dependencies: Map<ID, Builder<T>>,
|
|
164
|
-
changesets: Changeset[],
|
|
165
|
-
options?: OrchestratorOptions<T, Data, Viewer>,
|
|
166
|
-
private complexOptions?: ComplexExecutorOptions,
|
|
167
|
-
) {
|
|
168
|
-
this.builder = options?.builder;
|
|
169
|
-
|
|
170
|
-
let graph = Graph();
|
|
171
|
-
|
|
172
|
-
const changesetMap: Map<string, Changeset> = new Map();
|
|
173
|
-
|
|
174
|
-
const impl = (c: Changeset) => {
|
|
175
|
-
changesetMap.set(c.placeholderID.toString(), c);
|
|
176
|
-
|
|
177
|
-
graph.addNode(c.placeholderID.toString());
|
|
178
|
-
if (c.dependencies) {
|
|
179
|
-
for (let [_, builder] of c.dependencies) {
|
|
180
|
-
// dependency should go first...
|
|
181
|
-
graph.addEdge(
|
|
182
|
-
builder.placeholderID.toString(),
|
|
183
|
-
c.placeholderID.toString(),
|
|
184
|
-
1,
|
|
185
|
-
);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
if (c.changesets) {
|
|
190
|
-
c.changesets.forEach((c2) => {
|
|
191
|
-
impl(c2);
|
|
192
|
-
});
|
|
193
|
-
}
|
|
194
|
-
};
|
|
195
|
-
let localChangesets = new Map<ID, Changeset>();
|
|
196
|
-
changesets.forEach((c) => localChangesets.set(c.placeholderID, c));
|
|
197
|
-
|
|
198
|
-
// create a new changeset representing the source changeset with the simple executor
|
|
199
|
-
impl({
|
|
200
|
-
viewer: this.viewer,
|
|
201
|
-
placeholderID: this.placeholderID,
|
|
202
|
-
changesets: changesets,
|
|
203
|
-
dependencies: dependencies,
|
|
204
|
-
executor: () => {
|
|
205
|
-
return new ListBasedExecutor(
|
|
206
|
-
this.viewer,
|
|
207
|
-
this.placeholderID,
|
|
208
|
-
operations,
|
|
209
|
-
options,
|
|
210
|
-
);
|
|
211
|
-
},
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
// use a set to handle repeated ops because of how the executor logic currently works
|
|
215
|
-
// TODO: can this logic be rewritten to not have a set yet avoid duplicates?
|
|
216
|
-
let nodeOps: Set<DataOperation<Ent>> = new Set();
|
|
217
|
-
let remainOps: Set<DataOperation<Ent>> = new Set();
|
|
218
|
-
|
|
219
|
-
let sorted = graph.topologicalSort(graph.nodes());
|
|
220
|
-
sorted.forEach((node) => {
|
|
221
|
-
let c = changesetMap.get(node);
|
|
222
|
-
|
|
223
|
-
if (!c) {
|
|
224
|
-
// phew. expect it to be handled somewhere else
|
|
225
|
-
// we can just skip it and expect the resolver to handle this correctly
|
|
226
|
-
// this means it's not a changeset that was created by this ent and can/will be handled elsewhere
|
|
227
|
-
if (dependencies.has(node)) {
|
|
228
|
-
return;
|
|
229
|
-
}
|
|
230
|
-
throw new Error(
|
|
231
|
-
`trying to do a write with incomplete mutation data ${node}. current node: ${placeholderID}`,
|
|
232
|
-
);
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
// get ordered list of ops
|
|
236
|
-
let executor = c.executor();
|
|
237
|
-
for (let op of executor) {
|
|
238
|
-
if (op.createdEnt) {
|
|
239
|
-
nodeOps.add(op);
|
|
240
|
-
} else {
|
|
241
|
-
remainOps.add(op);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
// only add executors that are part of the changeset to what should be tracked here
|
|
246
|
-
// or self.
|
|
247
|
-
if (
|
|
248
|
-
localChangesets.has(c.placeholderID) ||
|
|
249
|
-
c.placeholderID === placeholderID
|
|
250
|
-
) {
|
|
251
|
-
this.executors.push(executor);
|
|
252
|
-
}
|
|
253
|
-
});
|
|
254
|
-
// get all the operations and put node operations first
|
|
255
|
-
this.allOperations = [...nodeOps, ...remainOps];
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
[Symbol.iterator]() {
|
|
259
|
-
return this;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
private handleCreatedEnt() {
|
|
263
|
-
if (!this.lastOp) {
|
|
264
|
-
return;
|
|
265
|
-
}
|
|
266
|
-
let createdEnt = getCreatedEnt(this.viewer, this.lastOp);
|
|
267
|
-
if (!createdEnt) {
|
|
268
|
-
return;
|
|
269
|
-
}
|
|
270
|
-
const placeholderID = this.lastOp.placeholderID;
|
|
271
|
-
if (!placeholderID) {
|
|
272
|
-
throw new Error(
|
|
273
|
-
`op ${this.lastOp} which implements getCreatedEnt doesn't have a placeholderID`,
|
|
274
|
-
);
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
this.mapper.set(placeholderID, createdEnt);
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
next(): IteratorResult<DataOperation<Ent>> {
|
|
281
|
-
this.handleCreatedEnt();
|
|
282
|
-
maybeFlagOpOperationAsChanged(this.lastOp, this.changedOps);
|
|
283
|
-
|
|
284
|
-
const done = this.idx >= this.allOperations.length;
|
|
285
|
-
const op = maybeChangeOp(this.allOperations[this.idx], this.complexOptions);
|
|
286
|
-
this.idx++;
|
|
287
|
-
|
|
288
|
-
this.lastOp = op;
|
|
289
|
-
|
|
290
|
-
if (done || op === undefined) {
|
|
291
|
-
return {
|
|
292
|
-
value: op,
|
|
293
|
-
done: true,
|
|
294
|
-
};
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
return { value: op };
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
resolveValue(val: ID): Ent | null {
|
|
301
|
-
let ent = this.mapper.get(val);
|
|
302
|
-
if (ent) {
|
|
303
|
-
return ent;
|
|
304
|
-
}
|
|
305
|
-
for (const c of this.executors) {
|
|
306
|
-
const ent = c.resolveValue(val);
|
|
307
|
-
if (ent) {
|
|
308
|
-
return ent;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
return null;
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
builderOpChanged(builder: Builder<any>): boolean {
|
|
315
|
-
const v = this.changedOps.get(builder.placeholderID);
|
|
316
|
-
return v !== undefined && v !== builder.operation;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
async executeObservers() {
|
|
320
|
-
await Promise.all(
|
|
321
|
-
this.executors.map((executor) => {
|
|
322
|
-
if (executor.builder && this.builderOpChanged(executor.builder)) {
|
|
323
|
-
return null;
|
|
324
|
-
}
|
|
325
|
-
if (!executor.executeObservers) {
|
|
326
|
-
return null;
|
|
327
|
-
}
|
|
328
|
-
return executor.executeObservers();
|
|
329
|
-
}),
|
|
330
|
-
);
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
async execute(): Promise<void> {
|
|
334
|
-
await executeOperations(this, this.viewer.context);
|
|
335
|
-
}
|
|
336
|
-
|
|
337
|
-
async preFetch?(queryer: Queryer, context: Context): Promise<void> {
|
|
338
|
-
const prefetches: Promise<void>[] = [];
|
|
339
|
-
|
|
340
|
-
for (const exec of this.executors) {
|
|
341
|
-
if (exec.preFetch) {
|
|
342
|
-
prefetches.push(exec.preFetch(queryer, context));
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
await Promise.all(prefetches);
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
async postFetch?(queryer: Queryer, context: Context): Promise<void> {
|
|
349
|
-
const postfetches: Promise<void>[] = [];
|
|
350
|
-
|
|
351
|
-
for (const exec of this.executors) {
|
|
352
|
-
if (exec.postFetch) {
|
|
353
|
-
postfetches.push(exec.postFetch(queryer, context));
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
await Promise.all(postfetches);
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
function isSyncClient(client: Client): client is SyncClient {
|
|
361
|
-
return (client as SyncClient).execSync !== undefined;
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
export async function executeOperations(
|
|
365
|
-
executor: Executor,
|
|
366
|
-
context?: Context,
|
|
367
|
-
trackOps?: true,
|
|
368
|
-
) {
|
|
369
|
-
const client = await DB.getInstance().getNewClient();
|
|
370
|
-
|
|
371
|
-
const operations: DataOperation[] = [];
|
|
372
|
-
try {
|
|
373
|
-
if (executor.preFetch) {
|
|
374
|
-
await executor.preFetch(client, context);
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
if (isSyncClient(client)) {
|
|
378
|
-
client.runInTransaction(() => {
|
|
379
|
-
for (const operation of executor) {
|
|
380
|
-
if (operation.shortCircuit && operation.shortCircuit(executor)) {
|
|
381
|
-
continue;
|
|
382
|
-
}
|
|
383
|
-
if (trackOps) {
|
|
384
|
-
operations.push(operation);
|
|
385
|
-
}
|
|
386
|
-
if (operation.resolve) {
|
|
387
|
-
operation.resolve(executor);
|
|
388
|
-
}
|
|
389
|
-
operation.performWriteSync(client, context);
|
|
390
|
-
}
|
|
391
|
-
});
|
|
392
|
-
} else {
|
|
393
|
-
logQuery("BEGIN", []);
|
|
394
|
-
await client.query("BEGIN");
|
|
395
|
-
for (const operation of executor) {
|
|
396
|
-
if (operation.shortCircuit && operation.shortCircuit(executor)) {
|
|
397
|
-
continue;
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
if (trackOps) {
|
|
401
|
-
operations.push(operation);
|
|
402
|
-
}
|
|
403
|
-
// resolve any placeholders before writes
|
|
404
|
-
if (operation.resolve) {
|
|
405
|
-
operation.resolve(executor);
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
await operation.performWrite(client, context);
|
|
409
|
-
}
|
|
410
|
-
logQuery("COMMIT", []);
|
|
411
|
-
await client.query("COMMIT");
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
if (executor.postFetch) {
|
|
415
|
-
await executor.postFetch(client, context);
|
|
416
|
-
}
|
|
417
|
-
client.release();
|
|
418
|
-
} catch (e) {
|
|
419
|
-
if (!isSyncClient(client)) {
|
|
420
|
-
// TODO these changes break tests
|
|
421
|
-
logQuery("ROLLBACK", []);
|
|
422
|
-
await client.query("ROLLBACK");
|
|
423
|
-
}
|
|
424
|
-
client.release(e);
|
|
425
|
-
log("error", e);
|
|
426
|
-
throw e;
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
if (executor.executeObservers) {
|
|
430
|
-
try {
|
|
431
|
-
await executor.executeObservers();
|
|
432
|
-
} catch (e) {}
|
|
433
|
-
}
|
|
434
|
-
return operations;
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
function maybeChangeOp<T extends Ent = Ent>(
|
|
438
|
-
op: DataOperation<T> | undefined,
|
|
439
|
-
complexOptions?: ComplexExecutorOptions,
|
|
440
|
-
): DataOperation<T> | undefined {
|
|
441
|
-
if (
|
|
442
|
-
!op ||
|
|
443
|
-
!complexOptions?.conditionalOverride ||
|
|
444
|
-
op instanceof ConditionalNodeOperation
|
|
445
|
-
) {
|
|
446
|
-
return op;
|
|
447
|
-
}
|
|
448
|
-
if (op.createdEnt) {
|
|
449
|
-
return new ConditionalNodeOperation(op, complexOptions.builder);
|
|
450
|
-
} else {
|
|
451
|
-
return new ConditionalOperation(op, complexOptions.builder);
|
|
452
|
-
}
|
|
453
|
-
}
|
|
@@ -1,277 +0,0 @@
|
|
|
1
|
-
import { Orchestrator } from "./orchestrator";
|
|
2
|
-
import { Viewer, Ent, Data } from "../core/base";
|
|
3
|
-
import { AlwaysAllowPrivacyPolicy } from "../core/privacy";
|
|
4
|
-
import {
|
|
5
|
-
Action,
|
|
6
|
-
WriteOperation,
|
|
7
|
-
Builder,
|
|
8
|
-
Trigger,
|
|
9
|
-
Observer,
|
|
10
|
-
Changeset,
|
|
11
|
-
Validator,
|
|
12
|
-
} from "./action";
|
|
13
|
-
|
|
14
|
-
export interface ActionOptions<
|
|
15
|
-
TEnt extends Ent<TViewer>,
|
|
16
|
-
TViewer extends Viewer,
|
|
17
|
-
TData extends Data,
|
|
18
|
-
TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>,
|
|
19
|
-
> {
|
|
20
|
-
existingEnt: TExistingEnt;
|
|
21
|
-
input?: TData;
|
|
22
|
-
operation?: WriteOperation;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
type MaybeNull<T extends Ent> = T | null;
|
|
26
|
-
type TMaybleNullableEnt<T extends Ent> = T | MaybeNull<T>;
|
|
27
|
-
|
|
28
|
-
export interface EntBuilder<
|
|
29
|
-
TEnt extends Ent<TViewer>,
|
|
30
|
-
TViewer extends Viewer,
|
|
31
|
-
TInput extends Data,
|
|
32
|
-
TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>,
|
|
33
|
-
> extends Builder<TEnt, TViewer, TExistingEnt> {
|
|
34
|
-
valid(): Promise<boolean>;
|
|
35
|
-
validX(): Promise<void>;
|
|
36
|
-
save(): Promise<void>;
|
|
37
|
-
saveX(): Promise<void>;
|
|
38
|
-
editedEnt(): Promise<TEnt | null>;
|
|
39
|
-
editedEntX(): Promise<TEnt>;
|
|
40
|
-
getInput(): TInput;
|
|
41
|
-
orchestrator: Orchestrator<TEnt, TInput, TViewer, TExistingEnt>;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export class BaseAction<
|
|
45
|
-
TEnt extends Ent<TViewer>,
|
|
46
|
-
TViewer extends Viewer,
|
|
47
|
-
TInput extends Data,
|
|
48
|
-
TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>,
|
|
49
|
-
> implements
|
|
50
|
-
Action<
|
|
51
|
-
TEnt,
|
|
52
|
-
EntBuilder<TEnt, TViewer, TInput, TExistingEnt>,
|
|
53
|
-
TViewer,
|
|
54
|
-
TInput,
|
|
55
|
-
TExistingEnt
|
|
56
|
-
>
|
|
57
|
-
{
|
|
58
|
-
builder: EntBuilder<TEnt, TViewer, TInput, TExistingEnt>;
|
|
59
|
-
private input: TInput;
|
|
60
|
-
|
|
61
|
-
getPrivacyPolicy() {
|
|
62
|
-
return AlwaysAllowPrivacyPolicy;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
getTriggers(): Trigger<
|
|
66
|
-
TEnt,
|
|
67
|
-
EntBuilder<TEnt, TViewer, TInput, TExistingEnt>,
|
|
68
|
-
TViewer,
|
|
69
|
-
TInput,
|
|
70
|
-
TExistingEnt
|
|
71
|
-
>[] {
|
|
72
|
-
return [];
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
getObservers(): Observer<
|
|
76
|
-
TEnt,
|
|
77
|
-
EntBuilder<TEnt, TViewer, TInput, TExistingEnt>,
|
|
78
|
-
TViewer,
|
|
79
|
-
TInput,
|
|
80
|
-
TExistingEnt
|
|
81
|
-
>[] {
|
|
82
|
-
return [];
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
getValidators(): Validator<
|
|
86
|
-
TEnt,
|
|
87
|
-
EntBuilder<TEnt, TViewer, TInput, TExistingEnt>,
|
|
88
|
-
TViewer,
|
|
89
|
-
TInput,
|
|
90
|
-
TExistingEnt
|
|
91
|
-
>[] {
|
|
92
|
-
return [];
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
constructor(
|
|
96
|
-
public viewer: TViewer,
|
|
97
|
-
public builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TExistingEnt>,
|
|
98
|
-
options: ActionOptions<TEnt, TViewer, TInput, TExistingEnt>,
|
|
99
|
-
) {
|
|
100
|
-
let operation = options?.operation;
|
|
101
|
-
if (!operation) {
|
|
102
|
-
if (options?.existingEnt) {
|
|
103
|
-
operation = WriteOperation.Edit;
|
|
104
|
-
} else {
|
|
105
|
-
operation = WriteOperation.Insert;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
this.input = options?.input || ({} as TInput);
|
|
109
|
-
this.builder = new builderCtr(viewer, operation, this, options.existingEnt);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
static createBuilder<
|
|
113
|
-
TEnt extends Ent<TViewer>,
|
|
114
|
-
TViewer extends Viewer,
|
|
115
|
-
TInput extends Data,
|
|
116
|
-
TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>,
|
|
117
|
-
>(
|
|
118
|
-
viewer: Viewer,
|
|
119
|
-
builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TExistingEnt>,
|
|
120
|
-
options: ActionOptions<TEnt, TViewer, TInput, TExistingEnt>,
|
|
121
|
-
): Builder<TEnt> {
|
|
122
|
-
let action = new BaseAction(viewer, builderCtr, options);
|
|
123
|
-
return action.builder;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// perform a bulk action in a transaction rooted on ent T
|
|
127
|
-
// it ends up creating triggers and having all the given actions performed in a transaction
|
|
128
|
-
/**
|
|
129
|
-
* @deprecated use Transaction
|
|
130
|
-
*/
|
|
131
|
-
static bulkAction<
|
|
132
|
-
TEnt extends Ent<TViewer>,
|
|
133
|
-
TViewer extends Viewer,
|
|
134
|
-
TInput extends Data,
|
|
135
|
-
>(
|
|
136
|
-
ent: TEnt,
|
|
137
|
-
builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TEnt>,
|
|
138
|
-
...actions: Action<Ent, Builder<Ent, any>>[]
|
|
139
|
-
): BaseAction<TEnt, TViewer, TInput, TEnt> {
|
|
140
|
-
let action = new BaseAction(ent.viewer, builderCtr, {
|
|
141
|
-
existingEnt: ent,
|
|
142
|
-
});
|
|
143
|
-
action.getTriggers = () => [
|
|
144
|
-
{
|
|
145
|
-
changeset: (): Promise<Changeset>[] => {
|
|
146
|
-
return actions.map((action) => action.changeset());
|
|
147
|
-
},
|
|
148
|
-
},
|
|
149
|
-
];
|
|
150
|
-
return action;
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
changeset() {
|
|
154
|
-
return this.builder.build();
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
async valid() {
|
|
158
|
-
return this.builder.valid();
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
async validX() {
|
|
162
|
-
return this.builder.validX();
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
async save(): Promise<TEnt | null> {
|
|
166
|
-
await this.builder.save();
|
|
167
|
-
return await this.builder.editedEnt();
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
async saveX(): Promise<TEnt> {
|
|
171
|
-
await this.builder.saveX();
|
|
172
|
-
return await this.builder.editedEntX();
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
getInput() {
|
|
176
|
-
return this.input;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
export interface BuilderConstructor<
|
|
181
|
-
TEnt extends Ent<TViewer>,
|
|
182
|
-
TViewer extends Viewer,
|
|
183
|
-
TInput extends Data,
|
|
184
|
-
TExistingEnt extends TMaybleNullableEnt<TEnt> = MaybeNull<TEnt>,
|
|
185
|
-
> {
|
|
186
|
-
new (
|
|
187
|
-
viewer: TViewer,
|
|
188
|
-
operation: WriteOperation,
|
|
189
|
-
action: Action<
|
|
190
|
-
TEnt,
|
|
191
|
-
any,
|
|
192
|
-
// EntBuilder<TEnt, TViewer, TInput, TExistingEnt>,
|
|
193
|
-
TViewer,
|
|
194
|
-
TInput,
|
|
195
|
-
TExistingEnt
|
|
196
|
-
>,
|
|
197
|
-
existingEnt: TExistingEnt,
|
|
198
|
-
): EntBuilder<TEnt, TViewer, TInput, TExistingEnt>;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// this provides a way to just update a row in the database.
|
|
202
|
-
// skips privacy, triggers, observers, etc
|
|
203
|
-
// does do field validation
|
|
204
|
-
// note that only editable fields in the builder can be passed here
|
|
205
|
-
export async function updateRawObject<
|
|
206
|
-
TEnt extends Ent<TViewer>,
|
|
207
|
-
TViewer extends Viewer,
|
|
208
|
-
TInput extends Data,
|
|
209
|
-
>(
|
|
210
|
-
viewer: TViewer,
|
|
211
|
-
builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TEnt>,
|
|
212
|
-
existingEnt: TEnt,
|
|
213
|
-
input: TInput,
|
|
214
|
-
) {
|
|
215
|
-
const action = new BaseAction(viewer, builderCtr, {
|
|
216
|
-
existingEnt: existingEnt,
|
|
217
|
-
operation: WriteOperation.Edit,
|
|
218
|
-
input,
|
|
219
|
-
});
|
|
220
|
-
return action.saveX();
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
// TODO need to fix types for all these
|
|
224
|
-
|
|
225
|
-
// creates an action which has no privacy, triggers, observers etc
|
|
226
|
-
// does do field validation
|
|
227
|
-
// useful to batch a bunch of writes together with BaseAction.bulkAction
|
|
228
|
-
// note that only editable fields in the builder can be passed here
|
|
229
|
-
export function getSimpleEditAction<
|
|
230
|
-
TEnt extends Ent<TViewer>,
|
|
231
|
-
TViewer extends Viewer,
|
|
232
|
-
TInput extends Data,
|
|
233
|
-
>(
|
|
234
|
-
viewer: TViewer,
|
|
235
|
-
builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TEnt>,
|
|
236
|
-
existingEnt: TEnt,
|
|
237
|
-
input: TInput,
|
|
238
|
-
): BaseAction<TEnt, TViewer, TInput, TEnt> {
|
|
239
|
-
return new BaseAction(viewer, builderCtr, {
|
|
240
|
-
existingEnt: existingEnt,
|
|
241
|
-
operation: WriteOperation.Edit,
|
|
242
|
-
input,
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
export function getSimpleDeleteAction<
|
|
247
|
-
TEnt extends Ent<TViewer>,
|
|
248
|
-
TViewer extends Viewer,
|
|
249
|
-
TInput extends Data,
|
|
250
|
-
>(
|
|
251
|
-
viewer: TViewer,
|
|
252
|
-
builderCtr: BuilderConstructor<TEnt, TViewer, TInput, TEnt>,
|
|
253
|
-
existingEnt: TEnt,
|
|
254
|
-
input: TInput,
|
|
255
|
-
): BaseAction<TEnt, TViewer, TInput, TEnt> {
|
|
256
|
-
return new BaseAction(viewer, builderCtr, {
|
|
257
|
-
existingEnt: existingEnt,
|
|
258
|
-
operation: WriteOperation.Delete,
|
|
259
|
-
input,
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
export function getSimpleInsertAction<
|
|
264
|
-
TEnt extends Ent<TViewer>,
|
|
265
|
-
TViewer extends Viewer,
|
|
266
|
-
TInput extends Data,
|
|
267
|
-
>(
|
|
268
|
-
viewer: TViewer,
|
|
269
|
-
builderCtr: BuilderConstructor<TEnt, TViewer, TInput, null>,
|
|
270
|
-
input: TInput,
|
|
271
|
-
): BaseAction<TEnt, TViewer, TInput, null> {
|
|
272
|
-
return new BaseAction(viewer, builderCtr, {
|
|
273
|
-
operation: WriteOperation.Insert,
|
|
274
|
-
input,
|
|
275
|
-
existingEnt: null,
|
|
276
|
-
});
|
|
277
|
-
}
|