import type { NextFunction, Response } from "express";
import type { IUser, IWorkspace } from "../entities";
import type { IBase } from "../entities/Base";
import type { AppRequest, Ownership } from "../interfaces/SystemTypes";
import { type BaseService } from "../services/BaseService";
import type { IQueryFilter, IQueryOptions, IResponsePagination } from "../interfaces/IQuery";
import type { ResponseData } from "../interfaces/ResponseData";
export default class BaseController<T extends IBase = any, S extends BaseService<T> = BaseService> {
    req: AppRequest;
    service: S;
    user: IUser;
    workspace: IWorkspace;
    ownership: Ownership;
    filter: IQueryFilter;
    options: IQueryOptions;
    pagination: IResponsePagination;
    constructor(service?: S);
    read(): Promise<ResponseData>;
    create(inputData: any): Promise<ResponseData>;
    update(updateData: any): Promise<ResponseData>;
    delete(): Promise<ResponseData>;
    softDelete(): Promise<ResponseData>;
    empty(): Promise<ResponseData | (ResponseData & {
        data: {
            ok: number;
        };
    })>;
    parseDateRange(req: AppRequest, res?: Response, next?: NextFunction): void;
    parseBody(req: AppRequest, res?: Response, next?: NextFunction): void;
    /**
     * Parse the filter option from the URL:
     * - List (first page, 10 item per page, sort "desc" by "updatedAt" first, then "desc" by "createdAt"): `https://example.com/api/v1/user?page=1&size=10&sort=-updatedAt,-createdAt`
     * - Search (by username that contains "john"): `https://example.com/api/v1/user?page=1&size=10&username=john&search=true`
     */
    parseFilter(req: AppRequest, res?: Response, next?: NextFunction): void;
    parsePagination(req: AppRequest, res?: Response, next?: NextFunction): Promise<void>;
}
//# sourceMappingURL=BaseController.d.ts.map