|
20 | 20 |
|
21 | 21 | from grpclib import GRPCError |
22 | 22 |
|
23 | | -from nitric.api.exception import exception_from_grpc_error |
| 23 | +from nitric.api.exception import exception_from_grpc_error, InvalidArgumentException |
24 | 24 | from nitric.utils import new_default_channel |
25 | | -from nitricapi.nitric.storage.v1 import StorageServiceStub |
| 25 | +from nitricapi.nitric.storage.v1 import StorageServiceStub, StoragePreSignUrlRequestOperation |
| 26 | +from enum import Enum |
26 | 27 |
|
27 | 28 |
|
28 | 29 | class Storage(object): |
@@ -59,6 +60,22 @@ def file(self, key: str): |
59 | 60 | return File(_storage=self._storage, _bucket=self.name, key=key) |
60 | 61 |
|
61 | 62 |
|
| 63 | +class FileMode(Enum): |
| 64 | + """Definition of available operation modes for file signed URLs.""" |
| 65 | + |
| 66 | + READ = 0 |
| 67 | + WRITE = 1 |
| 68 | + |
| 69 | + def to_request_operation(self) -> StoragePreSignUrlRequestOperation: |
| 70 | + """Convert FileMode to a StoragePreSignUrlRequestOperation""" |
| 71 | + if self == FileMode.READ: |
| 72 | + return StoragePreSignUrlRequestOperation.READ |
| 73 | + elif self == FileMode.WRITE: |
| 74 | + return StoragePreSignUrlRequestOperation.WRITE |
| 75 | + else: |
| 76 | + raise InvalidArgumentException("Invalid FileMode") |
| 77 | + |
| 78 | + |
62 | 79 | @dataclass(frozen=True, order=True) |
63 | 80 | class File(object): |
64 | 81 | """A reference to a file in a bucket, used to perform operations on that file.""" |
@@ -92,3 +109,13 @@ async def delete(self): |
92 | 109 | await self._storage._storage_stub.delete(bucket_name=self._bucket, key=self.key) |
93 | 110 | except GRPCError as grpc_err: |
94 | 111 | raise exception_from_grpc_error(grpc_err) |
| 112 | + |
| 113 | + async def sign_url(self, mode: FileMode = FileMode.READ, expiry: int = 3600): |
| 114 | + """Generated a signed url for reading or writing to a file""" |
| 115 | + |
| 116 | + try: |
| 117 | + await self._storage._storage_stub.pre_sign_url( |
| 118 | + bucket_name=self._bucket, key=self.key, operation=mode.to_request_operation(), expiry=expiry |
| 119 | + ) |
| 120 | + except GRPCError as grpc_err: |
| 121 | + raise exception_from_grpc_error(grpc_err) |
0 commit comments