@@ -387,33 +387,39 @@ pub async fn delete(req: HttpRequest, alert_id: Path<Ulid>) -> Result<impl Respo
387387 let session_key = extract_session_key_from_req ( & req) ?;
388388 let alert_id = alert_id. into_inner ( ) ;
389389 let tenant_id = get_tenant_id_from_request ( & req) ;
390+ delete_internal ( & session_key, alert_id, & tenant_id) . await
391+ }
392+
393+ /// Shared alert deletion implementation for HTTP handlers and in-process callers.
394+ pub async fn delete_internal (
395+ session_key : & SessionKey ,
396+ alert_id : Ulid ,
397+ tenant_id : & Option < String > ,
398+ ) -> Result < String , AlertError > {
390399 let guard = ALERTS . write ( ) . await ;
391400 let alerts = if let Some ( alerts) = guard. as_ref ( ) {
392401 alerts
393402 } else {
394403 return Err ( AlertError :: CustomError ( "No AlertManager set" . into ( ) ) ) ;
395404 } ;
396405
397- let alert = alerts. get_alert_by_id ( alert_id, & tenant_id) . await ?;
406+ let alert = alerts. get_alert_by_id ( alert_id, tenant_id) . await ?;
398407
399408 // validate that the user has access to the tables mentioned in the query
400- user_auth_for_alert_config ( & session_key, & alert. to_alert_config ( ) ) . await ?;
409+ user_auth_for_alert_config ( session_key, & alert. to_alert_config ( ) ) . await ?;
401410
402- PARSEABLE
403- . metastore
404- . delete_alert ( & * alert, & tenant_id)
405- . await ?;
411+ PARSEABLE . metastore . delete_alert ( & * alert, tenant_id) . await ?;
406412
407413 // delete the associated alert state
408414 let state_to_delete =
409415 AlertStateEntry :: new ( alert_id, AlertState :: NotTriggered , tenant_id. clone ( ) ) ; // state doesn't matter for deletion
410416 PARSEABLE
411417 . metastore
412- . delete_alert_state ( & state_to_delete as & dyn MetastoreObject , & tenant_id)
418+ . delete_alert_state ( & state_to_delete as & dyn MetastoreObject , tenant_id)
413419 . await ?;
414420
415421 // delete from memory
416- alerts. delete ( alert_id, & tenant_id) . await ?;
422+ alerts. delete ( alert_id, tenant_id) . await ?;
417423
418424 // delete the scheduled task
419425 alerts. delete_task ( alert_id) . await ?;
@@ -585,6 +591,18 @@ pub async fn modify_alert(
585591 let session_key = extract_session_key_from_req ( & req) ?;
586592 let alert_id = alert_id. into_inner ( ) ;
587593 let tenant_id = get_tenant_id_from_request ( & req) ;
594+ Ok ( web:: Json (
595+ modify_alert_internal ( & session_key, alert_id, alert_request, & tenant_id) . await ?,
596+ ) )
597+ }
598+
599+ /// Shared alert update implementation for HTTP handlers and in-process callers.
600+ pub async fn modify_alert_internal (
601+ session_key : & SessionKey ,
602+ alert_id : Ulid ,
603+ alert_request : AlertRequest ,
604+ tenant_id : & Option < String > ,
605+ ) -> Result < AlertConfigResponse , AlertError > {
588606 // Get alerts manager reference without holding the global lock
589607 let alerts = {
590608 let guard = ALERTS . read ( ) . await ;
@@ -596,15 +614,15 @@ pub async fn modify_alert(
596614 } ;
597615
598616 // Validate and prepare the new alert
599- let alert = alerts. get_alert_by_id ( alert_id, & tenant_id) . await ?;
600- user_auth_for_alert_config ( & session_key, & alert. to_alert_config ( ) ) . await ?;
617+ let alert = alerts. get_alert_by_id ( alert_id, tenant_id) . await ?;
618+ user_auth_for_alert_config ( session_key, & alert. to_alert_config ( ) ) . await ?;
601619
602620 let mut new_config = alert_request. into ( tenant_id. clone ( ) ) . await ?;
603621 if & new_config. alert_type != alert. get_alert_type ( ) {
604622 return Err ( AlertError :: InvalidAlertModifyRequest ) ;
605623 }
606624
607- user_auth_for_alert_config ( & session_key, & new_config) . await ?;
625+ user_auth_for_alert_config ( session_key, & new_config) . await ?;
608626
609627 // Calculate notification config
610628 let eval_freq = new_config. get_eval_frequency ( ) ;
@@ -639,27 +657,26 @@ pub async fn modify_alert(
639657 }
640658 } ;
641659
642- new_alert. validate ( & session_key) . await ?;
660+ new_alert. validate ( session_key) . await ?;
643661
644662 // Perform I/O operations
645663 PARSEABLE
646664 . metastore
647- . put_alert ( & new_alert. to_alert_config ( ) , & tenant_id)
665+ . put_alert ( & new_alert. to_alert_config ( ) , tenant_id)
648666 . await ?;
649667
650668 let is_disabled = new_alert. get_state ( ) . eq ( & AlertState :: Disabled ) ;
651669 // Now perform the atomic operations
652670 alerts. delete_task ( alert_id) . await ?;
653- alerts. delete ( alert_id, & tenant_id) . await ?;
671+ alerts. delete ( alert_id, tenant_id) . await ?;
654672 alerts. update ( & * new_alert) . await ;
655673
656674 // only restart the task if the state was not set to disabled
657675 if !is_disabled {
658676 alerts. start_task ( new_alert. clone_box ( ) ) . await ?;
659677 }
660678
661- let config = new_alert. to_alert_config ( ) . to_response ( ) ;
662- Ok ( web:: Json ( config) )
679+ Ok ( new_alert. to_alert_config ( ) . to_response ( ) )
663680}
664681
665682// PUT /alerts/{alert_id}/evaluate_alert
0 commit comments