Skip to content

Commit a358ee8

Browse files
committed
Endpoints seem to work now
1 parent 7853890 commit a358ee8

File tree

10 files changed

+114
-37
lines changed

10 files changed

+114
-37
lines changed

common/src/errors/validate_err_error.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@ use thiserror::Error;
33

44
#[derive(Clone, Hash, Debug, Serialize, Deserialize, Error)]
55
pub enum ValidateErrError {
6-
#[error("invalid task")]
7-
InvalidTask,
6+
#[error("invalid assignment")]
7+
InvalidAssignment,
88
#[error("provided assignments needed value out of bounds")]
99
AssignmentsNeededOutOfBounds,
1010
#[error("canonical result already set")]
1111
CanonicalResultExists,
12+
#[error("provided assignmennts belong to multiple tasks")]
13+
AssignmentTaskRelationshipError,
14+
#[error("provided inconclusive assignments belong to different tasks than the error assignments")]
15+
RequestAssignmentsRelationshipError,
1216
}

common/src/errors/validate_ok_error.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ pub enum ValidateOkError {
77
InvalidAssignment,
88
#[error("canonical result already set")]
99
CanonicalResultExists,
10-
#[error("provided results belong to multiple tasks")]
11-
ResultTaskRelationshipInconsistent,
10+
#[error("provided assignments belong to multiple tasks")]
11+
AssignmentTaskRelationshipError,
1212
#[error("result count does not equal quorum")]
1313
ResultCountQuorumNotEqual,
1414
#[error("assignments which have been canceled cannot be validated")]
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
use serde::{Deserialize, Serialize};
22

3-
use crate::types::Assignment;
3+
use crate::{id::Id, types::Assignment};
44

55
#[derive(Clone, Hash, Debug, Serialize, Deserialize)]
66
pub struct ValidateErrRequest {
77
pub assignments_needed: i32,
8-
pub assignments_error: Vec<Assignment>,
9-
pub assignments_inconclusive: Vec<Assignment>,
8+
pub assignments_error: Vec<Id<Assignment>>,
9+
pub assignments_inconclusive: Vec<Id<Assignment>>,
1010
}

server/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ async fn main() {
6868
.route("/fetch_tasks", post(fetch_tasks::fetch_tasks))
6969
.route("/submit_result/{id}", post(submit_result::submit_result))
7070
.route("/validate_fetch", post(validate_fetch::validate_fetch))
71-
.route("/validate_ok/{id}", post(validate_ok::validate_ok))
72-
.route("/validate_err/{id}", post(validate_err::validate_err))
71+
.route("/validate_ok", post(validate_ok::validate_ok))
72+
.route("/validate_err", post(validate_err::validate_err))
7373
.with_state(state);
7474

7575
let listener = TcpListener::bind(address).await.unwrap();

server/src/result.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ impl Status for ValidateOkError {
6363
Self::CanonicalResultExists => StatusCode::BAD_REQUEST,
6464
Self::AssignmentCanceledError => StatusCode::BAD_REQUEST,
6565
Self::ResultCountQuorumNotEqual => StatusCode::BAD_REQUEST,
66-
Self::ResultTaskRelationshipInconsistent => StatusCode::BAD_REQUEST,
66+
Self::AssignmentTaskRelationshipError => StatusCode::BAD_REQUEST,
6767
}
6868
}
6969
}
@@ -72,8 +72,10 @@ impl Status for ValidateErrError {
7272
fn status(&self) -> StatusCode {
7373
match self {
7474
Self::AssignmentsNeededOutOfBounds => StatusCode::BAD_REQUEST,
75-
Self::InvalidTask => StatusCode::NOT_FOUND,
75+
Self::InvalidAssignment => StatusCode::NOT_FOUND,
7676
Self::CanonicalResultExists => StatusCode::BAD_REQUEST,
77+
Self::AssignmentTaskRelationshipError => StatusCode::BAD_REQUEST,
78+
Self::RequestAssignmentsRelationshipError => StatusCode::BAD_REQUEST
7779
}
7880
}
7981
}
@@ -152,7 +154,7 @@ impl From<sqlx::Error> for AppError<ValidateOkError> {
152154
impl From<sqlx::Error> for AppError<ValidateErrError> {
153155
fn from(err: sqlx::Error) -> Self {
154156
match err {
155-
sqlx::Error::RowNotFound => Self::Specific(ValidateErrError::InvalidTask),
157+
sqlx::Error::RowNotFound => Self::Specific(ValidateErrError::InvalidAssignment),
156158
_ => Self::Generic,
157159
}
158160
}

server/src/routes/submit_result.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ pub async fn submit_result(
1818
Json(request): Json<SubmitResultRequest>,
1919
) -> AppResult<(), SubmitResultError> {
2020
// TODO: fix race condition: assignment could get canceled before result is inserted
21-
println!("Test");
22-
let assignment_query = sqlx::query_scalar_unchecked!(
21+
22+
let assignment_id = sqlx::query_scalar_unchecked!(
2323
r#"
2424
SELECT
2525
id "id: Id<Assignment>"
@@ -60,6 +60,6 @@ pub async fn submit_result(
6060
)
6161
.execute(&state.pool)
6262
.await?;
63-
println!("Test4");
63+
6464
Ok(())
6565
}

server/src/routes/validate_err.rs

Lines changed: 88 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,90 @@ use crate::{
1818

1919
pub 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
}

server/src/routes/validate_fetch.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ pub async fn validate_fetch(
4747
"#,
4848
request.project_ids,
4949
)
50-
.fetch_optional(&state.pool)
50+
.fetch_all(&state.pool)
5151
.await?;
5252

5353
Ok(Json(task.into_iter().collect()))

server/src/routes/validate_ok.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ pub async fn validate_ok(
2525
)
2626
.fetch_all(&state.pool)
2727
.await?;
28-
28+
println!("Request: {}\t db: {}", request.assignment_ids.len(), assignments.len());
2929
if assignments.len() != request.assignment_ids.len() {
3030
Err(ValidateOkError::InvalidAssignment)?;
3131
}
@@ -35,7 +35,7 @@ pub async fn validate_ok(
3535
task_ids.dedup();
3636

3737
if task_ids.len() > 1 || task_ids.is_empty() {
38-
Err(ValidateOkError::ResultTaskRelationshipInconsistent)?;
38+
Err(ValidateOkError::AssignmentTaskRelationshipError)?;
3939
}
4040

4141
let task = Task::select_one(task_ids[0]).fetch_one(&state.pool).await?;
@@ -95,10 +95,10 @@ pub async fn validate_ok(
9595
LEFT JOIN results r
9696
ON r.assignment_id = a.id
9797
WHERE
98-
a.id <> ANY($1)
98+
a.state != $1
9999
AND task_id = $2
100100
"#,
101-
request.assignment_ids,
101+
AssignmentState::Valid,
102102
task.id
103103
)
104104
.fetch_all(&state.pool)

server/src/util/set_assignment_state.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,5 @@ pub async fn set_assignment_state(
2525
)
2626
.execute(&state.pool)
2727
.await?;
28-
println!("test2");
2928
Ok(())
3029
}

0 commit comments

Comments
 (0)