1
+ from curses import meta
1
2
import logging
3
+ from turtle import down
2
4
3
5
from fastapi import Request , Depends , File , UploadFile
6
+ from fastapi .responses import StreamingResponse
4
7
from fastapi .concurrency import run_in_threadpool
5
8
from fastapi_utils .cbv import cbv
6
9
from fastapi .security import HTTPBearer , HTTPAuthorizationCredentials
7
10
from fastapi_utils .inferring_router import InferringRouter
11
+
12
+
13
+ from spaceone .core import utils
8
14
from spaceone .core .fastapi .api import BaseAPI , exception_handler
9
15
from spaceone .file_manager .manager .file_connector_manager import FileConnectorManager
10
-
11
16
from spaceone .file_manager .service .file_service import FileService
17
+ from spaceone .file_manager .error import *
12
18
13
19
_LOGGER = logging .getLogger (__name__ )
14
20
_AUTH_SCHEME = HTTPBearer (auto_error = False )
@@ -24,44 +30,184 @@ class Files(BaseAPI):
24
30
@router .post ("/public/upload" )
25
31
@exception_handler
26
32
async def upload_public_file (self , request : Request , file : UploadFile = File (...)):
27
- metadata = {
33
+
34
+ params = {
28
35
"token" : self .token .credentials ,
36
+ "name" : file .filename ,
37
+ "resource_group" : "SYSTEM" ,
29
38
}
39
+ file_svc = FileService ()
40
+ response : dict = file_svc .add (params )
41
+
42
+ download_url = self .get_download_url (response )
43
+
44
+ # Update File
45
+ file_conn_mgr = FileConnectorManager ()
46
+ # file_conn_mgr.upload_file(download_url, await file.read())
47
+ await run_in_threadpool (file_conn_mgr .upload_file , download_url , await file .read ())
48
+
49
+ response ["download_url" ] = download_url
50
+ file_svc .update (response )
51
+ return response
52
+
53
+ @router .get ("/public/{file_id}" )
54
+ @exception_handler
55
+ async def download_public_file (self , request : Request , file_id : str ):
30
56
31
57
params = {
32
- "name" : file .filename ,
33
- "resource_group" : "SYSTEM" ,
58
+ "token" : self .token .credentials ,
59
+ "file_id" : file_id ,
60
+ "resource_group" :"SYSTEM" ,
34
61
}
35
62
36
- file_svc = FileService (metadata )
37
- response : dict = await run_in_threadpool ( file_svc .add , params )
63
+ file_svc = FileService ()
64
+ file_vo : dict = file_svc .get ( params )
38
65
39
- file_id = response .get ("file_id" )
66
+ download_url = file_vo ["download_url" ]
67
+ if not download_url :
68
+ raise ERROR_FILE_DOWNLOAD_URL_EXIST (file_id = file_id )
40
69
41
70
file_conn_mgr = FileConnectorManager ()
71
+ file_stream = await run_in_threadpool (file_conn_mgr .download_file , download_url )
72
+ if not file_stream :
73
+ raise ERROR_FILE_DOWNLOAD_FAILED (file_id = file_vo ["file_id" ])
74
+
75
+ return StreamingResponse (
76
+ content = file_stream ,
77
+ media_type = "application/octet-stream" ,
78
+ headers = {"Content-Disposition" : f"attachment; filename={ file_vo ["name" ]} " }
79
+ )
80
+
81
+ @router .post ("/domain/{domain_id}/upload" )
82
+ @exception_handler
83
+ async def upload_domain_file (self , domain_id , request : Request , file : UploadFile = File (...)):
84
+
85
+
86
+ params = {
87
+ "token" : self .token .credentials ,
88
+ "name" : file .filename ,
89
+ "domain_id" : domain_id ,
90
+ "resource_group" : "DOMAIN" ,
91
+ }
92
+ file_svc = FileService ()
93
+ response : dict = file_svc .add (params )
94
+
95
+ download_url = self .get_download_url (response )
96
+
42
97
# Update File
43
- # file_id = file_vo.file_id
98
+ file_conn_mgr = FileConnectorManager ()
99
+ await run_in_threadpool (file_conn_mgr .upload_file , download_url , await file .read ())
44
100
101
+ response ["download_url" ] = download_url
102
+ response = file_svc .update (response )
45
103
return response
46
104
47
- @router .get ("/public /{file_id}" )
105
+ @router .get ("/domain/{domain_id} /{file_id}" )
48
106
@exception_handler
49
- async def download_public_file (self , request : Request , file_id : str ):
50
- metadata = {
107
+ async def download_domain_file (self , domain_id :str , file_id :str , request : Request ) -> StreamingResponse :
108
+
109
+ try :
110
+ params = {
111
+ "token" : self .token .credentials ,
112
+ "file_id" : file_id ,
113
+ "domain_id" : domain_id ,
114
+ "resource_group" :"DOMAIN" ,
115
+ }
116
+
117
+ file_svc = FileService ()
118
+ file_vo : dict = file_svc .get (params )
119
+
120
+ download_url = file_vo ["download_url" ]
121
+ if not download_url :
122
+ raise ERROR_FILE_DOWNLOAD_URL_EXIST (file_id = file_id )
123
+
124
+ file_conn_mgr = FileConnectorManager ()
125
+ file_stream = await run_in_threadpool (file_conn_mgr .download_file , download_url )
126
+ if not file_stream :
127
+ raise ERROR_FILE_DOWNLOAD_FAILED (file_id = file_vo ["file_id" ])
128
+
129
+ return StreamingResponse (
130
+ content = file_stream ,
131
+ media_type = "binary/octet-stream" ,
132
+ headers = {"Content-Disposition" : f"attachment; filename={ file_vo ["name" ]} " }
133
+ )
134
+ except Exception as e :
135
+ raise ERROR_FILE_DOWNLOAD_FAILED (file_id = file_id )
136
+
137
+ @router .post ("/domain/{domain_id}/workspace/{workspace_id}/upload" )
138
+ @exception_handler
139
+ async def upload_workspace_file (self , domain_id :str , workspace_id :str , request : Request , file : UploadFile = File (...)):
140
+
141
+ params = {
51
142
"token" : self .token .credentials ,
143
+ "name" : file .filename ,
144
+ "domain_id" : domain_id ,
145
+ "workspace_id" : workspace_id ,
146
+ "resource_group" : "WORKSPACE" ,
52
147
}
148
+ file_svc = FileService ()
149
+ response : dict = file_svc .add (params )
150
+
151
+ download_url = self .get_download_url (response )
152
+
153
+ # Update File
154
+ file_conn_mgr = FileConnectorManager ()
155
+ await run_in_threadpool (file_conn_mgr .upload_file , download_url , await file .read ())
156
+
157
+ response ["download_url" ] = download_url
158
+ file_svc .update (response )
159
+ return response
160
+
161
+ @router .get ("/domain/{domain_id}/workspace/{workspace_id}/{file_id}" )
162
+ @exception_handler
163
+ async def download_workspace_file (self , domain_id :str , workspace_id :str , file_id :str , request : Request ):
53
164
54
165
params = {
166
+ "token" : self .token .credentials ,
55
167
"file_id" : file_id ,
168
+ "domain_id" : domain_id ,
169
+ "workspace_id" : workspace_id ,
170
+ "resource_group" : "WORKSPACE" ,
56
171
}
57
172
58
- file_svc = FileService (metadata )
59
- response : dict = await run_in_threadpool (file_svc .get , params )
60
-
61
- file_id = response .get ("file_id" )
173
+ file_svc = FileService ()
174
+ file_vo : dict = file_svc .get (params )
62
175
176
+ download_url = file_vo ["download_url" ]
177
+ if not download_url :
178
+ raise ERROR_FILE_DOWNLOAD_URL_EXIST (file_id = file_id )
179
+
180
+
63
181
file_conn_mgr = FileConnectorManager ()
64
- # Update File
65
- # file_id = file_vo.file_id
66
-
67
- return response
182
+ file_stream = await run_in_threadpool (file_conn_mgr .download_file , download_url )
183
+ if not file_stream :
184
+ raise ERROR_FILE_DOWNLOAD_FAILED (file_id = file_vo ["file_id" ])
185
+
186
+ return StreamingResponse (
187
+ content = file_stream ,
188
+ media_type = "binary/octet-stream" ,
189
+ headers = {"Content-Disposition" : f"attachment; filename={ file_vo ["name" ]} " }
190
+ )
191
+
192
+ def get_download_url (self , response : dict ) -> str :
193
+
194
+ resource_group = response ["resource_group" ]
195
+ file_id = response ["file_id" ]
196
+
197
+ if resource_group == "SYSTEM" :
198
+ download_url = "/files/public/" + file_id
199
+ elif resource_group == "DOMAIN" :
200
+ domain_id = response ["domain_id" ]
201
+ download_url = "/files/domain/" + domain_id + "/" + file_id
202
+ elif resource_group == "WORKSPACE" :
203
+ domain_id = response ["domain_id" ]
204
+ workspace_id = response ["workspace_id" ]
205
+ download_url = "/files/domain/" + domain_id + "/workspace/" + workspace_id + "/" + file_id
206
+ elif resource_group == "PROJECT" :
207
+ domain_id = response ["domain_id" ]
208
+ user_id = response ["user_id" ]
209
+ download_url = "/files/domain/" + domain_id + "/user/" + user_id + "/" + file_id
210
+ else :
211
+ raise ERROR_NOT_SUPPORTED_RESOURCE_GROUP (resource_group = resource_group )
212
+
213
+ return download_url
0 commit comments