From db1978841e3d058be7ce791b68b87b64235cb904 Mon Sep 17 00:00:00 2001 From: Hans Kristian Flaatten Date: Wed, 20 Jul 2016 14:20:20 +0200 Subject: [PATCH] feat(admin): add user rate limit approval interface --- apps/admin/controller.js | 81 +++++++++++++++++++++++++++++++++++++ views/admin/limits.html | 76 ++++++++++++++++++++++++++++++++++ views/admin/navigation.html | 4 +- views/nav.html | 2 +- 4 files changed, 160 insertions(+), 3 deletions(-) create mode 100644 views/admin/limits.html diff --git a/apps/admin/controller.js b/apps/admin/controller.js index 2945ecd..21f1f4c 100644 --- a/apps/admin/controller.js +++ b/apps/admin/controller.js @@ -33,6 +33,87 @@ app.get('/users', (req, res, next) => { }); }); +app.get('/limits', (req, res, next) => { + const error = req.session.message; + delete req.session.message; + + const query = { + apps: { + $elemMatch: { + $or: [ + { prodRequest: { $exists: true } }, + { devRequest: { $exists: true } }, + ], + }, + }, + }; + + ApiUser.find(query).exec((err, users) => { + if (err) { return next(err); } + return res.render('admin/limits.html', { req, error, users }); + }); +}); + +app.post('/limits/:userId/:appId', (req, res, next) => { + ApiUser.findOne({ _id: req.params.userId }, (err, user) => { + if (err) { return next(err); } + + const app = user.apps.id(req.params.appId); + + // Unknown application + if (!app) { + req.session.message = { + title: 'Ukjent app', + message: `App ${req.params.appId} ble ikke funnet`, + }; + + return res.redirect(303, '/admin/limits'); + } + + // Approve new limits + if (req.body.approve === 'true') { + if (req.body.limit_prod) { + app.set('limit.prod', parseInt(req.body.limit_prod, 10)); + } + + if (req.body.limit_dev) { + app.set('limit.dev', parseInt(req.body.limit_dev, 10)); + } + + app.set('limit.prodRequest', undefined); + app.set('limit.devRequest', undefined); + + req.session.message = { + class: 'positive', + title: 'Ny grense godkjent', + message: `Ny grense for "${app.name}" er godkjent.`, + }; + + // Reject new limits + } else if (req.body.reject === 'true') { + app.set('limit.prodRequest', undefined); + app.set('limit.devRequest', undefined); + + req.session.message = { + class: 'positive', + title: 'Ny grense avslått', + message: `Ny grense for "${app.name}" er avslått.`, + }; + + // Unknown action + } else { + req.session.message = { + title: 'Ukjent valg', + message: 'Operasjonen ble ikke gjennkjennt som et gyldig valg.', + }; + + return res.redirect(303, '/admin/limits'); + } + + user.save().catch(next).then(() => res.redirect(303, '/admin/limits')); + }); +}); + app.get('/email', (req, res) => { const error = req.session.message; diff --git a/views/admin/limits.html b/views/admin/limits.html new file mode 100644 index 0000000..b6156b1 --- /dev/null +++ b/views/admin/limits.html @@ -0,0 +1,76 @@ +{% set page = 'limits' %} +{% set cclass = 'limits' %} +{% extends "admin/layout.html" %} + +{% block title %}Nye apps - {{ super() }}{% endblock %} + +{% block content %} +

+ +
+ Nye grenser +
Nye API grenser til godkjenning
+
+

+ +{% if not users.length %} +
+

Det er ingen nye grenser til godkjenning. Godt jobba!

+
+{% endif %} + +
+ {% for user in users %} + {% for app in user.apps %} + {% if app.limit.prodRequest or app.limit.devRequest %} +
+ +
+ + +
{{ app.name }}
+
{{ user.provider }}
+
+
+ + +
+ +
+ + +
+ +
+ + +
+
+
+
+
+ + + +
+
+
+ {% endif %} + {% endfor %} + {% endfor %} +
+{% endblock %} diff --git a/views/admin/navigation.html b/views/admin/navigation.html index b9bb06e..7445836 100644 --- a/views/admin/navigation.html +++ b/views/admin/navigation.html @@ -13,9 +13,9 @@

- Nye limits + Nye grenser

-

Nye rate limits til godkjenning

+

Nye API grenser til godkjenning

diff --git a/views/nav.html b/views/nav.html index 41f20c9..78f2c48 100644 --- a/views/nav.html +++ b/views/nav.html @@ -27,7 +27,7 @@ {{ req.session.stats.request|d(0) }} apps - Nye limits + Nye grenser Epostliste