Skip to content

Commit

Permalink
Merge pull request #13 from theztefan/feat/remove-empty
Browse files Browse the repository at this point in the history
Remove metadata from JSON output and empty scans from PDF/Summary
  • Loading branch information
gateixeira committed Dec 30, 2022
2 parents 908bcdf + 06eb2c0 commit 664c604
Show file tree
Hide file tree
Showing 9 changed files with 112 additions and 87 deletions.
75 changes: 45 additions & 30 deletions dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -42061,10 +42061,21 @@ const SecretScanningAlerts = async (owner, repository) => {
return res;
};

;// CONCATENATED MODULE: ./src/context/Printable.ts
class Printable {
printable(prettyName, metrics) {
return {
prettyName: prettyName,
metrics: metrics,
};
}
}

;// CONCATENATED MODULE: ./src/context/SecretScanning.ts


class SecretScanning {

class SecretScanning extends Printable {
name = "secret-scanning";
prettyName = "Secret Scanning";
metrics;
Expand Down Expand Up @@ -42117,7 +42128,8 @@ const DependabotAlerts = async (owner, repository) => {
;// CONCATENATED MODULE: ./src/context/Dependabot.ts


class Dependabot {

class Dependabot extends Printable {
name = "dependabot";
prettyName = "Dependabot";
metrics;
Expand Down Expand Up @@ -42175,7 +42187,8 @@ const CodeScanningAlerts = async (owner, repository) => {
;// CONCATENATED MODULE: ./src/context/CodeScanning.ts


class CodeScanning {

class CodeScanning extends Printable {
name = "code-scanning";
prettyName = "Code Scanning";
metrics;
Expand Down Expand Up @@ -42322,7 +42335,6 @@ class PDFReport {
}
addHeader(title) {
if (this.pdf.getNumberOfPages() !== 1) {
this.pdf.addPage();
this.position = 20;
}
this.setFontAndWriteText(title, 20, 10);
Expand Down Expand Up @@ -42444,52 +42456,55 @@ const run = async () => {
core.debug(`[🔎] ${context.prettyName} - MTTD: ` +
JSON.stringify(metrics.mttd?.mttd));
core.info(`[✅] ${context.prettyName} metrics calculated`);
features.push(context.feature);
if (context.feature.metrics.openVulnerabilities > 0)
features.push(context.feature);
}
output.repositories.push({
owner: inputs.org,
name: repository.name,
features: features,
});
}
const sections = new Map();
output.repositories.forEach((repository) => {
sections.set(`${repository.owner}/${repository.name}`, []);
repository.features.forEach((feature) => sections.get(`${repository.owner}/${repository.name}`).push({
name: feature.prettyName,
heading: `${feature.prettyName} - top 10`,
list: [
`Open Alerts: ${feature.metrics?.openVulnerabilities}`,
`Fixed in the past X days: ${feature.metrics?.fixedLastXDays}`,
`Frequency: ${inputs.frequency}`,
"MTTR: " + secondsToReadable(feature.metrics?.mttr.mttr),
"MTTD: " + secondsToReadable(feature.metrics?.mttd?.mttd) || 0,
],
tableHeaders: feature.attributes,
tableBody: feature.summaryTop10(),
}));
});
if (process.env.RUN_USING_ACT !== "true") {
inputs.outputFormat.push("html", "github-output");
}
let report;
inputs.outputFormat.forEach((format) => {
const outputWithoutMetadata = {
...output,
repositories: output.repositories.map((repository) => ({
...repository,
features: repository.features.map((feature) => feature.printable(feature.prettyName, feature.metrics)),
})),
};
switch (format) {
case "json":
JSONReport.write("ghas-report.json", JSON.stringify(output, null, 2));
JSONReport.write("ghas-report.json", JSON.stringify(outputWithoutMetadata, null, 2));
break;
case "pdf":
case "html":
report = format === "pdf" ? new PDFReport() : new SummaryReport();
case "html": {
const report = format === "pdf" ? new PDFReport() : new SummaryReport();
report.prepare();
sections.forEach((content, key) => {
report.addHeader(`Repository ${key}`);
content.forEach((section) => report.addSection(section.name, section.heading, section.list, section.tableHeaders, section.tableBody));
output.repositories.forEach((repository) => {
if (repository.features.length === 0)
return;
report.addHeader(`Repository ${repository.owner}/${repository.name}`);
repository.features.forEach((feature) => {
const list = [
`Open Alerts: ${feature.metrics?.openVulnerabilities}`,
`Fixed in the past X days: ${feature.metrics?.fixedLastXDays}`,
`Frequency: ${inputs.frequency}`,
"MTTR: " + secondsToReadable(feature.metrics?.mttr.mttr),
"MTTD: " + secondsToReadable(feature.metrics?.mttd?.mttd) ||
0,
];
report.addSection(feature.prettyName, `${feature.prettyName} - top 10`, list, feature.attributes, feature.summaryTop10());
});
});
report.write();
break;
}
case "github-output":
core.setOutput("report-json", JSON.stringify(output, null, 2));
core.setOutput("report-json", JSON.stringify(outputWithoutMetadata, null, 2));
core.info(`[✅] Report written output 'report-json' variable`);
break;
default:
Expand Down
4 changes: 2 additions & 2 deletions src/context/CodeScanning.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import {
import { AlertsMetrics, GetCommitDate } from "../utils";
import { Feature } from "./Feature";
import { CodeScanningAlerts } from "../github/CodeScanningAlerts";

export class CodeScanning implements Feature {
import { Printable } from "./Printable";
export class CodeScanning extends Printable implements Feature {
name: ghasFeatures = "code-scanning";
prettyName = "Code Scanning";
metrics: AlertsMetricsType;
Expand Down
3 changes: 2 additions & 1 deletion src/context/Dependabot.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@ import {
import { AlertsMetrics } from "../utils";
import { Feature } from "./Feature";
import { DependabotAlerts } from "../github/DependabotAlerts";
import { Printable } from "./Printable";

export class Dependabot implements Feature {
export class Dependabot extends Printable implements Feature {
name: ghasFeatures = "dependabot";
prettyName = "Dependabot";
metrics: AlertsMetricsType;
Expand Down
4 changes: 4 additions & 0 deletions src/context/Feature.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,8 @@ export interface Feature {
repo?: string
): Promise<AlertsMetricsType>;
summaryTop10(): string[][];
printable(
prettyName: string,
metrics: AlertsMetricsType
): { prettyName: string; metrics: AlertsMetricsType };
}
13 changes: 13 additions & 0 deletions src/context/Printable.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { AlertsMetrics as AlertsMetricsType } from "../types/common/main";

export class Printable {
printable(
prettyName: string,
metrics: AlertsMetricsType
): { prettyName: string; metrics: AlertsMetricsType } {
return {
prettyName: prettyName,
metrics: metrics,
};
}
}
3 changes: 2 additions & 1 deletion src/context/SecretScanning.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@ import {
} from "../types/common/main";
import { AlertsMetrics, GetCommitDate } from "../utils";
import { Feature } from "./Feature";
import { Printable } from "./Printable";

export class SecretScanning implements Feature {
export class SecretScanning extends Printable implements Feature {
name: ghasFeatures = "secret-scanning";
prettyName = "Secret Scanning";
metrics: AlertsMetricsType;
Expand Down
88 changes: 44 additions & 44 deletions src/main.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,13 @@
import * as core from "@actions/core";
import { inputs as getInput, secondsToReadable } from "./utils";
import {
Alert,
AlertsMetrics,
ReportType,
ReportContent,
} from "./types/common/main";
import { Alert, AlertsMetrics, ReportType } from "./types/common/main";
import { randomUUID } from "crypto";
import { Context } from "./context/Context";
import {
getRepository,
getRepositoriesForOrg,
getRepositoriesForTeamAsAdmin,
} from "./github/Repositories";
import { Feature } from "./context/Feature";
import { JSONReport } from "./report/JSONReport";
import { PDFReport } from "./report/PDFReport";
import { SummaryReport } from "./report/SummaryReport";
Expand Down Expand Up @@ -84,7 +78,8 @@ const run = async (): Promise<void> => {

core.info(`[✅] ${context.prettyName} metrics calculated`);

features.push(context.feature);
if (context.feature.metrics.openVulnerabilities > 0)
features.push(context.feature);
}

output.repositories.push({
Expand All @@ -94,60 +89,65 @@ const run = async (): Promise<void> => {
});
}

const sections: Map<string, ReportContent[]> = new Map();
output.repositories.forEach((repository) => {
sections.set(`${repository.owner}/${repository.name}`, []);

repository.features.forEach((feature: Feature) =>
sections.get(`${repository.owner}/${repository.name}`).push({
name: feature.prettyName,
heading: `${feature.prettyName} - top 10`,
list: [
`Open Alerts: ${feature.metrics?.openVulnerabilities}`,
`Fixed in the past X days: ${feature.metrics?.fixedLastXDays}`,
`Frequency: ${inputs.frequency}`,
"MTTR: " + secondsToReadable(feature.metrics?.mttr.mttr),
"MTTD: " + secondsToReadable(feature.metrics?.mttd?.mttd) || "N/A",
],
tableHeaders: feature.attributes,
tableBody: feature.summaryTop10(),
})
);
});

if (process.env.RUN_USING_ACT !== "true") {
inputs.outputFormat.push("html", "github-output");
}

let report;
inputs.outputFormat.forEach((format) => {
const outputWithoutMetadata = {
...output,
repositories: output.repositories.map((repository) => ({
...repository,
features: repository.features.map((feature) =>
feature.printable(feature.prettyName, feature.metrics)
),
})),
};

switch (format) {
case "json":
JSONReport.write("ghas-report.json", JSON.stringify(output, null, 2));
JSONReport.write(
"ghas-report.json",
JSON.stringify(outputWithoutMetadata, null, 2)
);
break;
case "pdf":
case "html":
report = format === "pdf" ? new PDFReport() : new SummaryReport();
case "html": {
const report = format === "pdf" ? new PDFReport() : new SummaryReport();
report.prepare();

sections.forEach((content, key) => {
report.addHeader(`Repository ${key}`);
output.repositories.forEach((repository) => {
if (repository.features.length === 0) return;

report.addHeader(`Repository ${repository.owner}/${repository.name}`);

content.forEach((section) =>
repository.features.forEach((feature) => {
const list = [
`Open Alerts: ${feature.metrics?.openVulnerabilities}`,
`Fixed in the past X days: ${feature.metrics?.fixedLastXDays}`,
`Frequency: ${inputs.frequency}`,
"MTTR: " + secondsToReadable(feature.metrics?.mttr.mttr),
"MTTD: " + secondsToReadable(feature.metrics?.mttd?.mttd) ||
"N/A",
];
report.addSection(
section.name,
section.heading,
section.list,
section.tableHeaders,
section.tableBody
)
);
feature.prettyName,
`${feature.prettyName} - top 10`,
list,
feature.attributes,
feature.summaryTop10()
);
});
});

report.write();
break;
}
case "github-output":
core.setOutput("report-json", JSON.stringify(output, null, 2));
core.setOutput(
"report-json",
JSON.stringify(outputWithoutMetadata, null, 2)
);
core.info(`[✅] Report written output 'report-json' variable`);
break;
default:
Expand Down
1 change: 0 additions & 1 deletion src/report/PDFReport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ export class PDFReport implements Report {

addHeader(title: string): void {
if (this.pdf.getNumberOfPages() !== 1) {
this.pdf.addPage();
this.position = 20;
}

Expand Down
8 changes: 0 additions & 8 deletions src/types/common/main.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -236,11 +236,3 @@ export interface ReportType {
name: string;
}[];
}

export interface ReportContent {
name: string;
heading: string;
list: string[];
tableHeaders: string[];
tableBody: unknown[];
}

0 comments on commit 664c604

Please sign in to comment.