It might have been the late hour but spent over 1.5h chasing this the other day... and getting tangled up in config and softdelete2 feathers-plus hooks.

Turns out to setup soft deletes in FeathersJS using feathers-sequelize you only need the Sequelize built in paranoid option.

Here's the example that makes it clear.

sequelizeClient.define('exampleTable', {
	id: {
		type: DataTypes.BIGINT(20).UNSIGNED,
		primaryKey: true,
		autoIncrement: true,
	},
	...
}, {
	tableName: 'example_table',
	paranoid: true,
	deletedAt: 'deleted_at'
});

In essence:

  • no need to define a field for deleted_at
  • add the paranoid: true option to your sequelize model
  • add the field name deletedAt: 'deleted_at' option to your sequelize model (if using alt name)
  • sequelize model option timestamps: true should be set, though it is the default, so you likely won't need to declare it

If you need a query that includes the soft deleted items set paranoid: false in a hook.

context => {
	context.params.sequelize = {paranoid: false};
}

Any includes will need their paranoid flag set:

context => {
	context.params.sequelize = {
		include: [{
			model: SomeModel,
			paranoid: false
		}], 
		paranoid: false
	};
}