59 lines
1.2 KiB
JavaScript
59 lines
1.2 KiB
JavaScript
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;
|