@intuitionrobotics/bug-report
Version:
54 lines • 2.36 kB
JavaScript
import { addItemToArray, auditBy, filterInstances, generateHex, Module, padNumber } from "@intuitionrobotics/ts-common";
import { FirebaseModule, FirestoreCollection, StorageWrapper } from "@intuitionrobotics/firebase/backend";
import {} from "../../index.js";
import JSZip from "jszip";
export class BugReportModule_Class extends Module {
constructor() {
super("BugReportModule");
}
// Resolved lazily on first use (was init()).
_bugReport;
_storage;
ticketCreatorApis = [];
get bugReport() {
return this._bugReport ??= FirebaseModule.createAdminSession().getFirestore().getCollection('bug-report', ["_id"]);
}
get storage() {
return this._storage ??= FirebaseModule.createAdminSession().getStorage();
}
addTicketCreator(ticketCreator) {
addItemToArray(this.ticketCreatorApis, ticketCreator);
}
saveLog = async (report, id) => {
const zip = new JSZip();
report.log.forEach((message, i) => zip.file(`${report.name}_${padNumber(i, 2)}.txt`, message));
const buffer = await zip.generateAsync({ type: "nodebuffer" });
const bucket = await this.storage.getOrCreateBucket(this.config?.bucket);
const fileName = `${id}-${report.name}.zip`;
const file = await bucket.getFile(fileName);
await file.write(buffer);
return {
path: `https://storage.cloud.google.com/${file.file.metadata.bucket}/${file.file.metadata.name}`,
name: fileName
};
};
saveFile = async (bugReport, email) => {
const _id = generateHex(16);
const logs = await Promise.all(bugReport.reports.map(report => this.saveLog(report, _id)));
const instance = {
_id,
subject: bugReport.subject,
description: bugReport.description,
reports: logs,
_audit: auditBy(email || "bug-report"),
};
if (this.config?.bucket)
instance.bucket = this.config.bucket;
const tickets = await Promise.all(this.ticketCreatorApis.map(api => api(bugReport, logs, email)));
instance.tickets = filterInstances(tickets);
await this.bugReport.insert(instance);
return instance.tickets;
};
}
export const BugReportModule = new BugReportModule_Class();
//# sourceMappingURL=BugReportModule.js.map