feat: Implement multi-tenancy with organization ID in LMS tables and middleware, refactor web API calls, and update analytics and gamification features."
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
-- Migration: Update Analytics Functions for Multi-Tenancy
|
||||
-- Scope: fn_get_cohort_analytics, fn_get_retention_data
|
||||
|
||||
-- 1. Update Course Cohort Analytics to include p_organization_id
|
||||
CREATE OR REPLACE FUNCTION fn_get_cohort_analytics(p_course_id UUID, p_organization_id UUID)
|
||||
RETURNS TABLE (
|
||||
period TEXT,
|
||||
student_count BIGINT,
|
||||
completion_rate FLOAT4
|
||||
) AS $$
|
||||
BEGIN
|
||||
RETURN QUERY
|
||||
WITH cohort_students AS (
|
||||
SELECT
|
||||
user_id,
|
||||
TO_CHAR(enrolled_at, 'YYYY-MM') as v_period
|
||||
FROM enrollments
|
||||
WHERE course_id = p_course_id AND organization_id = p_organization_id
|
||||
),
|
||||
course_lesson_count AS (
|
||||
SELECT COUNT(*)::float4 as total_lessons
|
||||
FROM lessons
|
||||
WHERE module_id IN (SELECT id FROM modules WHERE course_id = p_course_id AND organization_id = p_organization_id)
|
||||
AND organization_id = p_organization_id
|
||||
)
|
||||
SELECT
|
||||
cs.v_period as period,
|
||||
COUNT(DISTINCT cs.user_id) as student_count,
|
||||
COALESCE(AVG(
|
||||
(SELECT COUNT(DISTINCT lesson_id)::float4 FROM user_grades WHERE user_id = cs.user_id AND course_id = p_course_id AND organization_id = p_organization_id) /
|
||||
NULLIF((SELECT total_lessons FROM course_lesson_count), 0)
|
||||
), 0)::float4 as completion_rate
|
||||
FROM cohort_students cs
|
||||
GROUP BY cs.v_period
|
||||
ORDER BY cs.v_period DESC;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- 2. Update Retention Data Function to include p_organization_id
|
||||
CREATE OR REPLACE FUNCTION fn_get_retention_data(p_course_id UUID, p_organization_id UUID)
|
||||
RETURNS TABLE (
|
||||
lesson_id UUID,
|
||||
lesson_title VARCHAR,
|
||||
student_count BIGINT
|
||||
) AS $$
|
||||
BEGIN
|
||||
RETURN QUERY
|
||||
SELECT
|
||||
l.id as lesson_id,
|
||||
l.title as lesson_title,
|
||||
COUNT(DISTINCT ug.user_id) as student_count
|
||||
FROM lessons l
|
||||
LEFT JOIN user_grades ug ON l.id = ug.lesson_id AND ug.organization_id = p_organization_id
|
||||
WHERE l.module_id IN (SELECT id FROM modules WHERE course_id = p_course_id AND organization_id = p_organization_id)
|
||||
AND l.organization_id = p_organization_id
|
||||
GROUP BY l.id, l.title, l.position
|
||||
ORDER BY l.position;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
Reference in New Issue
Block a user