diff pkg/imports/sr.go @ 1392:0e1d89241cda

Imports: An Import (e.g. a sounding result import) can now write a 'summary' of a successful import. This is done if the import switches to to state 'pending'.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 28 Nov 2018 09:52:34 +0100
parents 8d59457a5651
children eb82076fdffe
line wrap: on
line diff
--- a/pkg/imports/sr.go	Wed Nov 28 08:11:23 2018 +0100
+++ b/pkg/imports/sr.go	Wed Nov 28 09:52:34 2018 +0100
@@ -115,6 +115,8 @@
 )
 RETURNING
   id,
+  ST_X(ST_Centroid(point_cloud::geometry)),
+  ST_Y(ST_Centroid(point_cloud::geometry)),
   CASE WHEN ST_Y(ST_Centroid(point_cloud::geometry)) > 0 THEN
     32600
   ELSE
@@ -169,58 +171,61 @@
 	importID int64,
 	conn *sql.Conn,
 	feedback Feedback,
-) error {
+) (interface{}, error) {
 
 	z, err := zip.OpenReader(filepath.Join(sr.Dir, "sr.zip"))
 	if err != nil {
-		return err
+		return nil, err
 	}
 	defer z.Close()
 
 	feedback.Info("Looking for 'meta.json'")
 	mf := common.FindInZIP(z, "meta.json")
 	if mf == nil && !sr.completeOverride() {
-		return errors.New("Cannot find 'meta.json'")
+		return nil, errors.New("Cannot find 'meta.json'")
 	}
 
 	m, err := sr.loadMeta(mf)
 	if err != nil {
-		return err
+		return nil, err
 	}
 
 	if err := m.Validate(ctx, conn); err != nil {
-		return common.ToError(err)
+		return nil, common.ToError(err)
 	}
 
 	feedback.Info("Looking for '*.xyz'")
 	xyzf := common.FindInZIP(z, ".xyz")
 	if xyzf == nil {
-		return errors.New("Cannot find any *.xyz file")
+		return nil, errors.New("Cannot find any *.xyz file")
 	}
 
 	xyz, err := loadXYZ(xyzf, feedback)
 	if err != nil {
-		return err
+		return nil, err
 	}
 
 	if len(xyz) == 0 {
-		return errors.New("XYZ does not contain any vertices")
+		return nil, errors.New("XYZ does not contain any vertices")
 	}
 
 	// Is there a boundary shapefile in the ZIP archive?
 	polygon, err := loadBoundary(z)
 	if err != nil {
-		return err
+		return nil, err
 	}
 
 	tx, err := conn.BeginTx(ctx, nil)
 	if err != nil {
-		return err
+		return nil, err
 	}
 	defer tx.Rollback()
 
-	var id int64
-	var epsg uint32
+	var (
+		id       int64
+		epsg     uint32
+		lat, lon float64
+	)
 	start := time.Now()
 
 	err = tx.QueryRow(insertPointsSQL,
@@ -230,11 +235,11 @@
 		xyz.AsWKB(),
 		polygon.AsWBK(),
 		m.EPSG,
-	).Scan(&id, &epsg)
+	).Scan(&id, &lat, &lon, &epsg)
 	xyz, polygon = nil, nil // not need from now on.
 	feedback.Info("storing points took %s", time.Since(start))
 	if err != nil {
-		return err
+		return nil, err
 	}
 
 	feedback.Info("Best suited UTM EPSG: %d", epsg)
@@ -244,11 +249,11 @@
 	tin, err := octree.GenerateTinByID(ctx, conn, id, epsg)
 	feedback.Info("triangulation took %s", time.Since(start))
 	if err != nil {
-		return err
+		return nil, err
 	}
 
 	if tin == nil {
-		return errors.New("cannot load TIN from database")
+		return nil, errors.New("cannot load TIN from database")
 	}
 
 	feedback.Info("Building octree...")
@@ -259,7 +264,7 @@
 	tin = nil // not needed from now on
 	feedback.Info("building octree took %s", time.Since(start))
 	if err != nil {
-		return err
+		return nil, err
 	}
 
 	feedback.Info("Store octree...")
@@ -270,7 +275,7 @@
 	_, err = tx.Exec(insertOctreeSQL, id, checksum, octreeIndex)
 	feedback.Info("storing octree index took %s", time.Since(start))
 	if err != nil {
-		return err
+		return nil, err
 	}
 
 	tree := builder.Tree()
@@ -281,18 +286,30 @@
 	err = generateContours(tree, tx, id)
 	feedback.Info("generating and storing contour lines took %s", time.Since(start))
 	if err != nil {
-		return err
+		return nil, err
 	}
 
 	// Store for potential later removal.
 	if err = track(ctx, tx, importID, "waterway.sounding_results", id); err != nil {
-		return err
+		return nil, err
 	}
 
 	if err = tx.Commit(); err == nil {
 		feedback.Info("Storing sounding result was successful.")
 	}
-	return err
+
+	summary := struct {
+		Bottleneck string                    `json:"bottleneck"`
+		Date       models.SoundingResultDate `json:"date"`
+		Lat        float64                   `json:"lat"`
+		Lon        float64                   `json:"lon"`
+	}{
+		Bottleneck: m.Bottleneck,
+		Date:       m.Date,
+		Lat:        lat,
+		Lon:        lon,
+	}
+	return &summary, err
 }
 
 func (sr *SoundingResult) CleanUp() error {