Skip to content

Commit f8594c8

Browse files
author
Håvard Ranum
authoredMar 9, 2017
Merge pull request #95 from Turbasen/edit-users
feat(admin): add details page for user
2 parents 93642ae + ff808e5 commit f8594c8

File tree

3 files changed

+188
-1
lines changed

3 files changed

+188
-1
lines changed
 

‎apps/admin/controller.js

+64
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const ApiUser = require('../app/model').ApiUser;
99

1010
const filters = require('./filters');
1111
const sendgrid = require('../../lib/sendgrid');
12+
const keygen = require('../../lib/keygen');
1213

1314
if (module.parent.exports.nunjucks) {
1415
Object.keys(filters).forEach(filter => {
@@ -33,6 +34,13 @@ route.get('/users', (req, res, next) => {
3334
});
3435
});
3536

37+
route.get('/users/:id', (req, res, next) => {
38+
ApiUser.findOne({ _id: req.params.id }).exec((err, user) => {
39+
if (err) { return next(err); }
40+
return res.render('admin/user.html', { req, user });
41+
});
42+
});
43+
3644
route.get('/limits', (req, res, next) => {
3745
const error = req.session.message;
3846
delete req.session.message;
@@ -54,6 +62,62 @@ route.get('/limits', (req, res, next) => {
5462
});
5563
});
5664

65+
route.post('/users/:userId/apps/:appId', (req, res, next) => {
66+
const promise = ApiUser.findOne({ 'apps._id': req.params.appId });
67+
68+
promise.then(user => {
69+
req.app = user.apps.id(req.params.appId);
70+
71+
req.app.set('name', req.body.name);
72+
req.app.set('url', req.body.url || undefined);
73+
req.app.set('desc', req.body.desc);
74+
75+
if (req.body.generate_key_dev) {
76+
req.app.set('key.dev', keygen());
77+
}
78+
79+
if (req.body.generate_key_prod) {
80+
req.app.set('key.prod', keygen());
81+
}
82+
83+
req.app.limit.prod = parseInt(req.body.limit_prod, 10);
84+
req.app.limit.prodRequest = undefined;
85+
86+
req.app.limit.dev = parseInt(req.body.limit_dev, 10);
87+
req.app.limit.devRequest = undefined;
88+
89+
const error = user.validateSync();
90+
91+
if (error) {
92+
req.session.message = error[0];
93+
94+
res.set('x-app-status', 'failure');
95+
res.set('x-app-message', 'validation_error');
96+
res.redirect(303, `/admin/users/${req.params.userId}`);
97+
98+
return;
99+
}
100+
101+
user.save(saveErr => {
102+
if (saveErr) { next(saveErr); return; }
103+
104+
req.session.message = {
105+
class: 'positive',
106+
title: 'App oppdatert',
107+
message: `Applikasjonen «${req.body.name}» ble oppdatert.`,
108+
app: req.app._id,
109+
};
110+
111+
res.set('x-app-status', 'success');
112+
res.redirect(303, `/admin/users/${req.params.userId}`);
113+
114+
return;
115+
});
116+
117+
return;
118+
});
119+
});
120+
57121
route.post('/limits/:userId/:appId', (req, res, next) => {
58122
ApiUser.findOne({ _id: req.params.userId }, (err, user) => {
59123
if (err) { return next(err); }

‎views/admin/user.html

+123
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
{% extends "admin/layout.html" %}
2+
3+
{% block title %}Users - {{ super() }}{% endblock %}
4+
5+
<div class="twelve wide column">
6+
{% include "components/message.html" %}
7+
8+
{% block content %}
9+
{% for app in user.apps %}
10+
<div class="ui" id="{{ app.slugg }}" style="margin-bottom: 10px;">
11+
<div class="ui attached message">
12+
<div class="header">{{ app.name }}</div>
13+
</div>
14+
{% if app.isActive or app.isPending %}
15+
<form
16+
class="ui form attached fluid segment"
17+
method="post"
18+
action="/admin/users/{{ user._id}}/apps/{{ app._id }}">
19+
<div class="two fields">
20+
<div class="field">
21+
<label>App Navn</label>
22+
<input type="text" name="name" value="{{ app.name }}">
23+
</div>
24+
<div class="field">
25+
<label>URL</label>
26+
<input type="text" name="url" value="{{ app.url }}">
27+
</div>
28+
</div>
29+
<div class="field">
30+
<label>Beskrivelse</label>
31+
<textarea rows="2" name="desc">{{ app.desc }}</textarea>
32+
</div>
33+
<div class="fields">
34+
<div class="twelve wide field">
35+
<label>Prod-nøkkel</label>
36+
<div class="ui input">
37+
<input
38+
type="text"
39+
name="key_prod"
40+
value="{{ app.key.prod }}">
41+
</div>
42+
</div>
43+
<div class="four wide field">
44+
<label>Rate Limit</label>
45+
<input
46+
type="text"
47+
name="limit_prod"
48+
placeholder="{{ app.limit.prod }}"
49+
value="{{ app.limit.prodRequest | d(app.limit.prod) }}">
50+
</div>
51+
</div>
52+
<div class="fields">
53+
<div class="sixteen wide field">
54+
<div class="ui checkbox">
55+
<input type="checkbox" name="generate_key_prod">
56+
<label>Generer ny API-nøkkel</label>
57+
</div>
58+
<div class="ui warning message generate_key_prod">
59+
<i class="icon warning"></i>
60+
Ny API-nøkkel vil genereres ved lagring, og vil erstatte den nåværende umiddelbart.
61+
</div>
62+
</div>
63+
</div>
64+
<div class="fields">
65+
<div class="twelve wide field">
66+
<label>Dev-nøkkel</label>
67+
<div class="ui input">
68+
<input
69+
type="text"
70+
name="key_dev"
71+
value="{{ app.key.dev }}">
72+
</div>
73+
</div>
74+
<div class="four wide field">
75+
<label>Rate Limit</label>
76+
<input
77+
type="text"
78+
name="limit_dev"
79+
placeholder="{{ app.limit.dev }}"
80+
value="{{ app.limit.devRequest | d(app.limit.dev) }}">
81+
</div>
82+
</div>
83+
<div class="fields">
84+
<div class="sixteen wide field">
85+
<div class="ui checkbox">
86+
<input type="checkbox" name="generate_key_dev">
87+
<label>Generer ny API-nøkkel</label>
88+
</div>
89+
<div class="ui warning message generate_key_dev">
90+
<i class="icon warning"></i>
91+
Ny API-nøkkel vil genereres ved lagring, og vil erstatte den nåværende umiddelbart.
92+
</div>
93+
</div>
94+
</div>
95+
<button class="ui blue submit button" type="submit">
96+
Lagre
97+
</button>
98+
</form>
99+
{% endif %}
100+
{% if app.isRejected %}
101+
<div class="ui bottom attached error message">
102+
<i class="icon warning"></i>
103+
Denne applikasjonen er avvist. {{ app.rejection }}
104+
</div>
105+
{% elif app.isPending %}
106+
<div class="ui bottom attached info message">
107+
<i class="icon wait"></i>
108+
Denne applikasjonen venter på godkjenning.
109+
</div>
110+
{% elif app.limit.devRequest or app.limit.prodRequest %}
111+
<div class="ui bottom attached info message">
112+
<i class="icon wait"></i>
113+
Endring av API rate-limit venter på godkjenning.
114+
</div>
115+
{% elif not app.isActive %}
116+
<div class="ui bottom attached warning message">
117+
<i class="icon warning"></i>
118+
Denne applikasjonen er deaktivert.
119+
</div>
120+
{% endif %}
121+
</div>
122+
{% endfor %}
123+
{% endblock %}

‎views/admin/users.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<img src="{{ app.owner[0].avatarUrl|d("/static/images/image.png") }}" alt="">
1616
</div>
1717
<div class="content">
18-
<a class="header">{{ app.provider }}</a>
18+
<a href="/admin/users/{{ app._id }}" class="header">{{ app.provider }}</a>
1919
<div class="meta">
2020
<span class="date">{{ app.updated|dateformat("YYYY-MM-DD HH:MM") }}</span>
2121
</div>

0 commit comments

Comments
 (0)