Assessor_2.0/server/gpo/gpo-policy-analysis-overvie...

50 lines
1.7 KiB
TypeScript

import type { AssessorRepository } from '../../src/persistence/assessor-repository';
import {
buildPolicyAnalysisOverview,
type PolicyAnalysisOverview
} from '../../src/domain/policy-analysis-overview';
import { RepositoryNotFoundError } from '../../src/persistence/repository-errors';
export interface GpoPolicyAnalysisOverviewServiceOptions {
now?: () => Date;
}
export class GpoPolicyAnalysisOverviewService {
private readonly now: () => Date;
constructor(
private readonly repository: AssessorRepository,
options: GpoPolicyAnalysisOverviewServiceOptions = {}
) {
this.now = options.now ?? (() => new Date());
}
async get(projectId: string): Promise<PolicyAnalysisOverview> {
if (!await this.repository.getProject(projectId)) {
throw new RepositoryNotFoundError(`Projekt ${projectId} ist nicht vorhanden.`);
}
const [identityAnalyses, profiles, aggregations, evaluations, findingRuns, processingRuns, baselineRecords, baselineAnalyses] = await Promise.all([
this.repository.listGpoPolicyAnalyses(projectId),
this.repository.listEnvironmentProfiles(projectId),
this.repository.listPolicySnapshotAggregations(projectId),
this.repository.listPolicyEvaluations(projectId),
this.repository.listPolicyFindingRuns(projectId),
this.repository.listProjectProcessingRuns(projectId),
this.repository.listMicrosoftSecurityBaselines(),
this.repository.listMicrosoftSecurityBaselineAnalyses()
]);
return buildPolicyAnalysisOverview({
projectId,
generatedAt: this.now().toISOString(),
identityAnalyses,
profiles,
aggregations,
evaluations,
findingRuns,
processingRuns,
baselineRecords,
baselineAnalyses
});
}
}