ExecuteQueryUseCase.ts•1.74 kB
import { QueryDomainService } from '../../domain/query/services/QueryDomainService.js';
import { QueryResult } from '../../domain/query/entities/Query.js';
import { QueryString } from '../../domain/query/value-objects/QueryString.js';
import { QueryExecutionError } from '../../domain/query/errors/QueryExecutionError.js';
export interface ExecuteQueryRequest {
  sql: string;
  parameters?: any[];
}
export interface ExecuteQueryResponse {
  success: boolean;
  result?: QueryResult;
  error?: string;
}
/**
 * ExecuteQueryUseCase
 *
 * Application use case for executing database queries.
 * Implements the use case pattern from Clean Architecture.
 */
export class ExecuteQueryUseCase {
  constructor(private readonly queryDomainService: QueryDomainService) {}
  /**
   * Executes a query with the given SQL and parameters.
   * @param request The query execution request
   * @returns Response with query result or error
   */
  async execute(request: ExecuteQueryRequest): Promise<ExecuteQueryResponse> {
    try {
      // Create QueryString value object to validate SQL
      const queryString = new QueryString(request.sql);
      // Create and validate query
      const query = await this.queryDomainService.createQuery(
        queryString.value,
        request.parameters || []
      );
      // Execute query
      const result = await this.queryDomainService.executeQuery(query.id);
      return {
        success: true,
        result,
      };
    } catch (error) {
      // Preserve domain errors
      if (error instanceof QueryExecutionError) {
        throw error;
      }
      return {
        success: false,
        error: error instanceof Error ? error.message : 'Unknown error occurred',
      };
    }
  }
}