package api import ( "encoding/json" "io" "log/slog" "net/http" "git.jmbit.de/jmb/scanfile/server/internal/database" "git.jmbit.de/jmb/scanfile/server/internal/processing" "git.jmbit.de/jmb/scanfile/server/internal/utils" "github.com/spf13/viper" ) func SubmitRestHandler(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { http.Error(w, "Only POST allowed", http.StatusBadRequest) return } err := r.ParseMultipartForm(viper.GetInt64("web.maxfilesizemb") * 1024 * 1024) if err != nil { slog.Error("Error parsing form in SubmitRestHandler", "error", err) utils.WriteJSONError(w, err.Error(), http.StatusBadRequest) return } fileData, fileHeader, err := r.FormFile("file") if err != nil { slog.Error("Error parsing form in SubmitRestHandler", "error", err) utils.WriteJSONError(w, err.Error(), http.StatusBadRequest) return } fileBytes, err := io.ReadAll(fileData) if err != nil { slog.Error("Error reading file in SubmitRestHandler", "error", err) utils.WriteJSONError(w, err.Error(), http.StatusBadRequest) return } file, err := database.CreateFile(r.Context(), fileHeader.Filename, fileBytes) if err != nil { slog.Error("Error saving file in SubmitRestHandler", "error", err) utils.WriteJSONError(w, err.Error(), http.StatusInternalServerError) return } err = processing.Submit(r.Context(), file.ID) w.Header().Set("Content-Type", "application/json") enc := json.NewEncoder(w) enc.SetIndent("", " ") w.WriteHeader(http.StatusOK) err = enc.Encode(file) if err != nil { slog.Error("Error creating json encoder in SubmitRestHandler", "error", err) utils.WriteJSONError(w, err.Error(), http.StatusInternalServerError) return } }