Introduce mapping layer for variant analysis history items

This commit is contained in:
Charis Kyriakou
2023-04-13 13:11:35 +01:00
parent 73089841a3
commit 7e08bb9efe
5 changed files with 538 additions and 23 deletions

View File

@@ -15,20 +15,19 @@ import {
SortDirectionDto,
} from "./query-history-local-query-dto";
import { QueryHistoryItemDto } from "./query-history-dto";
import { QueryHistoryVariantAnalysisDto } from "./query-history-variant-analysis-dto";
import {
RawResultsSortState,
SortDirection,
SortedResultSetInfo,
} from "../../pure/interface-types";
import { mapQueryHistoryVariantAnalysisToDto } from "./variant-analysis-domain-mapper";
export function mapQueryHistoryToDto(
queries: QueryHistoryInfo[],
): QueryHistoryItemDto[] {
return queries.map((q) => {
if (q.t === "variant-analysis") {
const query: QueryHistoryVariantAnalysisDto = q;
return query;
return mapQueryHistoryVariantAnalysisToDto(q);
} else if (q.t === "local") {
return mapLocalQueryInfoToDto(q);
} else {

View File

@@ -5,7 +5,6 @@ import {
} from "../../query-results";
import { QueryEvaluationInfo } from "../../run-queries-shared";
import { QueryHistoryInfo } from "../query-history-info";
import { VariantAnalysisHistoryItem } from "../variant-analysis-history-item";
import {
CompletedQueryInfoDto,
QueryEvaluationInfoDto,
@@ -23,14 +22,14 @@ import {
SortDirection,
SortedResultSetInfo,
} from "../../pure/interface-types";
import { mapQueryHistoryVariantAnalysisToDomainModel } from "./variant-analysis-dto-mapper";
export function mapQueryHistoryToDomainModel(
queries: QueryHistoryItemDto[],
): QueryHistoryInfo[] {
return queries.map((d) => {
if (d.t === "variant-analysis") {
const query: VariantAnalysisHistoryItem = d;
return query;
return mapQueryHistoryVariantAnalysisToDomainModel(d);
} else if (d.t === "local") {
return mapLocalQueryItemToDomainModel(d);
}

View File

@@ -1,27 +1,17 @@
// Contains models and consts for the data we want to store in the query history store.
// Changes to these models should be done carefully and account for backwards compatibility of data.
import { QueryLanguage } from "../../common/query-language";
import { QueryStatus } from "../../query-status";
import {
VariantAnalysisFailureReason,
VariantAnalysisRepoStatus,
VariantAnalysisStatus,
} from "../../variant-analysis/shared/variant-analysis";
// All data points are modelled, except enums.
export interface QueryHistoryVariantAnalysisDto {
readonly t: "variant-analysis";
failureReason?: string;
resultCount?: number;
status: QueryStatus;
status: QueryStatusDto;
completed: boolean;
variantAnalysis: VariantAnalysisQueryHistoryDto;
variantAnalysis: VariantAnalysisDto;
userSpecifiedLabel?: string;
}
export interface VariantAnalysisQueryHistoryDto {
export interface VariantAnalysisDto {
id: number;
controllerRepo: {
id: number;
@@ -31,7 +21,7 @@ export interface VariantAnalysisQueryHistoryDto {
query: {
name: string;
filePath: string;
language: QueryLanguage;
language: QueryLanguageDto;
text: string;
};
databases: {
@@ -42,10 +32,10 @@ export interface VariantAnalysisQueryHistoryDto {
createdAt: string;
updatedAt: string;
executionStartTime: number;
status: VariantAnalysisStatus;
status: VariantAnalysisStatusDto;
completedAt?: string;
actionsWorkflowRunId?: number;
failureReason?: VariantAnalysisFailureReason;
failureReason?: VariantAnalysisFailureReasonDto;
scannedRepos?: VariantAnalysisScannedRepositoryDto[];
skippedRepos?: VariantAnalysisSkippedRepositoriesDto;
}
@@ -58,7 +48,7 @@ export interface VariantAnalysisScannedRepositoryDto {
stargazersCount: number;
updatedAt: string | null;
};
analysisStatus: VariantAnalysisRepoStatus;
analysisStatus: VariantAnalysisRepoStatusDto;
resultCount?: number;
artifactSizeInBytes?: number;
failureMessage?: string;
@@ -83,3 +73,42 @@ export interface VariantAnalysisSkippedRepositoryDto {
stargazersCount?: number;
updatedAt?: string | null;
}
export enum VariantAnalysisFailureReasonDto {
NoReposQueried = "noReposQueried",
ActionsWorkflowRunFailed = "actionsWorkflowRunFailed",
InternalError = "internalError",
}
export enum VariantAnalysisRepoStatusDto {
Pending = "pending",
InProgress = "inProgress",
Succeeded = "succeeded",
Failed = "failed",
Canceled = "canceled",
TimedOut = "timedOut",
}
export enum VariantAnalysisStatusDto {
InProgress = "inProgress",
Succeeded = "succeeded",
Failed = "failed",
Canceled = "canceled",
}
export enum QueryLanguageDto {
CSharp = "csharp",
Cpp = "cpp",
Go = "go",
Java = "java",
Javascript = "javascript",
Python = "python",
Ruby = "ruby",
Swift = "swift",
}
export enum QueryStatusDto {
InProgress = "InProgress",
Completed = "Completed",
Failed = "Failed",
}

View File

@@ -0,0 +1,235 @@
import {
QueryHistoryVariantAnalysisDto,
QueryLanguageDto,
QueryStatusDto,
VariantAnalysisDto,
VariantAnalysisFailureReasonDto,
VariantAnalysisRepoStatusDto,
VariantAnalysisScannedRepositoryDto,
VariantAnalysisSkippedRepositoriesDto,
VariantAnalysisSkippedRepositoryDto,
VariantAnalysisSkippedRepositoryGroupDto,
VariantAnalysisStatusDto,
} from "./query-history-variant-analysis-dto";
import {
VariantAnalysis,
VariantAnalysisFailureReason,
VariantAnalysisRepoStatus,
VariantAnalysisScannedRepository,
VariantAnalysisSkippedRepositories,
VariantAnalysisSkippedRepository,
VariantAnalysisSkippedRepositoryGroup,
VariantAnalysisStatus,
} from "../../variant-analysis/shared/variant-analysis";
import { assertNever } from "../../pure/helpers-pure";
import { QueryLanguage } from "../../common/query-language";
import { QueryStatus } from "../../query-status";
import { VariantAnalysisHistoryItem } from "../variant-analysis-history-item";
export function mapQueryHistoryVariantAnalysisToDto(
item: VariantAnalysisHistoryItem,
): QueryHistoryVariantAnalysisDto {
return {
t: "variant-analysis",
failureReason: item.failureReason,
resultCount: item.resultCount,
status: mapQueryStatusToDto(item.status),
completed: item.completed,
variantAnalysis: mapVariantAnalysisDtoToDto(item.variantAnalysis),
userSpecifiedLabel: item.userSpecifiedLabel,
};
}
function mapVariantAnalysisDtoToDto(
variantAnalysis: VariantAnalysis,
): VariantAnalysisDto {
return {
id: variantAnalysis.id,
controllerRepo: {
id: variantAnalysis.controllerRepo.id,
fullName: variantAnalysis.controllerRepo.fullName,
private: variantAnalysis.controllerRepo.private,
},
query: {
name: variantAnalysis.query.name,
filePath: variantAnalysis.query.filePath,
language: mapQueryLanguageToDto(variantAnalysis.query.language),
text: variantAnalysis.query.text,
},
databases: {
repositories: variantAnalysis.databases.repositories,
repositoryLists: variantAnalysis.databases.repositoryLists,
repositoryOwners: variantAnalysis.databases.repositoryOwners,
},
createdAt: variantAnalysis.createdAt,
updatedAt: variantAnalysis.updatedAt,
executionStartTime: variantAnalysis.executionStartTime,
status: mapVariantAnalysisStatusToDto(variantAnalysis.status),
completedAt: variantAnalysis.completedAt,
actionsWorkflowRunId: variantAnalysis.actionsWorkflowRunId,
failureReason:
variantAnalysis.failureReason &&
mapVariantAnalysisFailureReasonToDto(variantAnalysis.failureReason),
scannedRepos:
variantAnalysis.scannedRepos &&
mapVariantAnalysisScannedRepositoriesToDto(variantAnalysis.scannedRepos),
skippedRepos:
variantAnalysis.skippedRepos &&
mapVariantAnalysisSkippedRepositoriesToDto(variantAnalysis.skippedRepos),
};
}
function mapVariantAnalysisScannedRepositoriesToDto(
repos: VariantAnalysisScannedRepository[],
): VariantAnalysisScannedRepositoryDto[] {
return repos.map(mapVariantAnalysisScannedRepositoryToDto);
}
function mapVariantAnalysisScannedRepositoryToDto(
repo: VariantAnalysisScannedRepository,
): VariantAnalysisScannedRepositoryDto {
return {
repository: {
id: repo.repository.id,
fullName: repo.repository.fullName,
private: repo.repository.private,
stargazersCount: repo.repository.stargazersCount,
updatedAt: repo.repository.updatedAt,
},
analysisStatus: mapVariantAnalysisRepoStatusToDto(repo.analysisStatus),
resultCount: repo.resultCount,
artifactSizeInBytes: repo.artifactSizeInBytes,
failureMessage: repo.failureMessage,
};
}
function mapVariantAnalysisSkippedRepositoriesToDto(
repos: VariantAnalysisSkippedRepositories,
): VariantAnalysisSkippedRepositoriesDto {
return {
accessMismatchRepos:
repos.accessMismatchRepos &&
mapVariantAnalysisSkippedRepositoryGroupToDto(repos.accessMismatchRepos),
notFoundRepos:
repos.notFoundRepos &&
mapVariantAnalysisSkippedRepositoryGroupToDto(repos.notFoundRepos),
noCodeqlDbRepos:
repos.noCodeqlDbRepos &&
mapVariantAnalysisSkippedRepositoryGroupToDto(repos.noCodeqlDbRepos),
overLimitRepos:
repos.overLimitRepos &&
mapVariantAnalysisSkippedRepositoryGroupToDto(repos.overLimitRepos),
};
}
function mapVariantAnalysisSkippedRepositoryGroupToDto(
repoGroup: VariantAnalysisSkippedRepositoryGroup,
): VariantAnalysisSkippedRepositoryGroupDto {
return {
repositoryCount: repoGroup.repositoryCount,
repositories: repoGroup.repositories.map(
mapVariantAnalysisSkippedRepositoryToDto,
),
};
}
function mapVariantAnalysisSkippedRepositoryToDto(
repo: VariantAnalysisSkippedRepository,
): VariantAnalysisSkippedRepositoryDto {
return {
id: repo.id,
fullName: repo.fullName,
private: repo.private,
stargazersCount: repo.stargazersCount,
updatedAt: repo.updatedAt,
};
}
function mapVariantAnalysisFailureReasonToDto(
failureReason: VariantAnalysisFailureReason,
): VariantAnalysisFailureReasonDto {
switch (failureReason) {
case VariantAnalysisFailureReason.NoReposQueried:
return VariantAnalysisFailureReasonDto.NoReposQueried;
case VariantAnalysisFailureReason.ActionsWorkflowRunFailed:
return VariantAnalysisFailureReasonDto.ActionsWorkflowRunFailed;
case VariantAnalysisFailureReason.InternalError:
return VariantAnalysisFailureReasonDto.InternalError;
default:
assertNever(failureReason);
}
}
function mapVariantAnalysisRepoStatusToDto(
status: VariantAnalysisRepoStatus,
): VariantAnalysisRepoStatusDto {
switch (status) {
case VariantAnalysisRepoStatus.Pending:
return VariantAnalysisRepoStatusDto.Pending;
case VariantAnalysisRepoStatus.InProgress:
return VariantAnalysisRepoStatusDto.InProgress;
case VariantAnalysisRepoStatus.Succeeded:
return VariantAnalysisRepoStatusDto.Succeeded;
case VariantAnalysisRepoStatus.Failed:
return VariantAnalysisRepoStatusDto.Failed;
case VariantAnalysisRepoStatus.Canceled:
return VariantAnalysisRepoStatusDto.Canceled;
case VariantAnalysisRepoStatus.TimedOut:
return VariantAnalysisRepoStatusDto.TimedOut;
default:
assertNever(status);
}
}
function mapVariantAnalysisStatusToDto(
status: VariantAnalysisStatus,
): VariantAnalysisStatusDto {
switch (status) {
case VariantAnalysisStatus.InProgress:
return VariantAnalysisStatusDto.InProgress;
case VariantAnalysisStatus.Succeeded:
return VariantAnalysisStatusDto.Succeeded;
case VariantAnalysisStatus.Failed:
return VariantAnalysisStatusDto.Failed;
case VariantAnalysisStatus.Canceled:
return VariantAnalysisStatusDto.Canceled;
default:
assertNever(status);
}
}
function mapQueryLanguageToDto(language: QueryLanguage): QueryLanguageDto {
switch (language) {
case QueryLanguage.CSharp:
return QueryLanguageDto.CSharp;
case QueryLanguage.Cpp:
return QueryLanguageDto.Cpp;
case QueryLanguage.Go:
return QueryLanguageDto.Go;
case QueryLanguage.Java:
return QueryLanguageDto.Java;
case QueryLanguage.Javascript:
return QueryLanguageDto.Javascript;
case QueryLanguage.Python:
return QueryLanguageDto.Python;
case QueryLanguage.Ruby:
return QueryLanguageDto.Ruby;
case QueryLanguage.Swift:
return QueryLanguageDto.Swift;
default:
assertNever(language);
}
}
function mapQueryStatusToDto(status: QueryStatus): QueryStatusDto {
switch (status) {
case QueryStatus.InProgress:
return QueryStatusDto.InProgress;
case QueryStatus.Completed:
return QueryStatusDto.Completed;
case QueryStatus.Failed:
return QueryStatusDto.Failed;
default:
assertNever(status);
}
}

View File

@@ -0,0 +1,253 @@
import {
QueryHistoryVariantAnalysisDto,
QueryLanguageDto,
QueryStatusDto,
VariantAnalysisDto,
VariantAnalysisFailureReasonDto,
VariantAnalysisRepoStatusDto,
VariantAnalysisScannedRepositoryDto,
VariantAnalysisSkippedRepositoriesDto,
VariantAnalysisSkippedRepositoryDto,
VariantAnalysisSkippedRepositoryGroupDto,
VariantAnalysisStatusDto,
} from "./query-history-variant-analysis-dto";
import {
VariantAnalysis,
VariantAnalysisFailureReason,
VariantAnalysisRepoStatus,
VariantAnalysisScannedRepository,
VariantAnalysisSkippedRepositories,
VariantAnalysisSkippedRepository,
VariantAnalysisSkippedRepositoryGroup,
VariantAnalysisStatus,
} from "../../variant-analysis/shared/variant-analysis";
import { assertNever } from "../../pure/helpers-pure";
import { QueryLanguage } from "../../common/query-language";
import { QueryStatus } from "../../query-status";
import { VariantAnalysisHistoryItem } from "../variant-analysis-history-item";
export function mapQueryHistoryVariantAnalysisToDomainModel(
item: QueryHistoryVariantAnalysisDto,
): VariantAnalysisHistoryItem {
return {
t: "variant-analysis",
failureReason: item.failureReason,
resultCount: item.resultCount,
status: mapQueryStatusToDomainModel(item.status),
completed: item.completed,
variantAnalysis: mapVariantAnalysisDtoToDomainModel(item.variantAnalysis),
userSpecifiedLabel: item.userSpecifiedLabel,
};
}
function mapVariantAnalysisDtoToDomainModel(
variantAnalysis: VariantAnalysisDto,
): VariantAnalysis {
return {
id: variantAnalysis.id,
controllerRepo: {
id: variantAnalysis.controllerRepo.id,
fullName: variantAnalysis.controllerRepo.fullName,
private: variantAnalysis.controllerRepo.private,
},
query: {
name: variantAnalysis.query.name,
filePath: variantAnalysis.query.filePath,
language: mapQueryLanguageToDomainModel(variantAnalysis.query.language),
text: variantAnalysis.query.text,
},
databases: {
repositories: variantAnalysis.databases.repositories,
repositoryLists: variantAnalysis.databases.repositoryLists,
repositoryOwners: variantAnalysis.databases.repositoryOwners,
},
createdAt: variantAnalysis.createdAt,
updatedAt: variantAnalysis.updatedAt,
executionStartTime: variantAnalysis.executionStartTime,
status: mapVariantAnalysisStatusToDomainModel(variantAnalysis.status),
completedAt: variantAnalysis.completedAt,
actionsWorkflowRunId: variantAnalysis.actionsWorkflowRunId,
failureReason:
variantAnalysis.failureReason &&
mapVariantAnalysisFailureReasonToDomainModel(
variantAnalysis.failureReason,
),
scannedRepos:
variantAnalysis.scannedRepos &&
mapVariantAnalysisScannedRepositoriesToDomainModel(
variantAnalysis.scannedRepos,
),
skippedRepos:
variantAnalysis.skippedRepos &&
mapVariantAnalysisSkippedRepositoriesToDomainModel(
variantAnalysis.skippedRepos,
),
};
}
function mapVariantAnalysisScannedRepositoriesToDomainModel(
repos: VariantAnalysisScannedRepositoryDto[],
): VariantAnalysisScannedRepository[] {
return repos.map(mapVariantAnalysisScannedRepositoryToDomainModel);
}
function mapVariantAnalysisScannedRepositoryToDomainModel(
repo: VariantAnalysisScannedRepositoryDto,
): VariantAnalysisScannedRepository {
return {
repository: {
id: repo.repository.id,
fullName: repo.repository.fullName,
private: repo.repository.private,
stargazersCount: repo.repository.stargazersCount,
updatedAt: repo.repository.updatedAt,
},
analysisStatus: mapVariantAnalysisRepoStatusToDomainModel(
repo.analysisStatus,
),
resultCount: repo.resultCount,
artifactSizeInBytes: repo.artifactSizeInBytes,
failureMessage: repo.failureMessage,
};
}
function mapVariantAnalysisSkippedRepositoriesToDomainModel(
repos: VariantAnalysisSkippedRepositoriesDto,
): VariantAnalysisSkippedRepositories {
return {
accessMismatchRepos:
repos.accessMismatchRepos &&
mapVariantAnalysisSkippedRepositoryGroupToDomainModel(
repos.accessMismatchRepos,
),
notFoundRepos:
repos.notFoundRepos &&
mapVariantAnalysisSkippedRepositoryGroupToDomainModel(
repos.notFoundRepos,
),
noCodeqlDbRepos:
repos.noCodeqlDbRepos &&
mapVariantAnalysisSkippedRepositoryGroupToDomainModel(
repos.noCodeqlDbRepos,
),
overLimitRepos:
repos.overLimitRepos &&
mapVariantAnalysisSkippedRepositoryGroupToDomainModel(
repos.overLimitRepos,
),
};
}
function mapVariantAnalysisSkippedRepositoryGroupToDomainModel(
repoGroup: VariantAnalysisSkippedRepositoryGroupDto,
): VariantAnalysisSkippedRepositoryGroup {
return {
repositoryCount: repoGroup.repositoryCount,
repositories: repoGroup.repositories.map(
mapVariantAnalysisSkippedRepositoryToDomainModel,
),
};
}
function mapVariantAnalysisSkippedRepositoryToDomainModel(
repo: VariantAnalysisSkippedRepositoryDto,
): VariantAnalysisSkippedRepository {
return {
id: repo.id,
fullName: repo.fullName,
private: repo.private,
stargazersCount: repo.stargazersCount,
updatedAt: repo.updatedAt,
};
}
function mapVariantAnalysisFailureReasonToDomainModel(
failureReason: VariantAnalysisFailureReasonDto,
): VariantAnalysisFailureReason {
switch (failureReason) {
case VariantAnalysisFailureReasonDto.NoReposQueried:
return VariantAnalysisFailureReason.NoReposQueried;
case VariantAnalysisFailureReasonDto.ActionsWorkflowRunFailed:
return VariantAnalysisFailureReason.ActionsWorkflowRunFailed;
case VariantAnalysisFailureReasonDto.InternalError:
return VariantAnalysisFailureReason.InternalError;
default:
assertNever(failureReason);
}
}
function mapVariantAnalysisRepoStatusToDomainModel(
status: VariantAnalysisRepoStatusDto,
): VariantAnalysisRepoStatus {
switch (status) {
case VariantAnalysisRepoStatusDto.Pending:
return VariantAnalysisRepoStatus.Pending;
case VariantAnalysisRepoStatusDto.InProgress:
return VariantAnalysisRepoStatus.InProgress;
case VariantAnalysisRepoStatusDto.Succeeded:
return VariantAnalysisRepoStatus.Succeeded;
case VariantAnalysisRepoStatusDto.Failed:
return VariantAnalysisRepoStatus.Failed;
case VariantAnalysisRepoStatusDto.Canceled:
return VariantAnalysisRepoStatus.Canceled;
case VariantAnalysisRepoStatusDto.TimedOut:
return VariantAnalysisRepoStatus.TimedOut;
default:
assertNever(status);
}
}
function mapVariantAnalysisStatusToDomainModel(
status: VariantAnalysisStatusDto,
): VariantAnalysisStatus {
switch (status) {
case VariantAnalysisStatusDto.InProgress:
return VariantAnalysisStatus.InProgress;
case VariantAnalysisStatusDto.Succeeded:
return VariantAnalysisStatus.Succeeded;
case VariantAnalysisStatusDto.Failed:
return VariantAnalysisStatus.Failed;
case VariantAnalysisStatusDto.Canceled:
return VariantAnalysisStatus.Canceled;
default:
assertNever(status);
}
}
function mapQueryLanguageToDomainModel(
language: QueryLanguageDto,
): QueryLanguage {
switch (language) {
case QueryLanguageDto.CSharp:
return QueryLanguage.CSharp;
case QueryLanguageDto.Cpp:
return QueryLanguage.Cpp;
case QueryLanguageDto.Go:
return QueryLanguage.Go;
case QueryLanguageDto.Java:
return QueryLanguage.Java;
case QueryLanguageDto.Javascript:
return QueryLanguage.Javascript;
case QueryLanguageDto.Python:
return QueryLanguage.Python;
case QueryLanguageDto.Ruby:
return QueryLanguage.Ruby;
case QueryLanguageDto.Swift:
return QueryLanguage.Swift;
default:
assertNever(language);
}
}
function mapQueryStatusToDomainModel(status: QueryStatusDto): QueryStatus {
switch (status) {
case QueryStatusDto.InProgress:
return QueryStatus.InProgress;
case QueryStatusDto.Completed:
return QueryStatus.Completed;
case QueryStatusDto.Failed:
return QueryStatus.Failed;
default:
assertNever(status);
}
}