/**
* @fileoverview AnalysisRun repository interface
*
* This module defines the repository interface for the AnalysisRun aggregate.
*/
import {
IRepository,
PaginationOptions,
PaginatedResult,
} from '../../shared/repository.interface.js';
import { AnalysisRun } from './analysis-run.aggregate.js';
import { RunId, ProjectKey, BranchName, CommitOid } from '../../../types/branded.js';
import { RunStatus } from './analysis-run.types.js';
/**
* Repository interface for AnalysisRun aggregates
*
* Provides methods for persisting and retrieving AnalysisRun aggregates.
*
* @example
* ```typescript
* class InMemoryAnalysisRunRepository implements IAnalysisRunRepository {
* private runs = new Map<RunId, AnalysisRun>();
*
* async findByRunId(id: RunId): Promise<AnalysisRun | null> {
* return this.runs.get(id) || null;
* }
*
* async findByProject(
* projectKey: ProjectKey,
* options: PaginationOptions
* ): Promise<PaginatedResult<AnalysisRun>> {
* const projectRuns = Array.from(this.runs.values())
* .filter(run => run.projectKey === projectKey);
*
* // Apply pagination
* const start = (options.page - 1) * options.pageSize;
* const items = projectRuns.slice(start, start + options.pageSize);
*
* return {
* items,
* page: options.page,
* pageSize: options.pageSize,
* totalCount: projectRuns.length,
* totalPages: Math.ceil(projectRuns.length / options.pageSize),
* hasNextPage: start + options.pageSize < projectRuns.length,
* hasPreviousPage: options.page > 1
* };
* }
*
* async save(run: AnalysisRun): Promise<void> {
* this.runs.set(run.runId, run);
* }
* }
* ```
*/
export interface IAnalysisRunRepository extends IRepository<AnalysisRun, RunId> {
/**
* Finds a run by its unique ID
*
* @param id - The run ID
* @returns The run if found, null otherwise
*/
findByRunId(_id: RunId): Promise<AnalysisRun | null>;
/**
* Finds runs for a specific project with pagination
*
* @param projectKey - The project key
* @param options - Pagination options
* @returns Paginated analysis runs
*/
findByProject(
_projectKey: ProjectKey,
_options: PaginationOptions
): Promise<PaginatedResult<AnalysisRun>>;
/**
* Finds the most recent run for a project
*
* @param projectKey - The project key
* @param branch - Optional branch filter
* @returns The most recent run if found, null otherwise
*/
findMostRecent(_projectKey: ProjectKey, _branch?: BranchName): Promise<AnalysisRun | null>;
/**
* Finds a run by commit OID
*
* @param projectKey - The project key
* @param commitOid - The commit OID
* @returns The run if found, null otherwise
*/
findByCommit(_projectKey: ProjectKey, _commitOid: CommitOid): Promise<AnalysisRun | null>;
/**
* Finds runs by status
*
* @param projectKey - The project key
* @param status - The run status
* @param options - Pagination options
* @returns Paginated analysis runs
*/
findByStatus(
_projectKey: ProjectKey,
_status: RunStatus,
_options: PaginationOptions
): Promise<PaginatedResult<AnalysisRun>>;
/**
* Finds runs within a date range
*
* @param projectKey - The project key
* @param startDate - Start date (inclusive)
* @param endDate - End date (inclusive)
* @param options - Pagination options
* @returns Paginated analysis runs
*/
findByDateRange(
_projectKey: ProjectKey,
_startDate: Date,
_endDate: Date,
_options: PaginationOptions
): Promise<PaginatedResult<AnalysisRun>>;
/**
* Counts runs for a project
*
* @param projectKey - The project key
* @returns The total number of runs
*/
countByProject(_projectKey: ProjectKey): Promise<number>;
/**
* Counts runs by status for a project
*
* @param projectKey - The project key
* @param status - The run status
* @returns The number of runs with the given status
*/
countByStatus(_projectKey: ProjectKey, _status: RunStatus): Promise<number>;
/**
* Checks if a run exists for a commit
*
* @param projectKey - The project key
* @param commitOid - The commit OID
* @returns True if a run exists, false otherwise
*/
existsForCommit(_projectKey: ProjectKey, _commitOid: CommitOid): Promise<boolean>;
}