46 lines
1.8 KiB
SQL
46 lines
1.8 KiB
SQL
-- Add user groups feature
|
|
-- Groups table
|
|
CREATE TABLE IF NOT EXISTS groups (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name VARCHAR(255) NOT NULL UNIQUE,
|
|
description TEXT,
|
|
is_system BOOLEAN NOT NULL DEFAULT false,
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- User groups junction table
|
|
CREATE TABLE IF NOT EXISTS user_groups (
|
|
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
group_id UUID NOT NULL REFERENCES groups(id) ON DELETE CASCADE,
|
|
assigned_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
assigned_by UUID REFERENCES users(id),
|
|
PRIMARY KEY (user_id, group_id)
|
|
);
|
|
|
|
-- Group roles junction table (groups can have roles)
|
|
CREATE TABLE IF NOT EXISTS group_roles (
|
|
group_id UUID NOT NULL REFERENCES groups(id) ON DELETE CASCADE,
|
|
role_id UUID NOT NULL REFERENCES roles(id) ON DELETE CASCADE,
|
|
granted_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
PRIMARY KEY (group_id, role_id)
|
|
);
|
|
|
|
-- Indexes
|
|
CREATE INDEX IF NOT EXISTS idx_groups_name ON groups(name);
|
|
CREATE INDEX IF NOT EXISTS idx_user_groups_user_id ON user_groups(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_user_groups_group_id ON user_groups(group_id);
|
|
CREATE INDEX IF NOT EXISTS idx_group_roles_group_id ON group_roles(group_id);
|
|
CREATE INDEX IF NOT EXISTS idx_group_roles_role_id ON group_roles(role_id);
|
|
|
|
-- Insert default system groups
|
|
INSERT INTO groups (name, description, is_system) VALUES
|
|
('wheel', 'System administrators group', true),
|
|
('operators', 'System operators group', true),
|
|
('backup', 'Backup operators group', true),
|
|
('auditors', 'Auditors group', true),
|
|
('storage_admins', 'Storage administrators group', true),
|
|
('services', 'Service accounts group', true)
|
|
ON CONFLICT (name) DO NOTHING;
|
|
|