@@ -354,6 +354,104 @@ pub async fn delete_group_by_id_query(
354354 }
355355}
356356
357+ #[ tracing:: instrument( skip( pool) ) ]
358+ pub async fn delete_group_by_file_id_query (
359+ file_id : uuid:: Uuid ,
360+ dataset : Dataset ,
361+ deleted_at : chrono:: NaiveDateTime ,
362+ delete_chunks : Option < bool > ,
363+ pool : web:: Data < Pool > ,
364+ dataset_config : DatasetConfiguration ,
365+ ) -> Result < ( ) , ServiceError > {
366+ use crate :: data:: schema:: chunk_group:: dsl as chunk_group_columns;
367+ use crate :: data:: schema:: chunk_group_bookmarks:: dsl as chunk_group_bookmarks_columns;
368+ use crate :: data:: schema:: chunk_metadata:: dsl as chunk_metadata_columns;
369+ use crate :: data:: schema:: groups_from_files:: dsl as groups_from_files_columns;
370+
371+ let mut conn = pool. get ( ) . await . map_err ( |_e| {
372+ ServiceError :: InternalServerError ( "Failed to get postgres connection" . to_string ( ) )
373+ } ) ?;
374+
375+ let group_id: uuid:: Uuid = groups_from_files_columns:: groups_from_files
376+ . filter ( groups_from_files_columns:: file_id. eq ( file_id) )
377+ . select ( groups_from_files_columns:: group_id)
378+ . first :: < uuid:: Uuid > ( & mut conn)
379+ . await
380+ . map_err ( |_err| {
381+ ServiceError :: BadRequest ( "Error getting group id for file_id" . to_string ( ) )
382+ } ) ?;
383+
384+ let delete_chunks = delete_chunks. unwrap_or ( false ) ;
385+ let chunks = chunk_group_bookmarks_columns:: chunk_group_bookmarks
386+ . inner_join ( chunk_metadata_columns:: chunk_metadata)
387+ . filter ( chunk_group_bookmarks_columns:: group_id. eq ( group_id) )
388+ . select ( ChunkMetadataTable :: as_select ( ) )
389+ . load :: < ChunkMetadataTable > ( & mut conn)
390+ . await
391+ . map_err ( |_err| ServiceError :: BadRequest ( "Error getting chunks" . to_string ( ) ) ) ?;
392+
393+ let transaction_result = conn
394+ . transaction :: < _ , diesel:: result:: Error , _ > ( |conn| {
395+ async move {
396+ diesel:: delete (
397+ groups_from_files_columns:: groups_from_files
398+ . filter ( groups_from_files_columns:: group_id. eq ( group_id) )
399+ . filter ( groups_from_files_columns:: created_at. le ( deleted_at) ) ,
400+ )
401+ . execute ( conn)
402+ . await ?;
403+
404+ diesel:: delete (
405+ chunk_group_bookmarks_columns:: chunk_group_bookmarks
406+ . filter ( chunk_group_bookmarks_columns:: group_id. eq ( group_id) )
407+ . filter ( chunk_group_bookmarks_columns:: created_at. le ( deleted_at) ) ,
408+ )
409+ . execute ( conn)
410+ . await ?;
411+
412+ diesel:: delete (
413+ chunk_group_columns:: chunk_group
414+ . filter ( chunk_group_columns:: id. eq ( group_id) )
415+ . filter ( chunk_group_columns:: dataset_id. eq ( dataset. id ) )
416+ . filter ( chunk_group_columns:: created_at. le ( deleted_at) ) ,
417+ )
418+ . execute ( conn)
419+ . await ?;
420+
421+ Ok ( ( ) )
422+ }
423+ . scope_boxed ( )
424+ } )
425+ . await ;
426+
427+ if delete_chunks {
428+ let chunk_ids = chunks. iter ( ) . map ( |chunk| chunk. id ) . collect ( ) ;
429+ delete_chunk_metadata_query (
430+ chunk_ids,
431+ deleted_at,
432+ dataset. clone ( ) ,
433+ pool. clone ( ) ,
434+ dataset_config. clone ( ) ,
435+ )
436+ . await ?;
437+ } else {
438+ let remove_chunks_from_groups_futures = chunks. iter ( ) . map ( |chunk| {
439+ remove_bookmark_from_qdrant_query (
440+ chunk. qdrant_point_id ,
441+ group_id,
442+ dataset_config. clone ( ) ,
443+ )
444+ } ) ;
445+
446+ futures:: future:: join_all ( remove_chunks_from_groups_futures) . await ;
447+ }
448+
449+ match transaction_result {
450+ Ok ( _) => Ok ( ( ) ) ,
451+ Err ( _) => Err ( ServiceError :: BadRequest ( "Error deleting group" . to_string ( ) ) ) ,
452+ }
453+ }
454+
357455#[ tracing:: instrument( skip( pool) ) ]
358456pub async fn update_chunk_group_query (
359457 group : ChunkGroup ,
0 commit comments