@@ -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
112120async 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
131154async 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
175215async 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 }
0 commit comments