Skip to content

Commit ede3057

Browse files
committed
improves OAS
1 parent b701317 commit ede3057

File tree

4 files changed

+34
-9
lines changed

4 files changed

+34
-9
lines changed

api/specs/web-server/_trash.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@
55

66

77
from enum import Enum
8+
from typing import Annotated
89

9-
from fastapi import APIRouter, status
10-
from models_library.projects import ProjectID
10+
from fastapi import APIRouter, Depends, status
1111
from simcore_service_webserver._meta import API_VTAG
12+
from simcore_service_webserver.projects._trash_handlers import (
13+
ProjectPathParams,
14+
RemoveQueryParams,
15+
)
1216

1317
router = APIRouter(
1418
prefix=f"/{API_VTAG}",
@@ -33,7 +37,8 @@ def empty_trash():
3337
status_code=status.HTTP_204_NO_CONTENT,
3438
)
3539
def trash_project(
36-
project_id: ProjectID,
40+
_p: Annotated[ProjectPathParams, Depends()],
41+
_q: Annotated[RemoveQueryParams, Depends()],
3742
):
3843
...
3944

@@ -44,6 +49,6 @@ def trash_project(
4449
status_code=status.HTTP_204_NO_CONTENT,
4550
)
4651
def untrash_project(
47-
project_id: ProjectID,
52+
_p: Annotated[ProjectPathParams, Depends()],
4853
):
4954
...

services/web/server/src/simcore_service_webserver/projects/_common_models.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,9 @@ class ProjectPathParams(BaseModel):
2323
class Config:
2424
allow_population_by_field_name = True
2525
extra = Extra.forbid
26+
27+
28+
class RemoveQueryParams(BaseModel):
29+
force: bool = Field(
30+
default=True, description="Force removal (even if resource is active)"
31+
)

services/web/server/src/simcore_service_webserver/projects/_trash_api.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,21 @@ async def trash_project(
5050
user_id: UserID,
5151
project_id: ProjectID,
5252
trashed: bool,
53-
forced: bool = True,
53+
forced: bool = False,
5454
):
55+
"""_summary_
56+
57+
Keyword Arguments:
58+
forced -- _description_ (default: {False})
59+
60+
Raises:
61+
ProjectStopError: _description_
62+
ProjectRunningConflictError: if
63+
"""
5564
if trashed:
56-
# stop first
5765

5866
if forced:
67+
# stop first
5968
try:
6069
await projects_api.remove_project_dynamic_services(
6170
user_id=user_id,
@@ -76,11 +85,10 @@ async def trash_project(
7685
from_err=exc,
7786
) from exc
7887
else:
79-
88+
# NOTE: must do here as well for dynamic services but needs refactoring!
8089
running = await director_v2_api.is_pipeline_running(
8190
app=app, user_id=user_id, project_id=project_id
8291
)
83-
# NOTE: must do here as well for dynamic services but needs refactoring!
8492
if running:
8593
raise ProjectRunningConflictError(
8694
project_uuid=project_id,

services/web/server/src/simcore_service_webserver/projects/_trash_handlers.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44

55
from aiohttp import web
66
from servicelib.aiohttp import status
7-
from servicelib.aiohttp.requests_validation import parse_request_path_parameters_as
7+
from servicelib.aiohttp.requests_validation import (
8+
parse_request_path_parameters_as,
9+
parse_request_query_parameters_as,
10+
)
811
from servicelib.aiohttp.typing_extension import Handler
912
from servicelib.aiohttp.web_exceptions_extension import get_http_error_class_or_none
1013
from servicelib.logging_errors import create_troubleshotting_log_kwargs
@@ -16,6 +19,7 @@
1619
from ..projects._common_models import ProjectPathParams
1720
from ..security.decorators import permission_required
1821
from . import _trash_api
22+
from ._common_models import RemoveQueryParams
1923
from .exceptions import ProjectRunningConflictError, ProjectStopError, ProjectTrashError
2024

2125
_logger = logging.getLogger(__name__)
@@ -116,13 +120,15 @@ async def trash_project(request: web.Request):
116120
user_id = get_user_id(request)
117121
product_name = get_product_name(request)
118122
path_params = parse_request_path_parameters_as(ProjectPathParams, request)
123+
query_params = parse_request_query_parameters_as(RemoveQueryParams, request)
119124

120125
await _trash_api.trash_project(
121126
request.app,
122127
product_name=product_name,
123128
user_id=user_id,
124129
project_id=path_params.project_id,
125130
trashed=True,
131+
forced=query_params.force,
126132
)
127133

128134
return web.json_response(status=status.HTTP_204_NO_CONTENT)

0 commit comments

Comments
 (0)