import { type CallOptions } from 'nice-grpc';
import { Client } from '@restorecommerce/grpc-client';
import { UserServiceDefinition } from '@restorecommerce/rc-grpc-clients/dist/generated-server/io/restorecommerce/user';
import { ResourceList } from '@restorecommerce/rc-grpc-clients/dist/generated-server/io/restorecommerce/resource_base';
import { Operation, ACSResource, AuthZAction, ACSClientContext } from './interfaces';
export type DatabaseProvider = 'arangoDB' | 'postgres';
export type ACSClientContextFactory<T extends ResourceList> = (self: any, request: T, ...args: any) => Promise<ACSClientContext>;
export type ResourceFactory<T extends ResourceList> = (self: any, request: T, ...args: any) => Promise<ACSResource[]>;
export type DatabaseSelector<T extends ResourceList> = (self: any, request: T, ...args: any) => Promise<DatabaseProvider>;
export type MetaDataInjector<T extends ResourceList> = (self: any, request: T, ...args: any) => Promise<T>;
export type SubjectResolver<T extends ResourceList> = (self: any, request: T, ...args: any) => Promise<T>;
export interface AccessControlledService {
    readonly __userService: Client<UserServiceDefinition>;
    readonly __acsDatabaseProvider: DatabaseProvider;
}
export declare const DefaultACSClientContextFactory: <T extends ResourceList>(self: any, request: T, context: any) => Promise<ACSClientContext>;
export declare function DefaultResourceFactory<T extends ResourceList>(...resourceNames: string[]): ResourceFactory<T>;
export declare const DefaultSubjectResolver: <T extends ResourceList>(self: any, request: T, ...args: any) => Promise<T>;
export declare const DefaultMetaDataInjector: <T extends ResourceList>(self: any, request: T, ...args: any) => Promise<T>;
export declare enum ByPass {
    SUBJECT = "SUBJECT",
    META = "META",
    ACS = "ACS"
}
export declare function setByPass(...args: ByPass[]): CallOptions;
export declare function access_controlled_service<T extends {
    new (...args: any): any;
}>(baseService: T): T;
export declare function access_controlled_function<T extends ResourceList>(kwargs: {
    action: AuthZAction;
    operation: Operation;
    context?: ACSClientContext | ACSClientContextFactory<T>;
    resource?: ACSResource[] | ResourceFactory<T>;
    database?: DatabaseProvider | DatabaseSelector<T>;
    useCache?: boolean;
}): (target: any, propertyName: string, descriptor: TypedPropertyDescriptor<any>) => void;
export declare function resolves_subject<T extends ResourceList>(subjectResolver?: SubjectResolver<T>): (target: any, propertyName: string, descriptor: TypedPropertyDescriptor<any>) => void;
export declare function injects_meta_data<T extends ResourceList>(metaDataInjector?: MetaDataInjector<T>): (target: any, propertyName: string, descriptor: TypedPropertyDescriptor<any>) => void;
//# sourceMappingURL=decorators.d.ts.map