-- +goose Up -- Create roles table CREATE TABLE IF NOT EXISTS roles ( id SERIAL PRIMARY KEY, name TEXT NOT NULL UNIQUE, description TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- Create permissions table CREATE TABLE IF NOT EXISTS permissions ( id SERIAL PRIMARY KEY, name TEXT NOT NULL UNIQUE, resource TEXT NOT NULL, action TEXT NOT NULL, description TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- Create role_permissions junction table CREATE TABLE IF NOT EXISTS role_permissions ( role_id INTEGER NOT NULL REFERENCES roles(id) ON DELETE CASCADE, permission_id INTEGER NOT NULL REFERENCES permissions(id) ON DELETE CASCADE, PRIMARY KEY (role_id, permission_id) ); -- Create indexes CREATE INDEX IF NOT EXISTS idx_role_permissions_role_id ON role_permissions(role_id); CREATE INDEX IF NOT EXISTS idx_role_permissions_permission_id ON role_permissions(permission_id); -- +goose Down -- Drop role_permissions, permissions, and roles tables DROP TABLE IF EXISTS role_permissions CASCADE; DROP TABLE IF EXISTS permissions CASCADE; DROP TABLE IF EXISTS roles CASCADE;