-- ============================================================================ -- Add Notifications Table -- Migration for notification system supporting negative flow alerts -- ============================================================================ -- Create notification type enum CREATE TYPE notification_type AS ENUM ('NEGATIVE_FLOW', 'SYSTEM_ALERT', 'MAINTENANCE'); -- ============================================================================ -- TABLE: notifications -- ============================================================================ CREATE TABLE notifications ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, meter_id UUID REFERENCES meters(id) ON DELETE SET NULL, notification_type notification_type NOT NULL DEFAULT 'NEGATIVE_FLOW', title VARCHAR(255) NOT NULL, message TEXT NOT NULL, meter_serial_number VARCHAR(255), flow_value DECIMAL(12, 4), is_read BOOLEAN NOT NULL DEFAULT FALSE, read_at TIMESTAMP WITH TIME ZONE, created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP ); -- Indexes for performance CREATE INDEX idx_notifications_user_id ON notifications(user_id); CREATE INDEX idx_notifications_meter_id ON notifications(meter_id); CREATE INDEX idx_notifications_is_read ON notifications(is_read); CREATE INDEX idx_notifications_created_at ON notifications(created_at DESC); CREATE INDEX idx_notifications_user_unread ON notifications(user_id, is_read) WHERE is_read = FALSE; COMMENT ON TABLE notifications IS 'User notifications for meter alerts and system events'; COMMENT ON COLUMN notifications.user_id IS 'User who receives this notification'; COMMENT ON COLUMN notifications.meter_id IS 'Related meter (nullable if meter is deleted)'; COMMENT ON COLUMN notifications.notification_type IS 'Type of notification'; COMMENT ON COLUMN notifications.flow_value IS 'Flow value if negative flow alert'; COMMENT ON COLUMN notifications.is_read IS 'Whether notification has been read by user'; COMMENT ON COLUMN notifications.read_at IS 'Timestamp when notification was marked as read';