/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import { LocalizedStrings } from './localized'; import * as azdata from 'azdata'; import * as vscode from 'vscode'; import { htmlEscape } from './utils'; export class HTMLReportBuilder { constructor( private _assessmentResult: azdata.SqlAssessmentResult, private _dateUpdated: number, private _connectionInfo: azdata.connection.ConnectionProfile ) { } public async build(): Promise { const serverInfo = await azdata.connection.getServerInfo(this._connectionInfo.connectionId); let mainContent = ` ${LocalizedStrings.REPORT_TITLE}
${LocalizedStrings.REPORT_TITLE}
${new Date(this._dateUpdated).toLocaleString(vscode.env.language)}
${this.buildVersionDetails(serverInfo)}
${this.buildResultsSection()}
${this.buildStyleSection()} `; return mainContent; } private instanceName(serverInfo: azdata.ServerInfo): string { const serverName = this._connectionInfo.serverName; if (['local', '(local)'].indexOf(serverName.toLowerCase()) >= 0) { return serverInfo !== undefined ? (serverInfo)['machineName'] : serverName; } return serverName; } private buildVersionDetails(serverInfo: azdata.ServerInfo): string { return `
${LocalizedStrings.API_VERSION}: ${this._assessmentResult.apiVersion}
${LocalizedStrings.DEFAULT_RULESET_VERSION}: ${this._assessmentResult.items[0].rulesetVersion}
${LocalizedStrings.SECTION_TITLE_SQL_SERVER}: ${serverInfo.serverEdition} ${serverInfo.serverVersion}
${LocalizedStrings.SERVER_INSTANCENAME}: ${this.instanceName(serverInfo)}
`; } private buildResultsSection(): string { let resultByTarget: { [targetType: number]: { [targetName: string]: azdata.SqlAssessmentResultItem[] } } = []; this._assessmentResult.items.forEach(resultItem => { if (resultByTarget[resultItem.targetType] === undefined) { resultByTarget[resultItem.targetType] = Object.create([]); } if (resultByTarget[resultItem.targetType][resultItem.targetName] === undefined) { resultByTarget[resultItem.targetType][resultItem.targetName] = []; } resultByTarget[resultItem.targetType][resultItem.targetName].push(resultItem); }); let result = ''; if (resultByTarget[azdata.sqlAssessment.SqlAssessmentTargetType.Server] !== undefined) { Object.keys(resultByTarget[azdata.sqlAssessment.SqlAssessmentTargetType.Server]).forEach(instanceName => { result += this.buildTargetAssessmentSection(resultByTarget[azdata.sqlAssessment.SqlAssessmentTargetType.Server][instanceName]); }); } if (resultByTarget[azdata.sqlAssessment.SqlAssessmentTargetType.Database] !== undefined) { Object.keys(resultByTarget[azdata.sqlAssessment.SqlAssessmentTargetType.Database]).forEach(dbName => { result += this.buildTargetAssessmentSection(resultByTarget[azdata.sqlAssessment.SqlAssessmentTargetType.Database][dbName]); }); } return result; } private buildTargetAssessmentSection(targetResults: azdata.SqlAssessmentResultItem[]): string { let content = `
${targetResults[0].targetType === azdata.sqlAssessment.SqlAssessmentTargetType.Server ? LocalizedStrings.RESULTS_FOR_INSTANCE : LocalizedStrings.RESULTS_FOR_DATABASE}: ${targetResults[0].targetName}
${this.buildSeveritySection(LocalizedStrings.REPORT_ERROR, targetResults.filter(item => item.level === 'Error'))} ${this.buildSeveritySection(LocalizedStrings.REPORT_WARNING, targetResults.filter(item => item.level === 'Warning'))} ${this.buildSeveritySection(LocalizedStrings.REPORT_INFO, targetResults.filter(item => item.level === 'Information'))}
`; return content; } private buildSeveritySection(severityName: string, items: azdata.SqlAssessmentResultItem[]) { if (items.length === 0) { return ''; } return `
${LocalizedStrings.REPORT_SEVERITY_MESSAGE(severityName, items.length)}
${this.buildItemsRows(items)}
${LocalizedStrings.MESSAGE_COLUMN_NAME}${LocalizedStrings.HELP_LINK_COLUMN_NAME}${LocalizedStrings.TAGS_COLUMN_NAME}${LocalizedStrings.CHECKID_COLUMN_NAME}
`; } private buildItemsRows(items: azdata.SqlAssessmentResultItem[]): string { let content = ''; items.forEach(item => { content += ` ${htmlEscape(item.message)} ${LocalizedStrings.LEARN_MORE_LINK} ${this.formatTags(item.tags)} ${item.checkId} `; }); return content; } private formatTags(tags: string[]): string { return tags?.join(', '); } private buildStyleSection(): string { return ` `; } }