@snowtop/ent 0.1.0-alpha96-2a5ea200-82e5-11ed-8c55-4da1cd949242 → 0.1.0-alpha97
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/action/action.d.ts +3 -3
- package/action/executor.js +6 -1
- package/action/experimental_action.d.ts +5 -2
- package/action/experimental_action.js +15 -12
- package/action/index.d.ts +2 -0
- package/action/index.js +7 -1
- package/action/orchestrator.d.ts +4 -2
- package/action/orchestrator.js +6 -0
- package/action/relative_value.d.ts +47 -0
- package/action/relative_value.js +125 -0
- package/action/transaction.d.ts +10 -0
- package/action/transaction.js +23 -0
- package/auth/auth.d.ts +1 -1
- package/core/base.d.ts +4 -2
- package/core/clause.d.ts +6 -1
- package/core/clause.js +25 -4
- package/core/config.d.ts +2 -1
- package/core/config.js +2 -0
- package/core/date.js +1 -5
- package/core/db.d.ts +9 -6
- package/core/db.js +14 -6
- package/core/ent.d.ts +3 -1
- package/core/ent.js +76 -26
- package/core/logger.d.ts +1 -1
- package/core/query/assoc_query.d.ts +2 -2
- package/core/query/shared_assoc_test.js +1 -2
- package/core/query/shared_test.js +0 -1
- package/graphql/graphql.d.ts +6 -6
- package/graphql/graphql.js +1 -0
- package/graphql/query/connection_type.d.ts +1 -1
- package/graphql/query/shared_assoc_test.js +1 -1
- package/graphql/query/shared_edge_connection.js +0 -4
- package/imports/index.d.ts +6 -1
- package/imports/index.js +14 -3
- package/index.d.ts +1 -0
- package/package.json +16 -16
- package/parse_schema/parse.d.ts +7 -7
- package/schema/base_schema.d.ts +3 -3
- package/schema/field.d.ts +17 -12
- package/schema/field.js +18 -8
- package/schema/schema.d.ts +10 -10
- package/schema/schema.js +0 -16
- package/scripts/custom_graphql.js +30 -4
- package/testutils/action/complex_schemas.d.ts +69 -0
- package/testutils/action/complex_schemas.js +398 -0
- package/testutils/builder.d.ts +21 -36
- package/testutils/builder.js +39 -45
- package/testutils/db/temp_db.d.ts +6 -3
- package/testutils/db/temp_db.js +79 -7
- package/testutils/db/value.d.ts +1 -0
- package/testutils/db/value.js +2 -2
- package/testutils/db_mock.d.ts +16 -4
- package/testutils/db_mock.js +48 -5
- package/testutils/ent-graphql-tests/index.d.ts +7 -1
- package/testutils/ent-graphql-tests/index.js +17 -5
- package/testutils/fake_data/fake_contact.d.ts +1 -0
- package/testutils/fake_data/fake_contact.js +6 -5
- package/testutils/fake_data/fake_event.d.ts +1 -0
- package/testutils/fake_data/fake_event.js +4 -3
- package/testutils/fake_data/fake_tag.d.ts +2 -1
- package/testutils/fake_data/fake_tag.js +6 -5
- package/testutils/fake_data/fake_user.d.ts +2 -1
- package/testutils/fake_data/fake_user.js +14 -13
- package/tsc/ast.d.ts +1 -1
|
@@ -0,0 +1,398 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.getTables = exports.GroupMemberOfSchema = exports.GroupMemberOf = exports.verifyChangelogFromMeberships = exports.loadChangelogs = exports.loadMemberships = exports.verifyGroupMembers = exports.EditGroupAction = exports.GroupMembershipTrigger = exports.UserAction = exports.MessageAction = exports.createUser = exports.createGroup = exports.executeAction = exports.MessageSchema = exports.ChangelogSchema = exports.Changelog = exports.GroupMembershipSchema = exports.GroupMembership = exports.GroupSchema = exports.ContactSchema = exports.AccountSchema = exports.Account = exports.UserBalanceWithCheckSchema = exports.UserWithBalanceWithCheck = exports.UserBalanceSchema = exports.UserWithBalance = exports.UserSchema = exports.getOperations = exports.getML = exports.setupTest = void 0;
|
|
27
|
+
const ent_1 = require("../../core/ent");
|
|
28
|
+
const object_loader_1 = require("../../core/loaders/object_loader");
|
|
29
|
+
const action_1 = require("../../action/action");
|
|
30
|
+
const executor_1 = require("../../action/executor");
|
|
31
|
+
const builder_1 = require("../../testutils/builder");
|
|
32
|
+
const viewer_1 = require("../../core/viewer");
|
|
33
|
+
const field_1 = require("../../schema/field");
|
|
34
|
+
const json_field_1 = require("../../schema/json_field");
|
|
35
|
+
const fake_log_1 = require("../../testutils/fake_log");
|
|
36
|
+
const write_1 = require("../../testutils/write");
|
|
37
|
+
const mock_log_1 = require("../../testutils/mock_log");
|
|
38
|
+
const logger_1 = require("../../core/logger");
|
|
39
|
+
const action = __importStar(require("../../action"));
|
|
40
|
+
const convert_1 = require("../../core/convert");
|
|
41
|
+
const uuid_1 = require("uuid");
|
|
42
|
+
const temp_db_1 = require("../db/temp_db");
|
|
43
|
+
const db_1 = require("../../core/db");
|
|
44
|
+
const schema_1 = require("../../schema");
|
|
45
|
+
const ml = new mock_log_1.MockLogs();
|
|
46
|
+
let operations = [];
|
|
47
|
+
const edges = [
|
|
48
|
+
"fake_edge",
|
|
49
|
+
"selfContact",
|
|
50
|
+
"channelMember",
|
|
51
|
+
"senderToMessage",
|
|
52
|
+
"workspaceMember",
|
|
53
|
+
"recipientToMessage",
|
|
54
|
+
"objectToChangelog",
|
|
55
|
+
"changelogToParent",
|
|
56
|
+
];
|
|
57
|
+
function setupTest() {
|
|
58
|
+
beforeEach(async () => {
|
|
59
|
+
// does assoc_edge_config loader need to be cleared?
|
|
60
|
+
for (const edge of edges) {
|
|
61
|
+
await (0, write_1.createRowForTest)({
|
|
62
|
+
tableName: "assoc_edge_config",
|
|
63
|
+
fields: {
|
|
64
|
+
edge_table: `${edge}_table`,
|
|
65
|
+
symmetric_edge: false,
|
|
66
|
+
inverse_edge_type: null,
|
|
67
|
+
edge_type: edge,
|
|
68
|
+
edge_name: "name",
|
|
69
|
+
created_at: new Date(),
|
|
70
|
+
updated_at: new Date(),
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
ml.clear();
|
|
75
|
+
});
|
|
76
|
+
beforeAll(() => {
|
|
77
|
+
(0, logger_1.setLogLevels)(["query", "error", "cache"]);
|
|
78
|
+
ml.mock();
|
|
79
|
+
});
|
|
80
|
+
afterEach(() => {
|
|
81
|
+
ml.clear();
|
|
82
|
+
});
|
|
83
|
+
afterAll(() => {
|
|
84
|
+
ml.restore();
|
|
85
|
+
});
|
|
86
|
+
afterEach(() => {
|
|
87
|
+
fake_log_1.FakeLogger.clear();
|
|
88
|
+
operations = [];
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
exports.setupTest = setupTest;
|
|
92
|
+
function getML() {
|
|
93
|
+
return ml;
|
|
94
|
+
}
|
|
95
|
+
exports.getML = getML;
|
|
96
|
+
function getOperations() {
|
|
97
|
+
return operations;
|
|
98
|
+
}
|
|
99
|
+
exports.getOperations = getOperations;
|
|
100
|
+
exports.UserSchema = (0, builder_1.getBuilderSchemaFromFields)({
|
|
101
|
+
FirstName: (0, field_1.StringType)(),
|
|
102
|
+
LastName: (0, field_1.StringType)(),
|
|
103
|
+
EmailAddress: (0, field_1.StringType)({ nullable: true }),
|
|
104
|
+
AccountID: (0, field_1.UUIDType)({ nullable: true }),
|
|
105
|
+
}, builder_1.User);
|
|
106
|
+
class UserWithBalance extends builder_1.User {
|
|
107
|
+
}
|
|
108
|
+
exports.UserWithBalance = UserWithBalance;
|
|
109
|
+
exports.UserBalanceSchema = (0, builder_1.getBuilderSchemaFromFields)({
|
|
110
|
+
first_name: (0, field_1.StringType)(),
|
|
111
|
+
last_name: (0, field_1.StringType)(),
|
|
112
|
+
email_address: (0, field_1.StringType)({ nullable: true }),
|
|
113
|
+
balance: (0, field_1.FloatType)(),
|
|
114
|
+
}, UserWithBalance);
|
|
115
|
+
class UserWithBalanceWithCheck extends UserWithBalance {
|
|
116
|
+
}
|
|
117
|
+
exports.UserWithBalanceWithCheck = UserWithBalanceWithCheck;
|
|
118
|
+
exports.UserBalanceWithCheckSchema = (0, builder_1.getBuilderSchemaFromFields)({
|
|
119
|
+
first_name: (0, field_1.StringType)(),
|
|
120
|
+
last_name: (0, field_1.StringType)(),
|
|
121
|
+
email_address: (0, field_1.StringType)({ nullable: true }),
|
|
122
|
+
balance: (0, field_1.FloatType)(),
|
|
123
|
+
}, UserWithBalanceWithCheck, {
|
|
124
|
+
constraints: [
|
|
125
|
+
{
|
|
126
|
+
type: schema_1.ConstraintType.Check,
|
|
127
|
+
name: "positive_balance",
|
|
128
|
+
columns: ["balance"],
|
|
129
|
+
condition: "balance >= 0",
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
});
|
|
133
|
+
class Account extends builder_1.BaseEnt {
|
|
134
|
+
constructor() {
|
|
135
|
+
super(...arguments);
|
|
136
|
+
this.accountID = "";
|
|
137
|
+
this.nodeType = "Account";
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.Account = Account;
|
|
141
|
+
exports.AccountSchema = (0, builder_1.getBuilderSchemaFromFields)({}, Account);
|
|
142
|
+
exports.ContactSchema = (0, builder_1.getBuilderSchemaFromFields)({
|
|
143
|
+
FirstName: (0, field_1.StringType)(),
|
|
144
|
+
LastName: (0, field_1.StringType)(),
|
|
145
|
+
UserID: (0, field_1.StringType)(),
|
|
146
|
+
}, builder_1.Contact);
|
|
147
|
+
exports.GroupSchema = (0, builder_1.getBuilderSchemaFromFields)({
|
|
148
|
+
name: (0, field_1.StringType)(),
|
|
149
|
+
funField: (0, field_1.StringType)({ nullable: true }),
|
|
150
|
+
}, builder_1.Group);
|
|
151
|
+
class GroupMembership extends builder_1.BaseEnt {
|
|
152
|
+
constructor() {
|
|
153
|
+
super(...arguments);
|
|
154
|
+
this.nodeType = "GroupMembership";
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
exports.GroupMembership = GroupMembership;
|
|
158
|
+
exports.GroupMembershipSchema = (0, builder_1.getBuilderSchemaFromFields)({
|
|
159
|
+
ownerID: (0, field_1.UUIDType)(),
|
|
160
|
+
addedBy: (0, field_1.UUIDType)(),
|
|
161
|
+
notificationsEnabled: (0, field_1.BooleanType)(),
|
|
162
|
+
}, GroupMembership);
|
|
163
|
+
class Changelog extends builder_1.BaseEnt {
|
|
164
|
+
constructor() {
|
|
165
|
+
super(...arguments);
|
|
166
|
+
this.nodeType = "Changelog";
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
exports.Changelog = Changelog;
|
|
170
|
+
exports.ChangelogSchema = (0, builder_1.getBuilderSchemaFromFields)({
|
|
171
|
+
parentID: (0, field_1.UUIDType)({ polymorphic: true }),
|
|
172
|
+
log: (0, json_field_1.JSONBType)(),
|
|
173
|
+
}, Changelog);
|
|
174
|
+
exports.MessageSchema = (0, builder_1.getBuilderSchemaFromFields)({
|
|
175
|
+
// TODO both id fields
|
|
176
|
+
sender: (0, field_1.StringType)(),
|
|
177
|
+
recipient: (0, field_1.StringType)(),
|
|
178
|
+
message: (0, field_1.StringType)(),
|
|
179
|
+
transient: (0, field_1.BooleanType)({ nullable: true }),
|
|
180
|
+
expiresAt: (0, field_1.TimestampType)({ nullable: true }),
|
|
181
|
+
}, builder_1.Message);
|
|
182
|
+
jest.spyOn(action, "saveBuilder").mockImplementation(saveBuilder);
|
|
183
|
+
jest.spyOn(action, "saveBuilderX").mockImplementation(saveBuilderX);
|
|
184
|
+
async function saveBuilder(builder) {
|
|
185
|
+
const changeset = await builder.build();
|
|
186
|
+
const executor = changeset.executor();
|
|
187
|
+
operations = await (0, executor_1.executeOperations)(executor, builder.viewer.context, true);
|
|
188
|
+
}
|
|
189
|
+
async function saveBuilderX(builder) {
|
|
190
|
+
return saveBuilder(builder);
|
|
191
|
+
}
|
|
192
|
+
async function executeAction(action, name) {
|
|
193
|
+
const exec = await executor(action.builder);
|
|
194
|
+
if (name !== undefined) {
|
|
195
|
+
expect(exec).toBeInstanceOf(name);
|
|
196
|
+
}
|
|
197
|
+
operations = await (0, executor_1.executeOperations)(exec, action.builder.viewer.context, true);
|
|
198
|
+
return exec;
|
|
199
|
+
}
|
|
200
|
+
exports.executeAction = executeAction;
|
|
201
|
+
async function executor(builder) {
|
|
202
|
+
const changeset = await builder.build();
|
|
203
|
+
return changeset.executor();
|
|
204
|
+
}
|
|
205
|
+
async function createGroup() {
|
|
206
|
+
let groupID = (0, uuid_1.v4)();
|
|
207
|
+
let groupFields = {
|
|
208
|
+
id: groupID,
|
|
209
|
+
name: "group",
|
|
210
|
+
created_at: new Date(),
|
|
211
|
+
updated_at: new Date(),
|
|
212
|
+
};
|
|
213
|
+
// need to create the group first
|
|
214
|
+
await (0, write_1.createRowForTest)({
|
|
215
|
+
tableName: "groups",
|
|
216
|
+
fields: groupFields,
|
|
217
|
+
});
|
|
218
|
+
return new builder_1.Group(new viewer_1.LoggedOutViewer(), groupFields);
|
|
219
|
+
}
|
|
220
|
+
exports.createGroup = createGroup;
|
|
221
|
+
async function createUser() {
|
|
222
|
+
const id = (0, uuid_1.v4)();
|
|
223
|
+
return new builder_1.User(new viewer_1.IDViewer(id), { id });
|
|
224
|
+
}
|
|
225
|
+
exports.createUser = createUser;
|
|
226
|
+
class MessageAction extends builder_1.SimpleAction {
|
|
227
|
+
constructor(viewer, fields, operation, existingEnt) {
|
|
228
|
+
super(viewer, exports.MessageSchema, fields, operation, existingEnt);
|
|
229
|
+
}
|
|
230
|
+
getTriggers() {
|
|
231
|
+
return [
|
|
232
|
+
{
|
|
233
|
+
changeset: (builder, _input) => {
|
|
234
|
+
let sender = builder.fields.get("sender");
|
|
235
|
+
let recipient = builder.fields.get("recipient");
|
|
236
|
+
builder.orchestrator.addInboundEdge(sender, "senderToMessage", "user");
|
|
237
|
+
builder.orchestrator.addInboundEdge(recipient, "recipientToMessage", "user");
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
];
|
|
241
|
+
}
|
|
242
|
+
getObservers() {
|
|
243
|
+
return [new fake_log_1.EntCreationObserver()];
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
exports.MessageAction = MessageAction;
|
|
247
|
+
class UserAction extends builder_1.SimpleAction {
|
|
248
|
+
constructor(viewer, fields, operation, existingEnt) {
|
|
249
|
+
super(viewer, exports.UserSchema, fields, operation, existingEnt);
|
|
250
|
+
}
|
|
251
|
+
getTriggers() {
|
|
252
|
+
return [
|
|
253
|
+
{
|
|
254
|
+
changeset: (builder) => {
|
|
255
|
+
let firstName = builder.fields.get("FirstName");
|
|
256
|
+
let lastName = builder.fields.get("LastName");
|
|
257
|
+
this.contactAction = new builder_1.SimpleAction(builder.viewer, exports.ContactSchema, new Map([
|
|
258
|
+
["FirstName", firstName],
|
|
259
|
+
["LastName", lastName],
|
|
260
|
+
["UserID", builder],
|
|
261
|
+
]), action_1.WriteOperation.Insert, null);
|
|
262
|
+
this.contactAction.getObservers = () => [
|
|
263
|
+
new fake_log_1.EntCreationObserver(),
|
|
264
|
+
];
|
|
265
|
+
builder.orchestrator.addOutboundEdge(this.contactAction.builder, "selfContact", "contact");
|
|
266
|
+
return this.contactAction.changeset();
|
|
267
|
+
},
|
|
268
|
+
},
|
|
269
|
+
];
|
|
270
|
+
}
|
|
271
|
+
getObservers() {
|
|
272
|
+
return [new fake_log_1.EntCreationObserver()];
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
exports.UserAction = UserAction;
|
|
276
|
+
class GroupMembershipTrigger {
|
|
277
|
+
constructor(getter) {
|
|
278
|
+
this.getter = getter;
|
|
279
|
+
}
|
|
280
|
+
changeset(builder, input) {
|
|
281
|
+
const inputEdges = builder.orchestrator.getInputEdges("workspaceMember", action_1.WriteOperation.Insert);
|
|
282
|
+
const changesets = [];
|
|
283
|
+
for (const edge of inputEdges) {
|
|
284
|
+
// we're going to simplify and assume it doesn't currently exist
|
|
285
|
+
const memberAction = this.getter(builder.viewer, edge);
|
|
286
|
+
// store the membership edge in data field of member edge
|
|
287
|
+
builder.orchestrator.addOutboundEdge(edge.id, "workspaceMember", "User", {
|
|
288
|
+
data: memberAction.builder,
|
|
289
|
+
});
|
|
290
|
+
changesets.push(memberAction.changeset());
|
|
291
|
+
}
|
|
292
|
+
return Promise.all(changesets);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
exports.GroupMembershipTrigger = GroupMembershipTrigger;
|
|
296
|
+
class EditGroupAction extends builder_1.SimpleAction {
|
|
297
|
+
constructor(viewer, schema, fields, existingEnt, getter) {
|
|
298
|
+
super(viewer, schema, fields, action_1.WriteOperation.Edit, existingEnt);
|
|
299
|
+
this.viewer = viewer;
|
|
300
|
+
this.getter = getter;
|
|
301
|
+
this.getTriggers = () => [new GroupMembershipTrigger(this.getter)];
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
exports.EditGroupAction = EditGroupAction;
|
|
305
|
+
async function verifyGroupMembers(group, members) {
|
|
306
|
+
const memberEdges = await (0, ent_1.loadEdges)({
|
|
307
|
+
edgeType: "workspaceMember",
|
|
308
|
+
id1: group.id,
|
|
309
|
+
});
|
|
310
|
+
const memberIDs = members.map((ent) => ent.id);
|
|
311
|
+
expect(memberIDs.sort()).toEqual(memberEdges.map((edge) => edge.id2).sort());
|
|
312
|
+
// @ts-ignore
|
|
313
|
+
const membershipids = memberEdges
|
|
314
|
+
.map((edge) => edge.data)
|
|
315
|
+
.filter((str) => str !== null && str !== undefined);
|
|
316
|
+
return membershipids;
|
|
317
|
+
}
|
|
318
|
+
exports.verifyGroupMembers = verifyGroupMembers;
|
|
319
|
+
async function loadMemberships(viewer, membershipids) {
|
|
320
|
+
const tableName = (0, builder_1.getTableName)(exports.GroupMembershipSchema);
|
|
321
|
+
const ents = await (0, ent_1.loadEnts)(viewer, {
|
|
322
|
+
tableName,
|
|
323
|
+
ent: GroupMembership,
|
|
324
|
+
fields: ["id", "owner_id", "added_by", "notifications_enabled"],
|
|
325
|
+
loaderFactory: new object_loader_1.ObjectLoaderFactory({
|
|
326
|
+
tableName,
|
|
327
|
+
fields: ["id", "owner_id", "added_by", "notifications_enabled"],
|
|
328
|
+
key: "id",
|
|
329
|
+
}),
|
|
330
|
+
}, ...membershipids);
|
|
331
|
+
return Array.from(ents.values());
|
|
332
|
+
}
|
|
333
|
+
exports.loadMemberships = loadMemberships;
|
|
334
|
+
async function loadChangelogs(viewer, clids) {
|
|
335
|
+
const ents = await (0, ent_1.loadEnts)(viewer, {
|
|
336
|
+
tableName: "changelogs",
|
|
337
|
+
ent: Changelog,
|
|
338
|
+
fields: ["id", "parent_id", "log"],
|
|
339
|
+
loaderFactory: new object_loader_1.ObjectLoaderFactory({
|
|
340
|
+
tableName: "changelogs",
|
|
341
|
+
fields: ["id", "parent_id", "log"],
|
|
342
|
+
key: "id",
|
|
343
|
+
}),
|
|
344
|
+
}, ...clids);
|
|
345
|
+
return Array.from(ents.values());
|
|
346
|
+
}
|
|
347
|
+
exports.loadChangelogs = loadChangelogs;
|
|
348
|
+
async function verifyChangelogFromMeberships(user, memberships) {
|
|
349
|
+
await Promise.all(memberships.map(async (membership) => {
|
|
350
|
+
const edges = await (0, ent_1.loadEdges)({
|
|
351
|
+
edgeType: "objectToChangelog",
|
|
352
|
+
id1: membership.id,
|
|
353
|
+
});
|
|
354
|
+
expect(edges.length).toBe(1);
|
|
355
|
+
const clIDs = edges.map((edge) => edge.id2);
|
|
356
|
+
const cls = await loadChangelogs(user.viewer, clIDs);
|
|
357
|
+
expect(cls.length).toBe(1);
|
|
358
|
+
const cl = cls[0];
|
|
359
|
+
expect(edges[0].id2).toBe(cl.id);
|
|
360
|
+
expect((0, convert_1.convertJSON)(cl.data.log)).toMatchObject({
|
|
361
|
+
// also has ownerID...
|
|
362
|
+
addedBy: user.id,
|
|
363
|
+
notificationsEnabled: true,
|
|
364
|
+
});
|
|
365
|
+
}));
|
|
366
|
+
}
|
|
367
|
+
exports.verifyChangelogFromMeberships = verifyChangelogFromMeberships;
|
|
368
|
+
class GroupMemberOf extends builder_1.BaseEnt {
|
|
369
|
+
constructor() {
|
|
370
|
+
super(...arguments);
|
|
371
|
+
this.nodeType = "GroupMemberOf";
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
exports.GroupMemberOf = GroupMemberOf;
|
|
375
|
+
exports.GroupMemberOfSchema = (0, builder_1.getBuilderSchemaFromFields)({
|
|
376
|
+
userID: (0, field_1.UUIDType)({ index: true }),
|
|
377
|
+
addedBy: (0, field_1.UUIDType)(),
|
|
378
|
+
groupID: (0, field_1.UUIDType)(),
|
|
379
|
+
notificationsEnabled: (0, field_1.BooleanType)(),
|
|
380
|
+
}, GroupMemberOf);
|
|
381
|
+
const getTables = () => {
|
|
382
|
+
const tables = [(0, temp_db_1.assoc_edge_config_table)()];
|
|
383
|
+
edges.map((edge) => tables.push((0, temp_db_1.assoc_edge_table)(`${edge}_table`)));
|
|
384
|
+
[
|
|
385
|
+
exports.AccountSchema,
|
|
386
|
+
exports.ContactSchema,
|
|
387
|
+
exports.GroupSchema,
|
|
388
|
+
exports.UserSchema,
|
|
389
|
+
exports.MessageSchema,
|
|
390
|
+
exports.GroupMembershipSchema,
|
|
391
|
+
exports.ChangelogSchema,
|
|
392
|
+
exports.GroupMemberOfSchema,
|
|
393
|
+
exports.UserBalanceSchema,
|
|
394
|
+
exports.UserBalanceWithCheckSchema,
|
|
395
|
+
].map((s) => tables.push((0, temp_db_1.getSchemaTable)(s, db_1.Dialect.SQLite)));
|
|
396
|
+
return tables;
|
|
397
|
+
};
|
|
398
|
+
exports.getTables = getTables;
|
package/testutils/builder.d.ts
CHANGED
|
@@ -4,60 +4,45 @@ import { Action, Builder, Changeset, WriteOperation, Validator, Trigger, Observe
|
|
|
4
4
|
import { FieldMap, Schema } from "../schema";
|
|
5
5
|
import { SchemaConfig, EntSchema } from "../schema/base_schema";
|
|
6
6
|
import { FieldInfoMap } from "../schema/schema";
|
|
7
|
-
|
|
7
|
+
import { Clause } from "src/core/clause";
|
|
8
|
+
export declare class BaseEnt {
|
|
9
|
+
viewer: Viewer;
|
|
10
|
+
readonly data: Data;
|
|
11
|
+
readonly id: ID;
|
|
12
|
+
constructor(viewer: Viewer, data: Data);
|
|
13
|
+
getKey(): string;
|
|
14
|
+
getPrivacyPolicy(): PrivacyPolicy;
|
|
15
|
+
__setRawDBData(data: Data): void;
|
|
16
|
+
}
|
|
17
|
+
export declare class User extends BaseEnt implements Ent {
|
|
8
18
|
viewer: Viewer;
|
|
9
19
|
data: Data;
|
|
10
|
-
id: ID;
|
|
11
20
|
accountID: string;
|
|
12
21
|
nodeType: string;
|
|
13
|
-
getPrivacyPolicy(): PrivacyPolicy<this>;
|
|
14
22
|
firstName: string;
|
|
15
23
|
constructor(viewer: Viewer, data: Data);
|
|
16
24
|
}
|
|
17
|
-
export declare class Event implements Ent {
|
|
18
|
-
viewer: Viewer;
|
|
19
|
-
data: Data;
|
|
20
|
-
id: ID;
|
|
25
|
+
export declare class Event extends BaseEnt implements Ent {
|
|
21
26
|
accountID: string;
|
|
22
27
|
nodeType: string;
|
|
23
|
-
getPrivacyPolicy(): PrivacyPolicy<this>;
|
|
24
|
-
constructor(viewer: Viewer, data: Data);
|
|
25
28
|
}
|
|
26
|
-
export declare class Contact implements Ent {
|
|
27
|
-
viewer: Viewer;
|
|
28
|
-
data: Data;
|
|
29
|
-
id: ID;
|
|
29
|
+
export declare class Contact extends BaseEnt implements Ent {
|
|
30
30
|
accountID: string;
|
|
31
31
|
nodeType: string;
|
|
32
32
|
getPrivacyPolicy(): PrivacyPolicy<this>;
|
|
33
|
-
constructor(viewer: Viewer, data: Data);
|
|
34
33
|
}
|
|
35
|
-
export declare class Group implements Ent {
|
|
36
|
-
viewer: Viewer;
|
|
37
|
-
data: Data;
|
|
38
|
-
id: ID;
|
|
34
|
+
export declare class Group extends BaseEnt implements Ent {
|
|
39
35
|
accountID: string;
|
|
40
36
|
nodeType: string;
|
|
41
37
|
getPrivacyPolicy(): PrivacyPolicy<this>;
|
|
42
|
-
constructor(viewer: Viewer, data: Data);
|
|
43
38
|
}
|
|
44
|
-
export declare class Message implements Ent {
|
|
45
|
-
viewer: Viewer;
|
|
46
|
-
data: Data;
|
|
47
|
-
id: ID;
|
|
39
|
+
export declare class Message extends BaseEnt implements Ent {
|
|
48
40
|
accountID: string;
|
|
49
41
|
nodeType: string;
|
|
50
|
-
getPrivacyPolicy(): PrivacyPolicy<this>;
|
|
51
|
-
constructor(viewer: Viewer, data: Data);
|
|
52
42
|
}
|
|
53
|
-
export declare class Address implements Ent {
|
|
54
|
-
viewer: Viewer;
|
|
55
|
-
data: Data;
|
|
56
|
-
id: ID;
|
|
43
|
+
export declare class Address extends BaseEnt implements Ent {
|
|
57
44
|
accountID: string;
|
|
58
45
|
nodeType: string;
|
|
59
|
-
getPrivacyPolicy(): PrivacyPolicy<this>;
|
|
60
|
-
constructor(viewer: Viewer, data: Data);
|
|
61
46
|
}
|
|
62
47
|
export interface BuilderSchema<T extends Ent> extends Schema {
|
|
63
48
|
ent: EntConstructor<T>;
|
|
@@ -67,13 +52,13 @@ export declare class EntBuilderSchema<T extends Ent> extends EntSchema {
|
|
|
67
52
|
constructor(ent: EntConstructor<T>, cfg: SchemaConfig);
|
|
68
53
|
}
|
|
69
54
|
export declare function getBuilderSchema<T extends Ent>(cfg: SchemaConfig, ent: EntConstructor<T>): BuilderSchema<T>;
|
|
70
|
-
export declare function getBuilderSchemaFromFields<T extends Ent>(fields: FieldMap, ent: EntConstructor<T
|
|
55
|
+
export declare function getBuilderSchemaFromFields<T extends Ent>(fields: FieldMap, ent: EntConstructor<T>, opts?: Partial<Exclude<SchemaConfig, "fields">>): BuilderSchema<T>;
|
|
71
56
|
export declare function getBuilderSchemaTZFromFields<T extends Ent>(fields: FieldMap, ent: EntConstructor<T>): BuilderSchema<T>;
|
|
72
57
|
export declare function getSchemaName(value: BuilderSchema<Ent>): string;
|
|
73
58
|
export declare function getTableName(value: BuilderSchema<Ent>): string;
|
|
74
59
|
export declare function getFieldInfo(value: BuilderSchema<Ent>): FieldInfoMap;
|
|
75
|
-
|
|
76
|
-
|
|
60
|
+
type MaybeNull<T extends Ent> = T | null;
|
|
61
|
+
type TMaybleNullableEnt<T extends Ent> = T | MaybeNull<T>;
|
|
77
62
|
export declare class SimpleBuilder<T extends Ent, TExistingEnt extends TMaybleNullableEnt<T> = MaybeNull<T>> implements Builder<T, Viewer, TExistingEnt> {
|
|
78
63
|
viewer: Viewer;
|
|
79
64
|
private schema;
|
|
@@ -85,7 +70,7 @@ export declare class SimpleBuilder<T extends Ent, TExistingEnt extends TMaybleNu
|
|
|
85
70
|
fields: Map<string, any>;
|
|
86
71
|
nodeType: string;
|
|
87
72
|
m: Map<string, any>;
|
|
88
|
-
constructor(viewer: Viewer, schema: BuilderSchema<T>, fields: Map<string, any>, operation: WriteOperation, existingEnt: TExistingEnt, action?: Action<T, SimpleBuilder<T, TExistingEnt>, Viewer, Data, TExistingEnt> | undefined);
|
|
73
|
+
constructor(viewer: Viewer, schema: BuilderSchema<T>, fields: Map<string, any>, operation: WriteOperation, existingEnt: TExistingEnt, action?: Action<T, SimpleBuilder<T, TExistingEnt>, Viewer, Data, TExistingEnt> | undefined, expressions?: Map<string, Clause>);
|
|
89
74
|
getInput(): Data;
|
|
90
75
|
updateInput(input: Data): void;
|
|
91
76
|
storeData(k: string, v: any): void;
|
|
@@ -106,7 +91,7 @@ export declare class SimpleAction<T extends Ent, TExistingEnt extends TMaybleNul
|
|
|
106
91
|
private fields;
|
|
107
92
|
builder: SimpleBuilder<T, TExistingEnt>;
|
|
108
93
|
viewerForEntLoad: viewerEntLoadFunc | undefined;
|
|
109
|
-
constructor(viewer: Viewer, schema: BuilderSchema<T>, fields: Map<string, any>, operation: WriteOperation | undefined, existingEnt: TExistingEnt);
|
|
94
|
+
constructor(viewer: Viewer, schema: BuilderSchema<T>, fields: Map<string, any>, operation: WriteOperation | undefined, existingEnt: TExistingEnt, expressions?: Map<string, Clause>);
|
|
110
95
|
getTriggers(): (Trigger<T, SimpleBuilder<T>> | Array<Trigger<T, SimpleBuilder<T>>>)[];
|
|
111
96
|
getValidators(): Validator<T, SimpleBuilder<T>>[];
|
|
112
97
|
getObservers(): Observer<T, SimpleBuilder<T>>[];
|
package/testutils/builder.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.SimpleAction = exports.SimpleBuilder = exports.getFieldInfo = exports.getTableName = exports.getSchemaName = exports.getBuilderSchemaTZFromFields = exports.getBuilderSchemaFromFields = exports.getBuilderSchema = exports.EntBuilderSchema = exports.Address = exports.Message = exports.Group = exports.Contact = exports.Event = exports.User = void 0;
|
|
6
|
+
exports.SimpleAction = exports.SimpleBuilder = exports.getFieldInfo = exports.getTableName = exports.getSchemaName = exports.getBuilderSchemaTZFromFields = exports.getBuilderSchemaFromFields = exports.getBuilderSchema = exports.EntBuilderSchema = exports.Address = exports.Message = exports.Group = exports.Contact = exports.Event = exports.User = exports.BaseEnt = void 0;
|
|
7
7
|
const privacy_1 = require("../core/privacy");
|
|
8
8
|
const orchestrator_1 = require("../action/orchestrator");
|
|
9
9
|
const action_1 = require("../action");
|
|
@@ -16,86 +16,79 @@ const convert_1 = require("../core/convert");
|
|
|
16
16
|
const camel_case_1 = require("camel-case");
|
|
17
17
|
const base_schema_1 = require("../schema/base_schema");
|
|
18
18
|
const schema_2 = require("../schema/schema");
|
|
19
|
-
class
|
|
19
|
+
class BaseEnt {
|
|
20
20
|
constructor(viewer, data) {
|
|
21
21
|
this.viewer = viewer;
|
|
22
22
|
this.data = data;
|
|
23
|
-
this.accountID = "";
|
|
24
|
-
this.nodeType = "User";
|
|
25
23
|
this.data.created_at = (0, convert_1.convertDate)(data.created_at);
|
|
26
24
|
this.data.updated_at = (0, convert_1.convertDate)(data.updated_at);
|
|
27
|
-
this.id = data.
|
|
28
|
-
|
|
25
|
+
this.id = data[this.getKey()];
|
|
26
|
+
}
|
|
27
|
+
getKey() {
|
|
28
|
+
return "id";
|
|
29
29
|
}
|
|
30
30
|
getPrivacyPolicy() {
|
|
31
31
|
return privacy_1.AlwaysAllowPrivacyPolicy;
|
|
32
32
|
}
|
|
33
|
+
__setRawDBData(data) {
|
|
34
|
+
// doesn't apply here so ignore...
|
|
35
|
+
}
|
|
33
36
|
}
|
|
34
|
-
exports.
|
|
35
|
-
class
|
|
37
|
+
exports.BaseEnt = BaseEnt;
|
|
38
|
+
class User extends BaseEnt {
|
|
36
39
|
constructor(viewer, data) {
|
|
40
|
+
super(viewer, data);
|
|
37
41
|
this.viewer = viewer;
|
|
38
42
|
this.data = data;
|
|
39
43
|
this.accountID = "";
|
|
40
|
-
this.nodeType = "
|
|
41
|
-
this.
|
|
44
|
+
this.nodeType = "User";
|
|
45
|
+
this.firstName = data.first_name;
|
|
42
46
|
}
|
|
43
|
-
|
|
44
|
-
|
|
47
|
+
}
|
|
48
|
+
exports.User = User;
|
|
49
|
+
class Event extends BaseEnt {
|
|
50
|
+
constructor() {
|
|
51
|
+
super(...arguments);
|
|
52
|
+
this.accountID = "";
|
|
53
|
+
this.nodeType = "Event";
|
|
45
54
|
}
|
|
46
55
|
}
|
|
47
56
|
exports.Event = Event;
|
|
48
|
-
class Contact {
|
|
49
|
-
constructor(
|
|
50
|
-
|
|
51
|
-
this.data = data;
|
|
57
|
+
class Contact extends BaseEnt {
|
|
58
|
+
constructor() {
|
|
59
|
+
super(...arguments);
|
|
52
60
|
this.accountID = "";
|
|
53
61
|
this.nodeType = "Contact";
|
|
54
|
-
this.data.created_at = (0, convert_1.convertDate)(data.created_at);
|
|
55
|
-
this.data.updated_at = (0, convert_1.convertDate)(data.updated_at);
|
|
56
|
-
this.id = data.id;
|
|
57
62
|
}
|
|
58
63
|
getPrivacyPolicy() {
|
|
59
64
|
return privacy_1.AlwaysAllowPrivacyPolicy;
|
|
60
65
|
}
|
|
61
66
|
}
|
|
62
67
|
exports.Contact = Contact;
|
|
63
|
-
class Group {
|
|
64
|
-
constructor(
|
|
65
|
-
|
|
66
|
-
this.data = data;
|
|
68
|
+
class Group extends BaseEnt {
|
|
69
|
+
constructor() {
|
|
70
|
+
super(...arguments);
|
|
67
71
|
this.accountID = "";
|
|
68
72
|
this.nodeType = "Group";
|
|
69
|
-
this.id = data.id;
|
|
70
73
|
}
|
|
71
74
|
getPrivacyPolicy() {
|
|
72
75
|
return privacy_1.AlwaysAllowPrivacyPolicy;
|
|
73
76
|
}
|
|
74
77
|
}
|
|
75
78
|
exports.Group = Group;
|
|
76
|
-
class Message {
|
|
77
|
-
constructor(
|
|
78
|
-
|
|
79
|
-
this.data = data;
|
|
79
|
+
class Message extends BaseEnt {
|
|
80
|
+
constructor() {
|
|
81
|
+
super(...arguments);
|
|
80
82
|
this.accountID = "";
|
|
81
83
|
this.nodeType = "Message";
|
|
82
|
-
this.id = data.id;
|
|
83
|
-
}
|
|
84
|
-
getPrivacyPolicy() {
|
|
85
|
-
return privacy_1.AlwaysAllowPrivacyPolicy;
|
|
86
84
|
}
|
|
87
85
|
}
|
|
88
86
|
exports.Message = Message;
|
|
89
|
-
class Address {
|
|
90
|
-
constructor(
|
|
91
|
-
|
|
92
|
-
this.data = data;
|
|
87
|
+
class Address extends BaseEnt {
|
|
88
|
+
constructor() {
|
|
89
|
+
super(...arguments);
|
|
93
90
|
this.accountID = "";
|
|
94
91
|
this.nodeType = "Address";
|
|
95
|
-
this.id = data.id;
|
|
96
|
-
}
|
|
97
|
-
getPrivacyPolicy() {
|
|
98
|
-
return privacy_1.AlwaysAllowPrivacyPolicy;
|
|
99
92
|
}
|
|
100
93
|
}
|
|
101
94
|
exports.Address = Address;
|
|
@@ -113,9 +106,9 @@ function getBuilderSchema(cfg, ent) {
|
|
|
113
106
|
};
|
|
114
107
|
}
|
|
115
108
|
exports.getBuilderSchema = getBuilderSchema;
|
|
116
|
-
function getBuilderSchemaFromFields(fields, ent) {
|
|
109
|
+
function getBuilderSchemaFromFields(fields, ent, opts) {
|
|
117
110
|
return {
|
|
118
|
-
...new base_schema_1.EntSchema({ fields }),
|
|
111
|
+
...new base_schema_1.EntSchema({ ...opts, fields }),
|
|
119
112
|
ent,
|
|
120
113
|
};
|
|
121
114
|
}
|
|
@@ -153,7 +146,7 @@ function getFieldInfo(value) {
|
|
|
153
146
|
exports.getFieldInfo = getFieldInfo;
|
|
154
147
|
// reuses orchestrator and standard things
|
|
155
148
|
class SimpleBuilder {
|
|
156
|
-
constructor(viewer, schema, fields, operation = action_1.WriteOperation.Insert, existingEnt, action) {
|
|
149
|
+
constructor(viewer, schema, fields, operation = action_1.WriteOperation.Insert, existingEnt, action, expressions) {
|
|
157
150
|
this.viewer = viewer;
|
|
158
151
|
this.schema = schema;
|
|
159
152
|
this.operation = operation;
|
|
@@ -204,6 +197,7 @@ class SimpleBuilder {
|
|
|
204
197
|
},
|
|
205
198
|
builder: this,
|
|
206
199
|
action: action,
|
|
200
|
+
expressions,
|
|
207
201
|
schema: this.schema,
|
|
208
202
|
editedFields: () => {
|
|
209
203
|
// to simulate what we do in generated builders where we return a new Map
|
|
@@ -271,10 +265,10 @@ class SimpleBuilder {
|
|
|
271
265
|
}
|
|
272
266
|
exports.SimpleBuilder = SimpleBuilder;
|
|
273
267
|
class SimpleAction {
|
|
274
|
-
constructor(viewer, schema, fields, operation = action_1.WriteOperation.Insert, existingEnt) {
|
|
268
|
+
constructor(viewer, schema, fields, operation = action_1.WriteOperation.Insert, existingEnt, expressions) {
|
|
275
269
|
this.viewer = viewer;
|
|
276
270
|
this.fields = fields;
|
|
277
|
-
this.builder = new SimpleBuilder(this.viewer, schema, fields, operation, existingEnt, this);
|
|
271
|
+
this.builder = new SimpleBuilder(this.viewer, schema, fields, operation, existingEnt, this, expressions);
|
|
278
272
|
}
|
|
279
273
|
getTriggers() {
|
|
280
274
|
return [];
|