Skip to content

Commit 755a1a1

Browse files
enhance impl
1 parent 37c18d4 commit 755a1a1

File tree

5 files changed

+65
-29
lines changed

5 files changed

+65
-29
lines changed

services/storage/src/simcore_service_storage/db_file_meta_data.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ def _list_filter_with_partial_file_id_stmt(
7272
file_id_prefix: str | None,
7373
partial_file_id: str | None,
7474
sha256_checksum: SHA256Str | None,
75-
only_files: bool,
75+
is_directory: bool | None = None,
7676
limit: int | None = None,
7777
offset: int | None = None,
7878
):
@@ -98,8 +98,8 @@ def _list_filter_with_partial_file_id_stmt(
9898
conditions.append(file_meta_data.c.file_id.startswith(file_id_prefix))
9999
if partial_file_id:
100100
conditions.append(file_meta_data.c.file_id.ilike(f"%{partial_file_id}%"))
101-
if only_files:
102-
conditions.append(file_meta_data.c.is_directory.is_(False))
101+
if is_directory is not None:
102+
conditions.append(file_meta_data.c.is_directory.is_(is_directory))
103103
if sha256_checksum:
104104
conditions.append(file_meta_data.c.sha256_checksum == sha256_checksum)
105105

@@ -119,7 +119,7 @@ async def list_filter_with_partial_file_id(
119119
file_id_prefix: str | None,
120120
partial_file_id: str | None,
121121
sha256_checksum: SHA256Str | None,
122-
only_files: bool,
122+
is_directory: bool | None = None,
123123
limit: int | None = None,
124124
offset: int | None = None,
125125
) -> list[FileMetaDataAtDB]:
@@ -129,7 +129,7 @@ async def list_filter_with_partial_file_id(
129129
file_id_prefix=file_id_prefix,
130130
partial_file_id=partial_file_id,
131131
sha256_checksum=sha256_checksum,
132-
only_files=only_files,
132+
is_directory=is_directory,
133133
limit=limit,
134134
offset=offset,
135135
)

services/storage/src/simcore_service_storage/simcore_s3_dsm.py

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@
8080
from .s3 import get_s3_client
8181
from .s3_utils import S3TransferDataCB, update_task_progress
8282
from .settings import Settings
83-
from .simcore_s3_dsm_utils import expand_directory, get_directory_file_id, try_get_fmd
83+
from .simcore_s3_dsm_utils import expand_directory, get_directory_file_id
8484
from .utils import (
8585
convert_db_to_model,
8686
download_to_file_or_raise,
@@ -182,7 +182,6 @@ async def list_files( # noqa C901
182182
),
183183
file_id_prefix=None,
184184
partial_file_id=uuid_filter,
185-
only_files=False,
186185
sha256_checksum=None,
187186
)
188187

@@ -518,6 +517,11 @@ async def delete_file(
518517
# Only use this in those circumstances where a collaborator requires to delete a file (the current
519518
# permissions model will not allow him to do so, even though this is a legitimate action)
520519
# SEE https://github.com/ITISFoundation/osparc-simcore/issues/5159
520+
def _get_subpath(path: str, levels: int):
521+
components = path.strip("/").split("/")
522+
subpath = "/".join(components[:levels])
523+
return "/" + subpath if subpath else "/"
524+
521525
async with self.engine.acquire() as conn:
522526
if enforce_access_rights:
523527
can: AccessRights = await get_file_access_rights(conn, user_id, file_id)
@@ -530,10 +534,23 @@ async def delete_file(
530534
)
531535

532536
async with self.engine.acquire() as conn:
533-
if await try_get_fmd(conn, file_id):
534-
await db_file_meta_data.delete(conn, [file_id])
535-
if parent_dir_file_id := await get_directory_file_id(conn, file_id):
536-
parent_dir_fmd = await db_file_meta_data.get(conn, parent_dir_file_id)
537+
try:
538+
if await db_file_meta_data.get(conn, file_id):
539+
await db_file_meta_data.delete(conn, [file_id])
540+
except FileMetaDataNotFoundError:
541+
_logger.warning("File %s not found in database", file_id)
542+
543+
if parent_dir_fmds := await db_file_meta_data.list_filter_with_partial_file_id(
544+
conn,
545+
user_or_project_filter=UserOrProjectFilter(
546+
user_id=user_id, project_ids=[]
547+
),
548+
file_id_prefix=_get_subpath(file_id, 2),
549+
partial_file_id=None,
550+
is_directory=True,
551+
sha256_checksum=None,
552+
):
553+
parent_dir_fmd = parent_dir_fmds[0]
537554
parent_dir_fmd.file_size = UNDEFINED_SIZE
538555
await db_file_meta_data.upsert(conn, parent_dir_fmd)
539556

services/storage/src/simcore_service_storage/simcore_s3_dsm_utils.py

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -78,16 +78,6 @@ async def expand_directory(
7878
return result
7979

8080

81-
async def try_get_fmd(
82-
conn: SAConnection, s3_file_id: StorageFileID
83-
) -> FileMetaDataAtDB | None:
84-
with suppress(FileMetaDataNotFoundError):
85-
return await db_file_meta_data.get(
86-
conn, TypeAdapter(SimcoreS3FileID).validate_python(s3_file_id)
87-
)
88-
return None
89-
90-
9181
def get_simcore_directory(file_id: SimcoreS3FileID) -> str:
9282
try:
9383
directory_id = SimcoreS3DirectoryID.from_simcore_s3_object(file_id)
@@ -104,7 +94,16 @@ async def get_directory_file_id(
10494
in the `file_meta_data` table
10595
"""
10696

107-
provided_file_id_fmd = await try_get_fmd(conn, file_id)
97+
async def _get_fmd(
98+
conn: SAConnection, s3_file_id: StorageFileID
99+
) -> FileMetaDataAtDB | None:
100+
with suppress(FileMetaDataNotFoundError):
101+
return await db_file_meta_data.get(
102+
conn, TypeAdapter(SimcoreS3FileID).validate_python(s3_file_id)
103+
)
104+
return None
105+
106+
provided_file_id_fmd = await _get_fmd(conn, file_id)
108107
if provided_file_id_fmd:
109108
# file_meta_data exists it is not a directory
110109
return None
@@ -117,6 +116,6 @@ async def get_directory_file_id(
117116
directory_file_id = TypeAdapter(SimcoreS3FileID).validate_python(
118117
directory_file_id_str
119118
)
120-
directory_file_id_fmd = await try_get_fmd(conn, directory_file_id)
119+
directory_file_id_fmd = await _get_fmd(conn, directory_file_id)
121120

122121
return directory_file_id if directory_file_id_fmd else None

services/storage/tests/unit/test_db_file_meta_data.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def _check(func_smt, **kwargs):
3131
file_id_prefix=None,
3232
partial_file_id=None,
3333
sha256_checksum=None,
34-
only_files=True,
34+
is_directory=False,
3535
)
3636
# WHERE file_meta_data.is_directory IS false ORDER BY file_meta_data.created_at ASC
3737

@@ -41,7 +41,7 @@ def _check(func_smt, **kwargs):
4141
file_id_prefix=None,
4242
partial_file_id=None,
4343
sha256_checksum=None,
44-
only_files=True,
44+
is_directory=False,
4545
)
4646
# WHERE file_meta_data.user_id = '42' AND file_meta_data.is_directory IS false ORDER BY file_meta_data.created_at ASC
4747

@@ -53,7 +53,7 @@ def _check(func_smt, **kwargs):
5353
file_id_prefix=None,
5454
partial_file_id=None,
5555
sha256_checksum=None,
56-
only_files=True,
56+
is_directory=False,
5757
)
5858
# WHERE (file_meta_data.user_id = '42' OR file_meta_data.project_id IN ('18d5'..., )) AND file_meta_data.is_directory IS false ORDER BY file_meta_data.created_at ASC
5959

@@ -65,7 +65,7 @@ def _check(func_smt, **kwargs):
6565
file_id_prefix=None,
6666
partial_file_id=None,
6767
sha256_checksum=None,
68-
only_files=True,
68+
is_directory=False,
6969
limit=10,
7070
offset=1,
7171
)
@@ -78,7 +78,6 @@ def _check(func_smt, **kwargs):
7878
file_id_prefix=None,
7979
partial_file_id="{project_id}/",
8080
sha256_checksum=None,
81-
only_files=False,
8281
)
8382

8483
# As used in SimcoreS3DataManager.search_owned_files
@@ -88,7 +87,7 @@ def _check(func_smt, **kwargs):
8887
file_id_prefix="api/",
8988
partial_file_id=None,
9089
sha256_checksum=faker.sha256(),
91-
only_files=True,
90+
is_directory=False,
9291
limit=10,
9392
offset=0,
9493
)

services/storage/tests/unit/test_handlers_files.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1345,6 +1345,7 @@ async def test_upload_file_is_directory_and_remove_content(
13451345
client: TestClient,
13461346
location_id: LocationID,
13471347
user_id: UserID,
1348+
faker: Faker,
13481349
):
13491350
FILE_SIZE_IN_DIR = TypeAdapter(ByteSize).validate_python("1Mib")
13501351
DIR_NAME = "some-dir"
@@ -1407,6 +1408,26 @@ async def test_upload_file_is_directory_and_remove_content(
14071408

14081409
assert len(list_of_files) == SUBDIR_COUNT * FILE_COUNT - 1
14091410

1411+
# DELETE NOT EXISTING
1412+
delete_url = (
1413+
client.app.router["delete_file"]
1414+
.url_for(
1415+
location_id=f"{location_id}",
1416+
file_id=urllib.parse.quote(
1417+
"/".join(list_of_files[0].file_id.split("/")[:2]) + "/does_not_exist",
1418+
safe="",
1419+
),
1420+
)
1421+
.with_query(user_id=user_id)
1422+
)
1423+
response = await client.delete(f"{delete_url}")
1424+
_, error = await assert_status(response, status.HTTP_204_NO_CONTENT)
1425+
assert error is None
1426+
1427+
list_of_files: list[FileMetaDataGet] = await _list_files_legacy(
1428+
client, user_id, location_id, directory_file_upload
1429+
)
1430+
14101431
# DIRECTORY REMOVAL
14111432

14121433
await delete_directory(directory_file_upload=directory_file_upload)

0 commit comments

Comments
 (0)