import { Model, Page, PartialModelObject, ForClassMethod, AnyQueryBuilder } from "objection"; const DELETED_COLUMN_NAME = 'deleted_at'; const buildQueryBuidlerForClass = (): ForClassMethod => { return (modelClass) => { const qb: AnyQueryBuilder = Model.QueryBuilder.forClass.call(ExtendedQueryBuilder, modelClass); qb.onBuild((builder) => { if (!builder.context().withSoftDeleted) { builder.whereNull(`${qb.modelClass().tableName}.${DELETED_COLUMN_NAME}`); } }); return qb; }; }; class ExtendedQueryBuilder extends Model.QueryBuilder { ArrayQueryBuilderType!: ExtendedQueryBuilder; SingleQueryBuilderType!: ExtendedQueryBuilder; MaybeSingleQueryBuilderType!: ExtendedQueryBuilder; NumberQueryBuilderType!: ExtendedQueryBuilder; PageQueryBuilderType!: ExtendedQueryBuilder>; static forClass: ForClassMethod = buildQueryBuidlerForClass(); delete() { return this.patch({ [DELETED_COLUMN_NAME]: (new Date()).toISOString(), } as unknown as PartialModelObject); } hardDelete() { return super.delete(); } restore() { return this.patch({ [DELETED_COLUMN_NAME]: null, } as unknown as PartialModelObject); } } export default ExtendedQueryBuilder;