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 7df9adc..cd5bbb3 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" )