40 lines
2.1 KiB
SQL
40 lines
2.1 KiB
SQL
-- ============================================================================
|
|
-- 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';
|