wulf-pulse/migrations/010_create_rmm_site_mappings.sql

65 lines
2.7 KiB
MySQL
Raw Permalink Normal View History

-- Migration: Create RMM Site Mappings Table
-- Purpose: Support mapping multiple RMM sites to a single PSA company
-- Date: 2024-11-05
-- Create the RMM site mappings table
CREATE TABLE IF NOT EXISTS rmm_site_mappings (
id SERIAL PRIMARY KEY,
company_id INTEGER NOT NULL REFERENCES companies(id) ON DELETE CASCADE,
rmm_site_uid VARCHAR(255) NOT NULL,
rmm_site_name VARCHAR(255) NOT NULL,
is_primary BOOLEAN DEFAULT false,
device_count INTEGER DEFAULT 0, -- Cache device count for performance
notes TEXT,
last_sync_at TIMESTAMP,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_by VARCHAR(255),
UNIQUE(company_id, rmm_site_uid)
);
-- Create indexes for better query performance
CREATE INDEX idx_rmm_site_mappings_company ON rmm_site_mappings(company_id);
CREATE INDEX idx_rmm_site_mappings_site_uid ON rmm_site_mappings(rmm_site_uid);
CREATE INDEX idx_rmm_site_mappings_is_primary ON rmm_site_mappings(is_primary) WHERE is_primary = true;
-- Add comments for documentation
COMMENT ON TABLE rmm_site_mappings IS 'Maps RMM sites to PSA companies, supporting multiple sites per company';
COMMENT ON COLUMN rmm_site_mappings.company_id IS 'Foreign key to companies table';
COMMENT ON COLUMN rmm_site_mappings.rmm_site_uid IS 'Unique identifier from RMM system';
COMMENT ON COLUMN rmm_site_mappings.rmm_site_name IS 'Display name of the RMM site';
COMMENT ON COLUMN rmm_site_mappings.is_primary IS 'Indicates if this is the primary site for the company';
COMMENT ON COLUMN rmm_site_mappings.device_count IS 'Cached count of devices in this site';
COMMENT ON COLUMN rmm_site_mappings.notes IS 'Optional notes about the site mapping';
COMMENT ON COLUMN rmm_site_mappings.last_sync_at IS 'Timestamp of last successful device sync';
COMMENT ON COLUMN rmm_site_mappings.created_by IS 'User who created the mapping';
-- Create trigger to update the updated_at timestamp
CREATE OR REPLACE FUNCTION update_rmm_site_mappings_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER update_rmm_site_mappings_updated_at
BEFORE UPDATE ON rmm_site_mappings
FOR EACH ROW
EXECUTE FUNCTION update_rmm_site_mappings_updated_at();
-- Create a view for easier querying with company names
CREATE OR REPLACE VIEW rmm_site_mappings_view AS
SELECT
rsm.*,
c.company_name,
c.company_number,
c.is_active AS company_is_active
FROM rmm_site_mappings rsm
JOIN companies c ON c.id = rsm.company_id;
-- Grant permissions (adjust as needed for your setup)
GRANT SELECT, INSERT, UPDATE, DELETE ON rmm_site_mappings TO PUBLIC;
GRANT SELECT ON rmm_site_mappings_view TO PUBLIC;
GRANT USAGE, SELECT ON SEQUENCE rmm_site_mappings_id_seq TO PUBLIC;