11from fastapi import APIRouter , HTTPException , status , Depends , Request
2+ from typing import List , Tuple
23from app .database .folders import (
34 db_update_parent_ids_for_subtree ,
45 db_folder_exists ,
78 db_disable_ai_tagging_batch ,
89 db_delete_folders_batch ,
910 db_get_direct_child_folders ,
11+ db_get_folder_ids_by_path_prefix ,
1012)
1113from app .schemas .folders import (
1214 AddFolderRequest ,
3739router = APIRouter ()
3840
3941
40- def post_folder_add_sequence (folder_path : str ):
42+ def post_folder_add_sequence (folder_path : str , folder_id : int ):
4143 """
4244 Post-addition sequence for a folder.
4345 This function is called after a folder is successfully added.
4446 It processes images in the folder and updates the database.
4547 """
4648 try :
47- # Process images in the folder
48- image_util_process_folder_images (folder_path )
49+ # Get all folder IDs and paths that match the root path prefix
50+ folder_data = []
51+ folder_ids_and_paths = db_get_folder_ids_by_path_prefix (folder_path )
52+
53+ # Set all folders to non-recursive (False)
54+ for folder_id_from_db , folder_path_from_db in folder_ids_and_paths :
55+ folder_data .append ((folder_path_from_db , folder_id_from_db , False ))
56+
57+ print ("Add folder: " , folder_data )
58+ # Process images in all folders
59+ image_util_process_folder_images (folder_data )
4960
5061 except Exception as e :
5162 print (f"Error in post processing after folder { folder_path } was added: { e } " )
@@ -68,6 +79,34 @@ def post_AI_tagging_enabled_sequence():
6879 return True
6980
7081
82+ def post_sync_folder_sequence (
83+ folder_path : str , folder_id : int , added_folders : List [Tuple [str , str ]]
84+ ):
85+ """
86+ Post-sync sequence for a folder.
87+ This function is called after a folder is synced.
88+ It processes images in the folder and updates the database.
89+ """
90+ try :
91+ # Create folder data array
92+ folder_data = []
93+
94+ folder_data .append ((folder_path , folder_id , False ))
95+
96+ for added_folder_id , added_folder_path in added_folders :
97+ folder_data .append ((added_folder_path , added_folder_id , False ))
98+
99+ print ("Sync folder: " , folder_data )
100+ # Process images in all folders
101+ image_util_process_folder_images (folder_data )
102+ image_util_process_untagged_images ()
103+ cluster_util_face_clusters_sync ()
104+ except Exception as e :
105+ print (f"Error in post processing after folder { folder_path } was synced: { e } " )
106+ return False
107+ return True
108+
109+
71110def get_state (request : Request ):
72111 return request .app .state
73112
@@ -132,7 +171,7 @@ def add_folder(request: AddFolderRequest, app_state=Depends(get_state)):
132171
133172 # Step 6: Call the post-addition sequence in a separate process
134173 executor : ProcessPoolExecutor = app_state .executor
135- executor .submit (post_folder_add_sequence , request .folder_path )
174+ executor .submit (post_folder_add_sequence , request .folder_path , root_folder_id )
136175
137176 return AddFolderResponse (
138177 success = True ,
@@ -287,33 +326,43 @@ def delete_folders(request: DeleteFoldersRequest):
287326 response_model = SyncFolderResponse ,
288327 responses = {code : {"model" : ErrorResponse } for code in [400 , 404 , 500 ]},
289328)
290- def sync_folder (request : SyncFolderRequest ):
329+ def sync_folder (request : SyncFolderRequest , app_state = Depends ( get_state ) ):
291330 """Sync a folder by comparing filesystem folders with database entries and removing extra DB entries."""
292331 try :
293- # Step 1: Validate request
294-
295- # Step 2: Get current state from both sources
332+ # Step 1: Get current state from both sources
296333 db_child_folders = db_get_direct_child_folders (request .folder_id )
297334 filesystem_folders = folder_util_get_filesystem_direct_child_folders (
298335 request .folder_path
299336 )
300337
301- # Step 3 : Compare and identify differences
338+ # Step 2 : Compare and identify differences
302339 filesystem_folder_set = set (filesystem_folders )
303340 db_folder_paths = {folder_path for folder_id , folder_path in db_child_folders }
304341
305342 folders_to_delete = db_folder_paths - filesystem_folder_set
306343 folders_to_add = filesystem_folder_set - db_folder_paths
307344
308- # Step 4 : Perform synchronization operations
345+ # Step 3 : Perform synchronization operations
309346 deleted_count , deleted_folders = folder_util_delete_obsolete_folders (
310347 db_child_folders , folders_to_delete
311348 )
312- added_count , added_folders = folder_util_add_multiple_folder_trees (
349+ added_count , added_folders_with_ids = folder_util_add_multiple_folder_trees (
313350 folders_to_add , request .folder_id
314351 )
315352
316- # Step 5: Return comprehensive response
353+ # Extract just the paths for the API response
354+ added_folders = [
355+ folder_path for folder_id , folder_path in added_folders_with_ids
356+ ]
357+
358+ executor : ProcessPoolExecutor = app_state .executor
359+ executor .submit (
360+ post_sync_folder_sequence ,
361+ request .folder_path ,
362+ request .folder_id ,
363+ added_folders_with_ids ,
364+ )
365+ # Step 4: Return comprehensive response
317366 return SyncFolderResponse (
318367 success = True ,
319368 message = f"Successfully synced folder. Added { added_count } folder(s), deleted { deleted_count } folder(s)" ,
0 commit comments