/// <reference types="node" />
import { Model } from 'mongoose';
import { FastifyMongooseRestOptions } from './types';
/**
 * Create a new FastifyMongooseRest instance
 *
 * @param basePath Base path for the routes. It will be prefixed to all routes
 * @param model Mongoose model to use
 * @param options Options for the routes
 * @returns FastifyMongooseRest instance
 *
 * @example
 * ```ts
 * import FastifyMongooseRest from 'fastify-mongoose-rest';
 * import Cat from './models/cat';
 *
 * // If the base path does not include a slash at the start, it will be added
 * const fastifyMongooseRest = FastifyMongooseRest('/cats', Cat);
 * ```
 */
export default function FastifyMongooseRest<T>(basePath: string, model: Model<T>, options?: FastifyMongooseRestOptions): {
    /**
     * Route for creating a new resource
     *
     * @description
     * Validates input with given {@link FastifyMongooseRestOptions.validationSchema validation schema} and returns the created resource
     *
     * @see {@link Model.create Mongooose create method}
     */
    create: {
        method: "POST";
        url: string;
        schema: {
            summary: string;
            tags?: string[] | undefined;
            body: object;
            response: object;
        };
        handler: (request: import("fastify").FastifyRequest<import("fastify").RouteGenericInterface, import("fastify").RawServerDefault, import("http").IncomingMessage, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown, import("fastify").FastifyBaseLogger, import("fastify/types/type-provider").ResolveFastifyRequestType<import("fastify").FastifyTypeProviderDefault, import("fastify").FastifySchema, import("fastify").RouteGenericInterface>>, reply: import("fastify").FastifyReply<import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").RouteGenericInterface, unknown, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown>) => Promise<any>;
    };
    /**
     * Route for deleting a resource by it's identifier
     *
     * @description
     * Deletes a resource by _id or {@link FastifyMongooseRestOptions.findProperty findProperty option}
     *
     * @see {@link Model.deleteOne Mongooose deleteOne method}
     */
    delete: {
        method: "DELETE";
        url: string;
        schema: {
            summary: string;
            tags?: string[] | undefined;
            params: object;
            response: object;
        };
        handler: (request: import("fastify").FastifyRequest<{
            Params: {
                id: string;
            };
        }, import("fastify").RawServerDefault, import("http").IncomingMessage, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown, import("fastify").FastifyBaseLogger, import("fastify/types/type-provider").ResolveFastifyRequestType<import("fastify").FastifyTypeProviderDefault, import("fastify").FastifySchema, {
            Params: {
                id: string;
            };
        }>>, reply: import("fastify").FastifyReply<import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").RouteGenericInterface, unknown, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown>) => Promise<any>;
    };
    /**
     * Route for displaying a single resource by it's identifier
     *
     * @description
     * Returns a resource by _id or {@link FastifyMongooseRestOptions.findProperty findProperty option}
     *
     * @see {@link Model.findOne Mongooose findOne method}
     */
    details: {
        method: "GET";
        url: string;
        schema: {
            summary: string;
            tags?: string[] | undefined;
            params: object;
            querystring: object;
            response: object;
        };
        handler: (request: import("fastify").FastifyRequest<{
            Params: {
                id: string;
            };
            Querystring: {
                populate?: string | undefined;
                projection?: string | undefined;
                select?: string | undefined;
            };
        }, import("fastify").RawServerDefault, import("http").IncomingMessage, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown, import("fastify").FastifyBaseLogger, import("fastify/types/type-provider").ResolveFastifyRequestType<import("fastify").FastifyTypeProviderDefault, import("fastify").FastifySchema, {
            Params: {
                id: string;
            };
            Querystring: {
                populate?: string | undefined;
                projection?: string | undefined;
                select?: string | undefined;
            };
        }>>, reply: import("fastify").FastifyReply<import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").RouteGenericInterface, unknown, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown>) => Promise<any>;
    };
    /**
     * Route for displaying modifying a resource by it's identifier
     *
     * @description
     * Validates input with given {@link FastifyMongooseRestOptions.validationSchema validation schema} and returns the modified resource
     *
     * @see {@link Model.findOne Mongooose findOne method}
     * @see {@link Model.updateOne Mongooose updateOne method}
     */
    modify: {
        method: "PATCH";
        url: string;
        schema: {
            summary: string;
            tags?: string[] | undefined;
            params: object;
            body: object;
            response: object;
        };
        handler: (request: import("fastify").FastifyRequest<{
            Params: {
                id: string;
            };
            Body: {
                [index: string]: any;
            };
        }, import("fastify").RawServerDefault, import("http").IncomingMessage, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown, import("fastify").FastifyBaseLogger, import("fastify/types/type-provider").ResolveFastifyRequestType<import("fastify").FastifyTypeProviderDefault, import("fastify").FastifySchema, {
            Params: {
                id: string;
            };
            Body: {
                [index: string]: any;
            };
        }>>, reply: import("fastify").FastifyReply<import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").RouteGenericInterface, unknown, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown>) => Promise<any>;
    };
    /**
     * Route for querying a list of resources
     *
     * @description
     * Returns a list of resources defined by the query parameters used in the request
     *
     * @see {@link Model.find Mongooose find method}
     */
    list: {
        method: "GET";
        url: string;
        schema: {
            summary: string;
            tags?: string[] | undefined;
            querystring: object;
            response: object;
        };
        handler: (request: import("fastify").FastifyRequest<{
            Querystring: import("./types").FindQueryOptions;
        }, import("fastify").RawServerDefault, import("http").IncomingMessage, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown, import("fastify").FastifyBaseLogger, import("fastify/types/type-provider").ResolveFastifyRequestType<import("fastify").FastifyTypeProviderDefault, import("fastify").FastifySchema, {
            Querystring: import("./types").FindQueryOptions;
        }>>, reply: import("fastify").FastifyReply<import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").RouteGenericInterface, unknown, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown>) => Promise<any>;
    };
    /**
     * Route for searching a list of resources
     *
     * @description
     * Returns a list of resources defined by the body used in the request
     *
     * @see {@link Model.find Mongooose find method}
     */
    search: {
        method: "POST";
        url: string;
        schema: {
            summary: string;
            tags?: string[] | undefined;
            body: object;
            response: object;
        };
        handler: (request: import("fastify").FastifyRequest<{
            Body: import("./types").FindOptions;
        }, import("fastify").RawServerDefault, import("http").IncomingMessage, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown, import("fastify").FastifyBaseLogger, import("fastify/types/type-provider").ResolveFastifyRequestType<import("fastify").FastifyTypeProviderDefault, import("fastify").FastifySchema, {
            Body: import("./types").FindOptions;
        }>>, reply: import("fastify").FastifyReply<import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").RouteGenericInterface, unknown, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown>) => Promise<any>;
    };
    /**
     * Route for inserting many resources
     *
     * @description
     * Validates input with given {@link FastifyMongooseRestOptions.validationSchema validation schema} and returns the created resources
     *
     * @see {@link Model.insertMany Mongooose insertMany method}
     */
    insertMany: {
        method: "POST";
        url: string;
        schema: {
            summary: string;
            tags?: string[] | undefined;
            body: object[];
            response: object;
        };
        handler: (request: import("fastify").FastifyRequest<{
            Body: object[];
        }, import("fastify").RawServerDefault, import("http").IncomingMessage, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown, import("fastify").FastifyBaseLogger, import("fastify/types/type-provider").ResolveFastifyRequestType<import("fastify").FastifyTypeProviderDefault, import("fastify").FastifySchema, {
            Body: object[];
        }>>, reply: import("fastify").FastifyReply<import("fastify").RawServerDefault, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").RouteGenericInterface, unknown, import("fastify").FastifySchema, import("fastify").FastifyTypeProviderDefault, unknown>) => Promise<any>;
    };
};
