Skip to content
Snippets Groups Projects
Commit 36b704a5 authored by Sebastian Mihalache's avatar Sebastian Mihalache
Browse files

feat(component-invite): add invitedOn and respondedOn to invitations, fix API tests

parent a489ebfc
No related branches found
No related tags found
1 merge request!8Sprint #10
......@@ -18,21 +18,14 @@ const CollectionsInvitations = app => {
* }
* @apiSuccessExample {json} Success
* HTTP/1.1 200 OK
* {
* "id": "a6184463-b17a-42f8-b02b-ae1d755cdc6b",
* "type": "user",
* "admin": false,
* "email": "email@example.com",
* "teams": [
* "c576695a-7cda-4e27-8e9c-31f3a0e9d592"
* ],
* "username": "email@example.com",
* "fragments": [],
* "collections": [],
* "isConfirmed": false,
* "editorInChief": false,
* "handlingEditor": true,
* "passwordResetToken": "04590a2b7f6c1f37cb84881d529e516fa6fc309c205a07f1341b2bfaa6f2b46c"
* {
* "id": "7b2431af-210c-49f9-a69a-e19271066ebd",
* "role": "reviewer",
* "userId": "4c3f8ee1-785b-4adb-87b4-407a27f652c6",
* "hasAnswer": false,
* "invitedOn": 1525428890167,
* "isAccepted": false,
* "respondedOn": null
* }
* @apiErrorExample {json} Invite user errors
* HTTP/1.1 403 Forbidden
......@@ -55,7 +48,8 @@ const CollectionsInvitations = app => {
* HTTP/1.1 200 OK
* [{
* "name": "John Smith",
* "timestamp": "123223121",
* "invitedOn": 1525428890167,
* "respondedOn": 1525428890299,
* "email": "email@example.com",
* "status": "pending",
* "invitationId": "1990881"
......@@ -99,19 +93,14 @@ const CollectionsInvitations = app => {
* }
* @apiSuccessExample {json} Success
* HTTP/1.1 200 OK
* {
* "id": "a6184463-b17a-42f8-b02b-ae1d755cdc6b",
* "type": "user",
* "admin": false,
* "email": "email@example.com",
* "teams": [],
* "username": "email@example.com",
* "fragments": [],
* "collections": [],
* "isConfirmed": false,
* "editorInChief": false,
* "handlingEditor": true,
* "passwordResetToken": "04590a2b7f6c1f37cb84881d529e516fa6fc309c205a07f1341b2bfaa6f2b46c"
* {
* "id": "7b2431af-210c-49f9-a69a-e19271066ebd",
* "role": "reviewer",
* "userId": "4c3f8ee1-785b-4adb-87b4-407a27f652c6",
* "hasAnswer": true,
* "invitedOn": 1525428890167,
* "isAccepted": false,
* "respondedOn": 1525428890299
* }
* @apiErrorExample {json} Update invitations errors
* HTTP/1.1 403 Forbidden
......
......@@ -7,7 +7,8 @@ const addHandlingEditor = async (collection, user, invitation) => {
collection.handlingEditor = {
id: user.id,
name: `${user.firstName} ${user.lastName}`,
timestamp: invitation.timestamp,
invitedOn: invitation.invitedOn,
respondedOn: invitation.respondedOn,
email: user.email,
hasAnswer: invitation.hasAnswer,
isAccepted: invitation.isAccepted,
......@@ -18,7 +19,7 @@ const addHandlingEditor = async (collection, user, invitation) => {
const updateHandlingEditor = async (collection, isAccepted) => {
collection.handlingEditor.hasAnswer = true
collection.handlingEditor.isAccepted = isAccepted
collection.handlingEditor.timestamp = Date.now()
collection.handlingEditor.respondedOn = Date.now()
let status
isAccepted ? (status = 'heAssigned') : (status = 'submitted')
await updateStatus(collection, status)
......
......@@ -12,8 +12,8 @@ const getInvitationData = (invitations, userId, role) => {
status = 'declined'
}
const { timestamp, id } = matchingInvitation
return { timestamp, status, id }
const { invitedOn, respondedOn, id } = matchingInvitation
return { invitedOn, respondedOn, status, id }
}
const setupInvitation = async (userId, role, collection) => {
......@@ -21,9 +21,10 @@ const setupInvitation = async (userId, role, collection) => {
role,
hasAnswer: false,
isAccepted: false,
timestamp: Date.now(),
invitedOn: Date.now(),
id: uuid.v4(),
userId,
respondedOn: null,
}
collection.invitations = collection.invitations || []
collection.invitations.push(invitation)
......
......@@ -33,7 +33,7 @@ module.exports = models => async (req, res) => {
}`,
})
invitation.timestamp = Date.now()
invitation.respondedOn = Date.now()
invitation.hasAnswer = true
invitation.isAccepted = false
await collection.save()
......
......@@ -7,7 +7,6 @@ const authsomeHelper = require('../../helpers/authsome')
const configRoles = config.get('roles')
module.exports = models => async (req, res) => {
const { role } = req.query
// TO DO: authsome
if (!helpers.checkForUndefinedParams(role)) {
res.status(400).json({ error: 'Role is required' })
return
......@@ -41,14 +40,20 @@ module.exports = models => async (req, res) => {
// TO DO: handle case for when the invitationID is provided
const membersData = members.map(async member => {
const user = await models.User.find(member)
const { timestamp, status, id } = invitationHelper.getInvitationData(
const {
invitedOn,
respondedOn,
status,
id,
} = invitationHelper.getInvitationData(
collection.invitations,
user.id,
role,
)
return {
name: `${user.firstName} ${user.lastName}`,
timestamp,
invitedOn,
respondedOn,
email: user.email,
status,
invitationId: id,
......
......@@ -43,7 +43,7 @@ module.exports = models => async (req, res) => {
}
if (invitation.role === 'handlingEditor')
await collectionHelper.updateHandlingEditor(collection, isAccepted)
invitation.timestamp = Date.now()
invitation.respondedOn = Date.now()
invitation.hasAnswer = true
const eic = await userHelper.getEditorInChief(models.User)
const toEmail = eic.email
......@@ -69,9 +69,9 @@ module.exports = models => async (req, res) => {
await userHelper.setupReviewerDecisionEmailData({
...params,
agree: true,
timestamp: invitation.timestamp,
timestamp: invitation.respondedOn,
})
res.status(200).json(invitation)
return res.status(200).json(invitation)
} catch (e) {
logger.error(e)
return res.status(500).json({ error: 'Email could not be sent.' })
......
......@@ -79,7 +79,7 @@ module.exports = models => async (req, res) => {
return res
.status(400)
.json({ error: 'User has already replied to a previous invitation.' })
invitation.timestamp = Date.now()
invitation.invitedOn = Date.now()
await collection.save()
resend = true
} else {
......@@ -99,13 +99,13 @@ module.exports = models => async (req, res) => {
...params,
user,
invitationId: invitation.id,
timestamp: invitation.timestamp,
timestamp: invitation.invitedOn,
resend,
})
}
if (role === 'handlingEditor') {
invitation.timestamp = Date.now()
invitation.invitedOn = Date.now()
await collection.save()
await collectionHelper.addHandlingEditor(collection, user, invitation)
await mailService.setupAssignEmail(
......@@ -148,7 +148,7 @@ module.exports = models => async (req, res) => {
...params,
user: newUser,
invitationId: invitation.id,
timestamp: invitation.timestamp,
timestamp: invitation.invitedOn,
})
return res.status(200).json(invitation)
}
......
......@@ -31,7 +31,8 @@ const collections = {
hasAnswer: false,
isAccepted: false,
userId: handlingEditor.id,
timestamp: chance.timestamp(),
invitedOn: chance.timestamp(),
respondedOn: null,
},
{
id: chance.guid(),
......@@ -39,7 +40,8 @@ const collections = {
hasAnswer: false,
isAccepted: false,
userId: reviewer.id,
timestamp: chance.timestamp(),
invitedOn: chance.timestamp(),
respondedOn: null,
},
{
id: chance.guid(),
......@@ -47,7 +49,8 @@ const collections = {
hasAnswer: true,
isAccepted: false,
userId: answerReviewer.id,
timestamp: chance.timestamp(),
invitedOn: chance.timestamp(),
respondedOn: chance.timestamp(),
},
],
handlingEditor: {
......@@ -55,7 +58,8 @@ const collections = {
hasAnswer: false,
isAccepted: false,
email: handlingEditor.email,
timestamp: chance.timestamp(),
invitedOn: chance.timestamp(),
respondedOn: null,
name: `${handlingEditor.firstName} ${handlingEditor.lastName}`,
},
},
......
......@@ -162,9 +162,9 @@ async function authenticatedUser(user, operation, object, context) {
const collection = await context.models.Collection.find(
get(object.collection, 'id'),
)
if (collection.handlingEditor.id === user.id) {
return true
}
const handlingEditor = get(collection, 'handlingEditor')
if (!handlingEditor) return false
if (handlingEditor.id === user.id) return true
return false
}
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment