|
|
@ -1,9 +1,12 @@ |
|
|
|
package main |
|
|
|
|
|
|
|
import ( |
|
|
|
"bytes" |
|
|
|
"encoding/json" |
|
|
|
"net/http" |
|
|
|
|
|
|
|
"io" |
|
|
|
|
|
|
|
"github.com/geplauder/lithium/middlewares" |
|
|
|
"github.com/geplauder/lithium/pipelines" |
|
|
|
"github.com/geplauder/lithium/settings" |
|
|
@ -39,12 +42,106 @@ func IndexHandler(w http.ResponseWriter, r *http.Request) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func RegisterPipelineRoutes(r *mux.Router, pipelines []pipelines.IPipeline, storageProvider storage.IStorageProvider) { |
|
|
|
func writeError(w http.ResponseWriter, status int, errStr string) { |
|
|
|
w.WriteHeader(status) |
|
|
|
json.NewEncoder(w).Encode(struct { |
|
|
|
Error string `json:"error"` |
|
|
|
}{errStr}) |
|
|
|
} |
|
|
|
|
|
|
|
func UploadHandler(w http.ResponseWriter, r *http.Request, pipes []pipelines.IPipeline, storageProvider storage.IStorageProvider) { |
|
|
|
// open file handler
|
|
|
|
formFile, handler, err := r.FormFile("file") |
|
|
|
if err != nil { |
|
|
|
writeError(w, http.StatusUnprocessableEntity, err.Error()) |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
defer formFile.Close() |
|
|
|
|
|
|
|
// check pipelines form param
|
|
|
|
formPipeline := r.FormValue("pipeline") |
|
|
|
if formPipeline == "" { |
|
|
|
writeError(w, http.StatusUnprocessableEntity, "pipeline parameter missing") |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
var execPipe pipelines.IPipeline |
|
|
|
for _, pipe := range pipes { |
|
|
|
if formPipeline == pipe.GetSlug() { |
|
|
|
execPipe = pipe |
|
|
|
break |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if execPipe == nil { |
|
|
|
writeError(w, http.StatusUnprocessableEntity, "pipeline not found") |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
bucket := r.FormValue("bucket") |
|
|
|
if bucket == "" { |
|
|
|
writeError(w, http.StatusUnprocessableEntity, "bucket parameter missing") |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
// open file
|
|
|
|
file, err := handler.Open() |
|
|
|
if err != nil { |
|
|
|
writeError(w, http.StatusInternalServerError, "error reading uploaded file") |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
defer file.Close() |
|
|
|
|
|
|
|
// read file to buffer
|
|
|
|
buf := bytes.NewBuffer(nil) |
|
|
|
_, err = io.Copy(buf, file) |
|
|
|
if err != nil { |
|
|
|
writeError(w, http.StatusInternalServerError, "error reading file from buffer") |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
// store uploaded file
|
|
|
|
_, err = storageProvider.StoreRaw(bucket, "source.jpg", buf.Bytes()) |
|
|
|
if err != nil { |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
// execute pipeline
|
|
|
|
output, err := execPipe.Run("source.jpg", bucket, storageProvider) |
|
|
|
if err != nil { |
|
|
|
writeError(w, http.StatusInternalServerError, "error executing pipeline") |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
w.Header().Set("Content-Type", "application/json") |
|
|
|
|
|
|
|
err = json.NewEncoder(w).Encode(struct { |
|
|
|
Message string `json:"message"` |
|
|
|
OutputFiles []string `json:"output_files"` |
|
|
|
}{"ok", []string{output}}) |
|
|
|
|
|
|
|
if err != nil { |
|
|
|
w.WriteHeader(http.StatusInternalServerError) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func RegisterRoutes(r *mux.Router, pipelines []pipelines.IPipeline, storageProvider storage.IStorageProvider) { |
|
|
|
r.HandleFunc("/", IndexHandler).Methods("GET") |
|
|
|
r.HandleFunc("/upload", func(w http.ResponseWriter, r *http.Request) { |
|
|
|
UploadHandler(w, r, pipelines, storageProvider) |
|
|
|
}).Methods("POST") |
|
|
|
r.HandleFunc("/pipelines/{pipeline}", func(w http.ResponseWriter, r *http.Request) { |
|
|
|
for _, pipeline := range pipelines { |
|
|
|
r.HandleFunc("/"+pipeline.GetSlug(), func(w http.ResponseWriter, r *http.Request) { |
|
|
|
if pipeline.GetSlug() == mux.Vars(r)["pipeline"] { |
|
|
|
PipelineHandler(pipeline, storageProvider, w, r) |
|
|
|
}) |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
w.WriteHeader(404) |
|
|
|
}).Methods("GET") |
|
|
|
} |
|
|
|
|
|
|
|
func main() { |
|
|
@ -82,7 +179,7 @@ func main() { |
|
|
|
|
|
|
|
r.HandleFunc("/", IndexHandler) |
|
|
|
|
|
|
|
RegisterPipelineRoutes(r, pipes, storageProvider) |
|
|
|
RegisterRoutes(r, pipes, storageProvider) |
|
|
|
|
|
|
|
err = http.ListenAndServe(appSettings.Endpoint, r) |
|
|
|
if err != nil { |
|
|
|