view pkg/controllers/importqueue.go @ 1026:3de54d7b7d30

Added endpoint to show the detail logs of an import. Path /api/import/[0-9]+
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 24 Oct 2018 13:35:15 +0200
parents 337a7f4c8a16
children c0f5dedf5753
line wrap: on
line source

// 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`

	selectImportLogsSQL = `
SELECT
  time,
  kind::varchar,
  msg
FROM waterway.import_logs
WHERE import_id = $1
ORDER BY time`
)

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
}

func importLogs(
	_ interface{},
	req *http.Request,
	conn *sql.Conn,
) (jr JSONResult, err error) {
	id, _ := strconv.ParseInt(mux.Vars(req)["id"], 10, 64)

	var rows *sql.Rows

	rows, err = conn.QueryContext(req.Context(), selectImportLogsSQL, id)
	if err != nil {
		return
	}
	defer rows.Close()

	entries := make([]*models.ImportLogEntry, 0, 10)

	for rows.Next() {
		var entry models.ImportLogEntry
		if err = rows.Scan(&entry.Time, &entry.Kind, &entry.Message); err != nil {
			return
		}
		entries = append(entries, &entry)
	}

	if err = rows.Err(); err != nil {
		return
	}

	jr = JSONResult{
		Result: struct {
			Entries []*models.ImportLogEntry `json:"entries"`
		}{
			Entries: entries,
		},
	}
	return
}