add role based permissions
This commit is contained in:
@@ -0,0 +1,15 @@
|
||||
-- Rollback modules and permissions update
|
||||
|
||||
-- Remove the new structured permissions
|
||||
DELETE FROM permissions WHERE code LIKE '%_READ' OR code LIKE '%_WRITE' OR code LIKE '%_CREATE' OR code LIKE '%_DELETE';
|
||||
|
||||
-- Drop indexes
|
||||
DROP INDEX IF EXISTS idx_permissions_module_id;
|
||||
|
||||
-- Remove columns from permissions table
|
||||
ALTER TABLE permissions
|
||||
DROP COLUMN IF EXISTS module_id,
|
||||
DROP COLUMN IF EXISTS action;
|
||||
|
||||
-- Drop modules table
|
||||
DROP TABLE IF EXISTS modules CASCADE;
|
||||
@@ -0,0 +1,65 @@
|
||||
-- Add modules table and update permissions structure
|
||||
|
||||
-- Create modules table
|
||||
CREATE TABLE IF NOT EXISTS modules (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
name TEXT NOT NULL,
|
||||
code TEXT UNIQUE NOT NULL,
|
||||
created_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||||
);
|
||||
|
||||
CREATE TRIGGER trg_modules_updated_at
|
||||
BEFORE UPDATE ON modules
|
||||
FOR EACH ROW EXECUTE FUNCTION set_updated_at();
|
||||
|
||||
-- Add module_id and action columns to permissions table
|
||||
ALTER TABLE permissions
|
||||
ADD COLUMN IF NOT EXISTS module_id UUID REFERENCES modules(id) ON DELETE CASCADE,
|
||||
ADD COLUMN IF NOT EXISTS action TEXT;
|
||||
|
||||
-- Create index on module_id for better query performance
|
||||
CREATE INDEX IF NOT EXISTS idx_permissions_module_id ON permissions(module_id);
|
||||
|
||||
-- Seed initial modules
|
||||
INSERT INTO modules (name, code) VALUES
|
||||
('User Management', 'USER_MANAGEMENT'),
|
||||
('Content Management', 'CONTENT_MANAGEMENT'),
|
||||
('Letter Management', 'LETTER_MANAGEMENT'),
|
||||
('Disposition Management', 'DISPOSITION_MANAGEMENT'),
|
||||
('Reporting', 'REPORTING'),
|
||||
('Settings', 'SETTINGS')
|
||||
ON CONFLICT (code) DO NOTHING;
|
||||
|
||||
-- Update existing permissions to include module_id and action
|
||||
-- This is a sample mapping - adjust based on your existing permission codes
|
||||
UPDATE permissions SET
|
||||
module_id = (SELECT id FROM modules WHERE code = 'LETTER_MANAGEMENT'),
|
||||
action = 'READ'
|
||||
WHERE code LIKE 'letter.%' AND code LIKE '%.view';
|
||||
|
||||
UPDATE permissions SET
|
||||
module_id = (SELECT id FROM modules WHERE code = 'LETTER_MANAGEMENT'),
|
||||
action = 'WRITE'
|
||||
WHERE code LIKE 'letter.%' AND code LIKE '%.edit';
|
||||
|
||||
UPDATE permissions SET
|
||||
module_id = (SELECT id FROM modules WHERE code = 'LETTER_MANAGEMENT'),
|
||||
action = 'CREATE'
|
||||
WHERE code LIKE 'letter.%' AND code LIKE '%.create';
|
||||
|
||||
UPDATE permissions SET
|
||||
module_id = (SELECT id FROM modules WHERE code = 'LETTER_MANAGEMENT'),
|
||||
action = 'DELETE'
|
||||
WHERE code LIKE 'letter.%' AND code LIKE '%.delete';
|
||||
|
||||
-- Insert new structured permissions for each module
|
||||
INSERT INTO permissions (module_id, action, code, description)
|
||||
SELECT
|
||||
m.id,
|
||||
a.action,
|
||||
CONCAT(m.code, '_', a.action),
|
||||
CONCAT('Can ', LOWER(a.action), ' ', LOWER(m.name))
|
||||
FROM modules m
|
||||
CROSS JOIN (VALUES ('READ'), ('WRITE'), ('CREATE'), ('DELETE')) AS a(action)
|
||||
ON CONFLICT (code) DO NOTHING;
|
||||
Reference in New Issue
Block a user