diff --git a/facefusion/apis/core.py b/facefusion/apis/core.py index c16f66b9..6c74e504 100644 --- a/facefusion/apis/core.py +++ b/facefusion/apis/core.py @@ -8,7 +8,7 @@ from starlette.routing import Route, WebSocketRoute from facefusion.apis.endpoints.assets import delete_assets, get_asset, get_assets, upload_asset from facefusion.apis.endpoints.capabilities import get_capabilities -from facefusion.apis.endpoints.jobs import create_job, get_job, get_jobs +from facefusion.apis.endpoints.jobs import create_job, delete_job, delete_jobs, get_job, get_jobs from facefusion.apis.endpoints.metrics import get_metrics, websocket_metrics from facefusion.apis.endpoints.ping import websocket_ping from facefusion.apis.endpoints.session import create_session, destroy_session, get_session, refresh_session @@ -49,8 +49,10 @@ def create_api() -> Starlette: Route('/stream', post_stream, methods = [ 'POST' ], middleware = [ session_guard ]), Route('/stream', delete_stream, methods = [ 'DELETE' ], name = 'delete_stream', middleware = [ session_guard ]), Route('/jobs', get_jobs, methods = [ 'GET' ], middleware = [ session_guard ]), - Route('/jobs/{job_id}', get_job, methods = [ 'GET' ], middleware = [ session_guard ]), Route('/jobs', create_job, methods = [ 'POST' ], middleware = [ session_guard ]), + Route('/jobs', delete_jobs, methods = [ 'DELETE' ], middleware = [ session_guard ]), + Route('/jobs/{job_id}', get_job, methods = [ 'GET' ], middleware = [ session_guard ]), + Route('/jobs/{job_id}', delete_job, methods = [ 'DELETE' ], middleware = [ session_guard ]), WebSocketRoute('/metrics', websocket_metrics, middleware = [ session_guard ]), WebSocketRoute('/ping', websocket_ping, middleware = [ session_guard ]), WebSocketRoute('/stream', websocket_stream, middleware = [ session_guard ]) diff --git a/facefusion/apis/endpoints/jobs.py b/facefusion/apis/endpoints/jobs.py index 000300c9..b724bca8 100644 --- a/facefusion/apis/endpoints/jobs.py +++ b/facefusion/apis/endpoints/jobs.py @@ -3,7 +3,7 @@ from starlette.responses import JSONResponse from starlette.status import HTTP_200_OK, HTTP_201_CREATED, HTTP_400_BAD_REQUEST, HTTP_404_NOT_FOUND import facefusion.choices -from facefusion import translator +from facefusion import state_manager, translator from facefusion.jobs import job_helper, job_manager @@ -56,3 +56,31 @@ async def create_job(request : Request) -> JSONResponse: { 'message': translator.get('job_not_created', 'facefusion.apis') }, status_code = HTTP_400_BAD_REQUEST) + + +async def delete_jobs(request : Request) -> JSONResponse: + if job_manager.delete_jobs(state_manager.get_item('halt_on_error')): + return JSONResponse( + { + 'message': translator.get('ok', 'facefusion.apis') + }, status_code = HTTP_200_OK) + + return JSONResponse( + { + 'message': translator.get('job_not_found', 'facefusion.apis') + }, status_code = HTTP_404_NOT_FOUND) + + +async def delete_job(request : Request) -> JSONResponse: + job_id = request.path_params.get('job_id') + + if job_manager.delete_job(job_id): + return JSONResponse( + { + 'message': translator.get('ok', 'facefusion.apis') + }, status_code = HTTP_200_OK) + + return JSONResponse( + { + 'message': translator.get('job_not_found', 'facefusion.apis') + }, status_code = HTTP_404_NOT_FOUND) diff --git a/tests/test_api_jobs.py b/tests/test_api_jobs.py index 9275f75e..e3d4d05a 100644 --- a/tests/test_api_jobs.py +++ b/tests/test_api_jobs.py @@ -53,7 +53,6 @@ def test_get_jobs(test_client : TestClient) -> None: get_jobs_body = get_jobs_response.json() assert 'job-test-get-jobs' in get_jobs_body - assert get_jobs_body.get('job-test-get-jobs').get('step_total') == 0 assert get_jobs_response.status_code == 200 @@ -127,3 +126,68 @@ def test_create_job(test_client : TestClient) -> None: assert create_job_body.get('message') == 'job not created' assert create_job_response.status_code == 400 + + +def test_delete_jobs(test_client : TestClient) -> None: + delete_jobs_response = test_client.delete('/jobs') + + assert delete_jobs_response.status_code == 401 + + create_session_response = test_client.post('/session', json = + { + 'client_version': metadata.get('version') + }) + create_session_body = create_session_response.json() + access_token = create_session_body.get('access_token') + + delete_jobs_response = test_client.delete('/jobs', headers = + { + 'Authorization': 'Bearer ' + access_token + }) + delete_jobs_body = delete_jobs_response.json() + + assert delete_jobs_body.get('message') == 'job not found' + assert delete_jobs_response.status_code == 404 + + create_job('job-test-delete-jobs-1') + create_job('job-test-delete-jobs-2') + + delete_jobs_response = test_client.delete('/jobs', headers = + { + 'Authorization': 'Bearer ' + access_token + }) + + assert find_job_ids('drafted') == [] + assert delete_jobs_response.status_code == 200 + + +def test_delete_job(test_client : TestClient) -> None: + delete_job_response = test_client.delete('/jobs/job-test-delete-job') + + assert delete_job_response.status_code == 401 + + create_session_response = test_client.post('/session', json = + { + 'client_version': metadata.get('version') + }) + create_session_body = create_session_response.json() + access_token = create_session_body.get('access_token') + + delete_job_response = test_client.delete('/jobs/job-test-unknown', headers = + { + 'Authorization': 'Bearer ' + access_token + }) + delete_job_body = delete_job_response.json() + + assert delete_job_body.get('message') == 'job not found' + assert delete_job_response.status_code == 404 + + create_job('job-test-delete-job') + + delete_job_response = test_client.delete('/jobs/job-test-delete-job', headers = + { + 'Authorization': 'Bearer ' + access_token + }) + + assert find_job_ids('drafted') == [] + assert delete_job_response.status_code == 200