■ ■ ■ ■ ■ ■
packages/public-api/src/website/service.ts
1 | 1 | | import { |
2 | 2 | | WebPageScan, |
3 | 3 | | getDatabaseConnection, |
4 | | - | internalApi, |
| 4 | + | systemApi, |
5 | 5 | | Hostname, |
6 | 6 | | WebPage, |
7 | 7 | | } from '@gradejs-public/shared'; |
8 | 8 | | import { EntityManager } from 'typeorm'; |
9 | 9 | | import { syncPackageUsageByHostname } from '../projections/syncPackageUsageByHostname'; |
10 | 10 | | import { syncScansWithVulnerabilities } from '../projections/syncScansWithVulnerabilities'; |
11 | | - | import { SystemApi } from '../systemApiRouter'; |
12 | 11 | | |
13 | 12 | | const RESCAN_TIMEOUT_MS = 1000 * 60 * 60 * 24; // 1 day in ms |
14 | 13 | | |
| skipped 52 lines |
67 | 66 | | status: WebPageScan.Status.Pending, |
68 | 67 | | }); |
69 | 68 | | |
70 | | - | await internalApi.requestWebPageScan(parsedUrl.toString(), webPageScanEntity.id.toString()); |
| 69 | + | await systemApi.requestWebPageScan(parsedUrl.toString(), webPageScanEntity.id.toString()); |
71 | 70 | | |
72 | 71 | | return webPageScanEntity; |
73 | 72 | | }); |
| skipped 1 lines |
75 | 74 | | return result; |
76 | 75 | | } |
77 | 76 | | |
78 | | - | export async function syncWebPageScanResult(scanReport: SystemApi.ScanReport) { |
| 77 | + | export async function syncWebPageScanResult(scanReport: systemApi.ScanReport) { |
79 | 78 | | const db = await getDatabaseConnection(); |
80 | 79 | | |
81 | 80 | | return await db.transaction(async (em) => { |
82 | 81 | | const webPageScanRepo = em.getRepository(WebPageScan); |
83 | 82 | | |
84 | 83 | | let scanEntity: WebPageScan; |
85 | | - | if (scanReport.id) { |
86 | | - | scanEntity = await webPageScanRepo.findOneOrFail({ id: parseInt(scanReport.id, 10) }); |
| 84 | + | if (scanReport.requestId) { |
| 85 | + | scanEntity = await webPageScanRepo.findOneOrFail({ id: parseInt(scanReport.requestId, 10) }); |
87 | 86 | | } else { |
88 | 87 | | const webPageEntity = await findOrCreateWebPage(new URL(scanReport.url), em); |
89 | 88 | | scanEntity = webPageScanRepo.create({ |
| skipped 1 lines |
91 | 90 | | }); |
92 | 91 | | } |
93 | 92 | | |
94 | | - | scanEntity.status = mapInternalWebsiteStatus(scanReport.status); |
| 93 | + | scanEntity.status = mapScanReportStatus(scanReport.status); |
95 | 94 | | scanEntity.finishedAt = new Date(); |
96 | | - | scanEntity.scanResult = scanReport.scan; |
| 95 | + | |
| 96 | + | if (scanReport.status === 'ready') { |
| 97 | + | scanEntity.scanResult = { |
| 98 | + | identifiedModuleMap: scanReport.identifiedModuleMap, |
| 99 | + | identifiedPackages: scanReport.identifiedPackages, |
| 100 | + | }; |
| 101 | + | } |
97 | 102 | | |
98 | 103 | | await webPageScanRepo.save(scanEntity); |
99 | 104 | | |
| skipped 6 lines |
106 | 111 | | }); |
107 | 112 | | } |
108 | 113 | | |
109 | | - | function mapInternalWebsiteStatus(status: internalApi.WebPageScan.Status) { |
| 114 | + | // TODO: add protected website use-case |
| 115 | + | function mapScanReportStatus(status: string) { |
110 | 116 | | switch (status) { |
111 | | - | case internalApi.WebPageScan.Status.Invalid: |
112 | | - | return WebPageScan.Status.Unsupported; |
113 | | - | case internalApi.WebPageScan.Status.InProgress: |
114 | | - | return WebPageScan.Status.Pending; |
115 | | - | case internalApi.WebPageScan.Status.Protected: |
116 | | - | return WebPageScan.Status.Protected; |
| 117 | + | case systemApi.ScanReport.Status.Ready: |
| 118 | + | return WebPageScan.Status.Processed; |
117 | 119 | | default: |
118 | | - | return WebPageScan.Status.Processed; |
| 120 | + | return WebPageScan.Status.Failed; |
119 | 121 | | } |
120 | 122 | | } |
121 | 123 | | |