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 (
 | 
					import (
 | 
				
			||||||
	"net/http"
 | 
						"net/http"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"git.jmbit.de/jmb/scanfile/server/api"
 | 
				
			||||||
	"git.jmbit.de/jmb/scanfile/server/web"
 | 
						"git.jmbit.de/jmb/scanfile/server/web"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func RegisterRoutes() *http.ServeMux {
 | 
					func RegisterRoutes() *http.ServeMux {
 | 
				
			||||||
	mux := http.NewServeMux()
 | 
						mux := http.NewServeMux()
 | 
				
			||||||
 | 
					  // Web interface
 | 
				
			||||||
	mux.HandleFunc("/", web.IndexWebHandler)
 | 
						mux.HandleFunc("/", web.IndexWebHandler)
 | 
				
			||||||
	mux.HandleFunc("/about", web.AboutWebHandler)
 | 
						mux.HandleFunc("/about", web.AboutWebHandler)
 | 
				
			||||||
	mux.HandleFunc("/files/{uuid}", web.FileViewWebHandler)
 | 
						mux.HandleFunc("/files/{uuid}", web.FileViewWebHandler)
 | 
				
			||||||
	mux.HandleFunc("POST /upload", web.IndexUploadHandler)
 | 
						mux.HandleFunc("POST /upload", web.IndexUploadHandler)
 | 
				
			||||||
	mux.Handle("/assets/", http.FileServer(http.FS(web.Files)))
 | 
						mux.Handle("/assets/", http.FileServer(http.FS(web.Files)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // REST API
 | 
				
			||||||
 | 
					  mux.HandleFunc("/api/v0/submit", api.SubmitRestHandler)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return mux
 | 
						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