scanfile/server/web/index.go

75 lines
2.3 KiB
Go

package web
import (
"io"
"log/slog"
"net/http"
"git.jmbit.de/jmb/scanfile/server/internal/database"
"git.jmbit.de/jmb/scanfile/server/internal/processing"
"github.com/spf13/viper"
)
func IndexWebHandler(w http.ResponseWriter, r *http.Request) {
files, err := database.GetAllFiles()
if err != nil {
slog.Error("Error in IndexWebHandler", "error", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
component := Index(files)
err = component.Render(r.Context(), w)
if err != nil {
slog.Error("Error rendering in IndexWebHandler", "error", err)
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
}
// IndexUploadHandler handles the upload of a new file
func IndexUploadHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodPost {
http.Error(w, "Only POST allowed", http.StatusBadRequest)
return
}
maxUploadSize := viper.GetInt64("web.maxfilesizemb") * 1024 * 1024
r.Body = http.MaxBytesReader(w, r.Body, maxUploadSize)
defer r.Body.Close()
fileData, fileHeader, err := r.FormFile("file")
if err != nil {
slog.Error("Error parsing form in IndexUploadHandler", "error", err)
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
slog.Debug("File form submitted", "file-name", fileHeader.Filename, "file-size", fileHeader.Size)
fileBytes, err := io.ReadAll(fileData)
if err != nil {
slog.Error("Error reading file in IndexUploadHandler", "error", err)
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
slog.Debug("File from form read", "file-name", fileHeader.Filename, "file-size", len(fileBytes))
file, err := database.CreateFile(r.Context(), fileHeader.Filename, fileBytes)
if err != nil {
slog.Error("Error saving file in IndexUploadHandler", "error", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
err = processing.Submit(r.Context(), file.ID)
if err != nil {
slog.Error("Error submitting file for processing in IndexUploadHandler", "error", err)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
//w.Header().Set("HX-Redirect", fmt.Sprintf("/files/%s", file.ID.String()))
component := UploadSuccessCard(file)
err = component.Render(r.Context(), w)
if err != nil {
slog.Error("Error rendering in IndexUploadHandler", "error", err)
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
}