79 lines
2.2 KiB
SQL
79 lines
2.2 KiB
SQL
-- name: StartSubCourseProgress :one
|
|
INSERT INTO user_sub_course_progress (user_id, sub_course_id)
|
|
VALUES ($1, $2)
|
|
ON CONFLICT (user_id, sub_course_id) DO NOTHING
|
|
RETURNING *;
|
|
|
|
-- name: UpdateSubCourseProgress :exec
|
|
UPDATE user_sub_course_progress
|
|
SET
|
|
progress_percentage = $1,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE user_id = $2 AND sub_course_id = $3;
|
|
|
|
-- name: CompleteSubCourse :exec
|
|
UPDATE user_sub_course_progress
|
|
SET
|
|
status = 'COMPLETED',
|
|
progress_percentage = 100,
|
|
completed_at = CURRENT_TIMESTAMP,
|
|
updated_at = CURRENT_TIMESTAMP
|
|
WHERE user_id = $1 AND sub_course_id = $2;
|
|
|
|
-- name: GetUserSubCourseProgress :one
|
|
SELECT * FROM user_sub_course_progress
|
|
WHERE user_id = $1 AND sub_course_id = $2;
|
|
|
|
-- name: GetUserCourseProgress :many
|
|
SELECT
|
|
usp.id,
|
|
usp.user_id,
|
|
usp.sub_course_id,
|
|
usp.status,
|
|
usp.progress_percentage,
|
|
usp.started_at,
|
|
usp.completed_at,
|
|
usp.created_at,
|
|
usp.updated_at,
|
|
sc.title AS sub_course_title,
|
|
sc.level AS sub_course_level,
|
|
sc.display_order AS sub_course_display_order
|
|
FROM user_sub_course_progress usp
|
|
JOIN sub_courses sc ON sc.id = usp.sub_course_id
|
|
WHERE usp.user_id = $1 AND sc.course_id = $2
|
|
ORDER BY sc.display_order;
|
|
|
|
-- name: GetSubCoursesWithProgressByCourse :many
|
|
SELECT
|
|
sc.id AS sub_course_id,
|
|
sc.title,
|
|
sc.description,
|
|
sc.thumbnail,
|
|
sc.display_order,
|
|
sc.level,
|
|
sc.is_active,
|
|
COALESCE(usp.status, 'NOT_STARTED') AS progress_status,
|
|
COALESCE(usp.progress_percentage, 0)::smallint AS progress_percentage,
|
|
usp.started_at,
|
|
usp.completed_at,
|
|
(SELECT COUNT(*)::bigint
|
|
FROM sub_course_prerequisites p
|
|
WHERE p.sub_course_id = sc.id
|
|
AND p.prerequisite_sub_course_id NOT IN (
|
|
SELECT usp2.sub_course_id
|
|
FROM user_sub_course_progress usp2
|
|
WHERE usp2.user_id = $1
|
|
AND usp2.status = 'COMPLETED'
|
|
)
|
|
) AS unmet_prerequisites_count
|
|
FROM sub_courses sc
|
|
LEFT JOIN user_sub_course_progress usp
|
|
ON usp.sub_course_id = sc.id AND usp.user_id = $1
|
|
WHERE sc.course_id = $2
|
|
AND sc.is_active = true
|
|
ORDER BY sc.display_order;
|
|
|
|
-- name: DeleteUserSubCourseProgress :exec
|
|
DELETE FROM user_sub_course_progress
|
|
WHERE user_id = $1 AND sub_course_id = $2;
|