changeset 1023:337a7f4c8a16

Add endpoint to list all or some import jobs. Unpaged path: /api/imports Paged path: /api/imports?offset=[0-9+]&limit=[0-9]+
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 24 Oct 2018 12:24:26 +0200
parents 74229d9f7028
children 96ea805d44b9
files pkg/controllers/importqueue.go pkg/controllers/routes.go pkg/models/import.go
diffstat 3 files changed, 154 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkg/controllers/importqueue.go	Wed Oct 24 12:24:26 2018 +0200
@@ -0,0 +1,95 @@
+// This is Free Software under GNU Affero General Public License v >= 3.0
+// without warranty, see README.md and license for details.
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+// License-Filename: LICENSES/AGPL-3.0.txt
+//
+// Copyright (C) 2018 by via donau
+//   – Österreichische Wasserstraßen-Gesellschaft mbH
+// Software engineering by Intevation GmbH
+//
+// Author(s):
+//  * Sascha L. Teichmann <sascha.teichmann@intevation.de>
+
+package controllers
+
+import (
+	"database/sql"
+	"net/http"
+	"strconv"
+
+	"gemma.intevation.de/gemma/pkg/models"
+	"github.com/gorilla/mux"
+)
+
+const (
+	selectImportsUnpagedSQL = `
+SELECT
+  id,
+  state::varchar,
+  enqueued,
+  kind,
+  username
+FROM waterway.imports
+ORDER BY id`
+
+	selectImportPagedSQL = selectImportsUnpagedSQL + `
+LIMIT $1 OFFSET $2`
+)
+
+func listImports(
+	_ interface{},
+	req *http.Request,
+	conn *sql.Conn,
+) (jr JSONResult, err error) {
+	vars := mux.Vars(req)
+
+	off, of := vars["offset"]
+	lim, lf := vars["limit"]
+
+	var rows *sql.Rows
+
+	if of && lf {
+		offset, _ := strconv.ParseInt(off, 10, 64)
+		limit, _ := strconv.ParseInt(lim, 10, 64)
+		rows, err = conn.QueryContext(
+			req.Context(), selectImportPagedSQL, limit, offset)
+	} else {
+		rows, err = conn.QueryContext(
+			req.Context(), selectImportsUnpagedSQL)
+	}
+	if err != nil {
+		return
+	}
+	defer rows.Close()
+
+	imports := make([]*models.Import, 0, 20)
+
+	for rows.Next() {
+		var it models.Import
+		if err = rows.Scan(
+			&it.ID,
+			&it.State,
+			&it.Enqueued,
+			&it.Kind,
+			&it.User,
+		); err != nil {
+			return
+		}
+		imports = append(imports, &it)
+	}
+
+	if err = rows.Err(); err != nil {
+		return
+	}
+
+	jr = JSONResult{
+		Result: struct {
+			Imports []*models.Import `json:"imports"`
+		}{
+			Imports: imports,
+		},
+	}
+
+	return
+}
--- a/pkg/controllers/routes.go	Wed Oct 24 12:03:51 2018 +0200
+++ b/pkg/controllers/routes.go	Wed Oct 24 12:24:26 2018 +0200
@@ -158,6 +158,20 @@
 	api.Handle("/imports/soundingresult",
 		waterwayAdmin(http.HandlerFunc(importSoundingResult))).Methods(http.MethodPost)
 
+	// Import queue
+	lsImports := waterwayAdmin(&JSONHandler{
+		Handle: listImports,
+	})
+
+	api.Handle("/imports", lsImports).
+		Methods(http.MethodGet).
+		Queries(
+			"offset", "{offset:[0-9]+}",
+			"limit", "{limit:[0-9]+}")
+
+	api.Handle("/imports", lsImports).
+		Methods(http.MethodGet)
+
 	// Token handling: Login/Logout.
 	api.HandleFunc("/login", login).
 		Methods(http.MethodPost)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkg/models/import.go	Wed Oct 24 12:24:26 2018 +0200
@@ -0,0 +1,45 @@
+// This is Free Software under GNU Affero General Public License v >= 3.0
+// without warranty, see README.md and license for details.
+//
+// SPDX-License-Identifier: AGPL-3.0-or-later
+// License-Filename: LICENSES/AGPL-3.0.txt
+//
+// Copyright (C) 2018 by via donau
+//   – Österreichische Wasserstraßen-Gesellschaft mbH
+// Software engineering by Intevation GmbH
+//
+// Author(s):
+//  * Sascha L. Teichmann <sascha.teichmann@intevation.de>
+
+package models
+
+import (
+	"encoding/json"
+	"time"
+)
+
+type (
+	ImportTime struct{ time.Time }
+
+	Import struct {
+		ID       int64      `json:"id"`
+		State    string     `json:"state"`
+		Enqueued ImportTime `json:"enqueued"`
+		Kind     string     `json:"kind"`
+		User     string     `json:"user"`
+	}
+)
+
+func (it ImportTime) MarshalJSON() ([]byte, error) {
+	return json.Marshal(it.Format("2006-01-02T15:04:05"))
+}
+
+func (it *ImportTime) Scan(x interface{}) error {
+	t, ok := x.(time.Time)
+	if !ok {
+		*it = ImportTime{}
+	} else {
+		*it = ImportTime{t}
+	}
+	return nil
+}