import { Model } from 'objection'; const DELETED_COLUMN_NAME = 'deleted_at'; const supportsSoftDeletion = (modelClass) => { return modelClass.jsonSchema.properties.deletedAt; }; const buildQueryBuidlerForClass = () => { return (modelClass) => { const qb = Model.QueryBuilder.forClass.call( ExtendedQueryBuilder, modelClass ); qb.onBuild((builder) => { if ( !builder.context().withSoftDeleted && supportsSoftDeletion(qb.modelClass()) ) { builder.whereNull( `${qb.modelClass().tableName}.${DELETED_COLUMN_NAME}` ); } }); return qb; }; }; class ExtendedQueryBuilder extends Model.QueryBuilder { static forClass = buildQueryBuidlerForClass(); delete() { if (supportsSoftDeletion(this.modelClass())) { return this.patch({ [DELETED_COLUMN_NAME]: new Date().toISOString(), }); } return super.delete(); } hardDelete() { return super.delete(); } withSoftDeleted() { this.context().withSoftDeleted = true; return this; } restore() { return this.patch({ [DELETED_COLUMN_NAME]: null, }); } } export default ExtendedQueryBuilder;