Skip to content

Commit 4bae79e

Browse files
committed
Add Journal option
1 parent e9f00da commit 4bae79e

4 files changed

Lines changed: 148 additions & 88 deletions

File tree

OpenFlow/src/DatabaseConnection.ts

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ export class DatabaseConnection {
192192
item._modifiedbyid = user._id;
193193
item._modified = item._created;
194194
var hasUser: Ace = item._acl.find(e => e._id === user._id);
195-
if ((hasUser === null || hasUser === undefined) && item._acl.length == 0) {
195+
if ((hasUser === null || hasUser === undefined)) {
196196
if (collectionname != "audit") { this._logger.debug("Adding self " + user.username + " to object " + (item.name || item._name)); }
197197
item.addRight(user._id, user.name, [Rights.full_control]);
198198
}
@@ -205,8 +205,12 @@ export class DatabaseConnection {
205205
(item as any).passwordhash = await Crypt.hash((item as any).newpassword);
206206
delete (item as any).newpassword;
207207
}
208+
j = ((j as any) === 'true' || j === true);
209+
w = parseInt((w as any));
210+
208211
// var options:CollectionInsertOneOptions = { writeConcern: { w: parseInt((w as any)), j: j } };
209212
var options: CollectionInsertOneOptions = { w: w, j: j };
213+
//var options: CollectionInsertOneOptions = { w: "majority" };
210214
var result: InsertOneWriteOpResult = await this.db.collection(collectionname).insertOne(item, options);
211215
item = result.ops[0];
212216

@@ -300,8 +304,13 @@ export class DatabaseConnection {
300304
}
301305
}
302306

307+
j = ((j as any) === 'true' || j === true);
308+
w = parseInt((w as any));
303309
// var options = { writeConcern: { w: parseInt((w as any)), j: j } };
304310
var options: CollectionInsertOneOptions = { w: w, j: j };
311+
//var options: CollectionInsertOneOptions = { w: w };
312+
// var options: CollectionInsertOneOptions = { w: "majority" };
313+
// var options: CollectionInsertOneOptions = {};
305314
var res: UpdateWriteOpResult = null;
306315
try {
307316
if (itemUpdate) {
@@ -311,14 +320,12 @@ export class DatabaseConnection {
311320
}
312321
// var res: ReplaceOneWriteOpResult = await this.db.collection(collectionname).replaceOne(_query, item, options);
313322
if (res.result.ok == 1) {
314-
if (w > 0) {
315-
if (res.modifiedCount == 0 || res.modifiedCount == undefined) {
316-
throw Error("item not found!");
317-
} else if (res.modifiedCount == 1) {
318-
item = item;
319-
} else {
320-
throw Error("More than one item was updated !!!");
321-
}
323+
if (res.modifiedCount == 0) {
324+
throw Error("item not found!");
325+
} else if (res.modifiedCount == 1 || res.modifiedCount == undefined) {
326+
item = item;
327+
} else {
328+
throw Error("More than one item was updated !!!");
322329
}
323330
} else {
324331
throw Error("UpdateOne failed!!!");
@@ -377,9 +384,14 @@ export class DatabaseConnection {
377384
item.$set._modified = new Date(new Date().toISOString());
378385
}
379386

387+
380388
this._logger.debug("updateMany " + (item.name || item._name) + " in database");
389+
390+
j = ((j as any) === 'true' || j === true);
391+
w = parseInt((w as any));
381392
// var options = { writeConcern: { w: parseInt((w as any)), j: j } };
382-
var options: CollectionInsertOneOptions = {};
393+
//var options: CollectionInsertOneOptions = {};
394+
var options: CollectionInsertOneOptions = { w: w, j: j };
383395
if (w > 0) { options.w = w; }
384396
var res: UpdateWriteOpResult = null;
385397
try {
@@ -389,9 +401,9 @@ export class DatabaseConnection {
389401
}
390402
if (res.result.ok == 1) {
391403
if (w > 0) {
392-
if (res.modifiedCount == 0 || res.modifiedCount == undefined) {
404+
if (res.modifiedCount == 0) {
393405
throw Error("item not found!");
394-
} else if (res.modifiedCount == 1) {
406+
} else if (res.modifiedCount == 1 || res.modifiedCount == undefined) {
395407
item = item;
396408
} else {
397409
throw Error("More than one item was updated !!!");
@@ -439,11 +451,6 @@ export class DatabaseConnection {
439451
}
440452
var user: TokenUser = Crypt.verityToken(jwt);
441453
if (!this.hasAuthorization(user, item, "update")) { throw new Error("Access denied"); }
442-
var hasUser: Ace = item._acl.find(e => e._id === user._id);
443-
if ((hasUser === null || hasUser === undefined) && item._acl.length == 0) {
444-
if (collectionname != "audit") { this._logger.debug("Adding self " + user.username + " to object " + (item.name || item._name)); }
445-
item.addRight(user._id, user.name, [Rights.full_control]);
446-
}
447454
if (item._id !== null && item._id !== undefined && item._id !== "") {
448455
item = await this.UpdateOne(null, item, collectionname, w, j, jwt);
449456
} else {

OpenFlow/src/index.ts

Lines changed: 67 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -51,69 +51,83 @@ async function ensureRole(jwt: string, name: string, id: string): Promise<Role>
5151
role = Role.assign(role);
5252
return role;
5353
}
54-
async function initDatabase(): Promise<void> {
55-
var jwt: string = TokenUser.rootToken();
56-
var admins: Role = await ensureRole(jwt, "admins", WellknownIds.admins);
57-
var users: Role = await ensureRole(jwt, "users", WellknownIds.users);
58-
var root: User = await ensureUser(jwt, "root", "root", WellknownIds.root);
59-
root.addRight(WellknownIds.admins, "admins", [Rights.full_control]);
60-
root.removeRight(WellknownIds.admins, [Rights.delete]);
61-
root.addRight(WellknownIds.root, "root", [Rights.full_control]);
62-
root.removeRight(WellknownIds.root, [Rights.delete]);
63-
await root.Save(jwt);
64-
65-
66-
admins.addRight(WellknownIds.admins, "admins", [Rights.full_control]);
67-
admins.removeRight(WellknownIds.admins, [Rights.delete]);
68-
await admins.Save(jwt);
69-
70-
users.addRight(WellknownIds.admins, "admins", [Rights.full_control]);
71-
users.removeRight(WellknownIds.admins, [Rights.delete]);
72-
users.AddMember(root);
73-
await users.Save(jwt);
74-
75-
var nodered_admins: Role = await ensureRole(jwt, "nodered admins", WellknownIds.nodered_admins);
76-
nodered_admins.AddMember(admins);
77-
nodered_admins.addRight(WellknownIds.admins, "admins", [Rights.full_control]);
78-
nodered_admins.removeRight(WellknownIds.admins, [Rights.delete]);
79-
await nodered_admins.Save(jwt);
80-
var nodered_users: Role = await ensureRole(jwt, "nodered users", WellknownIds.nodered_users);
81-
nodered_users.AddMember(admins);
82-
nodered_users.addRight(WellknownIds.admins, "admins", [Rights.full_control]);
83-
nodered_users.removeRight(WellknownIds.admins, [Rights.delete]);
84-
await nodered_users.Save(jwt);
85-
var nodered_api_users: Role = await ensureRole(jwt, "nodered api users", WellknownIds.nodered_api_users);
86-
nodered_api_users.AddMember(admins);
87-
nodered_api_users.addRight(WellknownIds.admins, "admins", [Rights.full_control]);
88-
nodered_api_users.removeRight(WellknownIds.admins, [Rights.delete]);
89-
await nodered_api_users.Save(jwt);
90-
91-
var robot_admins: Role = await ensureRole(jwt, "robot admins", WellknownIds.robot_admins);
92-
robot_admins.AddMember(admins);
93-
robot_admins.addRight(WellknownIds.admins, "admins", [Rights.full_control]);
94-
robot_admins.removeRight(WellknownIds.admins, [Rights.delete]);
95-
await robot_admins.Save(jwt);
96-
var robot_users: Role = await ensureRole(jwt, "robot users", WellknownIds.robot_users);
97-
robot_users.AddMember(admins);
98-
robot_users.AddMember(users);
99-
robot_users.addRight(WellknownIds.admins, "admins", [Rights.full_control]);
100-
robot_users.removeRight(WellknownIds.admins, [Rights.delete]);
101-
await robot_users.Save(jwt);
102-
103-
104-
if (!admins.IsMember(root._id)) {
105-
admins.AddMember(root);
54+
async function initDatabase(): Promise<boolean> {
55+
try {
56+
var jwt: string = TokenUser.rootToken();
57+
var admins: Role = await ensureRole(jwt, "admins", WellknownIds.admins);
58+
var users: Role = await ensureRole(jwt, "users", WellknownIds.users);
59+
var root: User = await ensureUser(jwt, "root", "root", WellknownIds.root);
60+
root.addRight(WellknownIds.admins, "admins", [Rights.full_control]);
61+
root.removeRight(WellknownIds.admins, [Rights.delete]);
62+
root.addRight(WellknownIds.root, "root", [Rights.full_control]);
63+
root.removeRight(WellknownIds.root, [Rights.delete]);
64+
await root.Save(jwt);
65+
66+
67+
admins.addRight(WellknownIds.admins, "admins", [Rights.full_control]);
68+
admins.removeRight(WellknownIds.admins, [Rights.delete]);
10669
await admins.Save(jwt);
70+
71+
users.addRight(WellknownIds.admins, "admins", [Rights.full_control]);
72+
users.removeRight(WellknownIds.admins, [Rights.delete]);
73+
users.AddMember(root);
74+
await users.Save(jwt);
75+
76+
var nodered_admins: Role = await ensureRole(jwt, "nodered admins", WellknownIds.nodered_admins);
77+
nodered_admins.AddMember(admins);
78+
nodered_admins.addRight(WellknownIds.admins, "admins", [Rights.full_control]);
79+
nodered_admins.removeRight(WellknownIds.admins, [Rights.delete]);
80+
await nodered_admins.Save(jwt);
81+
var nodered_users: Role = await ensureRole(jwt, "nodered users", WellknownIds.nodered_users);
82+
nodered_users.AddMember(admins);
83+
nodered_users.addRight(WellknownIds.admins, "admins", [Rights.full_control]);
84+
nodered_users.removeRight(WellknownIds.admins, [Rights.delete]);
85+
await nodered_users.Save(jwt);
86+
var nodered_api_users: Role = await ensureRole(jwt, "nodered api users", WellknownIds.nodered_api_users);
87+
nodered_api_users.AddMember(admins);
88+
nodered_api_users.addRight(WellknownIds.admins, "admins", [Rights.full_control]);
89+
nodered_api_users.removeRight(WellknownIds.admins, [Rights.delete]);
90+
await nodered_api_users.Save(jwt);
91+
92+
var robot_admins: Role = await ensureRole(jwt, "robot admins", WellknownIds.robot_admins);
93+
robot_admins.AddMember(admins);
94+
robot_admins.addRight(WellknownIds.admins, "admins", [Rights.full_control]);
95+
robot_admins.removeRight(WellknownIds.admins, [Rights.delete]);
96+
await robot_admins.Save(jwt);
97+
var robot_users: Role = await ensureRole(jwt, "robot users", WellknownIds.robot_users);
98+
robot_users.AddMember(admins);
99+
robot_users.AddMember(users);
100+
robot_users.addRight(WellknownIds.admins, "admins", [Rights.full_control]);
101+
robot_users.removeRight(WellknownIds.admins, [Rights.delete]);
102+
await robot_users.Save(jwt);
103+
104+
105+
if (!admins.IsMember(root._id)) {
106+
admins.AddMember(root);
107+
await admins.Save(jwt);
108+
}
109+
return true;
110+
} catch (error) {
111+
logger.error(error);
112+
return false;
107113
}
108114
}
109115

116+
117+
process.on('unhandledRejection', up => {
118+
console.error(up);
119+
throw up
120+
});
121+
110122
(async function (): Promise<void> {
111123
try {
112124
// await Config.get_login_providers();
113125
const server: http.Server = await WebServer.configure(logger, Config.baseurl());
114126
WebSocketServer.configure(logger, server);
115127
logger.info("listening on " + Config.baseurl());
116-
await initDatabase();
128+
if (!await initDatabase()) {
129+
process.exit(404);
130+
}
117131

118132
// console.log("************************");
119133
// var e:Base = new Base();
@@ -150,6 +164,5 @@ async function initDatabase(): Promise<void> {
150164
// console.log("************************");
151165
} catch (error) {
152166
logger.error(error.message);
153-
console.error(error);
154167
}
155168
})();

OpenFlowNodeRED/src/nodered/nodes/api.html

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -167,11 +167,17 @@
167167
<label><i class="fa fa-list"></i> Write Concern</label>
168168
<select id="node-input-writeconcern">
169169
<option value="0">Requests no acknowledgment</option>
170-
<option value="1">Requests acknowledgment</option>
171-
<!--
170+
<option value="majority">Requests majority</option>
171+
<option value="1">Requests acknowledgment from 1</option>
172172
<option value="2">Requests acknowledgment from 2</option>
173173
<option value="3">Requests acknowledgment from 3</option>
174-
-->
174+
</select>
175+
</div>
176+
<div class="form-row">
177+
<label><i class="fa fa-list"></i> Journal</label>
178+
<select id="node-input-journal">
179+
<option value="false">In memory</option>
180+
<option value="true">Written to the journal</option>
175181
</select>
176182
</div>
177183
<div class="form-row">
@@ -190,6 +196,7 @@
190196
name: { value: "" },
191197
entitytype: { value: "" },
192198
writeconcern: { value: "0", required: true },
199+
journal: { value: "false", required: true },
193200
collection: { value: "entities", required: true },
194201
inputfield: { value: "payload", required: true },
195202
resultfield: { value: "payload", required: true }
@@ -243,11 +250,17 @@
243250
<label><i class="fa fa-list"></i> Write Concern</label>
244251
<select id="node-input-writeconcern">
245252
<option value="0">Requests no acknowledgment</option>
246-
<option value="1">Requests acknowledgment</option>
247-
<!--
253+
<option value="majority">Requests majority</option>
254+
<option value="1">Requests acknowledgment from 1</option>
248255
<option value="2">Requests acknowledgment from 2</option>
249256
<option value="3">Requests acknowledgment from 3</option>
250-
-->
257+
</select>
258+
</div>
259+
<div class="form-row">
260+
<label><i class="fa fa-list"></i> Journal</label>
261+
<select id="node-input-journal">
262+
<option value="false">In memory</option>
263+
<option value="true">Written to the journal</option>
251264
</select>
252265
</div>
253266
<div class="form-row">
@@ -266,6 +279,7 @@
266279
name: { value: "" },
267280
entitytype: { value: "" },
268281
writeconcern: { value: "0", required: true },
282+
journal: { value: "false", required: true },
269283
collection: { value: "entities", required: true },
270284
inputfield: { value: "payload", required: true },
271285
resultfield: { value: "payload", required: true }
@@ -324,11 +338,17 @@
324338
<label><i class="fa fa-list"></i> Write Concern</label>
325339
<select id="node-input-writeconcern">
326340
<option value="0">Requests no acknowledgment</option>
327-
<option value="1">Requests acknowledgment</option>
328-
<!--
341+
<option value="majority">Requests majority</option>
342+
<option value="1">Requests acknowledgment from 1</option>
329343
<option value="2">Requests acknowledgment from 2</option>
330344
<option value="3">Requests acknowledgment from 3</option>
331-
-->
345+
</select>
346+
</div>
347+
<div class="form-row">
348+
<label><i class="fa fa-list"></i> Journal</label>
349+
<select id="node-input-journal">
350+
<option value="false">In memory</option>
351+
<option value="true">Written to the journal</option>
332352
</select>
333353
</div>
334354
<div class="form-row">
@@ -352,6 +372,7 @@
352372
name: { value: "" },
353373
entitytype: { value: "" },
354374
writeconcern: { value: "0", required: true },
375+
journal: { value: "false", required: true },
355376
collection: { value: "entities", required: true },
356377
inputfield: { value: "payload", required: true },
357378
resultfield: { value: "payload", required: true },
@@ -955,11 +976,17 @@
955976
<label><i class="fa fa-list"></i> Write Concern</label>
956977
<select id="node-input-writeconcern">
957978
<option value="0">Requests no acknowledgment</option>
958-
<option value="1">Requests acknowledgment</option>
959-
<!--
979+
<option value="majority">Requests majority</option>
980+
<option value="1">Requests acknowledgment from 1</option>
960981
<option value="2">Requests acknowledgment from 2</option>
961982
<option value="3">Requests acknowledgment from 3</option>
962-
-->
983+
</select>
984+
</div>
985+
<div class="form-row">
986+
<label><i class="fa fa-list"></i> Journal</label>
987+
<select id="node-input-journal">
988+
<option value="false">In memory</option>
989+
<option value="true">Written to the journal</option>
963990
</select>
964991
</div>
965992
<div class="form-row">
@@ -981,6 +1008,7 @@
9811008
defaults: {
9821009
name: { value: "" },
9831010
writeconcern: { value: "0", required: true },
1011+
journal: { value: "false", required: true },
9841012
action: { value: "updateOne", required: true },
9851013
query: { value: "", required: true },
9861014
updatedocument: { value: "", required: true },

0 commit comments

Comments
 (0)