Skip to content
This repository was archived by the owner on Oct 10, 2025. It is now read-only.

Commit 68530ef

Browse files
committed
REmove option wrap of DataId
1 parent 66f45b2 commit 68530ef

3 files changed

Lines changed: 30 additions & 27 deletions

File tree

db/ev0000.sqlite

1.32 MB
Binary file not shown.

src/changes.rs

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use crate::oc::OCheckListChange;
2020
use crate::runs::{RunChange};
2121
use crate::util::{anyhow_to_custom_error, sqlx_to_anyhow, sqlx_to_custom_error};
2222

23-
pub(crate) type DataId = Option<i64>;
23+
pub(crate) type DataId = i64;
2424

2525
pub const PENDING: &str = "Pending";
2626
const ACCEPTED: &str = "Accepted";
@@ -117,7 +117,7 @@ pub struct ChangesRecord {
117117
pub id: i64,
118118
pub source: String,
119119
pub data_type: DataType,
120-
pub data_id: DataId,
120+
pub data_id: Option<DataId>,
121121
pub data: ChangeData,
122122
pub user_id: Option<String>,
123123
// we need run_id to be able to pair changes with rows in runs table
@@ -220,32 +220,40 @@ pub async fn add_run_update_request_change(
220220
#[post("/api/event/current/changes/run-updated?<run_id>", data = "<change>")]
221221
async fn add_run_updated_change(
222222
run_id: DataId,
223-
change: Json<RunChange>,
223+
change: Json<Option<RunChange>>,
224224
api_token: QxApiToken,
225225
state: &State<SharedQxState>,
226226
db: &State<DbPool>
227227
) -> Result<(), Custom<String>> {
228228
let event = load_event_info_for_api_token(&api_token, db).await?;
229229
let run_change = change.into_inner();
230-
let data = ChangeData::RunUpdated(run_change.clone());
230+
let data = if let Some(run_change) = &run_change {
231+
ChangeData::RunUpdated(run_change.clone())
232+
} else {
233+
ChangeData::DropRecord
234+
};
231235
add_change(event.id, ChangesRecord{
232236
id: 0,
233237
source: "qe".to_string(),
234238
data_type: DataType::RunUpdated,
235-
data_id: run_id,
239+
data_id: Some(run_id),
236240
data,
237241
user_id: None,
238242
status: None,
239243
created: QxDateTime::now(),
240244
}, state).await.map_err(anyhow_to_custom_error)?;
241245
// add_change(event.id, "qe", data_type, run_id, &data, None, None, None, state).await.map_err(anyhow_to_custom_error)?;
242246
let db = get_event_db(event.id, state).await.map_err(anyhow_to_custom_error)?;
243-
apply_qe_run_change(run_id, &run_change, &db).await.map_err(anyhow_to_custom_error)?;
247+
apply_qe_run_change(run_id, run_change.as_ref(), &db).await.map_err(anyhow_to_custom_error)?;
244248
Ok(())
245249
}
246250

247-
async fn apply_qe_run_change(run_id: DataId, change: &RunChange, edb: &SqlitePool) -> anyhow::Result<()> {
248-
if let Some(run_id) = run_id {
251+
async fn apply_qe_run_change(run_id: DataId, change: Option<&RunChange>, edb: &SqlitePool) -> anyhow::Result<()> {
252+
if let Some(change) = change {
253+
let changed_fields = change.fields_with_value();
254+
if changed_fields.is_empty() {
255+
return Err(anyhow!("Cannot apply empty change"));
256+
}
249257
let count: (i64,) = sqlx::query_as("SELECT COUNT(*) FROM runs WHERE run_id=?")
250258
.bind(run_id)
251259
.fetch_one(edb).await.map_err(sqlx_to_anyhow)?;
@@ -272,7 +280,6 @@ async fn apply_qe_run_change(run_id: DataId, change: &RunChange, edb: &SqlitePoo
272280
.bind(change.finish_time)
273281
.execute(edb).await.map_err(sqlx_to_anyhow)?;
274282
} else {
275-
let changed_fields = change.fields_with_value();
276283
let placeholders = changed_fields.iter().map(|&fld_name| format!("{fld_name}=?") ).join(",");
277284
let qs = format!("UPDATE runs SET {placeholders} WHERE run_id=?");
278285
let mut q = sqlx::query(&qs);
@@ -350,8 +357,7 @@ async fn api_changes_get(
350357
query_builder.push_bind(data_type);
351358
}
352359
if let Some(status) = status {
353-
query_builder.push(" AND status=");
354-
query_builder.push_bind(status);
360+
query_builder.push(format!(" AND status LIKE '{status}%'"));
355361
}
356362
query_builder.push(" ORDER BY created");
357363
if let Some(limit) = limit {

src/tests.rs

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use crate::runs::rocket_uri_macro_get_runs;
12
use crate::changes::{rocket_uri_macro_api_changes_get, ChangeData, ChangesRecord};
23
use crate::changes::rocket_uri_macro_add_run_update_request_change;
34
use crate::changes::rocket_uri_macro_api_changes_delete;
@@ -13,6 +14,7 @@ use crate::{util};
1314
use crate::auth::QX_SESSION_ID;
1415
use crate::changes::DataId;
1516
use crate::runs::{RunChange, RunsRecord};
17+
use crate::changes::rocket_uri_macro_add_run_updated_change;
1618

1719
const EVENT_ID: EventId = 1;
1820

@@ -222,38 +224,33 @@ fn post_qe3_change() {
222224
let client = create_test_server();
223225
upload_start_list(&client);
224226

225-
fn apply_change_in_qe3(client: &Client, run_id: DataId, change: &RunsRecord) -> RunsRecord {
226-
let resp = client.post(format!("/api/event/current/changes/run-updated?run_id={}", run_id.unwrap()))
227+
fn apply_change_in_qe3(client: &Client, run_id: DataId, change: Option<&RunChange>) -> Vec<RunsRecord> {
228+
let resp = client.post(uri!(add_run_updated_change(run_id=run_id)))
227229
.header(Header::new("qx-api-token", DEMO_API_TOKEN))
228230
.header(ContentType::JSON)
229231
.json(&change)
230232
.dispatch();
231233
assert_eq!(resp.status(), Status::Ok);
232234

233235
// get change
234-
let resp = client.get(format!("/api/event/{EVENT_ID}/runs?run_id=1")).dispatch();
235-
resp.into_json::<Vec<RunsRecord>>().unwrap().first().unwrap().clone()
236+
let resp = client.get(uri!(get_runs(event_id=1, run_id=Some(1), class_name=None::<&str>))).dispatch();
237+
resp.into_json::<Vec<RunsRecord>>().unwrap()
236238
}
237239

238-
{
239-
let change = RunsRecord {
240-
run_id: 1,
241-
si_id: Some(12345),
242-
..Default::default()
243-
};
244-
let rec = apply_change_in_qe3(&client, Some(1), &change);
245-
assert_eq!(rec.si_id, Some(12345));
246-
}
247240
{
248241
let start_time = QxDateTime::now().trimmed_to_sec();
249-
let change = RunsRecord {
250-
run_id: 1,
242+
let change = RunChange {
251243
last_name: Some("Foo".to_string()),
252244
start_time: Some(start_time),
253245
..Default::default()
254246
};
255-
let rec = apply_change_in_qe3(&client, Some(1), &change);
247+
let rec = apply_change_in_qe3(&client, 1, Some(&change)).first().unwrap().clone();
256248
assert_eq!(rec.last_name, Some("Foo".to_string()));
257249
assert_eq!(rec.start_time, Some(start_time));
258250
}
251+
{
252+
// drop rec id == 1
253+
let rec_lst = apply_change_in_qe3(&client, 1, None).clone();
254+
assert!(rec_lst.is_empty());
255+
}
259256
}

0 commit comments

Comments
 (0)