added submission via REST api
This commit is contained in:
parent
33a2ddeafa
commit
5a87fcdc61
3 changed files with 91 additions and 0 deletions
58
server/api/submit.go
Normal file
58
server/api/submit.go
Normal file
|
@ -0,0 +1,58 @@
|
|||
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
|
||||
}
|
||||
|
||||
}
|
|
@ -3,15 +3,22 @@ package server
|
|||
import (
|
||||
"net/http"
|
||||
|
||||
"git.jmbit.de/jmb/scanfile/server/api"
|
||||
"git.jmbit.de/jmb/scanfile/server/web"
|
||||
)
|
||||
|
||||
func RegisterRoutes() *http.ServeMux {
|
||||
mux := http.NewServeMux()
|
||||
// Web interface
|
||||
mux.HandleFunc("/", web.IndexWebHandler)
|
||||
mux.HandleFunc("/about", web.AboutWebHandler)
|
||||
mux.HandleFunc("/files/{uuid}", web.FileViewWebHandler)
|
||||
mux.HandleFunc("POST /upload", web.IndexUploadHandler)
|
||||
mux.Handle("/assets/", http.FileServer(http.FS(web.Files)))
|
||||
|
||||
|
||||
// REST API
|
||||
mux.HandleFunc("/api/v0/submit", api.SubmitRestHandler)
|
||||
|
||||
return mux
|
||||
}
|
||||
|
|
26
server/internal/utils/jsonError.go
Normal file
26
server/internal/utils/jsonError.go
Normal file
|
@ -0,0 +1,26 @@
|
|||
package utils
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"log/slog"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
type ErrorResponse struct {
|
||||
Message string `json:"message"`
|
||||
Code int `json:"code,omitempty"`
|
||||
}
|
||||
|
||||
|
||||
|
||||
func WriteJSONError(w http.ResponseWriter, message string, statusCode int) {
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
w.WriteHeader(statusCode)
|
||||
errorRes := ErrorResponse{Message: message, Code: statusCode}
|
||||
enc := json.NewEncoder(w)
|
||||
enc.SetIndent("", " ")
|
||||
err := enc.Encode(errorRes) // Encode and write the JSON response
|
||||
if err != nil {
|
||||
slog.Error("Error in WriteJSONError", "error", err)
|
||||
}
|
||||
}
|
Loading…
Add table
Reference in a new issue