Jelajahi Sumber

Prototype for downloading generated documents

Andrea Fazzi 5 tahun lalu
induk
melakukan
068c9389a1
6 mengubah file dengan 48 tambahan dan 15 penghapusan
  1. 6 6
      handlers/handlers.go
  2. 6 3
      orm/job.go
  3. 1 1
      orm/mappings.go
  4. 31 0
      renderer/renderer.go
  5. 1 1
      templates/jobs_show.html.tpl
  6. 3 4
      watch.sh

+ 6 - 6
handlers/handlers.go

@@ -117,11 +117,11 @@ func generateHandler(r *mux.Router, model string) {
 		}
 	}
 
-	// if model == "jobs" {
-	// 	for _, pattern := range filePatterns {
-	// 		r.Handle(pattern.Path(model), jwtCookie.Handler(recoverHandler(modelHandler(model, pattern)))).Methods(pattern.Methods...)
-	// 	}
-	// }
+	if model == "jobs" {
+		for _, pattern := range filePatterns {
+			r.Handle(pattern.Path(model), jwtCookie.Handler(recoverHandler(modelHandler(model, pattern)))).Methods(pattern.Methods...)
+		}
+	}
 
 }
 
@@ -147,7 +147,6 @@ func Handlers() *mux.Router {
 	r.Handle("/get_token", tokenHandler())
 
 	// Static file server
-	r.PathPrefix("/jobs/13/files/elenco_docenti.pdf").Handler(http.FileServer(http.Dir("./output/1/13/elenco_docenti.pdf")))
 	r.PathPrefix("/").Handler(http.FileServer(http.Dir("./dist/")))
 
 	return r
@@ -198,6 +197,7 @@ func recoverHandler(next http.Handler) http.Handler {
 func get(w http.ResponseWriter, r *http.Request, model string, pattern PathPattern) {
 	format := r.URL.Query().Get("format")
 	getFn, err := orm.GetFunc(pattern.Path(model))
+
 	if err != nil {
 		respondWithError(w, r, err)
 	} else {

+ 6 - 3
orm/job.go

@@ -1,8 +1,8 @@
 package orm
 
 import (
-	"log"
 	"net/http"
+	"strconv"
 	"time"
 
 	"github.com/jinzhu/gorm"
@@ -38,8 +38,11 @@ func GetFile(args map[string]string) (interface{}, error) {
 	if err := DB().Preload("Document").Preload("Files").First(&job, args["id"]).Error; err != nil {
 		return nil, err
 	}
-	log.Println("Downloading file...")
-	return &job, nil
+	return map[string]string{
+		"filename":    args["filename"],
+		"document_id": strconv.Itoa(int(job.DocumentID)),
+		"id":          strconv.Itoa(int(job.ID)),
+	}, nil
 }
 
 func GetJob(args map[string]string) (interface{}, error) {

+ 1 - 1
orm/mappings.go

@@ -105,7 +105,7 @@ var (
 		// Jobs
 
 		"/jobs/{id}":                  GetJob,
-		"/jobs/{id]/files/{filename}": GetFile,
+		"/jobs/{id}/files/{filename}": GetFile,
 
 		"/api/jobs/{id}": GetJob,
 		"/api/jobs/add/": GetNothing,

+ 31 - 0
renderer/renderer.go

@@ -1,12 +1,15 @@
 package renderer
 
 import (
+	"bufio"
 	"encoding/json"
 	"fmt"
 	"html/template"
+	"io"
 	"mime"
 	"net/http"
 	"net/url"
+	"os"
 	"path"
 	"path/filepath"
 	"reflect"
@@ -23,6 +26,7 @@ type Renderer interface {
 
 type JSONRenderer struct{}
 type CSVRenderer struct{}
+type PDFRenderer struct{}
 
 type htmlTemplateData struct {
 	Data    interface{}
@@ -47,6 +51,7 @@ var (
 		"application/x-www-form-urlencoded": "html",
 		"application/json":                  "json",
 		"text/csv; charset=utf-8":           "csv",
+		"application/pdf":                   "pdf",
 	}
 )
 
@@ -66,6 +71,11 @@ func init() {
 		panic(err)
 	}
 
+	pdfRenderer, err := NewPDFRenderer()
+	if err != nil {
+		panic(err)
+	}
+
 	Render = make(map[string]func(http.ResponseWriter, *http.Request, interface{}, ...url.Values))
 
 	Render["html"] = func(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) {
@@ -80,6 +90,10 @@ func init() {
 		csvRenderer.Render(w, r, data, options...)
 	}
 
+	Render["pdf"] = func(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) {
+		pdfRenderer.Render(w, r, data, options...)
+	}
+
 }
 
 func Query(values ...string) template.URL {
@@ -164,6 +178,23 @@ func (rend *CSVRenderer) Render(w http.ResponseWriter, r *http.Request, data int
 	return nil
 }
 
+func NewPDFRenderer() (*PDFRenderer, error) {
+	return &PDFRenderer{}, nil
+}
+
+func (rend *PDFRenderer) Render(w http.ResponseWriter, r *http.Request, data interface{}, options ...url.Values) error {
+	w.Header().Set("Content-Type", "application/pdf")
+	fileMap := data.(map[string]string)
+	f, err := os.Open(filepath.Join("output", fileMap["document_id"], fileMap["id"], fileMap["filename"]))
+	if err != nil {
+		panic(err)
+	}
+	reader := bufio.NewReader(f)
+	io.Copy(w, reader)
+
+	return nil
+}
+
 type HTMLRenderer struct {
 	TemplatePath string
 

+ 1 - 1
templates/jobs_show.html.tpl

@@ -52,7 +52,7 @@
       {{if .Data.Files}}
       <div class="list-group" id="files_list_group">
     	{{range $file := .Data.Files}}
-    	<a href="/jobs/{{$file.JobID}}/files/{{$file.Path}}" class="list-group-item list-group-item-action">
+    	<a href="/jobs/{{$file.JobID}}/files/{{$file.Path}}?format=pdf" class="list-group-item list-group-item-action">
     	  <span class="fa fa-file-alt"></span>
     	  {{$file.Path}}
     	  {{end}}

+ 3 - 4
watch.sh

@@ -3,11 +3,10 @@
 diskFree=$(df -h /dev/sda1 | awk 'NR>1{print $4}')
 value="${diskFree::-1}"
 
-if (( value < 3 )); then
-    docker image prune -a -f
-fi
-
 while inotifywait -r -e modify ./; do
+  if (( value < 2 )); then
+        docker image prune -a -f
+  fi
   docker-compose -f compose/karmen/docker-compose.yml down
   docker-compose -f compose/karmen/docker-compose.yml up --build -d
 done