scanfile/server/api/submit.go
2025-06-12 13:00:13 +02:00

58 lines
1.7 KiB
Go

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
}
}