Skip to content

Commit 7b1b48c

Browse files
authored
Merge pull request #465 from CVEProject/count-only-parameter
added functionality to obtain count_only
2 parents 3cccd86 + 56cc5a0 commit 7b1b48c

File tree

5 files changed

+72
-1
lines changed

5 files changed

+72
-1
lines changed

docs/openapi.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -924,6 +924,12 @@ paths:
924924
type: string
925925
format: date-time
926926
- $ref: '#/components/parameters/page-query'
927+
- in: query
928+
name: count_only
929+
description: Get count of records that match query. Accepted values are 0 and 1, representing False and True, respectively.
930+
required: false
931+
schema:
932+
type: boolean
927933
responses:
928934
200:
929935
description: A list of CVE records and pagination fields, only allowed by the Secretariat.

src/controller/cve.controller/cve.controller.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,14 @@ async function getFilteredCves (req, res, next) {
6767
}
6868
]
6969

70+
// check whether user requested count_only
71+
if (req.ctx.query.count_only === '1') {
72+
const payload = {}
73+
payload.totalCount = await cveRepo.countDocuments(query)
74+
logger.info({ uuid: req.ctx.uuid, message: 'The cve records count was sent to the user.' })
75+
return res.status(200).json(payload) // only return count number, not the records
76+
}
77+
7078
const pg = await cveRepo.aggregatePaginate(agt, options)
7179
const payload = { cveRecords: pg.itemsList.map(val => { return val.cve }) }
7280

src/controller/cve.controller/cve.middleware.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ function parsePostParams (req, res, next) {
1010
}
1111

1212
function parseGetParams (req, res, next) {
13-
utils.reqCtxMapping(req, 'query', ['page', 'time_modified.lt', 'time_modified.gt'])
13+
utils.reqCtxMapping(req, 'query', ['page', 'time_modified.lt', 'time_modified.gt', 'count_only'])
1414
utils.reqCtxMapping(req, 'params', ['id'])
1515
next()
1616
}

src/controller/cve.controller/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ router.get('/cve',
2020
query(['page']).optional().isInt({ min: CONSTANTS.PAGINATOR_PAGE }),
2121
query(['time_modified.lt']).optional().isString().trim().escape().customSanitizer(val => { return toDate(val) }).not().isEmpty(),
2222
query(['time_modified.gt']).optional().isString().trim().escape().customSanitizer(val => { return toDate(val) }).not().isEmpty(),
23+
query(['count_only']).optional().isBoolean(),
2324
parseError,
2425
parseGetParams,
2526
controller.CVE_GET_FILTERED)

test-http/src/test/cve_tests/cve.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,62 @@ def test_get_cve_by_time_modified():
4848
assert len(json.loads(res.content.decode())['cveRecords']) >= 2
4949

5050

51+
def test_get_cve_by_count_only_true():
52+
""" count_only set to True using number 1 """
53+
res = requests.get(
54+
f'{env.AWG_BASE_URL}{CVE_URL}/',
55+
headers=utils.BASE_HEADERS,
56+
params={
57+
'count_only' : 1
58+
}
59+
60+
)
61+
assert len(json.loads(res.content.decode())) == 1 # only count is returned
62+
assert json.loads(res.content.decode())['totalCount'] == 114
63+
assert res.status_code == 200
64+
65+
66+
def test_get_cve_by_count_only_false():
67+
""" count_only set to False using number 0, returns all records"""
68+
res = requests.get(
69+
f'{env.AWG_BASE_URL}{CVE_URL}/',
70+
headers=utils.BASE_HEADERS,
71+
params={
72+
'count_only' : 0
73+
}
74+
75+
)
76+
print(json.loads(res.content.decode()))
77+
assert len(json.loads(res.content.decode())['cveRecords']) == 114 # all records are returned
78+
assert res.status_code == 200
79+
80+
81+
def test_get_cve_invalid_count_number():
82+
""" count_only can only be set to 0 or 1 """
83+
res = requests.get(
84+
f'{env.AWG_BASE_URL}{CVE_URL}/',
85+
headers=utils.BASE_HEADERS,
86+
params={
87+
'count_only' : 11
88+
}
89+
)
90+
assert res.status_code == 400
91+
response_contains_json(res, 'error', 'BAD_INPUT')
92+
93+
94+
def test_get_cve_invalid_count_value():
95+
""" count_only can only be set to 0 or 1 """
96+
res = requests.get(
97+
f'{env.AWG_BASE_URL}{CVE_URL}/',
98+
headers=utils.BASE_HEADERS,
99+
params={
100+
'count_only' : True
101+
}
102+
)
103+
assert res.status_code == 400
104+
response_contains_json(res, 'error', 'BAD_INPUT')
105+
106+
51107
#### GET /cve/:id ####
52108
def test_get_cve():
53109
res = requests.get(

0 commit comments

Comments
 (0)