Skip to content

Commit 6db50d9

Browse files
feat: request to unpublish and cancel requests
fixes #105
1 parent d9d9c48 commit 6db50d9

File tree

13 files changed

+95
-26
lines changed

13 files changed

+95
-26
lines changed

src/emails.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,11 @@ If it was not you, then please disregard this message.</p>
9191
};
9292

9393
let newRequest = {
94-
subject: 'New request to publish results on epubtest.org',
94+
subject: 'New request on epubtest.org',
9595
text: answerSet => `
9696
Hello,
9797
98-
Someone has requested to publish results for ${answerSet.testingEnvironment.readingSystem.name} ${answerSet.testingEnvironment.readingSystem.version}
98+
Someone has requested to publish or unpublish results for ${answerSet.testingEnvironment.readingSystem.name} ${answerSet.testingEnvironment.readingSystem.version}
9999
on epubtest.org. Please login and go to https://epubtest.org/admin/requests to manage and approve pending requests.
100100
101101
- epubtest.org

src/pages/css/forms.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,7 @@ button:hover, input[type=submit]:hover {
4444
gap: 0.5rem;
4545
}
4646

47+
/* very specific and brittle selector but i don't want to inadvertently affect other forms */
48+
form[action='/forms/login'] {
49+
gap: 1rem;
50+
}

src/pages/templates/admin/requests.njk

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
<th>Testing environment</th>
1919
<th>Date requested</th>
2020
<th>User</th>
21+
<th>Request type</th>
2122
<th>Actions</th>
2223
</tr>
2324
</thead>
@@ -28,6 +29,7 @@
2829
<td>{{ testingEnvironmentLabels.TestingEnvironmentLink(request.answerSet.testingEnvironment) }}</td>
2930
<td>{{ dayjs(request.created).format("YYYY-MM-DD HH:mm:ss") }}</td>
3031
<td>{{ request.answerSet.user.name }}</td>
32+
<td>{%- if request.reqType == 'PUBLISH' -%}Publish{%- else -%}Unpublish{%- endif -%}</td>
3133
<td>
3234
<form method="POST" action="/admin/forms/handle-request" style="gap: .5rem;">
3335
<input type="hidden" name="requestId" value="{{request.id}}"></input>

src/pages/templates/admin/testing-environment.njk

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -102,13 +102,13 @@
102102
<th>Score</th>
103103
<th>Edit</th>
104104
<th>Status</th>
105-
<th>Publishing requested</th>
105+
<th>Request</th>
106106
<th>Share</th>
107107
</tr>
108108
</thead>
109109
<tbody>
110110
{%- for answerSet in testingEnvironment.answerSets -%}
111-
{%- set requestToPublish=getRequestToPublish(answerSet.id) -%}
111+
112112
{%- set answerSetStatus = displayUtils.answerSetCompletedStatus(answerSet) -%}
113113
<tr id="{{answerSet.testBook.topic.id}}-{{answerSet.testBook.version}}">
114114
<td>{{answerSet.id}}</td>
@@ -170,10 +170,14 @@
170170
{%- endif -%}
171171
</td>
172172
<td>
173-
{%- if requestsToPublish[answerSet.id] -%}
174-
Yes
173+
{%- if publishRequests[answerSet.id] -%}
174+
{%- if publishRequests[answerSet.id].type == 'PUBLISH' -%}
175+
Request to publish
176+
{%- else -%}
177+
Request to unpublish
178+
{%- endif -%})
175179
{%- else -%}
176-
No
180+
No request
177181
{%- endif -%}
178182
</td>
179183
<td>

src/pages/templates/dashboard-details.njk

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,28 @@
9292
{%- if answerSet.isPublic -%}
9393
<a href="/results/{{testingEnvironment.id}}#{{answerSet.testBook.topic.id}}">Published</a>
9494
{%- else -%}
95-
{%- if getRequestToPublish(answerSet.id) -%}
96-
<span>Request pending</span>
97-
{%- else -%}
98-
<form method="POST" action="/user/forms/request-to-publish">
95+
Unpublished
96+
{%- endif -%}
97+
{%- if getPublishRequest(answerSet.id) -%}
98+
<span>Request to {%- if getPublishRequest(answerSet.id).type == 'PUBLISH' %} publish {% else %} unpublish {%- endif %}
99+
submitted</span>
100+
<form method="POST" action="/user/forms/cancel-request">
99101
<input type="hidden" name="answerSetId" value="{{answerSet.id}}"/>
100-
<input type="submit" name="submit" value="Request to publish"/>
102+
<input type="hidden" name="testEnvId" value="{{answerSet.testingEnvironment.id}}"/>
103+
<input type="submit" name="submit" value="Cancel request"/>
101104
</form>
105+
{%- else -%}
106+
<form method="POST" action="/user/forms/request">
107+
<input type="hidden" name="answerSetId" value="{{answerSet.id}}"/>
108+
<input type="hidden" name="testEnvId" value="{{answerSet.testingEnvironment.id}}"/>
109+
{%- if answerSet.isPublic -%}
110+
<input type="submit" name="submit" value="Request to unpublish"/>
111+
<input type="hidden" name="requestType" value="UNPUBLISH"/>
112+
{%- else -%}
113+
<input type="submit" name="submit" value="Request to publish"/>
114+
<input type="hidden" name="requestType" value="PUBLISH"/>
102115
{%- endif -%}
116+
</form>
103117
{%- endif -%}
104118
{%- endif -%}
105119
<td>

src/queries/requests.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import * as answerSets from './answerSets.js';
1212
const FIELDS = () => `
1313
id
1414
created
15+
reqType
1516
answerSet {
1617
${answerSets.FIELDS()}
1718
}`;

src/routes/admin-forms.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,30 @@ router.post('/unpublish', async (req, res, next) => {
104104
return next(err);
105105
}
106106

107+
// also clear any requests for unpublishing that this answer set might have had
108+
dbres = await db.query(
109+
Q.REQUESTS.GET_FOR_ANSWERSETS(),
110+
{ ids: [parseInt(req.body.answerSetId)]},
111+
req.cookies.jwt
112+
);
113+
114+
if (!dbres.success) {
115+
let err = new Error("Could not get requests.");
116+
return next(err);
117+
}
118+
119+
if (dbres.data && dbres.data.requests.length > 0) {
120+
dbres = await db.query(Q.REQUESTS.DELETE(),
121+
{ id: dbres.data.requests[0].id },
122+
req.cookies.jwt);
123+
124+
if (!dbres.success) {
125+
let err = new Error("Could not delete request to unpublish.");
126+
return next(err);
127+
}
128+
}
129+
130+
107131
let nextUrl = req.body.next ?? `/admin/testing-environment/${req.body.testingEnvironmentId}`
108132
return res.redirect(nextUrl);
109133
});

src/routes/admin.js

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -84,23 +84,19 @@ router.get('/testing-environment/:id', async (req, res, next) => {
8484
return next(err);
8585
}
8686
let requests = dbres.data.requests;
87-
let requestsToPublish = {};
87+
let publishRequests = {};
8888
testingEnvironment.answerSets.map(aset => {
8989
let foundRequest = requests.find(r => r.answerSet.id == aset.id);
9090
if (foundRequest) {
91-
requestsToPublish[aset.id] = foundRequest;
91+
publishRequests[aset.id] = foundRequest;
9292
}
9393
});
9494

9595
return res.render('admin/testing-environment.njk',
9696
{
9797
testingEnvironment,
9898
users,
99-
requestsToPublish,
100-
getRequestToPublish: answerSetId => {
101-
let retval = requests.find(r => r.answerSet.id === answerSetId);
102-
return retval;
103-
},
99+
publishRequests,
104100
displayUtils
105101
}
106102
);

src/routes/user-forms.js

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,19 @@ const { validator, validationResult, body } = expressValidator;
1111
const router = express.Router()
1212

1313
// submit request to publish
14-
router.post('/request-to-publish', async (req, res, next) => {
14+
router.post('/request', async (req, res, next) => {
1515
let dbres = await db.query(
1616
Q.REQUESTS.CREATE(),
1717
{
1818
input: {
1919
answerSetId: parseInt(req.body.answerSetId),
20-
type: 'PUBLISH'
20+
reqType: req.body.requestType
2121
}
2222
},
2323
req.cookies.jwt);
2424

2525
if (!dbres.success) {
26-
let err = new Error("Could not create request to publish");
26+
let err = new Error("Could not create request to publish/unpublish");
2727
return next(err);
2828
}
2929

@@ -43,7 +43,30 @@ router.post('/request-to-publish', async (req, res, next) => {
4343
emails.newRequest.subject,
4444
emails.newRequest.text(dbres.data.answerSet),
4545
emails.newRequest.html(dbres.data.answerSet));
46-
res.redirect('/user/dashboard');
46+
res.redirect(`/user/dashboard/testing/${dbres.data.answerSet.testingEnvironment.id}`);
47+
});
48+
router.post('/cancel-request', async (req, res, next) => {
49+
let dbres = await db.query(
50+
Q.REQUESTS.GET_FOR_ANSWERSETS(),
51+
{ ids: [parseInt(req.body.answerSetId)]},
52+
req.cookies.jwt
53+
);
54+
55+
if (!dbres.success || dbres.data.requests.length < 1) {
56+
let err = new Error("Could not get requests.");
57+
return next(err);
58+
}
59+
60+
dbres = await db.query(
61+
Q.REQUESTS.DELETE(),
62+
{ id: dbres.data.requests[0].id},
63+
req.cookies.jwt);
64+
65+
if (!dbres.success) {
66+
let err = new Error("Could not cancel request");
67+
return next(err);
68+
}
69+
res.redirect(`/user/dashboard/testing/${req.body.testEnvId}`);
4770
});
4871

4972
// submit results

src/routes/user.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ router.get('/dashboard/testing/:testingEnvironmentId', async (req, res, next) =>
4848
return res.render('dashboard-details.njk',
4949
{
5050
testingEnvironment,
51-
getRequestToPublish: answerSetId => {
51+
getPublishRequest: answerSetId => {
5252
let retval = requests.find(r => r.answerSet.id === answerSetId);
5353
return retval;
5454
},

0 commit comments

Comments
 (0)