@avonjs/avonjs
Version:
A fluent Node.js API generator.
326 lines (325 loc) • 21.5 kB
TypeScript
import { Ability, type DetailSerializedResource, type IndexSerializedResource, type Model, type ResourceMetaData, type ReviewSerializedResource, type StoreSerializedResource, type UnknownRecord, type UpdateSerializedResource } from './Contracts';
import type AvonRequest from './Http/Requests/AvonRequest';
declare const Resource_base: (abstract new (...args: import("./Contracts").Args) => {
beforeCreate(request: AvonRequest): void;
afterCreate(request: AvonRequest): void;
created(request: AvonRequest): void;
beforeUpdate(request: AvonRequest): void;
afterUpdate(request: AvonRequest, resource: Model): void;
updated(request: AvonRequest, resource: Model): void;
beforeDelete(request: AvonRequest): void;
afterDelete(request: AvonRequest): void;
beforeForceDelete(request: AvonRequest): void;
afterForceDelete(request: AvonRequest): void;
deleted(request: AvonRequest): void;
beforeRestore(request: AvonRequest): void;
afterRestore(request: AvonRequest): void;
restored(request: AvonRequest): void;
}) & (abstract new (...args: import("./Contracts").Args) => {
resource: Model;
recordEvents: boolean;
recordCreationEvent(payload?: import("./Contracts").Payload, transaction?: import("./Contracts").Transaction, userId?: import("./Contracts").PrimaryKey): Promise<void>;
recordUpdateEvent(previous: Model, payload?: import("./Contracts").Payload, transaction?: import("./Contracts").Transaction, userId?: import("./Contracts").PrimaryKey): Promise<void>;
recordDeletionEvent(transaction?: import("./Contracts").Transaction, userId?: import("./Contracts").PrimaryKey): Promise<void>;
recordRestoreEvent(transaction?: import("./Contracts").Transaction, userId?: import("./Contracts").PrimaryKey): Promise<void>;
recordStandaloneActionEvent(action: import("./Actions").Action, payload?: import("./Contracts").Payload, userId?: import("./Contracts").PrimaryKey): Promise<void>;
recordBulkActionEvent(action: import("./Actions").Action, changes?: import("./Contracts").BulkActionResult, payload?: import("./Contracts").Payload, userId?: import("./Contracts").PrimaryKey): Promise<void>;
flushActionEvents(transaction?: import("./Contracts").Transaction): Promise<void>;
makeActionRepository(transaction?: import("./Contracts").Transaction): import("./Repositories").Repository<Model> & import("./Contracts").ActionEventRepository<Model>;
actionRepository(): import("./Repositories").Repository & import("./Contracts").ActionEventRepository<Model>;
isRecordable(): boolean;
sanitizePayload(payload: import("./Contracts").Payload): import("./Contracts").Payload;
resourceName(): string;
}) & (abstract new (...args: import("./Contracts").Args) => {
search(request: AvonRequest, filters?: import("./Contracts").MatchedQueryHandlers<import("./Filters").Filter>, orderings?: import("./Contracts").MatchedQueryHandlers<import("./Orderings").Ordering>, withTrashed?: import("./Contracts").TrashedStatus): Promise<import("./Repositories").Repository<Model>>;
initializeSearch(request: AvonRequest, filters?: import("./Contracts").MatchedQueryHandlers<import("./Filters").Filter>, orderings?: import("./Contracts").MatchedQueryHandlers<import("./Orderings").Ordering>): Promise<import("./Repositories").Repository<Model>>;
queryBuilder(request: AvonRequest): import("./Repositories").Repository<Model>;
resolveRepository(request: AvonRequest): import("./Repositories").Repository<Model>;
applySoftDeleteConstraint(queryBuilder: import("./Repositories").Repository<Model>, withTrashed: import("./Contracts").TrashedStatus): import("./Repositories").Repository<Model>;
applyFilters(request: AvonRequest, queryBuilder: import("./Repositories").Repository<Model>, filters: import("./Contracts").MatchedQueryHandlers<import("./Filters").Filter>): Promise<import("./Repositories").Repository<Model>>;
applyOrderings(request: AvonRequest, queryBuilder: import("./Repositories").Repository<Model>, orderings?: import("./Contracts").MatchedQueryHandlers<import("./Orderings").Ordering>): Promise<import("./Repositories").Repository<Model>>;
relatableQuery(request: AvonRequest, queryBuilder: import("./Repositories").Repository<Model>): import("./Repositories").Repository<Model>;
indexQuery(request: AvonRequest, queryBuilder: import("./Repositories").Repository<Model>): import("./Repositories").Repository<Model>;
detailQuery(request: AvonRequest, queryBuilder: import("./Repositories").Repository<Model>): import("./Repositories").Repository<Model>;
reviewQuery(request: AvonRequest, queryBuilder: import("./Repositories").Repository<Model>): import("./Repositories").Repository<Model>;
softDeletes(): boolean;
repository(): import("./Repositories").Repository<Model>;
}) & (abstract new (...args: import("./Contracts").Args) => {
validateForCreation(request: AvonRequest): Promise<void>;
validatorForCreation(request: AvonRequest): import("joi").AnySchema;
rulesForCreation(request: AvonRequest): import("joi").AnySchema[];
validateForUpdate(request: AvonRequest, resource?: Resource): Promise<void>;
validatorForUpdate(request: AvonRequest, resource?: Resource): import("joi").AnySchema;
rulesForUpdate(request: AvonRequest, resource?: Resource): import("joi").AnySchema[];
prepareRulesForValidator(rules: import("./Contracts").Rules[]): import("joi").AnySchema[];
formatRules(request: AvonRequest, rules: import("joi").AnySchema[]): import("joi").AnySchema[];
dataForValidation(request: AvonRequest): import("./Contracts").AnyRecord;
afterValidation(request: AvonRequest, validator: unknown): void;
afterCreationValidation(request: AvonRequest, validator: unknown): void;
afterUpdateValidation(request: AvonRequest, validator: unknown): void;
}) & (abstract new (...args: import("./Contracts").Args) => {
fillForCreation<TModel_1 extends Model>(request: AvonRequest, model: TModel_1): import("./Contracts").CallbackStack;
fillForUpdate<TModel_1 extends Model>(request: AvonRequest, model: TModel_1): import("./Contracts").CallbackStack;
fillFields<TModel_1 extends Model>(request: AvonRequest, model: TModel_1, fields: import("./Collections/FieldCollection").default): import("./Contracts").CallbackStack;
}) & (abstract new (...args: import("./Contracts").Args) => {
resource: Model;
availableForSwagger: boolean;
availableForIndex: boolean;
availableForDetail: boolean;
availableForCreation: boolean;
availableForUpdate: boolean;
availableForDelete: boolean;
availableForForceDelete: boolean;
availableForRestore: boolean;
availableForReview: boolean;
schema(request: AvonRequest): import("openapi-types").OpenAPIV3.PathsObject;
resourceIndexSchema(request: AvonRequest): import("openapi-types").OpenAPIV3.PathItemObject | undefined;
resourceContentSchema(fields: Record<string, import("./Contracts").OpenApiSchema>): {
type: string;
items: {
type: string;
properties: {
metadata: import("./Contracts").OpenApiSchema;
authorization: {
type: string;
properties: {
authorizedToForceDelete?: {
type: string;
default: boolean;
description: string;
} | undefined;
authorizedToRestore?: {
type: string;
default: boolean;
description: string;
} | undefined;
authorizedToReview?: {
type: string;
default: boolean;
description: string;
} | undefined;
authorizedToView: {
type: string;
default: boolean;
description: string;
};
authorizedToUpdate: {
type: string;
default: boolean;
description: string;
};
authorizedToDelete: {
type: string;
default: boolean;
description: string;
};
};
};
fields: {
type: string;
properties: Record<string, import("./Contracts").OpenApiSchema>;
};
};
};
};
resourceMetaDataSchema(): import("./Contracts").OpenApiSchema;
searchParameters(request: AvonRequest): import("openapi-types").OpenAPIV3.ParameterObject[];
paginationParameters(request: AvonRequest): import("openapi-types").OpenAPIV3.ParameterObject[];
softDeleteParameters(request: AvonRequest): import("openapi-types").OpenAPIV3.ParameterObject[];
orderingParameters(request: AvonRequest): import("openapi-types").OpenAPIV3.ParameterObject[];
filteringParameters(request: AvonRequest): import("openapi-types").OpenAPIV3.ParameterObject[];
resourceStoreSchema(request: AvonRequest): import("openapi-types").OpenAPIV3.PathItemObject | undefined;
resourceDetailSchema(request: AvonRequest): import("openapi-types").OpenAPIV3.PathItemObject | undefined;
resourceLookupSchema(request: AvonRequest): import("openapi-types").OpenAPIV3.PathItemObject | undefined;
resourceReviewSchema(request: AvonRequest): import("openapi-types").OpenAPIV3.PathItemObject | undefined;
resourceUpdateSchema(request: AvonRequest): import("openapi-types").OpenAPIV3.PathItemObject | undefined;
resourceDeleteSchema(request: AvonRequest): import("openapi-types").OpenAPIV3.PathItemObject | undefined;
resourceForceDeleteSchema(request: AvonRequest): import("openapi-types").OpenAPIV3.PathItemObject | undefined;
resourceRestoreSchema(request: AvonRequest): import("openapi-types").OpenAPIV3.PathItemObject | undefined;
actionsSchema(request: AvonRequest): import("openapi-types").OpenAPIV3.PathsObject;
associationSchema(request: AvonRequest): import("openapi-types").OpenAPIV3.PathsObject;
singleResourceContent(request: AvonRequest, schema?: Record<string, import("./Contracts").OpenApiSchema>): Record<string, import("openapi-types").OpenAPIV3.MediaTypeObject>;
paginatedResponseSchema(data: UnknownRecord): Record<string, import("openapi-types").OpenAPIV3.MediaTypeObject>;
jsonResponseSchema(data: UnknownRecord, meta?: UnknownRecord): Record<string, import("openapi-types").OpenAPIV3.MediaTypeObject>;
reviewResourceContent(request: AvonRequest): Record<string, import("openapi-types").OpenAPIV3.MediaTypeObject>;
singleResourcePathParameters(request: AvonRequest): import("openapi-types").OpenAPIV3.ParameterObject[];
actionQueryParameters(request: AvonRequest, action: import("./Actions").Action): import("openapi-types").OpenAPIV3.ParameterObject[];
apis(request: AvonRequest): Record<string, string>;
getRouteKeyName(): string;
label(): string;
formatResponseFields(request: AvonRequest, fields: import("./Collections/FieldCollection").default): Record<string, import("./Contracts").OpenApiSchema>;
formatPayloadFields(request: AvonRequest, fields: import("./Collections/FieldCollection").default): Record<string, import("./Contracts").OpenApiSchema>;
authorizationResponses(): import("openapi-types").OpenAPIV3.ResponsesObject;
errorsResponses(): import("openapi-types").OpenAPIV3.ResponsesObject;
validationResponses(): import("openapi-types").OpenAPIV3.ResponsesObject;
accepts(): string[];
uriKey(): string;
availableFields(request: AvonRequest): import("./Collections/FieldCollection").default;
perPageOptions(): number[];
availableFieldsOnForms(request: AvonRequest): import("./Collections/FieldCollection").default;
resolveFilters(request: AvonRequest): import("./Filters").Filter[];
resolveOrderings(request: AvonRequest): import("./Orderings").Ordering[];
availableFieldsOnIndexOrDetail(request: AvonRequest): import("./Collections/FieldCollection").default;
fieldsForIndex(request: AvonRequest): import("./Fields").Field[];
fieldsForDetail(request: AvonRequest): import("./Fields").Field[];
fieldsForReview(request: AvonRequest): import("./Fields").Field[];
fieldsForCreate(request: AvonRequest): import("./Fields").Field[];
fieldsForUpdate(request: AvonRequest): import("./Fields").Field[];
resolveActions(request: AvonRequest): import("./Actions").Action[];
softDeletes(): boolean;
repository(): import("./Repositories").Repository<Model>;
}) & (abstract new (...args: import("./Contracts").Args) => {
availableActions(request: AvonRequest): import("./Actions").Action[];
resolveActions(request: AvonRequest): import("./Actions").Action[];
actions(request: AvonRequest): import("./Actions").Action[];
}) & (abstract new (...args: import("./Contracts").Args) => {
availableOrderings(request: AvonRequest): import("./Orderings").Ordering[];
resolveOrderings(request: AvonRequest): import("./Orderings").Ordering[];
resolveOrderingsFromFields(request: AvonRequest): import("./Orderings").Ordering[];
orders(request: AvonRequest): import("./Orderings").Ordering[];
}) & (abstract new (...args: import("./Contracts").Args) => {
availableFilters(request: AvonRequest): import("./Filters").Filter[];
resolveFilters(request: AvonRequest): import("./Filters").Filter[];
resolveFiltersFromFields(request: AvonRequest): import("./Filters").Filter[];
filters(request: AvonRequest): import("./Filters").Filter[];
}) & (abstract new (...args: import("./Contracts").Args) => {
resource: Model;
indexFields(request: AvonRequest, resource: Model): import("./Collections/FieldCollection").default;
detailFields(request: AvonRequest, resource: Model): import("./Collections/FieldCollection").default;
creationFields(request: AvonRequest): import("./Collections/FieldCollection").default;
updateFields(request: AvonRequest): import("./Collections/FieldCollection").default;
reviewFields(request: AvonRequest, resource: Model): import("./Collections/FieldCollection").default;
associationFields(request: AvonRequest): import("./Collections/FieldCollection").default;
filterableFields(request: AvonRequest): import("./Collections/FieldCollection").default<import("./Fields").Field>;
orderableFields(request: AvonRequest): import("./Collections/FieldCollection").default<import("./Fields").Field>;
resolveFields(request: AvonRequest, resource?: Model): import("./Collections/FieldCollection").default;
availableFields(request: AvonRequest): import("./Collections/FieldCollection").default;
availableFieldsOnIndexOrDetail(request: AvonRequest): import("./Collections/FieldCollection").default;
availableFieldsOnForms(request: AvonRequest): import("./Collections/FieldCollection").default;
buildAvailableFields(request: AvonRequest, methods: string[]): import("./Collections/FieldCollection").default;
callFieldsMethod(method: string, request: AvonRequest): import("./Fields").Field[];
fieldsMethod(request: AvonRequest): keyof {
resource: Model;
indexFields(request: AvonRequest, resource: Model): import("./Collections/FieldCollection").default;
detailFields(request: AvonRequest, resource: Model): import("./Collections/FieldCollection").default;
creationFields(request: AvonRequest): import("./Collections/FieldCollection").default;
updateFields(request: AvonRequest): import("./Collections/FieldCollection").default;
reviewFields(request: AvonRequest, resource: Model): import("./Collections/FieldCollection").default;
associationFields(request: AvonRequest): import("./Collections/FieldCollection").default;
filterableFields(request: AvonRequest): import("./Collections/FieldCollection").default<import("./Fields").Field>;
orderableFields(request: AvonRequest): import("./Collections/FieldCollection").default<import("./Fields").Field>;
resolveFields(request: AvonRequest, resource?: Model): import("./Collections/FieldCollection").default;
availableFields(request: AvonRequest): import("./Collections/FieldCollection").default;
availableFieldsOnIndexOrDetail(request: AvonRequest): import("./Collections/FieldCollection").default;
availableFieldsOnForms(request: AvonRequest): import("./Collections/FieldCollection").default;
buildAvailableFields(request: AvonRequest, methods: string[]): import("./Collections/FieldCollection").default;
callFieldsMethod(method: string, request: AvonRequest): import("./Fields").Field[];
fieldsMethod(request: AvonRequest): keyof any;
fieldsForCreate(request: AvonRequest): import("./Fields").Field[];
fieldsForUpdate(request: AvonRequest): import("./Fields").Field[];
fieldsForIndex(request: AvonRequest): import("./Fields").Field[];
fieldsForDetail(request: AvonRequest): import("./Fields").Field[];
fieldsForReview(request: AvonRequest): import("./Fields").Field[];
fieldsForAssociation(request: AvonRequest): import("./Fields").Field[];
fields(request: AvonRequest): import("./Fields").Field[];
};
fieldsForCreate(request: AvonRequest): import("./Fields").Field[];
fieldsForUpdate(request: AvonRequest): import("./Fields").Field[];
fieldsForIndex(request: AvonRequest): import("./Fields").Field[];
fieldsForDetail(request: AvonRequest): import("./Fields").Field[];
fieldsForReview(request: AvonRequest): import("./Fields").Field[];
fieldsForAssociation(request: AvonRequest): import("./Fields").Field[];
fields(request: AvonRequest): import("./Fields").Field[];
}) & (abstract new (...args: import("./Contracts").Args) => {
authorizeTo(request: AvonRequest, ability: Ability, args?: import("./Contracts").AnyArray): Promise<void>;
authorizedTo(request: AvonRequest, ability: Ability, args?: import("./Contracts").AnyArray): Promise<boolean>;
authorizable(): boolean;
makeAuthorizationCallback(ability: string): string;
authorizedToViewAny(request: AvonRequest): Promise<boolean>;
authorizedToView(request: AvonRequest): Promise<boolean>;
authorizedToCreate(request: AvonRequest): Promise<boolean>;
authorizedToUpdate(request: AvonRequest): Promise<boolean>;
authorizedToDelete(request: AvonRequest): Promise<boolean>;
authorizedToForceDelete(request: AvonRequest): Promise<boolean>;
authorizedToRestore(request: AvonRequest): Promise<boolean>;
authorizedToAdd(request: AvonRequest, resource: Model): Promise<boolean>;
authorizedToAttach(request: AvonRequest, resource: Model): Promise<boolean>;
authorizedToDetach(request: AvonRequest, resource: Model): Promise<boolean>;
}) & {
new (): {};
};
export default abstract class Resource<TModel extends Model = Model> extends Resource_base {
/**
* The resource model instance.
*/
resource: TModel;
/**
* The number of results to display when searching relatable resource.
*/
relatableSearchResults: number;
constructor(resource?: TModel);
/**
* Create a new instance of the resource for the given model.
*/
forModel(resource: Model): Resource;
/**
* Get the uri-key name of the resource
*/
uriKey(): string;
/**
* Get the pagination per-page values
*/
perPageOptions(): number[];
/**
* Prepare the resource for JSON serialization.
*/
serializeForIndex(request: AvonRequest): Promise<IndexSerializedResource>;
/**
* Prepare the resource for JSON serialization.
*/
serializeForAssociation(request: AvonRequest): Promise<IndexSerializedResource>;
/**
* Prepare the resource for JSON serialization.
*/
protected serializeIndex(request: AvonRequest, fields: UnknownRecord): Promise<{
metadata: ResourceMetaData;
authorization: {
authorizedToView: boolean;
authorizedToUpdate: boolean;
authorizedToDelete: boolean;
authorizedToForceDelete: boolean | undefined;
authorizedToRestore: boolean | undefined;
authorizedToReview: boolean | undefined;
};
fields: UnknownRecord;
}>;
/**
* Prepare the resource for JSON serialization.
*/
serializeForStore(request: AvonRequest): Promise<StoreSerializedResource>;
/**
* Prepare the resource for JSON serialization.
*/
serializeForUpdate(request: AvonRequest): Promise<UpdateSerializedResource>;
/**
* Prepare the resource for JSON serialization.
*/
serializeForDetail(request: AvonRequest): Promise<DetailSerializedResource>;
/**
* Prepare the resource for JSON serialization.
*/
serializeForReview(request: AvonRequest): Promise<ReviewSerializedResource>;
/**
* Get the resource metadata.
*/
protected resourceMetaData(): ResourceMetaData;
/**
* Determine whether a given resource is "soft-deleted".
*/
isSoftDeleted(): boolean;
/**
* Get the resource name fo events.
*/
resourceName(): string;
}
export {};