import { CustomConsumeFunction, CustomPrepareFunction } from "./prepare_consume_chain_builder"; import type { OpenAPIV3 } from "../bundled_openapi_types"; import type { HttpContext } from '@adonisjs/core/http'; import type { ApplicationService } from '@adonisjs/core/types'; import type { ResourcefulDataType } from "../types"; import type { ModelRelationTypes } from '@adonisjs/lucid/types/relations'; import type { LucidModel, LucidRow, ModelColumnOptions, ComputedOptions } from '@adonisjs/lucid/types/model'; import type { AnySchema, StringSchema, BinarySchema, NumberSchema, BooleanSchema, ObjectSchema, ArraySchema, DateSchema } from "./schema_types"; export type PromiseAble = T | Promise | PromiseLike; export type Promised = Promise | PromiseLike; export interface ResourcefulGeneralAccessControlFilter { (ctx: HttpContext, app: ApplicationService): PromiseAble; } export interface ResourcefulAccessControlFilter> { (ctx: HttpContext, app: ApplicationService, instance?: ResourcefulModelInstance): PromiseAble; } export interface ResourcefulResourceAccessControlFilter> { (ctx: HttpContext, app: ApplicationService, instance: ResourcefulModelInstance): PromiseAble; } export interface ExternalDocumentationObject { description?: string; url: string; } export interface ResourcefulPropertyDefinition { propertyKey: string; readAccessControlFilters: ResourcefulAccessControlFilter[]; writeAccessControlFilters: ResourcefulAccessControlFilter[]; nullable: boolean; description?: string; default?: any; externalDocs?: ExternalDocumentationObject; example?: string; deprecated?: boolean; prepare?: CustomPrepareFunction; consume?: CustomConsumeFunction; } export interface ValidationScoper { (schema: BaseSchema): void; } export interface LocalResourcefulPropertyDefinition extends ResourcefulPropertyDefinition { type: ResourcefulDataType; validationScopes?: ValidationScoper[]; } export interface ResourcefulColumnDefinition extends LocalResourcefulPropertyDefinition { /** Whether this column can be used in filter operations. Defaults to true. */ filterable: boolean; /** Whether this column can be used in sort operations. Defaults to true. */ sortable: boolean; /** Whether this column can be used in aggregation operations. Defaults to false. */ aggregatable: boolean; /** Whether this column is immutable. Defaults to false. */ immutable: boolean; /** The property name of the relationship which this column acts as a key for */ relationshipKey?: string; } export interface ResourcefulComputedAccessorDefinition extends LocalResourcefulPropertyDefinition { writable: boolean; } export interface ResourcefulRelationshipDefinition extends ResourcefulPropertyDefinition { relatedModel: () => Model; } export type LucidBinaryValue = Uint8Array | Buffer; export type LucidPlainObject = { [key: string]: unknown; }; export type ResourcefulPropertySchema = StringSchema | BinarySchema | NumberSchema | BooleanSchema | ObjectSchema | ArraySchema | DateSchema; export interface ResourcefulModelMetaSchema { name: string; properties: { [key: string]: ResourcefulModelPropertyMetaSchema; }; description?: string; externalDocs?: ExternalDocumentationObject; example?: string; } export interface ResourcefulModelColumnMetaSchema { propertyKey: string; definition: ResourcefulColumnDefinition; lucidDefinitions: ModelColumnOptions; canRead: boolean; canWrite: boolean; kind: 'column'; validator: AnySchema; /** Whether this column can be used in filter operations */ filterable: boolean; /** Whether this column can be used in sort operations */ sortable: boolean; /** Whether this column can be used in aggregation operations */ aggregatable: boolean; } export interface ResourcefulModelComputedAccessorMetaSchema { propertyKey: string; definition: ResourcefulComputedAccessorDefinition; lucidDefinitions: ComputedOptions; canRead: boolean; canWrite: boolean; kind: 'computedAccessor'; validator: AnySchema; } export interface ResourcefulModelRelationshipMetaSchema { propertyKey: string; definition: ResourcefulRelationshipDefinition; lucidDefinitions: ReturnType; canRead: boolean; canWrite: boolean; kind: 'relationship'; validator: AnySchema; relatedModel: () => Model; /** Array of field names from the related model that can be used in filter operations */ filterable: { [key: string]: any; }; } export type ResourcefulModelPropertyMetaSchema = ResourcefulModelColumnMetaSchema | ResourcefulModelComputedAccessorMetaSchema | ResourcefulModelRelationshipMetaSchema; export type ResourcefulModelOpenApiSchema = OpenAPIV3.SchemaObject & { /** Array of field names that can be used in filter operations, including dot-notation for relationships */ 'x-resourceful-filterable'?: { [key: string]: any; }; /** Array of field names that can be used in sort operations */ 'x-resourceful-sortable'?: string[]; /** Array of field names that can be used in aggregation operations */ 'x-resourceful-aggregatable'?: string[]; /** Properties of this model which are "auto-created" i.e. not required for creation even though they're not nullable */ 'x-resourceful-auto-create'?: string[]; }; export type ResourcefulModelOpenApiRelatedSchema = OpenAPIV3.ReferenceObject & { 'x-resourceful-display-key': string; }; export type ResourcefulModelSerializableAttributes = Model['$columns'] extends undefined ? { [P in keyof Model as P extends keyof LucidRow | 'serializeExtras' ? never : Model[P] extends Function | ModelRelationTypes ? never : Model extends { $columnsDefinitions: Map; } ? P extends K ? V extends { serializeAs: null; } ? never : V extends { serializeAs: infer S; } ? S extends string ? S : P : P : P : P]: Model[P]; } : Model['$columns']; export type ResourcefulModelRelationshipMetaChoice = { label: string; value: any; }; export type ResourcefulModelRelationshipMeta = { title: string; multiple: boolean; choices: ResourcefulModelRelationshipMetaChoice[] | string; }; export type ResourcefulModelFieldRelationshipMeta = false | ResourcefulModelRelationshipMeta; export type { ResourcefulEnum, ResourcefulEnumObject } from "./data_types";