Skip to content

Commit db903b7

Browse files
committed
chore: convert /api/v1/generate-reports endpoint to POST method
1 parent 26b69cf commit db903b7

File tree

4 files changed

+56
-26
lines changed

4 files changed

+56
-26
lines changed

__tests__/httpServer.test.js

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,33 +41,41 @@ describe('HTTP Server API', () => {
4141
})
4242
})
4343

44-
describe('GET /api/v1/generate-reports', () => {
44+
describe('POST /api/v1/generate-reports', () => {
4545
test('should return status completed when report generation succeeds', async () => {
4646
generateStaticReports.mockResolvedValueOnce()
4747

48-
const response = await app.get('/api/v1/generate-reports')
48+
const response = await app.post('/api/v1/generate-reports')
4949

5050
expect(generateStaticReports).toHaveBeenCalledWith(expect.anything(), { clearPreviousReports: true })
51-
expect(response.status).toBe(200)
51+
expect(response.status).toBe(202)
5252
expect(response.body).toHaveProperty('status', 'completed')
53-
expect(response.body).toHaveProperty('timestamp')
53+
expect(response.body).toHaveProperty('startedAt')
54+
expect(response.body).toHaveProperty('finishedAt')
5455

55-
const timestamp = new Date(response.body.timestamp)
56-
expect(timestamp.toISOString()).toBe(response.body.timestamp)
56+
const startedAt = new Date(response.body.startedAt)
57+
const finishedAt = new Date(response.body.finishedAt)
58+
expect(startedAt.toISOString()).toBe(response.body.startedAt)
59+
expect(finishedAt.toISOString()).toBe(response.body.finishedAt)
60+
expect(finishedAt >= startedAt).toBe(true)
5761
})
5862

5963
test('should return status failed when report generation fails', async () => {
6064
generateStaticReports.mockRejectedValueOnce(new Error('Report generation failed'))
6165

62-
const response = await app.get('/api/v1/generate-reports')
66+
const response = await app.post('/api/v1/generate-reports')
6367

6468
expect(generateStaticReports).toHaveBeenCalledWith(expect.anything(), { clearPreviousReports: true })
6569
expect(response.status).toBe(500)
6670
expect(response.body).toHaveProperty('status', 'failed')
67-
expect(response.body).toHaveProperty('timestamp')
71+
expect(response.body).toHaveProperty('startedAt')
72+
expect(response.body).toHaveProperty('finishedAt')
6873

69-
const timestamp = new Date(response.body.timestamp)
70-
expect(timestamp.toISOString()).toBe(response.body.timestamp)
74+
const startedAt = new Date(response.body.startedAt)
75+
const finishedAt = new Date(response.body.finishedAt)
76+
expect(startedAt.toISOString()).toBe(response.body.startedAt)
77+
expect(finishedAt.toISOString()).toBe(response.body.finishedAt)
78+
expect(finishedAt >= startedAt).toBe(true)
7179
})
7280
})
7381
})

src/httpServer/apiV1.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,22 @@ function createApiRouter (knex, express) {
88
res.json({ status: 'ok', timestamp: new Date().toISOString() })
99
})
1010

11-
router.get('/generate-reports', async (req, res) => {
12-
const timestamp = new Date().toISOString()
11+
router.post('/generate-reports', async (req, res) => {
12+
const startTs = new Date().toISOString()
1313
try {
1414
await generateStaticReports(knex, { clearPreviousReports: true })
15-
res.json({ status: 'completed', timestamp })
15+
res.status(202).json({
16+
status: 'completed',
17+
startedAt: startTs,
18+
finishedAt: new Date().toISOString()
19+
})
1620
} catch (error) {
1721
logger.error(error)
18-
res.status(500).json({ status: 'failed', timestamp })
22+
res.status(500).json({
23+
status: 'failed',
24+
startedAt: startTs,
25+
finishedAt: new Date().toISOString()
26+
})
1927
}
2028
})
2129
return router

src/httpServer/index.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,9 @@ module.exports = () => ({
4242
start: async () => {
4343
const isDbConnected = await checkDatabaseConnection(knex)
4444
if (!isDbConnected) {
45-
logger.error('Failed to connect to database')
46-
process.exit(1)
45+
const err = new Error('Failed to connect to database')
46+
logger.error(err)
47+
throw err
4748
}
4849
return server.listen(staticServer.port, () => {
4950
logger.info(`Server running at http://${staticServer.ip}:${staticServer.port}/`)
@@ -52,7 +53,9 @@ module.exports = () => ({
5253
},
5354
stop: async () => {
5455
await knex.destroy()
55-
server.close()
56+
await new Promise((resolve, reject) => {
57+
server.close(err => (err ? reject(err) : resolve()))
58+
})
5659
logger.info('Server stopped')
5760
}
5861
})

src/reports/index.js

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,26 @@ const generateStaticReports = async (knex, options = { clearPreviousReports: fal
4646

4747
logger.info('Generating reports')
4848
const { getAllProjects, getAllChecklists, getAllComplianceChecks, getAllAlerts, getAllResults, getAllTasks, getAllGithubOrganizationsByProjectsId, getAllGithubRepositories, getAllOSSFResults } = initializeStore(knex)
49-
// @TODO: Run the queries in parallel
50-
const projects = await getAllProjects()
51-
const checklists = await getAllChecklists()
52-
const checks = await getAllComplianceChecks()
53-
const alerts = await getAllAlerts()
54-
const results = await getAllResults()
55-
const tasks = await getAllTasks()
56-
const ossfScorecardResults = await getAllOSSFResults()
57-
const githubRepos = await getAllGithubRepositories()
49+
// Run the queries in parallel
50+
const [
51+
projects,
52+
checklists,
53+
checks,
54+
alerts,
55+
results,
56+
tasks,
57+
ossfScorecardResults,
58+
githubRepos
59+
] = await Promise.all([
60+
getAllProjects(),
61+
getAllChecklists(),
62+
getAllComplianceChecks(),
63+
getAllAlerts(),
64+
getAllResults(),
65+
getAllTasks(),
66+
getAllOSSFResults(),
67+
getAllGithubRepositories()
68+
])
5869

5970
// @TODO: Read the files in parallel
6071
const indexTemplate = await readFile(indexTemplatePath, 'utf8')

0 commit comments

Comments
 (0)