Skip to content

Commit cef0093

Browse files
authored
Merge pull request #1549 from CVEProject/dr_review_collection
Resolves #1537 - #1539: First pass at the review collection, with some endpoints for testing
2 parents 6305cf5 + 79f95de commit cef0093

File tree

6 files changed

+192
-0
lines changed

6 files changed

+192
-0
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
const router = require('express').Router()
2+
const controller = require('./review-object.controller')
3+
const mw = require('../../middleware/middleware')
4+
5+
router.get('/review/org/:identifier', mw.useRegistry(), mw.validateUser, mw.onlySecretariat, controller.getReviewObjectByOrgIdentifier)
6+
router.get('/review/orgs', mw.useRegistry(), mw.validateUser, mw.onlySecretariat, controller.getAllReviewObjects)
7+
router.put('/review/org/:uuid', mw.useRegistry(), mw.validateUser, mw.onlySecretariat, controller.updateReviewObjectByReviewUUID)
8+
router.post('/review/org/', mw.useRegistry(), mw.validateUser, mw.onlySecretariat, controller.createReviewObject)
9+
10+
module.exports = router
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
2+
const validateUUID = require('uuid').validate
3+
async function getReviewObjectByOrgIdentifier (req, res, next) {
4+
const repo = req.ctx.repositories.getReviewObjectRepository()
5+
const identifier = req.params.identifier
6+
const identifierIsUUID = validateUUID(identifier)
7+
if (!identifier) {
8+
return res.status(400).json({ message: 'Missing identifier parameter' })
9+
}
10+
let value
11+
// We may want this to be something different, but for now we are just testing
12+
if (identifierIsUUID) {
13+
value = await repo.getOrgReviewObjectByOrgUUID(identifier)
14+
} else {
15+
value = await repo.getOrgReviewObjectByOrgShortname(identifier)
16+
}
17+
return res.status(200).json(value)
18+
}
19+
20+
async function getAllReviewObjects (req, res, next) {
21+
const repo = req.ctx.repositories.getReviewObjectRepository()
22+
const value = await repo.getAllReviewObjects()
23+
return res.status(200).json(value)
24+
}
25+
26+
async function updateReviewObjectByReviewUUID (req, res, next) {
27+
const repo = req.ctx.repositories.getReviewObjectRepository()
28+
const UUID = req.params.uuid
29+
const orgRepo = req.ctx.repositories.getBaseOrgRepository()
30+
const body = req.body
31+
32+
const result = orgRepo.validateOrg(body.new_review_data)
33+
if (!result.isValid) {
34+
return res.status(400).json({ message: 'Invalid new_review_data', errors: result.errors })
35+
}
36+
37+
const value = await repo.updateReviewOrgObject(body, UUID)
38+
39+
if (!value) {
40+
return res.status(404).json({ message: `No review object found with UUID ${UUID}` })
41+
}
42+
return res.status(200).json(value)
43+
}
44+
45+
async function createReviewObject (req, res, next) {
46+
const repo = req.ctx.repositories.getReviewObjectRepository()
47+
const orgRepo = req.ctx.repositories.getBaseOrgRepository()
48+
const body = req.body
49+
50+
if (body.uuid) {
51+
return res.status(400).json({ message: 'Do not pass in a uuid key when creating a review object' })
52+
}
53+
54+
if (!body.target_object_uuid) {
55+
return res.status(400).json({ message: 'Missing required field target_object_uuid' })
56+
}
57+
58+
if (!body.new_review_data) {
59+
return res.status(400).json({ message: 'Missing required field new_review_data' })
60+
}
61+
62+
// Validate the data going into "new_review_data"
63+
const result = orgRepo.validateOrg(body.new_review_data)
64+
if (!result.isValid) {
65+
return res.status(400).json({ message: 'Invalid new_review_data', errors: result.errors })
66+
}
67+
68+
const value = await repo.createReviewOrgObject(body)
69+
70+
if (!value) {
71+
return res.status(500).json({ message: 'Failed to create review object' })
72+
}
73+
return res.status(200).json(value)
74+
}
75+
module.exports = {
76+
getReviewObjectByOrgIdentifier,
77+
getAllReviewObjects,
78+
updateReviewObjectByReviewUUID,
79+
createReviewObject
80+
}

src/model/reviewobject.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
const mongoose = require('mongoose')
2+
const aggregatePaginate = require('mongoose-aggregate-paginate-v2')
3+
const MongoPaging = require('mongo-cursor-pagination')
4+
5+
const schema = {
6+
uuid: String,
7+
target_object_uuid: String,
8+
status: String,
9+
new_review_data: Object // This should be a object containing the new org data in the format of the base org model or one of its descriminators (e.g. CNAOrg, ADPOrg)
10+
}
11+
12+
const ReviewOrgSchema = new mongoose.Schema(schema, { collection: 'ReviewObject', timestamps: { createdAt: 'created', updatedAt: 'last_updated' } })
13+
14+
ReviewOrgSchema.plugin(aggregatePaginate)
15+
16+
// Cursor pagination
17+
ReviewOrgSchema.plugin(MongoPaging.mongoosePlugin)
18+
const ReviewObject = mongoose.model('ReviewObject', ReviewOrgSchema)
19+
module.exports = ReviewObject

