import { IContainer } from './../../di/resolvers';
import { QueryResponse } from './../../pipeline/query';
import { ActionResponse } from './../../pipeline/actions';
import * as types from './types';
import 'reflect-metadata';
import { CommonRequestResponse } from '../../pipeline/common';
import { IMetrics } from '../../metrics/metrics';
import { RequestContext } from '../../servers/requestContext';
/**
 *
 *
 * @export
 * @abstract
 * @class AbstractCommand
 * @template T
 */
export declare abstract class AbstractServiceCommand {
    private overrideAuthorization;
    private overrideTenant;
    protected metrics: IMetrics;
    private customTags;
    /**
     *
     *
     * @type {RequestContext}
     */
    requestContext: RequestContext;
    readonly container: IContainer;
    private static METRICS_NAME;
    /**
     * Creates an instance of AbstractCommand.
     *
     * @param {IContainer} container
     * @param {any} providerFactory
     */
    constructor(container: IContainer);
    /**
     * Set (or reset) user context to use for calling service.
     *
     * @protected
     * @param {string} apiKey - null for reset
     * @param {string} tenant - null for reset
     *
     * @memberOf AbstractServiceCommand
     */
    protected setRequestContext(apiKey?: string, tenant?: string): void;
    protected initializeMetricsInfo(container: IContainer): void;
    protected setMetricsTags(container: IContainer, targetServiceName: string, targetServiceVersion: string): void;
    onCommandCompleted(duration: number, success: boolean): void;
    /**
     *
     *
     * @private
     * @param {string} serviceName
     * @param {number} version
     * @returns
     */
    private createServiceName(serviceName, version);
    /**
     * get a domain element
     * @param serviceName - full service name
     * @param version - version of the service
     * @param id - Element id
     * @param schema - optional element schema
     * @returns A vulcain request response
     *
     * @protected
     * @template T
     * @param {string} serviceName
     * @param {number} version
     * @param {string} id
     * @param {string} [schema]
     * @returns {Promise<QueryResponse<T>>}
     */
    protected getRequestAsync<T>(serviceName: string, version: string, id: string, schema?: string): Promise<QueryResponse<T>>;
    /**
     *
     *
     * @protected
     * @template T
     * @param {string} serviceName
     * @param {number} version
     * @param {string} action
     * @param {*} [query]
     * @param {number} [page]
     * @param {number} [maxByPage]
     * @param {string} [schema]
     * @returns {Promise<QueryResponse<T>>}
     */
    protected getQueryAsync<T>(serviceName: string, version: string, verb: string, query?: any, page?: number, maxByPage?: number, schema?: string): Promise<QueryResponse<T>>;
    /**
     *
     *
     * @protected
     * @param {string} serviceName
     * @param {number} version
     * @param {string} action
     * @param {*} data
     * @returns {Promise<ActionResponse<T>>}
     */
    protected sendActionAsync<T>(serviceName: string, version: string, verb: string, data: any): Promise<ActionResponse<T>>;
    private setUserContextAsync(request);
    /**
     * Send a http request
     *
     * @protected
     * @param {string} http verb to use
     * @param {string} url
     * @param {(req:types.IHttpRequest) => void} [prepareRequest] Callback to configure request before sending
     * @returns request response
     */
    protected sendRequestAsync(verb: string, url: string, prepareRequest?: (req: types.IHttpRequest) => void): Promise<CommonRequestResponse<any>>;
    protected exec(kind: string, serviceName: string, version: string, verb: string, userContext: any, data: any, page: any, maxByPage: any): Promise<any>;
    runAsync(...args: any[]): Promise<any>;
}
