Skip to content

Commit eef82ad

Browse files
korgan00Tansito
andauthored
Migrate files endpoints (#1696)
* list endpoint * improved list endpoint * added provider_list endpoint * added download file endpoints * added delete endpoints * setup upload and delete old files-endpoint files * added some types and docs correction * remove unnecessary name (auto-generated) * improve docs and types * Address PR comments, fix documentation, use AbstractUser instead AbstractBaseUsser. * remove file sanitization * black & lint --------- Co-authored-by: David <[email protected]>
1 parent 684e8a9 commit eef82ad

27 files changed

+1364
-753
lines changed

gateway/api/domain/exceptions/__init__.py

Whitespace-only changes.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
"""Base exception for business domain errors."""
2+
3+
4+
class NotFoundError(Exception):
5+
"""Base exception for business domain errors."""
6+
7+
def __init__(self, message: str):
8+
self.message = message
9+
super().__init__(message)

gateway/api/use_cases/files/__init__.py

Whitespace-only changes.
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
"""Delete file from user storage use case."""
2+
# pylint: disable=duplicate-code
3+
import logging
4+
from django.contrib.auth.models import AbstractUser
5+
from api.services.file_storage import FileStorage, WorkingDir
6+
from api.repositories.functions import FunctionRepository
7+
from api.domain.exceptions.not_found_error import NotFoundError
8+
9+
from api.models import RUN_PROGRAM_PERMISSION
10+
11+
12+
logger = logging.getLogger("gateway.use_cases.files")
13+
14+
15+
class FilesDeleteUseCase:
16+
"""
17+
Delete file from user storage use case.
18+
"""
19+
20+
function_repository = FunctionRepository()
21+
working_dir = WorkingDir.USER_STORAGE
22+
23+
def execute(
24+
self,
25+
user: AbstractUser,
26+
provider_name: str,
27+
function_title: str,
28+
file_name: str,
29+
):
30+
"""
31+
Delete file from user storage.
32+
"""
33+
function = self.function_repository.get_function_by_permission(
34+
user=user,
35+
permission_name=RUN_PROGRAM_PERMISSION,
36+
function_title=function_title,
37+
provider_name=provider_name,
38+
)
39+
40+
if not function:
41+
if provider_name:
42+
error_message = f"Qiskit Function {provider_name}/{function_title} doesn't exist." # pylint: disable=line-too-long
43+
else:
44+
error_message = f"Qiskit Function {function_title} doesn't exist."
45+
raise NotFoundError(error_message)
46+
47+
file_storage = FileStorage(
48+
username=user.username,
49+
working_dir=self.working_dir,
50+
function_title=function_title,
51+
provider_name=provider_name,
52+
)
53+
result = file_storage.remove_file(file_name=file_name)
54+
55+
if not result:
56+
raise NotFoundError("Requested file was not found.")
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
"""Download a file from user storage use case."""
2+
# pylint: disable=duplicate-code
3+
import logging
4+
from django.contrib.auth.models import AbstractUser
5+
from api.services.file_storage import FileStorage, WorkingDir
6+
from api.repositories.functions import FunctionRepository
7+
from api.domain.exceptions.not_found_error import NotFoundError
8+
9+
from api.models import RUN_PROGRAM_PERMISSION
10+
11+
12+
logger = logging.getLogger("gateway.use_cases.files")
13+
14+
15+
class FilesDownloadUseCase:
16+
"""
17+
Download a file from user storage use case.
18+
"""
19+
20+
function_repository = FunctionRepository()
21+
working_dir = WorkingDir.USER_STORAGE
22+
23+
def execute(
24+
self,
25+
user: AbstractUser,
26+
provider_name: str,
27+
function_title: str,
28+
requested_file_name: str,
29+
):
30+
"""
31+
Download a file from user storage.
32+
"""
33+
function = self.function_repository.get_function_by_permission(
34+
user=user,
35+
permission_name=RUN_PROGRAM_PERMISSION,
36+
function_title=function_title,
37+
provider_name=provider_name,
38+
)
39+
40+
if not function:
41+
if provider_name:
42+
error_message = f"Qiskit Function {provider_name}/{function_title} doesn't exist." # pylint: disable=line-too-long
43+
else:
44+
error_message = f"Qiskit Function {function_title} doesn't exist."
45+
raise NotFoundError(error_message)
46+
47+
file_storage = FileStorage(
48+
username=user.username,
49+
working_dir=self.working_dir,
50+
function_title=function_title,
51+
provider_name=provider_name,
52+
)
53+
result = file_storage.get_file(file_name=requested_file_name)
54+
55+
if result is None:
56+
raise NotFoundError("Requested file was not found.")
57+
58+
return result
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
"""List all files on user storage use case."""
2+
# pylint: disable=duplicate-code
3+
import logging
4+
from django.contrib.auth.models import AbstractUser
5+
from api.services.file_storage import FileStorage, WorkingDir
6+
from api.repositories.functions import FunctionRepository
7+
from api.domain.exceptions.not_found_error import NotFoundError
8+
9+
from api.models import RUN_PROGRAM_PERMISSION
10+
11+
12+
logger = logging.getLogger("gateway.use_cases.files")
13+
14+
15+
class FilesListUseCase:
16+
"""
17+
List all files on user storage use case.
18+
"""
19+
20+
function_repository = FunctionRepository()
21+
working_dir = WorkingDir.USER_STORAGE
22+
23+
def execute(self, user: AbstractUser, provider_name: str, function_title: str):
24+
"""
25+
List all files on user storage.
26+
"""
27+
function = self.function_repository.get_function_by_permission(
28+
user=user,
29+
permission_name=RUN_PROGRAM_PERMISSION,
30+
function_title=function_title,
31+
provider_name=provider_name,
32+
)
33+
34+
if not function:
35+
if provider_name:
36+
error_message = f"Qiskit Function {provider_name}/{function_title} doesn't exist." # pylint: disable=line-too-long
37+
else:
38+
error_message = f"Qiskit Function {function_title} doesn't exist."
39+
raise NotFoundError(error_message)
40+
41+
file_storage = FileStorage(
42+
username=user.username,
43+
working_dir=self.working_dir,
44+
function_title=function_title,
45+
provider_name=provider_name,
46+
)
47+
48+
return file_storage.get_files()
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
"""Delete file from provider storage use case."""
2+
# pylint: disable=duplicate-code
3+
import logging
4+
from django.contrib.auth.models import AbstractUser
5+
from api.access_policies.providers import ProviderAccessPolicy
6+
from api.repositories.providers import ProviderRepository
7+
from api.services.file_storage import FileStorage, WorkingDir
8+
from api.repositories.functions import FunctionRepository
9+
from api.domain.exceptions.not_found_error import NotFoundError
10+
11+
from api.models import RUN_PROGRAM_PERMISSION
12+
13+
logger = logging.getLogger("gateway.use_cases.files")
14+
15+
16+
class FilesProviderDeleteUseCase:
17+
"""
18+
Delete file from provider storage use case.
19+
"""
20+
21+
function_repository = FunctionRepository()
22+
provider_repository = ProviderRepository()
23+
working_dir = WorkingDir.PROVIDER_STORAGE
24+
25+
def execute(
26+
self,
27+
user: AbstractUser,
28+
provider_name: str,
29+
function_title: str,
30+
file_name: str,
31+
):
32+
"""
33+
Delete file from provider storage.
34+
"""
35+
36+
provider = self.provider_repository.get_provider_by_name(name=provider_name)
37+
if provider is None or not ProviderAccessPolicy.can_access(
38+
user=user, provider=provider
39+
):
40+
raise NotFoundError(f"Provider {provider_name} doesn't exist.")
41+
42+
function = self.function_repository.get_function_by_permission(
43+
user=user,
44+
permission_name=RUN_PROGRAM_PERMISSION,
45+
function_title=function_title,
46+
provider_name=provider_name,
47+
)
48+
49+
if not function:
50+
raise NotFoundError(
51+
f"Qiskit Function {provider_name}/{function_title} doesn't exist."
52+
)
53+
54+
file_storage = FileStorage(
55+
username=user.username,
56+
working_dir=self.working_dir,
57+
function_title=function_title,
58+
provider_name=provider_name,
59+
)
60+
result = file_storage.remove_file(file_name=file_name)
61+
62+
if not result:
63+
raise NotFoundError("Requested file was not found.")
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
"""Download a file from provider storage use case."""
2+
# pylint: disable=duplicate-code
3+
import logging
4+
from django.contrib.auth.models import AbstractUser
5+
from api.access_policies.providers import ProviderAccessPolicy
6+
from api.repositories.providers import ProviderRepository
7+
from api.services.file_storage import FileStorage, WorkingDir
8+
from api.repositories.functions import FunctionRepository
9+
from api.domain.exceptions.not_found_error import NotFoundError
10+
11+
from api.models import RUN_PROGRAM_PERMISSION
12+
13+
logger = logging.getLogger("gateway.use_cases.files")
14+
15+
16+
class FilesProviderDownloadUseCase:
17+
"""
18+
Download a file from provider storage use case.
19+
"""
20+
21+
function_repository = FunctionRepository()
22+
provider_repository = ProviderRepository()
23+
working_dir = WorkingDir.PROVIDER_STORAGE
24+
25+
def execute(
26+
self,
27+
user: AbstractUser,
28+
provider_name: str,
29+
function_title: str,
30+
requested_file_name: str,
31+
):
32+
"""
33+
Download a file from provider storage.
34+
"""
35+
36+
provider = self.provider_repository.get_provider_by_name(name=provider_name)
37+
if provider is None or not ProviderAccessPolicy.can_access(
38+
user=user, provider=provider
39+
):
40+
raise NotFoundError(f"Provider {provider_name} doesn't exist.")
41+
42+
function = self.function_repository.get_function_by_permission(
43+
user=user,
44+
permission_name=RUN_PROGRAM_PERMISSION,
45+
function_title=function_title,
46+
provider_name=provider_name,
47+
)
48+
49+
if not function:
50+
raise NotFoundError(
51+
f"Qiskit Function {provider_name}/{function_title} doesn't exist."
52+
)
53+
54+
file_storage = FileStorage(
55+
username=user.username,
56+
working_dir=self.working_dir,
57+
function_title=function_title,
58+
provider_name=provider_name,
59+
)
60+
result = file_storage.get_file(file_name=requested_file_name)
61+
62+
if result is None:
63+
raise NotFoundError("Requested file was not found.")
64+
65+
return result
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
"""List all files on the provider storage use case."""
2+
# pylint: disable=duplicate-code
3+
import logging
4+
from django.contrib.auth.models import AbstractUser
5+
from api.access_policies.providers import ProviderAccessPolicy
6+
from api.services.file_storage import FileStorage, WorkingDir
7+
from api.repositories.functions import FunctionRepository
8+
from api.repositories.providers import ProviderRepository
9+
from api.domain.exceptions.not_found_error import NotFoundError
10+
11+
from api.models import RUN_PROGRAM_PERMISSION
12+
13+
logger = logging.getLogger("gateway.use_cases.files")
14+
15+
16+
class FilesProviderListUseCase:
17+
"""
18+
List all files on the provider storage use case.
19+
"""
20+
21+
function_repository = FunctionRepository()
22+
provider_repository = ProviderRepository()
23+
working_dir = WorkingDir.PROVIDER_STORAGE
24+
25+
def execute(self, user: AbstractUser, provider_name: str, function_title: str):
26+
"""
27+
List all files on the provider storage.
28+
"""
29+
30+
provider = self.provider_repository.get_provider_by_name(name=provider_name)
31+
if provider is None or not ProviderAccessPolicy.can_access(
32+
user=user, provider=provider
33+
):
34+
raise NotFoundError(f"Provider {provider_name} doesn't exist.")
35+
36+
function = self.function_repository.get_function_by_permission(
37+
user=user,
38+
permission_name=RUN_PROGRAM_PERMISSION,
39+
function_title=function_title,
40+
provider_name=provider_name,
41+
)
42+
43+
if not function:
44+
raise NotFoundError(
45+
f"Qiskit Function {provider_name}/{function_title} doesn't exist."
46+
)
47+
48+
file_storage = FileStorage(
49+
username=user.username,
50+
working_dir=self.working_dir,
51+
function_title=function_title,
52+
provider_name=provider_name,
53+
)
54+
55+
return file_storage.get_files()

0 commit comments

Comments
 (0)