@@ -29,26 +29,41 @@ func (s *Server) ReceiveFile(w http.ResponseWriter, r *http.Request) {
2929 user , name , _ := getModelVars (r )
3030
3131 console .Debug ("Received build request" )
32- streamLogger := logger .NewStreamLogger (r .Context (), w )
33- mod , err := s .ReceiveVersion (r , streamLogger , user , name )
32+ dir , err := s .UnzipInputToTempDir (r , user , name )
3433 if err != nil {
35- streamLogger . WriteError ( err )
34+ writeError ( w , http . StatusInternalServerError , "Failed to unzip input directory" )
3635 console .Error (err .Error ())
3736 return
3837 }
39- streamLogger .WriteVersion (mod )
40- }
4138
42- func (s * Server ) ReceiveVersion (r * http.Request , logWriter logger.Logger , user string , name string ) (* model.Version , error ) {
43- dir , err := s .UnzipInputToTempDir (r , user , name )
39+ id , err := ComputeID (dir )
4440 if err != nil {
45- return nil , err
41+ writeError (w , http .StatusInternalServerError , "Failed to compute version ID" )
42+ console .Error (err .Error ())
43+ return
44+ }
45+ version , err := s .db .GetVersion (user , name , id )
46+ if err != nil {
47+ writeError (w , http .StatusInternalServerError , "Failed to determine if version already exists" )
48+ console .Error (err .Error ())
49+ return
50+ }
51+ if version != nil {
52+ writeError (w , http .StatusConflict , "Model version %s already exists" , id )
53+ return
4654 }
4755
48- id , err := ComputeID (dir )
56+ logWriter := logger .NewStreamLogger (r .Context (), w )
57+ mod , err := s .ReceiveVersion (dir , id , logWriter , user , name )
4958 if err != nil {
50- return nil , err
59+ logWriter .WriteError (err )
60+ console .Error (err .Error ())
61+ return
5162 }
63+ logWriter .WriteVersion (mod )
64+ }
65+
66+ func (s * Server ) ReceiveVersion (dir string , id string , logWriter logger.Logger , user string , name string ) (* model.Version , error ) {
5267 logWriter .Debugf ("Received version %s" , id )
5368
5469 config , err := s .ReadConfig (dir )
@@ -339,3 +354,16 @@ func (s *Server) SendBuildLogs(w http.ResponseWriter, r *http.Request) {
339354 }
340355 }
341356}
357+
358+ func writeError (w http.ResponseWriter , statusCode int , format string , args ... interface {}) {
359+ var message string
360+ if len (args ) > 0 {
361+ message = fmt .Sprintf (format , args ... )
362+ } else {
363+ message = format
364+ }
365+ w .WriteHeader (statusCode )
366+ if _ , err := w .Write ([]byte (message )); err != nil {
367+ console .Error ("Failed to write to response writer" )
368+ }
369+ }
0 commit comments