@@ -20,7 +20,7 @@ use crate::oc::OCheckListChange;
2020use crate :: runs:: { RunChange } ;
2121use 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
2525pub const PENDING : & str = "Pending" ;
2626const 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>" ) ]
221221async 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 {
0 commit comments