diff pkg/controllers/system.go @ 4214:49564382ffff

Added a import queue job to recalculate the contour lines of the sounding results if the heights have changed.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 16 Aug 2019 13:15:34 +0200
parents 45be361f2d48
children 8aff98c84a5a
line wrap: on
line diff
--- a/pkg/controllers/system.go	Wed Aug 14 17:12:23 2019 +0200
+++ b/pkg/controllers/system.go	Fri Aug 16 13:15:34 2019 +0200
@@ -23,12 +23,15 @@
 	"net/http"
 	"strings"
 	"sync"
+	"time"
 
 	"github.com/gorilla/mux"
 
 	"gemma.intevation.de/gemma/pkg/auth"
+	"gemma.intevation.de/gemma/pkg/common"
 	"gemma.intevation.de/gemma/pkg/config"
 	"gemma.intevation.de/gemma/pkg/geoserver"
+	"gemma.intevation.de/gemma/pkg/imports"
 	"gemma.intevation.de/gemma/pkg/models"
 )
 
@@ -152,7 +155,7 @@
 	return
 }
 
-type reconfFunc func(sql.NullString, string) (func(), error)
+type reconfFunc func(sql.NullString, string) (func(*http.Request), error)
 
 var (
 	reconfigureFuncsMu sync.Mutex
@@ -171,7 +174,11 @@
 	return reconfigureFuncs[key]
 }
 
-func reconfigureClassBreaks(old sql.NullString, curr, which string, recalc func()) (func(), error) {
+func reconfigureClassBreaks(
+	old sql.NullString, curr,
+	which string,
+	recalc func(*http.Request),
+) (func(*http.Request), error) {
 
 	// If new values are broken, don't proceed.
 	currCVs, err := models.ParseColorValues(curr)
@@ -179,10 +186,10 @@
 		return nil, err
 	}
 
-	doBoth := func() {
+	doBoth := func(req *http.Request) {
 		log.Printf("info: Trigger re-calculation of %s.", which)
 		geoserver.ReconfigureStyle(which)
-		recalc()
+		recalc(req)
 	}
 
 	if !old.Valid {
@@ -213,7 +220,7 @@
 	// Only the color changed -> no expensive recalc needed.
 	if colorChanged {
 		log.Println("info: Only colors changed.")
-		return func() { geoserver.ReconfigureStyle(which) }, nil
+		return func(*http.Request) { geoserver.ReconfigureStyle(which) }, nil
 	}
 
 	return nil, nil
@@ -221,24 +228,52 @@
 
 func init() {
 	registerReconfigureFunc("morphology_classbreaks",
-		func(old sql.NullString, curr string) (func(), error) {
+		func(old sql.NullString, curr string) (func(*http.Request), error) {
 			return reconfigureClassBreaks(
 				old, curr,
 				"sounding_results_contour_lines_geoserver",
-				func() {
-					log.Println(
-						"todo: Trigger expensive recalculation of sounding result contours.")
+				func(req *http.Request) {
+					if s, ok := auth.GetSession(req); ok {
+						triggerSoundingResultsContoursRecalc(s.User, curr)
+					}
 				})
 		})
 	registerReconfigureFunc("morphology_classbreaks_compare",
-		func(old sql.NullString, curr string) (func(), error) {
+		func(old sql.NullString, curr string) (func(*http.Request), error) {
 			return reconfigureClassBreaks(
 				old, curr,
 				"sounding_differences",
-				func() { go deleteSoundingDiffs() })
+				func(*http.Request) { go deleteSoundingDiffs() })
 		})
 }
 
+func triggerSoundingResultsContoursRecalc(who, breaks string) {
+	var serialized string
+	job := &imports.IsoRefresh{ClassBreaks: breaks}
+	serialized, err := common.ToJSONString(job)
+	if err != nil {
+		log.Printf("error: %v\n", err)
+		return
+	}
+	var jobID int64
+	if jobID, err = imports.AddJob(
+		imports.ISRJobKind,
+		time.Time{},
+		nil,
+		nil,
+		who,
+		false,
+		serialized,
+	); err != nil {
+		log.Printf("error: %v\n", err)
+		return
+	}
+	log.Printf(
+		"info: Recalculate sounding results contours in job %d.\n",
+		jobID)
+
+}
+
 func deleteSoundingDiffs() {
 	// TODO: Better do that in import queue?
 	ctx := context.Background()
@@ -279,7 +314,7 @@
 	}
 	defer getStmt.Close()
 
-	reconfigure := map[string]func(){}
+	reconfigure := map[string]func(*http.Request){}
 
 	for key, value := range *settings {
 		var old sql.NullString
@@ -292,7 +327,7 @@
 		}
 
 		if cmp := reconfigureFunc(key); cmp != nil {
-			var fn func()
+			var fn func(*http.Request)
 			if fn, err = cmp(old, value); err != nil {
 				return
 			}
@@ -311,7 +346,7 @@
 	}
 
 	for _, fn := range reconfigure {
-		fn()
+		fn(req)
 	}
 
 	jr = JSONResult{