package upload import ( "RenewCMS/api/pkg/apperr" "RenewCMS/internal/domain/image" "errors" "net/http" ) const multipartOverheadAllowance = 1 << 20 const fileField = "file" func ReadImageInput(w http.ResponseWriter, r *http.Request, uploadedById uint32) (image.ImageInput, func(), bool) { r.Body = http.MaxBytesReader(w, r.Body, image.MaxImageSize+multipartOverheadAllowance) file, header, err := r.FormFile(fileField) if err != nil { var tooLarge *http.MaxBytesError if errors.As(err, &tooLarge) { http.Error(w, image.ErrImageTooLarge.Error(), http.StatusRequestEntityTooLarge) return image.ImageInput{}, nil, false } http.Error(w, apperr.BodyErrorMessage, http.StatusBadRequest) return image.ImageInput{}, nil, false } input := image.ImageInput{ Content: file, Filename: header.Filename, Size: header.Size, ContentType: header.Header.Get("Content-Type"), UploadedByID: uploadedById, } return input, func() { _ = file.Close() }, true } func WriteCreateError(w http.ResponseWriter, err error) { switch { case errors.Is(err, image.ErrImageTypeNotAllowed): http.Error(w, err.Error(), http.StatusUnsupportedMediaType) case errors.Is(err, image.ErrImageTooLarge): http.Error(w, err.Error(), http.StatusRequestEntityTooLarge) case errors.Is(err, image.ErrImageUnreadable): http.Error(w, err.Error(), http.StatusBadRequest) default: http.Error(w, "Internal server error", http.StatusInternalServerError) } }