mirror of
https://github.com/gotenberg/gotenberg.git
synced 2026-08-08 00:22:14 +01:00
66 lines
1.5 KiB
Go
66 lines
1.5 KiB
Go
package api
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
"os"
|
|
|
|
"github.com/labstack/echo"
|
|
"github.com/thecodingmachine/gotenberg/internal/pkg/printer"
|
|
"github.com/thecodingmachine/gotenberg/internal/pkg/rand"
|
|
)
|
|
|
|
func merge(c echo.Context) error {
|
|
r, err := newResource(c)
|
|
if err != nil {
|
|
return hijackErr(err, r)
|
|
}
|
|
fpaths, err := r.filePaths([]string{".pdf"})
|
|
if err != nil {
|
|
return hijackErr(err, r)
|
|
}
|
|
if len(fpaths) == 0 {
|
|
return hijackErr(errors.New("no suitable PDF files to merge"), r)
|
|
}
|
|
baseFilename, err := rand.Get()
|
|
if err != nil {
|
|
return hijackErr(fmt.Errorf("getting result file name: %v", err), r)
|
|
}
|
|
filename := fmt.Sprintf("%s.pdf", baseFilename)
|
|
fpath := fmt.Sprintf("%s/%s", r.dirPath, filename)
|
|
if r.webhookURL() == "" {
|
|
defer r.removeAll()
|
|
// if no webhook URL given, run merge
|
|
// and directly return the resulting PDF file
|
|
// or an error.
|
|
if err := printer.Merge(fpaths, fpath); err != nil {
|
|
return err
|
|
}
|
|
return c.Attachment(fpath, filename)
|
|
}
|
|
// as a webhook URL has been given, we
|
|
// run the following lines in a goroutine so that
|
|
// it doesn't block.
|
|
go func() {
|
|
defer r.removeAll()
|
|
if err := printer.Merge(fpaths, fpath); err != nil {
|
|
c.Logger().Errorf("%v", err)
|
|
return
|
|
}
|
|
f, err := os.Open(fpath)
|
|
if err != nil {
|
|
c.Logger().Errorf("%v", err)
|
|
return
|
|
}
|
|
defer f.Close()
|
|
resp, err := http.Post(r.webhookURL(), "application/pdf", f)
|
|
if err != nil {
|
|
c.Logger().Errorf("%v", err)
|
|
return
|
|
}
|
|
defer resp.Body.Close()
|
|
}()
|
|
return nil
|
|
}
|