@@ -2,13 +2,13 @@ package storageconn
22
33import (
44 "fmt"
5+ "mime"
56 "os"
67 "path/filepath"
8+ "strconv"
79 "testing_system/common/config"
810 "testing_system/common/connectors"
911 "testing_system/common/constants/resource"
10-
11- "github.com/go-resty/resty/v2"
1212)
1313
1414type Connector struct {
@@ -22,115 +22,171 @@ func NewConnector(connection *config.Connection) *Connector {
2222 return & Connector {connectors .NewConnectorBase (connection )}
2323}
2424
25- func (s * Connector ) Download (request * Request ) * ResponseFiles {
25+ func (s * Connector ) Download (request * Request ) * FileResponse {
26+ response := NewFileResponse (* request )
27+
2628 if err := os .MkdirAll (request .BaseFolder , 0775 ); err != nil {
27- return & ResponseFiles {Response : Response {R : * request , Error : fmt .Errorf ("failed to create base folder: %v" , err )}}
29+ response .Error = fmt .Errorf ("failed to create base folder: %v" , err )
30+ return response
2831 }
2932
30- path := fmt .Sprintf ("/storage/get?id=%d&dataType=%s&filepath=%s" ,
31- getIDForResource (request ),
32- getDataTypeForResource (request .Resource ),
33- request .Resource .String (),
34- )
35-
33+ path := "/storage/get"
3634 r := s .connection .R ()
37- resp , err := r .Execute (resty .MethodGet , path )
35+
36+ params , err := getStorageParams (request )
37+
38+ if err != nil {
39+ response .Error = fmt .Errorf ("failed to form storage request: %v" , err )
40+ return response
41+ }
42+
43+ r .SetQueryParams (map [string ]string {
44+ "id" : params .id ,
45+ "dataType" : params .dataType ,
46+ "filepath" : params .filepath ,
47+ })
48+
49+ resp , err := r .Get (path )
3850 if err != nil {
39- return & ResponseFiles {Response : Response {R : * request , Error : fmt .Errorf ("failed to send request: %v" , err )}}
51+ response .Error = fmt .Errorf ("failed to send request: %v" , err )
52+ return response
4053 }
4154
4255 if resp .IsError () {
43- return & ResponseFiles {Response : Response {R : * request , Error : fmt .Errorf ("request failed with status: %v" , resp .Status ())}}
56+ response .Error = fmt .Errorf ("get request failed with status: %v" , resp .Status ())
57+ return response
4458 }
4559
46- filename := request . Resource . String ()
60+ filename := ""
4761 if request .CustomFilename != "" {
4862 filename = request .CustomFilename
63+ } else {
64+ // Extract filename from Content-Disposition header
65+ contentDisposition := resp .Header ().Get ("Content-Disposition" )
66+ if contentDisposition != "" {
67+ _ , params , err := mime .ParseMediaType (contentDisposition )
68+ if err == nil && params ["filename" ] != "" {
69+ filename = params ["filename" ]
70+ }
71+ }
72+ }
73+
74+ if filename == "" {
75+ response .Error = fmt .Errorf ("can't extract filename from CustomFilename or Content-Disposition header" )
76+ return response
4977 }
5078
51- filepath := filepath .Join (request .BaseFolder , filename )
52- err = os .WriteFile (filepath , resp .Body (), 0644 )
79+ filePath := filepath .Join (request .BaseFolder , filename )
80+ err = os .WriteFile (filePath , resp .Body (), 0644 )
5381 if err != nil {
54- return & ResponseFiles {Response : Response {R : * request , Error : fmt .Errorf ("failed to write file: %v" , err )}}
82+ response .Error = fmt .Errorf ("failed to write file: %v" , err )
83+ return response
5584 }
5685
57- responseFiles := NewResponseFiles ( * request )
58- responseFiles . fileNames = [] string { filename }
59- responseFiles .Size = uint64 (len (resp .Body ()))
60- return responseFiles
86+ response . Filename = filename
87+ response . BaseFolder = request . BaseFolder
88+ response .Size = uint64 (len (resp .Body ()))
89+ return response
6190}
6291
6392func (s * Connector ) Upload (request * Request ) * Response {
64- if len (request .Files ) == 0 {
65- return & Response {R : * request , Error : fmt .Errorf ("no files to upload" )}
66- }
93+ response := & Response {R : * request }
6794
68- path := fmt .Sprintf ("/storage/upload?id=%d&dataType=%s&filepath=%s" ,
69- getIDForResource (request ),
70- getDataTypeForResource (request .Resource ),
71- request .Resource .String (),
72- )
95+ if request .File == nil {
96+ response .Error = fmt .Errorf ("file for upload is not specified" )
97+ return response
98+ }
7399
100+ path := "/storage/upload"
74101 r := s .connection .R ()
75- for filename , reader := range request .Files {
76- r .SetFileReader ("file" , filename , reader )
102+
103+ params , err := getStorageParams (request )
104+
105+ if err != nil {
106+ response .Error = fmt .Errorf ("failed to form storage request: %v" , err )
107+ return response
77108 }
78109
79- resp , err := r .Execute (resty .MethodPost , path )
110+ r .SetFormData (map [string ]string {
111+ "id" : params .id ,
112+ "dataType" : params .dataType ,
113+ "filepath" : params .filepath ,
114+ })
115+
116+ r .SetFileReader ("file" , request .Filename , request .File )
117+
118+ resp , err := r .Post (path )
80119 if err != nil {
81- return & Response {R : * request , Error : fmt .Errorf ("failed to send request: %v" , err )}
120+ response .Error = fmt .Errorf ("failed to send request: %v" , err )
121+ return response
82122 }
83123
84124 if resp .IsError () {
85- return & Response {R : * request , Error : fmt .Errorf ("request failed with status: %s, body: %s" , resp .Status (), resp .String ())}
125+ response .Error = fmt .Errorf ("upload failed with status: %v" , resp .Status ())
126+ return response
86127 }
87128
88- return & Response { R : * request }
129+ return response
89130}
90131
91132func (s * Connector ) Delete (request * Request ) * Response {
92- path := fmt .Sprintf ("/storage/remove?id=%d&dataType=%s&filepath=%s" ,
93- getIDForResource (request ),
94- getDataTypeForResource (request .Resource ),
95- request .Resource .String (),
96- )
133+ response := & Response {R : * request }
97134
135+ path := "/storage/remove"
98136 r := s .connection .R ()
99- resp , err := r .Execute (resty .MethodDelete , path )
137+
138+ params , err := getStorageParams (request )
139+
100140 if err != nil {
101- return & Response {R : * request , Error : fmt .Errorf ("failed to send request: %v" , err )}
141+ response .Error = fmt .Errorf ("failed to form storage request: %v" , err )
142+ return response
143+ }
144+
145+ r .SetFormData (map [string ]string {
146+ "id" : params .id ,
147+ "dataType" : params .dataType ,
148+ "filepath" : params .filepath ,
149+ })
150+
151+ resp , err := r .Delete (path )
152+ if err != nil {
153+ response .Error = fmt .Errorf ("failed to send request: %v" , err )
154+ return response
102155 }
103156
104157 if resp .IsError () {
105- return & Response {R : * request , Error : fmt .Errorf ("request failed with status: %s, body: %s" , resp .Status (), resp .String ())}
158+ response .Error = fmt .Errorf ("delete failed with status: %v" , resp .Status ())
159+ return response
106160 }
107161
108- return & Response { R : * request }
162+ return response
109163}
110164
111- func getIDForResource (request * Request ) uint64 {
112- switch request .Resource {
113- case resource .SourceCode , resource .CompiledBinary , resource .CompileOutput :
114- return request .SubmitID
115- case resource .Checker , resource .Interactor :
116- return request .ProblemID
117- case resource .Test :
118- if request .TestID > 0 {
119- return request .TestID
120- }
121- return request .ProblemID
122- default :
123- return 0
124- }
165+ type storageParams struct {
166+ id string
167+ dataType string
168+ filepath string
125169}
126170
127- func getDataTypeForResource (resourceType resource.Type ) string {
128- switch resourceType {
171+ func getStorageParams (request * Request ) (storageParams , error ) {
172+ params := storageParams {}
173+ switch request .Resource {
174+ case resource .Checker , resource .Interactor :
175+ params .dataType = "problem"
176+ params .filepath = request .Resource .String ()
177+ params .id = strconv .FormatUint (request .ProblemID , 10 )
178+ return params , nil
129179 case resource .SourceCode , resource .CompiledBinary , resource .CompileOutput :
130- return "submission"
131- case resource .Checker , resource .Interactor , resource .Test :
132- return "problem"
180+ params .dataType = "submission"
181+ params .filepath = request .Resource .String ()
182+ params .id = strconv .FormatUint (request .SubmitID , 10 )
183+ return params , nil
184+ case resource .Test :
185+ params .dataType = "problem"
186+ params .filepath = "tests/" + strconv .FormatUint (request .TestID , 10 )
187+ params .id = strconv .FormatUint (request .ProblemID , 10 )
188+ return params , nil
133189 default :
134- return "unknown"
190+ return params , fmt . Errorf ( "unknown resource type: %s" , request . Resource . String ())
135191 }
136192}
0 commit comments