Skip to content

Commit 846c13e

Browse files
authored
Merge pull request #7 from arangoml/expiry
Stores optional Email and expires and drops dbs when 2 weeks old
2 parents b4394f6 + cce538c commit 846c13e

File tree

4 files changed

+66
-3
lines changed

4 files changed

+66
-3
lines changed

index.js

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@ const users = require("@arangodb/users");
66
const router = createRouter();
77
const joi = require('joi');
88

9+
const aisisInstances = "aisisInstances"
10+
911
module.context.use(router);
1012

1113
router.post('/createDB', function (req,res) {
1214
const data = req.body;
1315
const dbName = data.dbName ? data.dbName : randomStringGenerator();
1416
const username = data.username ? data.username : randomStringGenerator();
1517
const password = data.password ? data.password : randomStringGenerator();
18+
const email = data.email ? data.email : '[email protected]'
1619

1720

1821
// If user doesn't exist, create the user
@@ -29,12 +32,27 @@ router.post('/createDB', function (req,res) {
2932
res.send("Database already exists or invalid name supplied, please supply new dbName.").status(400);
3033
}
3134

35+
3236
users.save(username, password, true);
37+
// Grants user access only to newly created database
38+
users.grantDatabase(username, dbName, 'rw');
39+
40+
41+
42+
// @TODO: obtain hostname and port of external deployment if necessary.
43+
// Returns hostname and port
3344
let hostname = req.hostname
3445
let port = req.port
3546

36-
// Grants user access only to newly created database
37-
users.grantDatabase(username, dbName, 'rw');
47+
let insertDoc = query`INSERT {
48+
"dbName": ${dbName},
49+
"username": ${username},
50+
"hostname": ${hostname},
51+
"port": ${port},
52+
"email": ${email},
53+
"timestamp": DATE_NOW()
54+
} INTO aisisInstances`
55+
3856
res.send({dbName, username, password, hostname, port});
3957
}
4058
})

manifest.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
},
55
"main": "index.js",
66
"scripts": {
7-
"setup": "scripts/setup.js"
7+
"setup": "scripts/setup.js",
8+
"expire":"scripts/expire.js"
89
}
910
}

scripts/expire.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
'use strict';
2+
const { aql, query, db } = require("@arangodb");
3+
const users = require("@arangodb/users");
4+
5+
const expirationTime = (336 * 60 * 60 * 1000)
6+
const expired = []
7+
8+
let dbs = query`
9+
FOR i IN aisisInstances
10+
RETURN {key: i._key, dbName: i.dbName, timestamp: i.timestamp}`
11+
12+
dbs.toArray().map((d) => {
13+
(Date.now() - expirationTime ) > d.timestamp ? removeDatabase(d.dbName, d.key) : ''
14+
})
15+
16+
query`
17+
FOR key IN ${expired}
18+
REMOVE { _key: key } IN aisisInstances
19+
`
20+
21+
function removeDatabase(dbName, key) {
22+
console.log(db._engineStats())
23+
db._dropDatabase(dbName)
24+
expired.push(key)
25+
}

scripts/setup.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,20 @@
1+
'use strict';
2+
const db = require('@arangodb').db;
3+
const collectionName = 'aisisInstances';
14

5+
if (!db._collection(collectionName)) {
6+
db._createDocumentCollection(collectionName);
7+
}
8+
const queues = require('@arangodb/foxx/queues');
9+
const queue = queues.create('expirationQueue');
10+
11+
// Creates the expire job to check if databases should be expired and dropped.
12+
queue.push(
13+
{mount: '/createDB', name: 'expire'},
14+
{},
15+
{
16+
repeatTimes: Infinity,
17+
repeatUntil: -1, // Forever
18+
repeatDelay: (24 * 60 * 60 * 1000) // Daily
19+
}
20+
);

0 commit comments

Comments
 (0)