# HG changeset patch # User Sascha L. Teichmann # Date 1540376666 -7200 # Node ID 337a7f4c8a16bb53b2b4543e9a2d6bc8a38827a8 # Parent 74229d9f70280c02a233be8d538e286d8b149893 Add endpoint to list all or some import jobs. Unpaged path: /api/imports Paged path: /api/imports?offset=[0-9+]&limit=[0-9]+ diff -r 74229d9f7028 -r 337a7f4c8a16 pkg/controllers/importqueue.go --- /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 + +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 +} diff -r 74229d9f7028 -r 337a7f4c8a16 pkg/controllers/routes.go --- 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) diff -r 74229d9f7028 -r 337a7f4c8a16 pkg/models/import.go --- /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 + +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 +}