refacto: add build and cleanup file structure

This commit is contained in:
2026-02-20 01:32:08 +01:00
parent 6adc62f9ec
commit d80b9f387b
31 changed files with 2234 additions and 2235 deletions
+82
View File
@@ -0,0 +1,82 @@
-- =============================================================================
-- VALIDATION FUNCTIONS
-- =============================================================================
-- Check if role assignment would violate Separation of Duty
CREATE OR REPLACE FUNCTION morbac.check_sod_violation(
p_user_id UUID,
p_role_id UUID,
p_org_id UUID
)
RETURNS BOOLEAN
LANGUAGE plpgsql
STABLE
AS $$
DECLARE
v_conflict_exists BOOLEAN;
BEGIN
-- Check if user already has a conflicting role
SELECT EXISTS (
SELECT 1
FROM morbac.user_roles ur
INNER JOIN morbac.sod_conflicts sod ON (
(sod.role_a_id = ur.role_id AND sod.role_b_id = p_role_id)
OR (sod.role_b_id = ur.role_id AND sod.role_a_id = p_role_id)
)
WHERE ur.user_id = p_user_id
AND ur.org_id = p_org_id
AND sod.org_id = p_org_id
) INTO v_conflict_exists;
RETURN v_conflict_exists;
END;
$$;
COMMENT ON FUNCTION morbac.check_sod_violation(UUID, UUID, UUID) IS
'Returns true if assigning role would violate Separation of Duty constraints';
-- Check if role assignment would violate cardinality constraints
CREATE OR REPLACE FUNCTION morbac.check_cardinality_violation(
p_role_id UUID,
p_adding BOOLEAN DEFAULT TRUE
)
RETURNS TEXT
LANGUAGE plpgsql
STABLE
AS $$
DECLARE
v_current_count INTEGER;
v_min_users INTEGER;
v_max_users INTEGER;
BEGIN
-- Get current user count and constraints
SELECT
COUNT(DISTINCT ur.user_id),
rc.min_users,
rc.max_users
INTO v_current_count, v_min_users, v_max_users
FROM morbac.user_roles ur
LEFT JOIN morbac.role_cardinality rc ON rc.role_id = ur.role_id
WHERE ur.role_id = p_role_id
GROUP BY rc.min_users, rc.max_users;
-- Check max constraint when adding
IF p_adding AND v_max_users IS NOT NULL THEN
IF v_current_count >= v_max_users THEN
RETURN format('Maximum users (%s) reached for role', v_max_users);
END IF;
END IF;
-- Check min constraint when removing
IF NOT p_adding AND v_min_users IS NOT NULL THEN
IF v_current_count <= v_min_users THEN
RETURN format('Minimum users (%s) required for role', v_min_users);
END IF;
END IF;
RETURN NULL; -- No violation
END;
$$;
COMMENT ON FUNCTION morbac.check_cardinality_violation(UUID, BOOLEAN) IS
'Returns error message if cardinality constraint would be violated, NULL otherwise';