tududi/backend/migrations/20251125000001-add-notification-features.js
Chris 18c7785b13
Feat notifications (#594)
* Add notifications for deferred and due tasks

* Cleanup

* fixup! Cleanup

* Add notifications settings

* ADd dismissed for notifications

* Beautify project cards

* fixup! Beautify project cards

* Fix an issue with icon badge

* Cleanup scripts

* fixup! Cleanup scripts
2025-11-25 21:16:21 +02:00

94 lines
2.9 KiB
JavaScript

'use strict';
const {
safeAddColumns,
safeAddIndex,
safeRemoveColumn,
} = require('../utils/migration-utils');
module.exports = {
async up(queryInterface, Sequelize) {
// Add notification_preferences to users table
await safeAddColumns(queryInterface, 'users', [
{
name: 'notification_preferences',
definition: {
type: Sequelize.JSON,
allowNull: true,
defaultValue: {
dueTasks: { inApp: true, email: false, push: false },
overdueTasks: {
inApp: true,
email: false,
push: false,
},
dueProjects: { inApp: true, email: false, push: false },
overdueProjects: {
inApp: true,
email: false,
push: false,
},
deferUntil: { inApp: true, email: false, push: false },
},
comment:
'User notification channel preferences for different notification types',
},
},
]);
// Add dismissed_at to notifications table
await safeAddColumns(queryInterface, 'notifications', [
{
name: 'dismissed_at',
definition: {
type: Sequelize.DATE,
allowNull: true,
defaultValue: null,
},
},
]);
// Add indexes for better query performance
await safeAddIndex(queryInterface, 'notifications', ['dismissed_at'], {
name: 'notifications_dismissed_at_idx',
});
await safeAddIndex(
queryInterface,
'notifications',
['user_id', 'dismissed_at'],
{
name: 'notifications_user_dismissed_idx',
}
);
},
async down(queryInterface, Sequelize) {
// Remove indexes first
try {
await queryInterface.removeIndex(
'notifications',
'notifications_user_dismissed_idx'
);
} catch (error) {
console.log('Index notifications_user_dismissed_idx not found');
}
try {
await queryInterface.removeIndex(
'notifications',
'notifications_dismissed_at_idx'
);
} catch (error) {
console.log('Index notifications_dismissed_at_idx not found');
}
// Remove columns
await safeRemoveColumn(queryInterface, 'notifications', 'dismissed_at');
await safeRemoveColumn(
queryInterface,
'users',
'notification_preferences'
);
},
};