changeset 2155:51c5aead78c0

Print templates: Implemented /api/templates/print/{name} GET.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 08 Feb 2019 12:36:47 +0100
parents a08e0f532304
children 9c7078e157b8
files pkg/controllers/printtemplates.go pkg/controllers/routes.go
diffstat 2 files changed, 36 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/controllers/printtemplates.go	Fri Feb 08 12:30:22 2019 +0100
+++ b/pkg/controllers/printtemplates.go	Fri Feb 08 12:36:47 2019 +0100
@@ -14,14 +14,19 @@
 package controllers
 
 import (
+	"bytes"
 	"database/sql"
 	"net/http"
 	"time"
 
+	"github.com/gorilla/mux"
+	"github.com/jackc/pgx/pgtype"
+
 	"gemma.intevation.de/gemma/pkg/models"
-	"github.com/gorilla/mux"
 )
 
+const maxPrintTemplateSize = 5 * 1024 * 1024
+
 const (
 	listPrintTemplatesSQL = `
 SELECT
@@ -36,6 +41,9 @@
 
 	deletePrintTemplateSQL = `
 DELETE FROM users.templates WHERE name = $1`
+
+	selectPrintTemplateSQL = `
+SELECT template_data FROM users.templates WHERE name = $1`
 )
 
 func listPrintTemplates(
@@ -76,7 +84,30 @@
 	req *http.Request,
 	conn *sql.Conn,
 ) (jr JSONResult, err error) {
-	// TODO: Implement me!
+
+	ctx := req.Context()
+	name := mux.Vars(req)["name"]
+
+	var data pgtype.Bytea
+	err = conn.QueryRowContext(ctx, selectPrintTemplateSQL, name).Scan(&data)
+
+	switch {
+	case err == sql.ErrNoRows:
+		err = JSONError{
+			Code:    http.StatusNotFound,
+			Message: "No such template found",
+		}
+		return
+	case err != nil:
+		return
+	case data.Status != pgtype.Present:
+		err = JSONError{
+			Code:    http.StatusInternalServerError,
+			Message: "Unexpected return value from database query",
+		}
+		return
+	}
+	jr = JSONResult{Result: bytes.NewReader(data.Bytes)}
 	return
 }
 
@@ -96,7 +127,6 @@
 ) (jr JSONResult, err error) {
 
 	ctx := req.Context()
-
 	name := mux.Vars(req)["name"]
 
 	var tx *sql.Tx
@@ -122,6 +152,7 @@
 			Code:    http.StatusInternalServerError,
 			Message: "Unexpected return value from database query",
 		}
+		return
 	}
 
 	if _, err = tx.ExecContext(ctx, deletePrintTemplateSQL, name); err != nil {
--- a/pkg/controllers/routes.go	Fri Feb 08 12:30:22 2019 +0100
+++ b/pkg/controllers/routes.go	Fri Feb 08 12:36:47 2019 +0100
@@ -105,7 +105,9 @@
 	})).Methods(http.MethodGet)
 
 	api.Handle("/templates/print/{name}", waterwayAdmin(&JSONHandler{
+		Input:  func(*http.Request) interface{} { return new(models.PrintTemplateIn) },
 		Handle: createPrintTemplate,
+		Limit:  maxPrintTemplateSize,
 	})).Methods(http.MethodPost)
 
 	api.Handle("/templates/print/{name}", waterwayAdmin(&JSONHandler{