From 89eda187bec815e195d3b6953efec40a6b3f33d9 Mon Sep 17 00:00:00 2001 From: Eli Ribble Date: Sun, 1 Mar 2026 20:33:16 +0000 Subject: [PATCH] Get map images working --- api/compliance.go | 22 ++++++++++------- background/arcgis.go | 42 +++++++++++++++++++++++---------- platform/imagetile/imagetile.go | 7 ++++-- start-flogo.sh | 4 +++- start-nidus-sync.sh | 2 +- 5 files changed, 52 insertions(+), 25 deletions(-) diff --git a/api/compliance.go b/api/compliance.go index fc2729de..ec0ae3b5 100644 --- a/api/compliance.go +++ b/api/compliance.go @@ -44,20 +44,26 @@ func getComplianceRequestImagePool(w http.ResponseWriter, r *http.Request) { http.Error(w, "parcel env", http.StatusInternalServerError) return } - log.Info().Int("len", len(*envelope)).Msg("got envelope") ring := (*envelope)[0] - log.Info().Int("len", len(ring)).Msg("got ring") p := ring[0] - log.Info().Int("len", len(p)).Msg("got point") - writeImage(ctx, w, org, 14, p[0], p[1]) + err = writeImage(ctx, w, org, 22, p[1], p[0]) + if err != nil { + log.Error().Err(err).Msg("write image") + http.Error(w, "failed to write image", http.StatusInternalServerError) + return + } } -func writeImage(ctx context.Context, w http.ResponseWriter, org *models.Organization, level uint, x, y float64) { - img, err := imagetile.ImageAtPoint(ctx, org, level, x, y) +func writeImage(ctx context.Context, w http.ResponseWriter, org *models.Organization, level uint, lat, lng float64) error { + img, err := imagetile.ImageAtPoint(ctx, org, level, lat, lng) + if err != nil { + return fmt.Errorf("image at point: %w", err) + } + log.Info().Int("size", len(img)).Msg("image") w.Header().Set("Content-Type", "image/png") w.Header().Set("Content-Length", fmt.Sprintf("%d", len(img))) _, err = io.Copy(w, bytes.NewBuffer(img)) if err != nil { - http.Error(w, "failed copy", http.StatusInternalServerError) - return + return fmt.Errorf("copy bytes: %w", err) } + return nil } diff --git a/background/arcgis.go b/background/arcgis.go index c76e45a2..e4507e0e 100644 --- a/background/arcgis.go +++ b/background/arcgis.go @@ -324,6 +324,7 @@ func updateArcgisUserData(ctx context.Context, user *models.User, oauth *models. log.Error().Err(err).Msg("Failed to update oauth token portal data") return } + txn.Commit(ctx) // At this point we have the arcgis ID. If the ID matches an existing ID, join it with the users organization orgs, err := models.Organizations.Query( sm.Where( @@ -357,6 +358,13 @@ func updateArcgisUserData(ctx context.Context, user *models.User, oauth *models. return } + txn, err = db.PGInstance.BobDB.BeginTx(ctx, nil) + if err != nil { + log.Error().Err(err).Msg("Create transaction") + return + } + defer txn.Rollback(ctx) + fssync, err := fieldseeker.NewFieldSeekerFromAG(ctx, *client) if err != nil { log.Error().Err(err).Msg("Failed to create fieldseeker") @@ -365,11 +373,13 @@ func updateArcgisUserData(ctx context.Context, user *models.User, oauth *models. log.Info().Str("url", fssync.ServiceFeature.URL.String()).Msg("Found Fieldseeker") // Ensure the fieldseeker service is saved on the account + // Why yes, we do get 'ArcGIS' and 'arcgis' from the API, why do you ask? + url_corrected := strings.Replace(fssync.ServiceFeature.URL.String(), "/arcgis/", "/ArcGIS/", 1) service_account, err := models.ArcgisServiceFeatures.Query( - models.SelectWhere.ArcgisServiceFeatures.URL.EQ(fssync.ServiceFeature.URL.String()), + models.SelectWhere.ArcgisServiceFeatures.URL.EQ(url_corrected), ).One(ctx, txn) if err != nil { - log.Error().Err(err).Msg("no fieldseeker service") + log.Error().Err(err).Str("url", fssync.ServiceFeature.URL.String()).Str("url_corrected", url_corrected).Msg("no fieldseeker service to link, it should have been created before") return } setter := models.OrganizationSetter{ @@ -380,7 +390,6 @@ func updateArcgisUserData(ctx context.Context, user *models.User, oauth *models. log.Error().Err(err).Msg("Failed to create new organization") return } - txn.Commit(ctx) maybeCreateWebhook(ctx, fssync) downloadFieldseekerSchema(ctx, fssync, account.ID) notification.ClearOauth(ctx, user) @@ -390,7 +399,7 @@ func updateArcgisUserData(ctx context.Context, user *models.User, oauth *models. func NewFieldSeeker(ctx context.Context, oauth *models.ArcgisOauthToken) (*fieldseeker.FieldSeeker, error) { row, err := sql.OrgByOauthId(oauth.ID).One(ctx, db.PGInstance.BobDB) if err != nil { - return nil, fmt.Errorf("Failed to get org ID: %w", err) + return nil, fmt.Errorf("Failed to get org ID from oauth %d: %w", oauth.ID, err) } // The URL for fieldseeker should be something like // https://foo.arcgis.com/123abc/arcgis/rest/services/FieldSeekerGIS/FeatureServer @@ -494,16 +503,23 @@ func updateServiceData(ctx context.Context, txn bob.Tx, client *arcgis.ArcGIS, u } for _, sm := range service_maps { log.Info().Str("account-id", account.ID).Str("arcgis-id", sm.ID).Str("name", sm.Name).Str("title", sm.Title).Str("url", sm.URL.String()).Msg("inserting map service") - setter := models.ArcgisServiceMapSetter{ - AccountID: omit.From(account.ID), - ArcgisID: omit.From(sm.ID), - Name: omit.From(sm.Name), - Title: omit.From(sm.Title), - URL: omit.From(sm.URL.String()), - } - _, err := models.ArcgisServiceMaps.Insert(&setter).One(ctx, txn) + _, err := models.FindArcgisServiceMap(ctx, txn, sm.ID) if err != nil { - return fmt.Errorf("save map service: %w", err) + if err.Error() == "sql: no rows in result set" { + setter := models.ArcgisServiceMapSetter{ + AccountID: omit.From(account.ID), + ArcgisID: omit.From(sm.ID), + Name: omit.From(sm.Name), + Title: omit.From(sm.Title), + URL: omit.From(sm.URL.String()), + } + _, err := models.ArcgisServiceMaps.Insert(&setter).One(ctx, txn) + if err != nil { + return fmt.Errorf("save map service: %w", err) + } + } else { + return err + } } /* diff --git a/platform/imagetile/imagetile.go b/platform/imagetile/imagetile.go index 2dde38c3..d497dee0 100644 --- a/platform/imagetile/imagetile.go +++ b/platform/imagetile/imagetile.go @@ -10,7 +10,7 @@ import ( //"github.com/rs/zerolog/log" ) -func ImageAtPoint(ctx context.Context, org *models.Organization, level uint, x, y float64) ([]byte, error) { +func ImageAtPoint(ctx context.Context, org *models.Organization, level uint, lat, lng float64) ([]byte, error) { oauth, err := background.GetOAuthForOrg(ctx, org) if err != nil { return []byte{}, fmt.Errorf("get oauth for org: %w", err) @@ -19,11 +19,14 @@ func ImageAtPoint(ctx context.Context, org *models.Organization, level uint, x, ctx, oauth, ) + if err != nil { + return []byte{}, fmt.Errorf("create fssync: %w", err) + } map_service, err := aerialImageService(ctx, fssync.Arcgis) if err != nil { return []byte{}, fmt.Errorf("no map service: %w", err) } - return map_service.TileGPS(ctx, fssync.Arcgis, level, x, y) + return map_service.TileGPS(ctx, level, lat, lng) } func aerialImageService(ctx context.Context, gis *arcgis.ArcGIS) (*arcgis.MapService, error) { diff --git a/start-flogo.sh b/start-flogo.sh index 2962d928..881b5537 100755 --- a/start-flogo.sh +++ b/start-flogo.sh @@ -1,7 +1,9 @@ #!/run/current-system/sw/bin/bash # normal #export $(cat /var/run/secrets/nidus-dev-sync-env | xargs) && BIND=127.0.0.1:9001 FLOGO_BIND=:9000 FLOGO_UPSTREAM=http://127.0.0.1:9001 ../flogo/flogo -target . +# MITM proxy +export $(cat /var/run/secrets/nidus-dev-sync-env | xargs) && BIND=127.0.0.1:9001 FLOGO_BIND=:9000 FLOGO_UPSTREAM=http://127.0.0.1:9001 MITM_PROXY=http://127.0.0.1:8080 ../flogo/flogo -target . # verbose -export $(cat /var/run/secrets/nidus-dev-sync-env | xargs) && BIND=127.0.0.1:9001 FLOGO_BIND=:9000 FLOGO_UPSTREAM=http://127.0.0.1:9001 FLOGO_VERBOSE=1 ../flogo/flogo -target . +#export $(cat /var/run/secrets/nidus-dev-sync-env | xargs) && BIND=127.0.0.1:9001 FLOGO_BIND=:9000 FLOGO_UPSTREAM=http://127.0.0.1:9001 FLOGO_VERBOSE=1 ../flogo/flogo -target . # no TUI #export $(cat /var/run/secrets/nidus-dev-sync-env | xargs) && BIND=127.0.0.1:9001 FLOGO_BIND=:9000 FLOGO_DISABLE_TUI=1 FLOGO_UPSTREAM=http://127.0.0.1:9001 ../flogo/flogo -target . diff --git a/start-nidus-sync.sh b/start-nidus-sync.sh index 4096536c..90217531 100755 --- a/start-nidus-sync.sh +++ b/start-nidus-sync.sh @@ -1,2 +1,2 @@ #!/run/current-system/sw/bin/bash -export $(cat /var/run/secrets/nidus-dev-sync-env | xargs) && ./nidus-sync 2>&1 | tee nidus-sync.log +export $(cat /var/run/secrets/nidus-dev-sync-env | xargs) && MITM_PROXY=http://127.0.0.1:8080 ./nidus-sync 2>&1 | tee nidus-sync.log