package handlers import ( "errors" "net/http" "strconv" "warpbox.dev/backend/libs/helpers" "warpbox.dev/backend/libs/services" ) func (a *App) Upload(w http.ResponseWriter, r *http.Request) { r.Body = http.MaxBytesReader(w, r.Body, a.uploadService.MaxUploadSize()*8) if err := r.ParseMultipartForm(a.uploadService.MaxUploadSize() * 8); err != nil { helpers.WriteJSONError(w, http.StatusBadRequest, "upload form could not be read") return } files := r.MultipartForm.File["file"] result, err := a.uploadService.CreateBox(files, services.UploadOptions{ MaxDays: parseInt(r.FormValue("max_days")), MaxDownloads: parseInt(r.FormValue("max_downloads")), Password: r.FormValue("password"), ObfuscateMetadata: r.FormValue("obfuscate_metadata") == "on", }) if err != nil { a.logger.Warn("upload failed", "source", "user-upload", "severity", "warn", "code", 4001, "error", err.Error()) helpers.WriteJSONError(w, http.StatusBadRequest, err.Error()) return } helpers.WriteJSON(w, http.StatusCreated, result) } func parseInt(value string) int { if value == "" { return 0 } parsed, err := strconv.Atoi(value) if err != nil { return 0 } return parsed } func statusForDownloadError(err error) int { if errors.Is(err, http.ErrMissingFile) { return http.StatusNotFound } return http.StatusForbidden }