Skip to content

Commit 3234bdf

Browse files
committed
Another pass
1 parent 51c8107 commit 3234bdf

File tree

2 files changed

+77
-33
lines changed

2 files changed

+77
-33
lines changed

src/controller/registry-user.controller/registry-user.controller.js

Lines changed: 26 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -121,15 +121,33 @@ async function createUser (req, res, next) {
121121
}
122122

123123
async function updateUser (req, res, next) {
124-
try {
125-
const userUUID = req.ctx.params.identifier
126-
const userRepo = req.ctx.repositories.getBaseUserRepository()
127-
const orgRepo = req.ctx.repositories.getBaseOrgRepository()
124+
const session = await mongoose.startSession()
125+
const userUUID = req.ctx.params.identifier
126+
const userRepo = req.ctx.repositories.getBaseUserRepository()
127+
const orgRepo = req.ctx.repositories.getBaseOrgRepository()
128+
const body = req.ctx.body
129+
let result
128130

129-
await registryUserRepo.updateByUUID(userUUID, newUser)
130-
const agt = setAggregateUserObj({ UUID: userUUID })
131-
let result = await registryUserRepo.aggregate(agt)
132-
result = result.length > 0 ? result[0] : null
131+
try {
132+
session.startTransaction()
133+
try {
134+
result = await userRepo.validateUser(body)
135+
if (body?.role && typeof body?.role !== 'string') {
136+
return res.status(400).json({ message: 'Parameters were invalid', details: [{ param: 'role', msg: 'Parameter must be a string' }] })
137+
}
138+
if (!result.isValid) {
139+
logger.error(JSON.stringify({ uuid: req.ctx.uuid, message: 'User JSON schema validation FAILED.' }))
140+
await session.abortTransaction()
141+
return res.status(400).json({ message: 'Parameters were invalid', errors: result.errors })
142+
}
143+
await userRepo.updateUserFull(userUUID, body, { session })
144+
await session.commitTransaction()
145+
} catch (error) {
146+
await session.abortTransaction()
147+
throw error
148+
} finally {
149+
await session.endSession()
150+
}
133151

134152
const payload = {
135153
action: 'update_registry_user',
@@ -190,29 +208,6 @@ async function deleteUser (req, res, next) {
190208
}
191209
}
192210

193-
function setAggregateUserObj (query) {
194-
return [
195-
{
196-
$match: query
197-
},
198-
{
199-
$project: {
200-
_id: false,
201-
UUID: true,
202-
user_id: true,
203-
name: true,
204-
org_affiliations: true,
205-
cve_program_org_membership: true,
206-
created: true,
207-
created_by: true,
208-
last_updated: true,
209-
deactivation_date: true,
210-
last_active: true
211-
}
212-
}
213-
]
214-
}
215-
216211
module.exports = {
217212
ALL_USERS: getAllUsers,
218213
SINGLE_USER: getUser,

src/repositories/baseUserRepository.js

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -316,9 +316,58 @@ class BaseUserRepository extends BaseRepository {
316316
return deepRemoveEmpty(plainJavascriptRegistryUser)
317317
}
318318

319-
async updateUserFull () {
320-
const baseOrgRepository = new BaseOrgRepository()
319+
async updateUserFull (identifier, incomingUser, options = {}, isLegacyObject = false) {
321320
const legacyUserRepo = new UserRepository()
321+
322+
// Find registry user by UUID
323+
const registryUser = await this.findUserByUUID(identifier, options)
324+
if (!registryUser) {
325+
throw new Error('Registry user not found')
326+
}
327+
328+
// Find legacy user
329+
const legacyUser = await legacyUserRepo.findOneByUUID(identifier)
330+
if (!legacyUser) {
331+
throw new Error('Legacy user not found')
332+
}
333+
334+
let legacyObjectRaw
335+
let registryObjectRaw
336+
337+
if (isLegacyObject) {
338+
legacyObjectRaw = incomingUser
339+
registryObjectRaw = this.convertRegistryToLegacy(incomingUser)
340+
} else {
341+
registryObjectRaw = incomingUser
342+
legacyObjectRaw = this.convertRegistryToLegacy(incomingUser)
343+
}
344+
345+
const updatedLegacyUser = _.merge(legacyUser, legacyObjectRaw)
346+
const updatedRegistryUser = _.merge(registryUser, registryObjectRaw)
347+
348+
try {
349+
await updatedLegacyUser.save({ options })
350+
await updatedRegistryUser.save({ options })
351+
} catch (error) {
352+
throw new Error('Failed to update user')
353+
}
354+
355+
if (isLegacyObject) {
356+
const plain = updatedLegacyUser.toObject()
357+
delete plain._id
358+
delete plain.__v
359+
delete plain.secret
360+
return plain
361+
}
362+
363+
// Retrieve updated registry user
364+
const plainJsRegistryUser = updatedRegistryUser.toObject()
365+
delete plainJsRegistryUser._id
366+
delete plainJsRegistryUser.__v
367+
delete plainJsRegistryUser.secret
368+
delete plainJsRegistryUser.authority
369+
370+
return plainJsRegistryUser
322371
}
323372

324373
async resetSecret (username, orgShortName, options = {}, isLegacyObject = false) {

0 commit comments

Comments
 (0)