Mercurial > gemma
view pkg/imports/email.go @ 3163:d9903cb34842
Handle failing INSERTs gracefully during gauges import
Using the special table EXCLUDED in INSERT statements makes
functionally no difference, but makes editing of the statements easier.
Since reference water levels are not deleted all at once before
(re-)importing anymore, take the chance to report those that were
deleted.
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Mon, 06 May 2019 13:25:49 +0200 |
parents | 92812bf2f008 |
children | 5f47eeea988d |
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 imports import ( "context" "database/sql" "log" "strings" "text/template" "gemma.intevation.de/gemma/pkg/auth" "gemma.intevation.de/gemma/pkg/config" "gemma.intevation.de/gemma/pkg/misc" ) const ( selectEmailSQL = `SELECT email_address FROM users.list_users WHERE username = $1` importNotificationMailSubject = `Gemma: import notification mail` ) var ( importNotificationMailTmpl = template.Must( template.New("notification").Parse(`Dear {{ .User }}, a {{ .Description }} import on server {{ .Server }} triggered this email notification. {{ if eq .State "accepted" }}The imported data were successfully integrated into the database. {{ end -}} {{ if eq .State "unchanged" }}The import has not changed any data in the database. {{ end -}} {{ if eq .State "failed" }}The import failed for some reasons. {{ end -}} {{ if eq .State "pending" }}The imported data could be integrated into the database but your final decision is needed. {{ end -}} Please follow this link to have a closer look at the details: {{ .Server }}/#/imports/overview/{{ .ID }} Best regards Your service team`)) ) func sendNotificationMail(user, description, state string, id int64) { config.WaitReady() ctx := context.Background() var email string if err := auth.RunAs(ctx, user, func(conn *sql.Conn) error { return conn.QueryRowContext(ctx, selectEmailSQL, user).Scan(&email) }, ); err != nil { log.Printf("error: %v\n", err) return } data := struct { User string Description string Server string State string ID int64 }{ User: user, Description: description, Server: config.ExternalURL(), State: state, ID: id, } var body strings.Builder if err := importNotificationMailTmpl.Execute(&body, &data); err != nil { log.Printf("error: %v\n", err) return } if err := misc.SendMail(email, importNotificationMailSubject, body.String()); err != nil { log.Printf("error: %v\n", err) } }