import { Request, Response, NextFunction, Router, RequestHandler, IRouter } from "express";
import { INeuraLogger } from "../utils/logger.util";
import { INeuraContainer } from "../utils/container.util";
import { ClassConstructor } from "class-transformer";
export interface NeuraSession {
}
export interface NeuraRequest<T, U> {
    body: T;
    query: U;
    session: NeuraSession;
    headers: {
        [key: string]: string;
    };
    expressRequest: Request;
    expressResponse: Response;
    cookies: {
        [key: string]: string;
    };
}
export declare class NeuraRouter {
    protected readonly container: INeuraContainer;
    router: Router;
    routePrefix: string | undefined;
    protected logger: INeuraLogger;
    constructor(container: INeuraContainer);
    use(...handlers: Array<RequestHandler>): void;
    get<T, U>(path: string, cb: (request: NeuraRequest<T, U>) => Promise<any>, bodyToValidate?: ClassConstructor<T>, queryToValidate?: ClassConstructor<U>): void;
    post<T, U>(path: string, cb: (request: NeuraRequest<T, U>) => Promise<any>, bodyToValidate?: ClassConstructor<T>, queryToValidate?: ClassConstructor<U>): void;
    put<T, U>(path: string, cb: (request: NeuraRequest<T, U>) => Promise<any>, bodyToValidate?: ClassConstructor<T>, queryToValidate?: ClassConstructor<U>): void;
    delete<T, U>(path: string, cb: (request: NeuraRequest<T, U>) => Promise<any>, bodyToValidate?: ClassConstructor<T>, queryToValidate?: ClassConstructor<U>): void;
    protected validateAndRespond<T, U>(req: Request, res: Response, next: NextFunction, cb: (request: NeuraRequest<T, U>) => Promise<any>, bodyToValidate?: ClassConstructor<T>, queryToValidate?: ClassConstructor<U>): Promise<any>;
    protected getFullRoutePath(path: string): string;
}
export declare abstract class NeuraController {
    protected readonly container: INeuraContainer;
    protected logger: INeuraLogger;
    protected router: NeuraRouter;
    private routesRegistered;
    constructor(container: INeuraContainer);
    getRouterPrefix(): string | undefined;
    abstract registerRoutes(): void;
    getRouter(): IRouter;
}
