@@ -18,20 +18,90 @@ use crate::{
1818
1919pub async fn validate_err (
2020 State ( state) : State < AppState > ,
21- Path ( task_id) : Path < Id < Task > > ,
2221 Json ( request) : Json < ValidateErrRequest > ,
2322) -> AppResult < ( ) , ValidateErrError > {
24- let task = Task :: select_one ( task_id) . fetch_one ( & state. pool ) . await ?;
2523
26- if task. canonical_result_id . is_some ( ) {
24+ let assignments_error = sqlx:: query_as_unchecked!(
25+ Assignment ,
26+ r#"
27+ SELECT
28+ *
29+ FROM
30+ assignments
31+ WHERE
32+ id = ANY($1)
33+ "# ,
34+ request. assignments_error
35+ )
36+ . fetch_all ( & state. pool )
37+ . await ?;
38+
39+
40+ let assignments_inconclusive = sqlx:: query_as_unchecked!(
41+ Assignment ,
42+ r#"
43+ SELECT
44+ *
45+ FROM
46+ assignments
47+ WHERE
48+ id = ANY($1)
49+ "# ,
50+ request. assignments_inconclusive
51+ )
52+ . fetch_all ( & state. pool )
53+ . await ?;
54+
55+ if assignments_inconclusive. len ( ) != request. assignments_inconclusive . len ( ) || assignments_error. len ( ) != request. assignments_error . len ( ) {
56+ Err ( ValidateErrError :: InvalidAssignment ) ?;
57+ }
58+
59+ let mut task_error_ids = Vec :: from_iter ( assignments_error. into_iter ( ) . map ( |assignment| assignment. task_id ) ) ;
60+ task_error_ids. sort ( ) ;
61+ task_error_ids. dedup ( ) ;
62+
63+ let mut task_inconclusive_ids = Vec :: from_iter ( assignments_inconclusive. into_iter ( ) . map ( |assignment| assignment. task_id ) ) ;
64+ task_inconclusive_ids. sort ( ) ;
65+ task_inconclusive_ids. dedup ( ) ;
66+
67+ if task_error_ids. len ( ) > 1 || task_inconclusive_ids. len ( ) > 1 {
68+ Err ( ValidateErrError :: AssignmentTaskRelationshipError ) ?
69+ }
70+
71+ if task_error_ids[ 0 ] != task_inconclusive_ids[ 0 ] {
72+ Err ( ValidateErrError :: RequestAssignmentsRelationshipError ) ?
73+ }
74+
75+ let task_error = Task :: select_one ( task_error_ids[ 0 ] ) . fetch_one ( & state. pool ) . await ?;
76+ let task_inconclusive = Task :: select_one ( task_inconclusive_ids[ 0 ] ) . fetch_one ( & state. pool ) . await ?;
77+
78+ if task_error. canonical_result_id . is_some ( ) || task_inconclusive. canonical_result_id . is_some ( ) {
2779 Err ( ValidateErrError :: CanonicalResultExists ) ?
2880 }
2981
30- let project = Project :: select_one ( task . project_id )
82+ let project_inconclusive = Project :: select_one ( task_inconclusive . project_id )
3183 . fetch_one ( & state. pool )
3284 . await ?;
3385
34- let result_count = sqlx:: query_scalar_unchecked!(
86+ let result_error_count = sqlx:: query_scalar_unchecked!(
87+ r#"
88+ SELECT
89+ count(1) as "count!"
90+ FROM
91+ results r
92+ JOIN assignments a
93+ ON a.id = r.assignment_id
94+ JOIN tasks t
95+ ON t.id = a.task_id
96+ WHERE
97+ t.id = $1
98+ "# ,
99+ task_error. id
100+ )
101+ . fetch_one ( & state. pool )
102+ . await ? as i32 ;
103+
104+ let result_inconclusive_count = sqlx:: query_scalar_unchecked!(
35105 r#"
36106 SELECT
37107 count(1) as "count!"
@@ -44,13 +114,13 @@ pub async fn validate_err(
44114 WHERE
45115 t.id = $1
46116 "# ,
47- task_id
117+ task_inconclusive . id
48118 )
49119 . fetch_one ( & state. pool )
50120 . await ? as i32 ;
51121
52122 if request. assignments_needed <= 0
53- || request. assignments_needed + task . assignments_needed > project . quorum + result_count
123+ || request. assignments_needed + task_inconclusive . assignments_needed > project_inconclusive . quorum + result_inconclusive_count + result_error_count
54124 {
55125 Err ( ValidateErrError :: AssignmentsNeededOutOfBounds ) ?
56126 } else {
@@ -62,23 +132,25 @@ pub async fn validate_err(
62132 WHERE
63133 id = $1
64134 "# ,
65- task_id ,
135+ task_inconclusive . id ,
66136 request. assignments_needed
67137 )
68138 . execute ( & state. pool )
69139 . await ?;
70140
71- //Set validate state
141+ //Set inconclusive validate state
72142 set_assignment_state:: set_assignment_state (
73143 & state,
74144 AssignmentState :: Inconclusive ,
75- & Vec :: from_iter (
76- Assignment :: select_all_by ( task_id)
77- . fetch_all ( & state. pool )
78- . await ?
79- . iter ( )
80- . map ( |assignment| assignment. id ) ,
81- ) ,
145+ & request. assignments_inconclusive ,
146+ )
147+ . await ?;
148+
149+ //Set invalid validate state
150+ set_assignment_state:: set_assignment_state (
151+ & state,
152+ AssignmentState :: Invalid ,
153+ & request. assignments_error ,
82154 )
83155 . await ?;
84156 }
0 commit comments