Skip to content

Commit 64022f6

Browse files
committed
use partials where possible
1 parent 40c9062 commit 64022f6

10 files changed

+104
-199
lines changed

index.js

+17-27
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ var server = app.listen(9215, function () {
3939
app.set('view engine', 'html');
4040
app.set('views', require('path').join(__dirname, '/view'));
4141
app.engine('html', hogan);
42+
const partials = {
43+
smallNavbar: 'components/smallNavbar',
44+
fullNavbar: 'components/fullNavbar',
45+
footer: 'components/footer',
46+
}
4247

4348
// Create a session-store to be used by both the express-session
4449
// middleware and the keycloak middleware.
@@ -271,7 +276,7 @@ app.get('/error', (req, res) => {
271276
res.status(500).send("An error occurred.")
272277
});
273278
app.get('/unauthorized', (req, res) => {
274-
return res.status(401).render('unauthorized.html', {productName: config.branding.title, logoPath: config.branding.logoPath, copyrightOwner: config.branding.copyrightOwner, statusURL: config.branding.statusURL, orgHome: config.branding.orgHome,groups: config.groups_permitted.toString().replaceAll(",", "<br />")});
279+
return res.status(401).render('unauthorized.html', {partials, productName: config.branding.title, logoPath: config.branding.logoPath, copyrightOwner: config.branding.copyrightOwner, statusURL: config.branding.statusURL, orgHome: config.branding.orgHome,groups: config.groups_permitted.toString().replaceAll(",", "<br />")});
275280
});
276281
// 'GET returnURL'
277282
// `passport.authenticate` will try to authenticate the content returned in
@@ -309,30 +314,9 @@ app.post('/auth/openid/return',
309314

310315
// 'logout' route, logout from passport, and destroy the session with AAD.
311316
app.get('/logout', function(req, res){
312-
req.session.destroy(function(err) {
313-
req.logOut();
314-
res.redirect(config.destroySessionUrl);
315-
});
317+
req.session = null;
316318
});
317-
function intersect_safe(a, b)
318-
{
319-
var ai=0, bi=0;
320-
var result = [];
321-
322-
while( ai < a.length && bi < b.length )
323-
{
324-
if (a[ai] < b[bi] ){ ai++; }
325-
else if (a[ai] > b[bi] ){ bi++; }
326-
else /* they're equal */
327-
{
328-
result.push(a[ai]);
329-
ai++;
330-
bi++;
331-
}
332-
}
333319

334-
return result;
335-
}
336320
function validateArray(userGroups, accessGroups) {
337321
for (const item of userGroups) {
338322
if (accessGroups.includes(item)) {
@@ -357,12 +341,12 @@ app.use(async (req, res, next) => {
357341

358342
app.get('/', async function (req, res) {
359343
if (req.isAuthenticated()) { return res.redirect('/create') }
360-
res.render('home.html', {productName: config.branding.title, logoPath: config.branding.logoPath, copyrightOwner: config.branding.copyrightOwner, statusURL: config.branding.statusURL, orgHome: config.branding.orgHome,loginProvider: config.branding.loginProvider});
344+
res.render('home.html', {partials, productName: config.branding.title, logoPath: config.branding.logoPath, copyrightOwner: config.branding.copyrightOwner, statusURL: config.branding.statusURL, orgHome: config.branding.orgHome,loginProvider: config.branding.loginProvider});
361345
return
362346
})
363347

364348
app.get('/create', ensureAuthenticated, async function (req, res) {
365-
res.render('index.html', {productName: config.branding.title, logoPath: config.branding.logoPath, copyrightOwner: config.branding.copyrightOwner, statusURL: config.branding.statusURL, orgHome: config.branding.orgHome,email: req.user._json.preferred_username, name: req.user.displayName, baseURL, userGroups: req.user._json.groups !== undefined ? req.user._json.groups.map((item) => {return {group: item}}) : {}})
349+
res.render('index.html', {partials, productName: config.branding.title, logoPath: config.branding.logoPath, copyrightOwner: config.branding.copyrightOwner, statusURL: config.branding.statusURL, orgHome: config.branding.orgHome,email: req.user._json.preferred_username, name: req.user.displayName, baseURL, userGroups: req.user._json.groups !== undefined ? req.user._json.groups.map((item) => {return {group: item}}) : {}})
366350
return
367351
})
368352

@@ -425,6 +409,12 @@ app.get('/mylinks', ensureAuthenticated, async function (req, res) {
425409
})
426410
delegatedLinks = delegatedLinks.filter(word => word.email != email);
427411
res.render('mylinks', {
412+
partials,
413+
productName: config.branding.title,
414+
logoPath: config.branding.logoPath,
415+
copyrightOwner: config.branding.copyrightOwner,
416+
statusURL: config.branding.statusURL,
417+
orgHome: config.branding.orgHome,
428418
data,
429419
name,
430420
email,
@@ -504,11 +494,11 @@ app.get('/:id', async function (req, res) {
504494
res.redirect(atob(url[0].url))
505495
return
506496
} else {
507-
res.status(404).render('404', {productName: config.branding.title, logoPath: config.branding.logoPath, copyrightOwner: config.branding.copyrightOwner, statusURL: config.branding.statusURL,})
497+
res.status(404).render('404', {partials, productName: config.branding.title, logoPath: config.branding.logoPath, copyrightOwner: config.branding.copyrightOwner, statusURL: config.branding.statusURL,})
508498
return
509499
}
510500
} catch {
511-
res.status(500).render('500', {productName: config.branding.title, logoPath: config.branding.logoPath, copyrightOwner: config.branding.copyrightOwner, statusURL: config.branding.statusURL,})
501+
res.status(500).render('500', {partials, productName: config.branding.title, logoPath: config.branding.logoPath, copyrightOwner: config.branding.copyrightOwner, statusURL: config.branding.statusURL,})
512502
return
513503
}
514504

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
"express": "^4.17.1",
2222
"forever": "^4.0.1",
2323
"hogan-express": "^0.5.2",
24+
"hogan-express-partials": "^0.0.4",
2425
"node-fetch": "2",
2526
"nodemon": "^2.0.13",
2627
"passport": "^0.5.2",

view/components/footer.html

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<div class="container fixed-bottom">
2+
<footer class="d-flex flex-wrap justify-content-between align-items-center py-3 my-4 border-top">
3+
<div class="col-md-4 d-flex align-items-center">
4+
<span class="mb-3 mb-md-0 text-white">©
5+
<script>document.write(new Date().getFullYear())</script> {{{copyrightOwner}}}
6+
</span>
7+
</div>
8+
<ul class="nav col-md-4 justify-content-end">
9+
<li class="nav-item"><a href="{{{orgHome}}}" class="nav-link px-2 text-white">{{{copyrightOwner}}}
10+
Home</a></li>
11+
<li class="nav-item"><a href="{{{statusURL}}}/" class="nav-link px-2 text-white">System
12+
Status</a></li>
13+
</ul>
14+
</footer>
15+
</div>

view/components/fullNavbar.html

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<nav class="navbar navbar-expand-lg">
2+
<div class="container-fluid">
3+
<a class="navbar-brand text-light" href="/">
4+
<img src="{{{logoPath}}}"
5+
height="50">&nbsp;&nbsp;Link Shortener
6+
</a>
7+
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
8+
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false"
9+
aria-label="Toggle navigation">
10+
<span class="navbar-toggler-icon"></span>
11+
</button>
12+
<div class="collapse navbar-collapse" id="navbarSupportedContent">
13+
<ul class="navbar-nav me-auto flex-nowrap mb-2 mb-lg-0">
14+
<li class="nav-item">
15+
<a class="nav-link text-light" aria-current="page" href="/mylinks">My Links</a>
16+
</li>
17+
</ul>
18+
<div class="dropstart dropdown-menu-md">
19+
<a href="#" class="d-block text-white text-decoration-none dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
20+
Signed in as: {{name}}
21+
</a>
22+
<ul class="dropdown-menu text-small">
23+
<li><a class="dropdown-item disabled" href="#">Email: {{email}}</a></li>
24+
<li><hr class="dropdown-divider"></li>
25+
<li><a class="dropdown-item" href="/logout">Logout</a></li>
26+
</ul>
27+
</div>
28+
</div>
29+
</div>
30+
</nav>

view/components/smallNavbar.html

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<nav class="navbar navbar-expand-lg">
2+
<div class="container-fluid">
3+
<a class="navbar-brand text-light" href="/">
4+
<img src="{{{logoPath}}}" height="50">&nbsp;&nbsp;Link Shortener
5+
</a>
6+
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
7+
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false"
8+
aria-label="Toggle navigation">
9+
<span class="navbar-toggler-icon"></span>
10+
</button>
11+
</div>
12+
</nav>

view/home.html

+2-27
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,7 @@
1010
<script src="/static/js/index.js"></script>
1111
</head>
1212
<body class="epoch-dark epoch-font">
13-
<nav class="navbar navbar-expand-lg">
14-
<div class="container-fluid">
15-
<a class="navbar-brand text-light" href="/">
16-
<img src="{{{logoPath}}}" height="50">&nbsp;&nbsp;Link Shortener
17-
</a>
18-
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
19-
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false"
20-
aria-label="Toggle navigation">
21-
<span class="navbar-toggler-icon"></span>
22-
</button>
23-
</div>
24-
</nav>
13+
{{> smallNavbar }}
2514
<div class="px-4 py-5 my-5 text-center">
2615
<img class="d-block mx-auto mb-4" src="{{{logoPath}}}" height="100" alt="{{{copyrightOwner}}} Logo">
2716
<h1 class="display-5 fw-bold" style="color: white;">{{{productName}}}</h1>
@@ -32,20 +21,6 @@ <h1 class="display-5 fw-bold" style="color: white;">{{{productName}}}</h1>
3221
</div>
3322
</div>
3423
</div>
35-
<div class="container fixed-bottom">
36-
<footer class="d-flex flex-wrap justify-content-between align-items-center py-3 my-4 border-top">
37-
<div class="col-md-4 d-flex align-items-center">
38-
<span class="mb-3 mb-md-0 text-white">©
39-
<script>document.write(new Date().getFullYear())</script> {{{copyrightOwner}}}
40-
</span>
41-
</div>
42-
<ul class="nav col-md-4 justify-content-end">
43-
<li class="nav-item"><a href="{{{orgHome}}}" class="nav-link px-2 text-white">{{{copyrightOwner}}}
44-
Home</a></li>
45-
<li class="nav-item"><a href="{{{statusURL}}}/" class="nav-link px-2 text-white">System
46-
Status</a></li>
47-
</ul>
48-
</footer>
49-
</div>
24+
{{> footer}}
5025
</body>
5126
</html>

view/index.html

+3-45
Original file line numberDiff line numberDiff line change
@@ -14,36 +14,7 @@
1414
</head>
1515

1616
<body class="epoch-dark epoch-font">
17-
<nav class="navbar navbar-expand-lg">
18-
<div class="container-fluid">
19-
<a class="navbar-brand text-light" href="/">
20-
<img src="{{{logoPath}}}"
21-
height="50">&nbsp;&nbsp;Link Shortener
22-
</a>
23-
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
24-
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false"
25-
aria-label="Toggle navigation">
26-
<span class="navbar-toggler-icon"></span>
27-
</button>
28-
<div class="collapse navbar-collapse" id="navbarSupportedContent">
29-
<ul class="navbar-nav me-auto flex-nowrap mb-2 mb-lg-0">
30-
<li class="nav-item">
31-
<a class="nav-link text-light" aria-current="page" href="/mylinks">My Links</a>
32-
</li>
33-
</ul>
34-
<div class="dropstart dropdown-menu-md">
35-
<a href="#" class="d-block text-white text-decoration-none dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
36-
Signed in as: {{name}}
37-
</a>
38-
<ul class="dropdown-menu text-small">
39-
<li><a class="dropdown-item disabled" href="#">Email: {{email}}</a></li>
40-
<li><hr class="dropdown-divider"></li>
41-
<li><a class="dropdown-item" href="/logout">Logout</a></li>
42-
</ul>
43-
</div>
44-
</div>
45-
</div>
46-
</nav>
17+
{{> fullNavbar }}
4718
<div class="container epoch-child-light">
4819
<br /><br />
4920
<h1>Shorten a URL</h1>
@@ -78,21 +49,8 @@ <h2 id="delegate-header">Delegate Access</h2>
7849
{{/userGroups.length}}
7950
<button class="btn btn-primary" onclick="submitData()">Shorten!</button>
8051
</div>
81-
<div class="container fixed-bottom">
82-
<footer class="d-flex flex-wrap justify-content-between align-items-center py-3 my-4 border-top">
83-
<div class="col-md-4 d-flex align-items-center">
84-
<span class="mb-3 mb-md-0 text-white">©
85-
<script>document.write(new Date().getFullYear())</script> {{{copyrightOwner}}}
86-
</span>
87-
</div>
88-
<ul class="nav col-md-4 justify-content-end">
89-
<li class="nav-item"><a href="{{{orgHome}}}" class="nav-link px-2 text-white">{{{copyrightOwner}}}
90-
Home</a></li>
91-
<li class="nav-item"><a href="{{{statusURL}}}/" class="nav-link px-2 text-white">System
92-
Status</a></li>
93-
</ul>
94-
</footer>
95-
</div>
52+
{{> footer}}
53+
9654
</body>
9755

9856
</html>

view/mylinks.html

+3-47
Original file line numberDiff line numberDiff line change
@@ -32,38 +32,7 @@
3232
</script>
3333

3434
<body class="epoch-dark epoch-font epoch-child-light">
35-
<nav class="navbar navbar-expand-lg">
36-
<div class="container-fluid">
37-
<a class="navbar-brand text-light" href="/">
38-
<img src="{{{logoPath}}}" height="50">&nbsp;&nbsp;Link Shortener
39-
</a>
40-
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
41-
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false"
42-
aria-label="Toggle navigation">
43-
<span class="navbar-toggler-icon"></span>
44-
</button>
45-
<div class="collapse navbar-collapse" id="navbarSupportedContent">
46-
<ul class="navbar-nav me-auto flex-nowrap mb-2 mb-lg-0">
47-
<li class="nav-item">
48-
<a class="nav-link text-light" aria-current="page" href="/mylinks">My Links</a>
49-
</li>
50-
</ul>
51-
<div class="dropstart dropdown-menu-md">
52-
<a href="#" class="d-block text-white text-decoration-none dropdown-toggle"
53-
data-bs-toggle="dropdown" aria-expanded="false">
54-
Signed in as: {{name}}
55-
</a>
56-
<ul class="dropdown-menu text-small">
57-
<li><a class="dropdown-item disabled" href="#">Email: {{email}}</a></li>
58-
<li>
59-
<hr class="dropdown-divider">
60-
</li>
61-
<li><a class="dropdown-item text-dark" href="/logout">Logout</a></li>
62-
</ul>
63-
</div>
64-
</div>
65-
</div>
66-
</nav>
35+
{{>fullNavbar}}
6736
<br />
6837
<div class="container">
6938
<h1 style="text-align: center;">Your shortened links</h1>
@@ -111,21 +80,8 @@ <h1 style="text-align: center;">Your delegated links</h1>
11180
</table>
11281
{{/delegatedLinks.length}}
11382
</div>
114-
<div class="container fixed-bottom">
115-
<footer class="d-flex flex-wrap justify-content-between align-items-center py-3 my-4 border-top">
116-
<div class="col-md-4 d-flex align-items-center">
117-
<span class="mb-3 mb-md-0 text-white">©
118-
<script>document.write(new Date().getFullYear())</script> {{{copyrightOwner}}}
119-
</span>
120-
</div>
121-
<ul class="nav col-md-4 justify-content-end">
122-
<li class="nav-item"><a href="{{{orgHome}}}" class="nav-link px-2 text-white">{{{copyrightOwner}}}
123-
Home</a></li>
124-
<li class="nav-item"><a href="{{{statusURL}}}/" class="nav-link px-2 text-white">System
125-
Status</a></li>
126-
</ul>
127-
</footer>
128-
</div>
83+
{{> footer}}
84+
12985
</body>
13086

13187
</html>

view/unauthorized.html

+2-27
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,7 @@
1010
<script src="/static/js/index.js"></script>
1111
</head>
1212
<body class="epoch-dark epoch-font">
13-
<nav class="navbar navbar-expand-lg">
14-
<div class="container-fluid">
15-
<a class="navbar-brand text-light" href="/">
16-
<img src="{{{logoPath}}}" height="50">&nbsp;&nbsp;Link Shortener
17-
</a>
18-
<button class="navbar-toggler" type="button" data-bs-toggle="collapse"
19-
data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false"
20-
aria-label="Toggle navigation">
21-
<span class="navbar-toggler-icon"></span>
22-
</button>
23-
</div>
24-
</nav>
13+
{{> smallNavbar}}
2514
<div class="px-4 py-5 my-5 text-center">
2615
<img class="d-block mx-auto mb-4" src="{{{logoPath}}}" height="100" alt="{{{copyrightOwner}}} Logo">
2716
<h1 class="display-5 fw-bold" style="color: white;">Unauthorized</h1>
@@ -35,20 +24,6 @@ <h1 class="display-5 fw-bold" style="color: white;">Unauthorized</h1>
3524
</div>
3625
</div>
3726
</div>
38-
<div class="container fixed-bottom">
39-
<footer class="d-flex flex-wrap justify-content-between align-items-center py-3 my-4 border-top">
40-
<div class="col-md-4 d-flex align-items-center">
41-
<span class="mb-3 mb-md-0 text-white">©
42-
<script>document.write(new Date().getFullYear())</script> {{{copyrightOwner}}}
43-
</span>
44-
</div>
45-
<ul class="nav col-md-4 justify-content-end">
46-
<li class="nav-item"><a href="{{{orgHome}}}" class="nav-link px-2 text-white">{{{copyrightOwner}}}
47-
Home</a></li>
48-
<li class="nav-item"><a href="{{{statusURL}}}/" class="nav-link px-2 text-white">System
49-
Status</a></li>
50-
</ul>
51-
</footer>
52-
</div>
27+
{{> footer}}
5328
</body>
5429
</html>

0 commit comments

Comments
 (0)