Files

49 lines
1.4 KiB
Go

package api
import (
"errors"
"net/http"
"rawmark/internal/i18n"
"rawmark/internal/vault"
)
func (s *Server) importNotes(w http.ResponseWriter, r *http.Request) {
// The total request limit includes form overhead; vault validates the aggregate file size separately.
r.Body = http.MaxBytesReader(w, r.Body, vault.MaxImportBytes+(1<<20))
if err := r.ParseMultipartForm(8 << 20); err != nil {
var limit *http.MaxBytesError
if errors.As(err, &limit) {
writeError(w, 413, message(w, "total_import_size_must_not_23ac37"))
} else {
writeError(w, 400, message(w, "could_not_read_import_form_69f1c3"))
}
return
}
defer r.MultipartForm.RemoveAll()
headers := r.MultipartForm.File["files"]
if len(headers) == 0 || len(headers) > 10_000 {
writeError(w, 400, message(w, "choose_markdown_files_or_a_bea10e"))
return
}
files := make([]vault.ImportFile, 0, len(headers))
for _, h := range headers {
f, err := h.Open()
if err != nil {
internalError(w, r, err)
return
}
defer f.Close()
files = append(files, vault.ImportFile{Name: h.Filename, Reader: f, Size: h.Size})
}
result, err := s.vault.Import(r.Context(), r.FormValue("dir"), r.FormValue("folder"), files)
if err != nil {
vaultError(w, r, err)
return
}
for i, warning := range result.WarningMessages {
result.Warnings[i] = i18n.RenderError(warning, responseLocale(w))
}
writeJSON(w, http.StatusCreated, result)
}