From 27fe519958724503d8cd73a71c76440677fd72c8 Mon Sep 17 00:00:00 2001
From: OXYgen <ra-egorrych@yandex.ru>
Date: Wed, 2 Apr 2025 21:52:21 +0500
Subject: [PATCH] Added solved_count to listproblems endpoint

---
 internal/models/problem.go                     |  1 +
 internal/tester/delivery/rest/handlers.go      |  1 +
 .../repository/pg_problems_repository.go       | 18 +++++++++++++++---
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/internal/models/problem.go b/internal/models/problem.go
index 930aa58..aad030d 100644
--- a/internal/models/problem.go
+++ b/internal/models/problem.go
@@ -32,6 +32,7 @@ type ProblemsListItem struct {
 	TimeLimit   int32     `db:"time_limit"`
 	CreatedAt   time.Time `db:"created_at"`
 	UpdatedAt   time.Time `db:"updated_at"`
+	SolvedCount int32     `db:"solved_count"`
 }
 
 type ProblemsList struct {
diff --git a/internal/tester/delivery/rest/handlers.go b/internal/tester/delivery/rest/handlers.go
index ec796ab..1736d70 100644
--- a/internal/tester/delivery/rest/handlers.go
+++ b/internal/tester/delivery/rest/handlers.go
@@ -467,6 +467,7 @@ func PLI2PLI(p models.ProblemsListItem) testerv1.ProblemsListItem {
 		TimeLimit:   p.TimeLimit,
 		CreatedAt:   p.CreatedAt,
 		UpdatedAt:   p.UpdatedAt,
+		SolvedCount: p.SolvedCount,
 	}
 }
 
diff --git a/internal/tester/repository/pg_problems_repository.go b/internal/tester/repository/pg_problems_repository.go
index a5dc3c1..fa007da 100644
--- a/internal/tester/repository/pg_problems_repository.go
+++ b/internal/tester/repository/pg_problems_repository.go
@@ -82,9 +82,21 @@ func (r *ProblemRepository) DeleteProblem(ctx context.Context, q tester.Querier,
 }
 
 const (
-	ListProblemsQuery = `SELECT id, title, time_limit, memory_limit, created_at, updated_at
-FROM problems
-LIMIT ? OFFSET ?`
+	ListProblemsQuery = `
+		SELECT 
+    p.id,p.title,p.memory_limit,p.time_limit,p.created_at,p.updated_at,
+    COALESCE(solved_count, 0) AS solved_count
+	FROM problems p
+	LEFT JOIN (
+		SELECT 
+			t.problem_id,
+			COUNT(DISTINCT s.participant_id) AS solved_count
+		FROM solutions s
+		JOIN tasks t ON s.task_id = t.id
+		WHERE s.state = 5 
+		GROUP BY t.problem_id
+	) sol ON p.id = sol.problem_id
+	LIMIT ? OFFSET ?`
 	CountProblemsQuery = "SELECT COUNT(*) FROM problems"
 )