src/repositories/repositoryFactory.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ const RegistryUserRepository = require('./registryUserRepository')
77
const RegistryOrgRepository = require('./registryOrgRepository')
88
const BaseOrgRepository = require('./baseOrgRepository')
99
const BaseUserRepository = require('./baseUserRepository')
10+
const ReviewObjectRepository = require('./reviewObjectRepository')
1011

1112
class RepositoryFactory {
1213
getOrgRepository () {
@@ -53,6 +54,11 @@ class RepositoryFactory {
5354
const repo = new BaseUserRepository()
5455
return repo
5556
}
57+
58+
getReviewObjectRepository () {
59+
const repo = new ReviewObjectRepository()
60+
return repo
61+
}
5662
}
5763

5864
module.exports = RepositoryFactory
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
const ReviewObjectModel = require('../model/reviewobject')
2+
const BaseRepository = require('./baseRepository')
3+
const BaseOrgRepository = require('./baseOrgRepository')
4+
const uuid = require('uuid')
5+
6+
class ReviewObjectRepository extends BaseRepository {
7+
async findOneByOrgShortName (orgShortName, options = {}) {
8+
const baseOrgRepository = new BaseOrgRepository()
9+
const org = await baseOrgRepository.findOneByShortName(orgShortName)
10+
if (!org) {
11+
throw new Error(`No organization found with short name ${orgShortName}`)
12+
}
13+
const reviewObject = await ReviewObjectModel.find({ target_object_uuid: org.UUID }, null, options)
14+
15+
return reviewObject || null
16+
}
17+
18+
async findOneByUUID (UUID, options = {}) {
19+
const reviewObject = await ReviewObjectModel.findOne({ uuid: UUID }, null, options)
20+
return reviewObject || null
21+
}
22+
23+
async getAllReviewObjects (options = {}) {
24+
const reviewObjects = await ReviewObjectModel.find({}, null, options)
25+
return reviewObjects || []
26+
}
27+
28+
async deleteReviewObjectByUUID (UUID, options = {}) {
29+
const result = await ReviewObjectModel.deleteOne({ uuid: UUID }, options)
30+
return result.deletedCount
31+
}
32+
33+
async getOrgReviewObjectByOrgShortname (orgShortName, options = {}) {
34+
const baseOrgRepository = new BaseOrgRepository()
35+
const org = await baseOrgRepository.findOneByShortName(orgShortName)
36+
if (!org) {
37+
throw new Error(`No organization found with short name ${orgShortName}`)
38+
}
39+
const reviewObject = await ReviewObjectModel.findOne({ target_object_uuid: org.UUID }, null, options)
40+
41+
return reviewObject || null
42+
}
43+
44+
async getOrgReviewObjectByOrgUUID (orgUUID, options = {}) {
45+
const baseOrgRepository = new BaseOrgRepository()
46+
const org = await baseOrgRepository.findOneByUUID(orgUUID)
47+
if (!org) {
48+
throw new Error(`No organization found with UUID ${orgUUID}`)
49+
}
50+
const reviewObject = await ReviewObjectModel.findOne({ target_object_uuid: org.UUID }, null, options)
51+
52+
return reviewObject || null
53+
}
54+
55+
async createReviewOrgObject (body, options = {}) {
56+
console.log('Creating review object for organization:', body.target_object_uuid)
57+
body.uuid = uuid.v4()
58+
const reviewObject = new ReviewObjectModel(body)
59+
const result = await reviewObject.save(options)
60+
return result.toObject()
61+
}
62+
63+
async updateReviewOrgObject (body, UUID, options = {}) {
64+
console.log('Updating review object with UUID:', UUID)
65+
const reviewObject = await this.findOneByUUID(UUID, options)
66+
67+
// For each item waiting for approval, for testing we are going to just do shortname
68+
reviewObject.new_review_data.short_name = body.new_review_data.short_name || reviewObject.new_review_data.short_name
69+
70+
const result = await reviewObject.save(options)
71+
return result.toObject()
72+
}
73+
}
74+
75+
module.exports = ReviewObjectRepository

src/routes.config.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const SystemController = require('./controller/system.controller')
99
const UserController = require('./controller/user.controller')
1010
const RegistryUserController = require('./controller/registry-user.controller')
1111
const RegistryOrgController = require('./controller/registry-org.controller')
12+
const ReviewObjectController = require('./controller/review-object.controller')
1213

1314
var options = {
1415
swaggerOptions: {
@@ -34,6 +35,7 @@ module.exports = async function configureRoutes (app) {
3435
app.use('/api/', UserController)
3536
app.use('/api/', RegistryUserController)
3637
app.use('/api/', RegistryOrgController)
38+
app.use('/api/', ReviewObjectController)
3739
app.get('/api-docs/openapi.json', (req, res) => res.json(openApiSpecification))
3840
app.use('/api-docs', swaggerUi.serveFiles(null, options), swaggerUi.setup(null, setupOptions))
3941
app.use('/schemas/', SchemasController)

0 commit comments

Comments
 (0)