diff --git a/src/controllers/auth.js b/src/controllers/auth.js index 341f01ae..50477f36 100644 --- a/src/controllers/auth.js +++ b/src/controllers/auth.js @@ -41,9 +41,7 @@ class AuthController { if (!isValid) { return res.status(401).send({ status: "fail", - data: { - "auth": "Invalid credentials or auth token" - } + message: "Invalid credentials or auth token" }); } diff --git a/src/controllers/user.js b/src/controllers/user.js index 90dd2a02..f3c334a4 100644 --- a/src/controllers/user.js +++ b/src/controllers/user.js @@ -52,7 +52,7 @@ class UserController { } catch (err) { return res.status(400).send({ status: "fail", - message: err.error + ": " + err.reason + message: err.message }); } } @@ -92,7 +92,7 @@ class UserController { } catch (err) { return res.status(500).send({ status: "fail", - message: err.error + ": " + err.reason + message: err.message }); } } @@ -159,13 +159,12 @@ class UserController { } catch (err) { return res.status(500).send({ status: "fail", - message: err.error + ": " + err.reason + message: err.message }); } } async databases(req, res) { - const databaseName = req.body.databaseName; const did = req.tokenData.did const contextName = req.tokenData.contextName @@ -188,7 +187,7 @@ class UserController { } catch (err) { return res.status(500).send({ status: "fail", - message: err.error + ": " + err.reason + message: err.message }); } } @@ -229,7 +228,45 @@ class UserController { } catch (err) { return res.status(500).send({ status: "fail", - message: err.error + ": " + err.reason + message: err.message + }); + } + } + + async usage(req, res) { + const did = req.tokenData.did + const contextName = req.tokenData.contextName + + if (!did || !contextName) { + return res.status(401).send({ + status: "fail", + message: "Permission denied" + }); + } + + try { + const databases = await DbManager.getUserDatabases(did, contextName) + + const result = { + databases: 0, + bytes: 0 + } + + for (let d in databases) { + const database = databases[d] + const dbInfo = await DbManager.getUserDatabase(did, contextName, database.databaseName) + result.databases++ + result.bytes += dbInfo.info.sizes.file + } + + return Utils.signedResponse({ + status: "success", + result + }, res); + } catch (err) { + return res.status(500).send({ + status: "fail", + message: err.message }); } } diff --git a/src/routes/index.js b/src/routes/index.js index 71daa813..fdc3090e 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -9,5 +9,6 @@ router.post('/user/deleteDatabase', UserController.deleteDatabase); router.post('/user/deleteDatabases', UserController.deleteDatabases); router.post('/user/databases', UserController.databases); router.post('/user/databaseInfo', UserController.databaseInfo); +router.post('/user/usage', UserController.usage); export default router; \ No newline at end of file diff --git a/test/server.js b/test/server.js index d994b089..e5404b77 100644 --- a/test/server.js +++ b/test/server.js @@ -138,7 +138,7 @@ describe("Server tests", function() { signature }); - assert.equal(response.data.status, 'success', 'Successfull device invalidation response from server') + assert.equal(response.data.status, 'success', 'Successful device invalidation response from server') const pendingConnect = new Promise((resolve) => { const request = Axios.post(`${SERVER_URL}/auth/connect`, { @@ -233,7 +233,6 @@ describe("Server tests", function() { }); assert.ok(TestUtils.verifySignature(response), 'Have a valid signature in response') - assert.equal(response.data.status, "success", "Successful database info response") const result = response.data.result @@ -242,6 +241,24 @@ describe("Server tests", function() { assert.ok(result.info, 'Have an info response') }) + it('Gets usage stats for user and context', async () => { + const response = await Axios.post(`${SERVER_URL}/user/usage`, { + did: accountInfo.did, + contextName: CONTEXT_NAME + }, { + headers: { + Authorization: `Bearer ${accessToken}` + } + }); + + assert.ok(TestUtils.verifySignature(response), 'Have a valid signature in response') + assert.equal(response.data.status, "success", "Successful usage response") + + const result = response.data.result + assert.equal(result.databases, 2, 'Expected number of databases') + assert.ok(result.bytes > 0, 'More than 0 bytes used') + }) + // @todo: updates it("Deletes database", async () => {