Skip to content

Commit 81b9beb

Browse files
authored
Merge branch 'dev' into dependabot/npm_and_yarn/webpack-5.105.0
2 parents c4cae7c + 2842f4d commit 81b9beb

File tree

10 files changed

+236
-67
lines changed

10 files changed

+236
-67
lines changed

api-docs/openapi.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5078,7 +5078,7 @@
50785078
}
50795079
}
50805080
},
5081-
"/review/org/{uuid}": {
5081+
"/review/{uuid}": {
50825082
"put": {
50835083
"tags": [
50845084
"Review Object"
@@ -5181,7 +5181,7 @@
51815181
}
51825182
}
51835183
},
5184-
"/review/org/{uuid}/approve": {
5184+
"/review/{uuid}/approve": {
51855185
"put": {
51865186
"tags": [
51875187
"Review Object"
@@ -5285,7 +5285,7 @@
52855285
}
52865286
}
52875287
},
5288-
"/review/org/{uuid}/reject": {
5288+
"/review/{uuid}/reject": {
52895289
"put": {
52905290
"tags": [
52915291
"Review Object"

src/controller/org.controller/org.controller.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,13 +175,13 @@ async function getUser (req, res, next) {
175175
return res.status(404).json(error.userDne(username))
176176
}
177177

178-
const rawResult = result
178+
const rawResult = result.toObject()
179179

180180
delete rawResult._id
181181
delete rawResult.__v
182182
delete rawResult.secret
183183

184-
logger.info({ uuid: req.ctx.uuid, message: username + ' was sent to the user.', user: result })
184+
logger.info({ uuid: req.ctx.uuid, message: username + ' was sent to the user.', user: rawResult })
185185
return res.status(200).json(rawResult)
186186
} catch (err) {
187187
next(err)
@@ -190,7 +190,7 @@ async function getUser (req, res, next) {
190190

191191
/**
192192
* Get details on ID quota for an org with the specified org shortname.
193-
* Called by GET /api/registry/org/{shortname}/id_quota, GET /api/org/{shortname}/id_quota
193+
* Called by GET /api/registry/org/{shortname}/hard_quota, GET /api/org/{shortname}/id_quota
194194
*
195195
* @param {Object} req - The request object
196196
* @param {Object} res - The response object

src/controller/review-object.controller/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@ router.get('/review/org/:identifier/reviews',
324324
)
325325

326326
// Update a review object
327-
router.put('/review/org/:uuid',
327+
router.put('/review/:uuid',
328328
/*
329329
#swagger.tags = ['Review Object']
330330
#swagger.operationId = 'updateReviewObjectByReviewUUID'
@@ -407,7 +407,7 @@ router.put('/review/org/:uuid',
407407
)
408408

409409
// Approve a review object
410-
router.put('/review/org/:uuid/approve',
410+
router.put('/review/:uuid/approve',
411411
/*
412412
#swagger.tags = ['Review Object']
413413
#swagger.operationId = 'approveReviewObject'
@@ -491,7 +491,7 @@ router.put('/review/org/:uuid/approve',
491491
)
492492

493493
// Reject a review object
494-
router.put('/review/org/:uuid/reject',
494+
router.put('/review/:uuid/reject',
495495
/*
496496
#swagger.tags = ['Review Object']
497497
#swagger.operationId = 'rejectReviewObject'

src/controller/review-object.controller/review-object.controller.js

Lines changed: 79 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ async function getReviewObjectByOrgIdentifier (req, res, next) {
2222
let value
2323
// We may want this to be something different, but for now we are just testing
2424
if (identifierIsUUID) {
25-
value = await repo.getOrgReviewObjectByOrgUUID(identifier, isSecretariat)
25+
value = await repo.getOrgReviewObjectByOrgUUID(identifier, isSecretariat, {})
2626
} else {
27-
value = await repo.getOrgReviewObjectByOrgShortname(identifier, isSecretariat)
27+
value = await repo.getOrgReviewObjectByOrgShortname(identifier, isSecretariat, {})
2828
}
2929
if (!value) {
3030
return res.status(404).json({ message: 'No pending review object exists for this organization' })
@@ -61,19 +61,26 @@ async function approveReviewObject (req, res, next) {
6161
const reviewRepo = req.ctx.repositories.getReviewObjectRepository()
6262
const baseOrgRepo = req.ctx.repositories.getBaseOrgRepository()
6363
const userRepo = req.ctx.repositories.getBaseUserRepository()
64+
const isSecretariat = await baseOrgRepo.isSecretariatByShortName(req.ctx.org)
65+
const isPendingReview = true
6466
const UUID = req.params.uuid
6567
const body = req.body
66-
const session = await mongoose.startSession()
67-
let reviewObj
68+
const session = await mongoose.startSession({ causalConsistency: false })
6869
let updatedOrgObj
6970

7071
try {
7172
session.startTransaction()
7273

73-
const reviewObject = await reviewRepo.findOneByUUID(UUID, { session })
74+
const bodyValidation = (body && Object.keys(body).length) ? baseOrgRepo.validateOrg(body) : { isValid: true }
75+
if (!bodyValidation.isValid) {
76+
await session.abortTransaction()
77+
return res.status(400).json({ message: 'Invalid body parameters', errors: bodyValidation.errors })
78+
}
79+
80+
const reviewObject = await reviewRepo.findOneByUUIDWithConversation(UUID, isSecretariat, isPendingReview, { session })
7481
if (!reviewObject) {
7582
await session.abortTransaction()
76-
return res.status(404).json({ message: `No review object found with UUID ${UUID}` })
83+
return res.status(404).json({ message: `No pending review object found with UUID ${UUID}` })
7784
}
7885

7986
const org = await baseOrgRepo.findOneByUUID(reviewObject.target_object_uuid, { session })
@@ -88,56 +95,89 @@ async function approveReviewObject (req, res, next) {
8895

8996
const requestingUserUUID = await userRepo.getUserUUID(req.ctx.user, req.ctx.org, { session })
9097

91-
reviewObj = await reviewRepo.approveReviewOrgObject(UUID, { session })
92-
await baseOrgRepo.updateOrgFull(org.short_name, dataToUpdate, { session }, false, requestingUserUUID, false, true)
98+
const reviewObj = await reviewRepo.approveReviewOrgObject(UUID, { session })
99+
if (!reviewObj) {
100+
await session.abortTransaction()
101+
return res.status(404).json({ message: `Review object not approved with UUID ${UUID}` })
102+
}
103+
updatedOrgObj = await baseOrgRepo.updateOrgFull(org.short_name, dataToUpdate, { session }, false, requestingUserUUID, false, true)
104+
if (!updatedOrgObj) {
105+
await session.abortTransaction()
106+
return res.status(404).json({ message: `Org Object not updated with UUID ${UUID}` })
107+
}
93108

94109
await session.commitTransaction()
95-
96-
// Return the updated organization
97-
updatedOrgObj = await baseOrgRepo.findOneByUUID(reviewObject.target_object_uuid)
98110
} catch (updateErr) {
99111
await session.abortTransaction()
100-
throw updateErr
112+
return res.status(500).json({ message: updateErr.message || 'Failed to approve review object' })
101113
} finally {
102114
await session.endSession()
103115
}
104-
105-
if (!reviewObj) {
106-
return res.status(404).json({ message: `No review object found with UUID ${UUID}` })
107-
}
108-
109-
return res.status(200).json(updatedOrgObj ? updatedOrgObj.toObject() : null)
116+
_.unset(updatedOrgObj, 'joint_approval_required')
117+
return res.status(200).json(updatedOrgObj)
110118
}
111119

112120
async function updateReviewObjectByReviewUUID (req, res, next) {
113121
const repo = req.ctx.repositories.getReviewObjectRepository()
114122
const UUID = req.params.uuid
115123
const orgRepo = req.ctx.repositories.getBaseOrgRepository()
116124
const body = req.body
125+
const session = await mongoose.startSession({ causalConsistency: false })
126+
let updatedReviewObj
117127

118128
const result = orgRepo.validateOrg(body)
119129
if (!result.isValid) {
120130
return res.status(400).json({ message: 'Invalid new_review_data', errors: result.errors })
121131
}
122132

123-
const value = await repo.updateReviewOrgObject(body, UUID)
133+
try {
134+
session.startTransaction()
135+
const reviewObject = await repo.findOneByUUIDWithConversation(UUID, false, true, { session })
136+
if (!reviewObject) {
137+
await session.abortTransaction()
138+
return res.status(404).json({ message: `No pending review object found with UUID ${UUID}` })
139+
}
140+
updatedReviewObj = await repo.updateReviewOrgObject(body, UUID, { session })
141+
} catch (updateErr) {
142+
await session.abortTransaction()
143+
return res.status(500).json({ message: updateErr.message || 'Failed to update review object' })
144+
} finally {
145+
await session.endSession()
146+
}
124147

125-
if (!value) {
148+
if (!updatedReviewObj) {
126149
return res.status(404).json({ message: `No review object found with UUID ${UUID}` })
127150
}
128-
return res.status(200).json(value)
151+
return res.status(200).json(updatedReviewObj)
129152
}
130153

131154
async function createReviewObject (req, res, next) {
155+
const baseOrgRepo = req.ctx.repositories.getBaseOrgRepository()
132156
const repo = req.ctx.repositories.getReviewObjectRepository()
133157
const body = req.body
158+
const session = await mongoose.startSession({ causalConsistency: false })
159+
let createdReviewObj
134160

135-
const value = await repo.createReviewOrgObject(body)
161+
try {
162+
session.startTransaction()
163+
const bodyValidation = (body && Object.keys(body).length) ? baseOrgRepo.validateOrg(body, { session }) : { isValid: false }
164+
if (!bodyValidation.isValid) {
165+
await session.abortTransaction()
166+
return res.status(400).json({ message: 'Invalid body parameters', errors: bodyValidation.errors })
167+
}
168+
createdReviewObj = await repo.createReviewOrgObject(body, { session })
169+
await session.commitTransaction()
170+
} catch (createErr) {
171+
await session.abortTransaction()
172+
return res.status(500).json({ message: createErr.message || 'Failed to create review object' })
173+
} finally {
174+
await session.endSession()
175+
}
136176

137-
if (!value) {
177+
if (!createdReviewObj) {
138178
return res.status(500).json({ message: 'Failed to create review object' })
139179
}
140-
return res.status(200).json(value)
180+
return res.status(200).json(createdReviewObj)
141181
}
142182

143183
/**
@@ -173,19 +213,30 @@ async function getReviewHistoryByOrgShortNamePaginated (req, res, next) {
173213
}
174214

175215
async function rejectReviewObject (req, res, next) {
176-
const repo = req.ctx.repositories.getReviewObjectRepository()
216+
const reviewRepo = req.ctx.repositories.getReviewObjectRepository()
217+
const baseOrgRepo = req.ctx.repositories.getBaseOrgRepository()
177218
const UUID = req.params.uuid
178-
const session = await mongoose.startSession()
219+
const session = await mongoose.startSession({ causalConsistency: false })
220+
221+
const isSecretariat = await baseOrgRepo.isSecretariatByShortName(req.ctx.org, { session })
222+
223+
const isPendingReview = true
179224
let value
180225

181226
try {
182227
session.startTransaction()
183228

184-
value = await repo.rejectReviewOrgObject(UUID, { session })
229+
const reviewObject = await reviewRepo.findOneByUUIDWithConversation(UUID, isSecretariat, isPendingReview, { session })
230+
if (!reviewObject) {
231+
await session.abortTransaction()
232+
return res.status(404).json({ message: `No pending review object found with UUID ${UUID}` })
233+
}
234+
235+
value = await reviewRepo.rejectReviewOrgObject(UUID, { session })
185236
await session.commitTransaction()
186237
} catch (rejectErr) {
187238
await session.abortTransaction()
188-
throw rejectErr
239+
return res.status(500).json({ message: rejectErr.message || 'Failed to reject review object' })
189240
} finally {
190241
await session.endSession()
191242
}

src/repositories/reviewObjectRepository.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@ class ReviewObjectRepository extends BaseRepository {
2424
return reviewObject || null
2525
}
2626

27-
async findOneByUUIDWithConversation (UUID, isSecretariat, options = {}) {
27+
async findOneByUUIDWithConversation (UUID, isSecretariat, pending = false, options = {}) {
2828
const ConversationRepository = require('./conversationRepository')
2929
const conversationRepository = new ConversationRepository()
3030
let reviewObject
31-
const reviewObjectRaw = await ReviewObjectModel.findOne({ uuid: UUID }, null, options)
31+
const query = pending ? { uuid: UUID, status: 'pending' } : { uuid: UUID }
32+
const reviewObjectRaw = await ReviewObjectModel.findOne(query, null, options)
3233
if (reviewObjectRaw) {
3334
reviewObject = reviewObjectRaw.toObject()
3435
const conversations = await conversationRepository.getAllByTargetUUID(reviewObject.target_object_uuid, isSecretariat, options)

src/scripts/populate.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,15 +132,24 @@ db.once('open', async () => {
132132

133133
// don't close database connection until all remaining populate
134134
// promises are resolved
135-
Promise.all(populatePromises).then(function () {
135+
Promise.all(populatePromises).then(async function () {
136136
logger.info('Successfully populated the database!')
137137

138+
const indexPromises = []
138139
Object.keys(indexesToCreate).forEach(col => {
139140
indexesToCreate[col].forEach(index => {
140-
db.collections[col].createIndex(index)
141+
indexPromises.push(db.collections[col].createIndex(index))
141142
})
142143
})
143-
mongoose.connection.close()
144+
145+
try {
146+
await Promise.all(indexPromises)
147+
logger.info('Successfully created indexes!')
148+
} catch (err) {
149+
logger.error('Error creating indexes:', err)
150+
} finally {
151+
mongoose.connection.close()
152+
}
144153
})
145154
} else {
146155
mongoose.connection.close()

test/integration-tests/registry-org/registryOrgWithJointReviewTest.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,9 @@ describe('Testing Joint approval', () => {
148148
})
149149
})
150150
it('Secretariat can approve the ORG review with body parameter', async function () {
151-
const newBody = { short_name: 'final_non_secretariat_org', hard_quota: 20000 }
151+
const newBody = { short_name: 'final_non_secretariat_org', hard_quota: 20000, long_name: 'Final Non Secretariat Organization' }
152152
await chai.request(app)
153-
.put(`/api/review/org/${reviewUUID}/approve`)
153+
.put(`/api/review/${reviewUUID}/approve`)
154154
.set(secretariatHeaders)
155155
.send(newBody)
156156
.then((res) => {
@@ -306,7 +306,7 @@ describe('Testing Joint approval', () => {
306306
})
307307
it('Secretariat can approve the ORG review', async function () {
308308
await chai.request(app)
309-
.put(`/api/review/org/${reviewUUID}/approve`)
309+
.put(`/api/review/${reviewUUID}/approve`)
310310
.set(secretariatHeaders)
311311
.then((res) => {
312312
expect(res).to.have.status(200)

0 commit comments

Comments
 (0)