diff --git a/arcgis.go b/arcgis.go index a11b3d58..6ffdfc67 100644 --- a/arcgis.go +++ b/arcgis.go @@ -511,16 +511,20 @@ func maintainOAuth(ctx context.Context, oauth *models.OauthToken) error { if err != nil { return fmt.Errorf("Failed to update oauth token from database: %w", err) } - accessTokenDelay := time.Until(oauth.AccessTokenExpires) - (3 * time.Second) - refreshTokenDelay := time.Until(oauth.RefreshTokenExpires) - (3 * time.Second) + var accessTokenDelay time.Duration if oauth.AccessTokenExpires.Before(time.Now()) { - accessTokenDelay = 0 + accessTokenDelay = 1 + } else { + accessTokenDelay = time.Until(oauth.AccessTokenExpires) - (3 * time.Second) } + var refreshTokenDelay time.Duration if oauth.RefreshTokenExpires.Before(time.Now()) { - refreshTokenDelay = 0 + refreshTokenDelay = 1 + } else { + refreshTokenDelay = time.Until(oauth.RefreshTokenExpires) - (3 * time.Second) } - log.Info().Int("id", int(oauth.ID)).Float64("seconds", accessTokenDelay.Seconds()).Str("access_token", oauth.AccessToken).Msg("Need to refresh access token") - log.Info().Int("id", int(oauth.ID)).Float64("seconds", refreshTokenDelay.Seconds()).Str("refresh_token", oauth.RefreshToken).Msg("Need to refresh refresh token") + log.Info().Int("id", int(oauth.ID)).Float64("seconds", accessTokenDelay.Seconds()).Msg("Need to refresh access token") + log.Info().Int("id", int(oauth.ID)).Float64("seconds", refreshTokenDelay.Seconds()).Msg("Need to refresh refresh token") accessTokenTicker := time.NewTicker(accessTokenDelay) refreshTokenTicker := time.NewTicker(refreshTokenDelay) select { @@ -1138,318 +1142,294 @@ func exportFieldseekerLayer(ctx context.Context, org *models.Organization, fssyn var inserts, unchanged, updates uint var err error switch l { - case fieldseeker.LayerAerialSpraySession: - name = "AerialSpraySession" - rows, err := fssync.AerialSpraySession(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateAerialSpraySession(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerAerialSprayLine: - name = "LayerAerialSprayLine" - rows, err := fssync.AerialSprayLine(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateAerialSprayLine(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerBarrierSpray: - name = "LayerBarrierSpray" - rows, err := fssync.BarrierSpray(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateBarrierSpray(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerBarrierSprayRoute: - name = "LayerBarrierSprayRoute" - rows, err := fssync.BarrierSprayRoute(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateBarrierSprayRoute(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerContainerRelate: - name = "LayerContainerRelate" - rows, err := fssync.ContainerRelate(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateContainerRelate(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerFieldScoutingLog: - name = "LayerFieldScoutingLog" - rows, err := fssync.FieldScoutingLog(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateFieldScoutingLog(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerHabitatRelate: - name = "LayerHabitatRelate" - rows, err := fssync.HabitatRelate(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateHabitatRelate(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerInspectionSample: - name = "LayerInspectionSample" - rows, err := fssync.InspectionSample(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateInspectionSample(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerInspectionSampleDetail: - name = "LayerInspectionSampleDetail" - rows, err := fssync.InspectionSampleDetail(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateInspectionSampleDetail(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerLandingCount: - name = "LayerLandingCount" - rows, err := fssync.LandingCount(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateLandingCount(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerLandingCountLocation: - name = "LayerLandingCountLocation" - rows, err := fssync.LandingCountLocation(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateLandingCountLocation(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerLineLocation: - name = "LayerLineLocation" - rows, err := fssync.LineLocation(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateLineLocation(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerLocationTracking: - name = "LayerLocationTracking" - rows, err := fssync.LocationTracking(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateLocationTracking(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerMosquitoInspection: - name = "LayerMosquitoInspection" - rows, err := fssync.MosquitoInspection(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateMosquitoInspection(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerOfflineMapAreas: - name = "LayerOfflineMapAreas" - rows, err := fssync.OfflineMapAreas(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateOfflineMapAreas(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerProposedTreatmentArea: - name = "LayerProposedTreatmentArea" - rows, err := fssync.ProposedTreatmentArea(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateProposedTreatmentArea(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerPointLocation: - name = "LayerPointLocation" - rows, err := fssync.PointLocation(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdatePointLocation(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerPolygonLocation: - name = "LayerPolygonLocation" - rows, err := fssync.PolygonLocation(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdatePolygonLocation(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerPoolDetail: - name = "LayerPoolDetail" - rows, err := fssync.PoolDetail(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdatePoolDetail(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerPool: - name = "LayerPool" - rows, err := fssync.Pool(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdatePool(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerPoolBuffer: - name = "LayerPoolBuffer" - rows, err := fssync.PoolBuffer(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdatePoolBuffer(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerQALarvCount: - name = "LayerQALarvCount" - rows, err := fssync.QALarvCount(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateQALarvCount(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerQAMosquitoInspection: - name = "LayerQAMosquitoInspection" - rows, err := fssync.QAMosquitoInspection(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateQAMosquitoInspection(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerQAProductObservation: - name = "LayerQAProductObservation" - rows, err := fssync.QAProductObservation(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateQAProductObservation(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerRestrictedArea: - name = "LayerRestrictedArea" - rows, err := fssync.RestrictedArea(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateRestrictedArea(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerRodentInspection: - name = "LayerRodentInspection" - rows, err := fssync.RodentInspection(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateRodentInspection(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err + /* + case fieldseeker.LayerAerialSpraySession: + name = "AerialSpraySession" + rows, err := fssync.AerialSpraySession(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateAerialSpraySession(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerAerialSprayLine: + name = "LayerAerialSprayLine" + rows, err := fssync.AerialSprayLine(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateAerialSprayLine(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerBarrierSpray: + name = "LayerBarrierSpray" + rows, err := fssync.BarrierSpray(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateBarrierSpray(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerBarrierSprayRoute: + name = "LayerBarrierSprayRoute" + rows, err := fssync.BarrierSprayRoute(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateBarrierSprayRoute(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerContainerRelate: + name = "LayerContainerRelate" + rows, err := fssync.ContainerRelate(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateContainerRelate(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerFieldScoutingLog: + name = "LayerFieldScoutingLog" + rows, err := fssync.FieldScoutingLog(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateFieldScoutingLog(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerHabitatRelate: + name = "LayerHabitatRelate" + rows, err := fssync.HabitatRelate(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateHabitatRelate(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerInspectionSample: + name = "LayerInspectionSample" + rows, err := fssync.InspectionSample(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateInspectionSample(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerInspectionSampleDetail: + name = "LayerInspectionSampleDetail" + rows, err := fssync.InspectionSampleDetail(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateInspectionSampleDetail(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerLandingCount: + name = "LayerLandingCount" + rows, err := fssync.LandingCount(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateLandingCount(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerLandingCountLocation: + name = "LayerLandingCountLocation" + rows, err := fssync.LandingCountLocation(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateLandingCountLocation(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerLineLocation: + name = "LayerLineLocation" + rows, err := fssync.LineLocation(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateLineLocation(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerLocationTracking: + name = "LayerLocationTracking" + rows, err := fssync.LocationTracking(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateLocationTracking(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerMosquitoInspection: + name = "LayerMosquitoInspection" + rows, err := fssync.MosquitoInspection(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateMosquitoInspection(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerOfflineMapAreas: + name = "LayerOfflineMapAreas" + rows, err := fssync.OfflineMapAreas(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateOfflineMapAreas(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerProposedTreatmentArea: + name = "LayerProposedTreatmentArea" + rows, err := fssync.ProposedTreatmentArea(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateProposedTreatmentArea(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerPointLocation: + name = "LayerPointLocation" + rows, err := fssync.PointLocation(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdatePointLocation(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerPolygonLocation: + name = "LayerPolygonLocation" + rows, err := fssync.PolygonLocation(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdatePolygonLocation(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerPoolDetail: + name = "LayerPoolDetail" + rows, err := fssync.PoolDetail(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdatePoolDetail(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerPool: + name = "LayerPool" + rows, err := fssync.Pool(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdatePool(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerPoolBuffer: + name = "LayerPoolBuffer" + rows, err := fssync.PoolBuffer(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdatePoolBuffer(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerQALarvCount: + name = "LayerQALarvCount" + rows, err := fssync.QALarvCount(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateQALarvCount(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerQAMosquitoInspection: + name = "LayerQAMosquitoInspection" + rows, err := fssync.QAMosquitoInspection(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateQAMosquitoInspection(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerQAProductObservation: + name = "LayerQAProductObservation" + rows, err := fssync.QAProductObservation(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateQAProductObservation(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerRestrictedArea: + name = "LayerRestrictedArea" + rows, err := fssync.RestrictedArea(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateRestrictedArea(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerRodentInspection: + name = "LayerRodentInspection" + rows, err := fssync.RodentInspection(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateRodentInspection(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + */ case fieldseeker.LayerRodentLocation: name = "LayerRodentLocation" rows, err := fssync.RodentLocation(offset) @@ -1461,176 +1441,165 @@ func exportFieldseekerLayer(ctx context.Context, org *models.Organization, fssyn return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) } unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerSampleCollection: - name = "LayerSampleCollection" - rows, err := fssync.SampleCollection(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateSampleCollection(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerSampleLocation: - name = "LayerSampleLocation" - rows, err := fssync.SampleLocation(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateSampleLocation(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerServiceRequest: - name = "LayerServiceRequest" - rows, err := fssync.ServiceRequest(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateServiceRequest(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerSpeciesAbundance: - name = "LayerSpeciesAbundance" - rows, err := fssync.SpeciesAbundance(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateSpeciesAbundance(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerStormDrain: - name = "LayerStormDrain" - rows, err := fssync.StormDrain(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateStormDrain(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerTracklog: - name = "LayerTracklog" - rows, err := fssync.Tracklog(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateTracklog(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerTrapLocation: - name = "LayerTrapLocation" - rows, err := fssync.TrapLocation(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateTrapLocation(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerTrapData: - name = "LayerTrapData" - rows, err := fssync.TrapData(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateTrapData(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerTimeCard: - name = "LayerTimeCard" - rows, err := fssync.TimeCard(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateTimeCard(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerTreatment: - name = "LayerTreatment" - rows, err := fssync.Treatment(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateTreatment(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerTreatmentArea: - name = "LayerTreatmentArea" - rows, err := fssync.TreatmentArea(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateTreatmentArea(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerULVSprayRoute: - name = "LayerULVSprayRoute" - rows, err := fssync.ULVSprayRoute(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateULVSprayRoute(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerZones: - name = "LayerZones" - rows, err := fssync.Zones(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateZones(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates - return ss, err - case fieldseeker.LayerZones2: - name = "LayerZones2" - rows, err := fssync.Zones2(offset) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) - } - inserts, updates, err = db.SaveOrUpdateZones2(rows) - if err != nil { - return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) - } - unchanged = uint(len(rows)) - inserts - updates + /* + case fieldseeker.LayerSampleCollection: + name = "LayerSampleCollection" + rows, err := fssync.SampleCollection(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateSampleCollection(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerSampleLocation: + name = "LayerSampleLocation" + rows, err := fssync.SampleLocation(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateSampleLocation(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerServiceRequest: + name = "LayerServiceRequest" + rows, err := fssync.ServiceRequest(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateServiceRequest(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerSpeciesAbundance: + name = "LayerSpeciesAbundance" + rows, err := fssync.SpeciesAbundance(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateSpeciesAbundance(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerStormDrain: + name = "LayerStormDrain" + rows, err := fssync.StormDrain(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateStormDrain(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerTracklog: + name = "LayerTracklog" + rows, err := fssync.Tracklog(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateTracklog(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerTrapLocation: + name = "LayerTrapLocation" + rows, err := fssync.TrapLocation(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateTrapLocation(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerTrapData: + name = "LayerTrapData" + rows, err := fssync.TrapData(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateTrapData(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerTimeCard: + name = "LayerTimeCard" + rows, err := fssync.TimeCard(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateTimeCard(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerTreatment: + name = "LayerTreatment" + rows, err := fssync.Treatment(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateTreatment(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerTreatmentArea: + name = "LayerTreatmentArea" + rows, err := fssync.TreatmentArea(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateTreatmentArea(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerULVSprayRoute: + name = "LayerULVSprayRoute" + rows, err := fssync.ULVSprayRoute(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateULVSprayRoute(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerZones: + name = "LayerZones" + rows, err := fssync.Zones(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateZones(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + case fieldseeker.LayerZones2: + name = "LayerZones2" + rows, err := fssync.Zones2(offset) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to query %s: %w", name, err) + } + inserts, updates, err = db.SaveOrUpdateZones2(rows) + if err != nil { + return SyncStats{}, fmt.Errorf("Failed to update %s: %w", name, err) + } + unchanged = uint(len(rows)) - inserts - updates + */ default: - return ss, errors.New("Unrecognized layer") + //return ss, errors.New("Unrecognized layer") + return ss, nil } ss.Inserts = inserts ss.Updates = updates diff --git a/db/fieldseeker.go b/db/fieldseeker.go index 2298a214..53a98707 100644 --- a/db/fieldseeker.go +++ b/db/fieldseeker.go @@ -138,11 +138,34 @@ type InsertResultRow struct { Version int `db:"version_num"` } -func SaveOrUpdateRodentLocation(ctx context.Context, org *models.Organization, fs []*fslayer.RodentLocation) (inserts uint, updates uint, err error) { - log.Info().Int("rows", len(fs)).Msg("Processing RodentLocation") +type rowConverter[T any] func(*T) []SqlParam + +func doUpdatesViaFunction[T any](ctx context.Context, org *models.Organization, fs []*T, table string, procedure string, converter rowConverter[T]) (inserts uint, updates uint, err error) { + //log.Info().Int("rows", len(fs)).Msg("Processing RodentLocation") for _, row := range fs { - procedure := "fieldseeker.insert_rodentlocation" - q := queryStoredProcedure(procedure, + params := converter(row) + q := queryStoredProcedure(procedure, params...) + query := psql.RawQuery(q) + log.Info().Str("query", q).Msg("querying") + result, err := bob.One[InsertResultRow](ctx, PGInstance.BobDB, query, scan.StructMapper[InsertResultRow]()) + if err != nil { + return inserts, updates, fmt.Errorf("Failed to execute %s: %w", procedure, err) + } + if result.Inserted { + if result.Version == 1 { + inserts += 1 + } else { + updates += 1 + } + } + log.Info().Bool("inserted", result.Inserted).Int("version", result.Version).Msg("querying") + } + return inserts, updates, err + +} +func SaveOrUpdateRodentLocation(ctx context.Context, org *models.Organization, fs []*fslayer.RodentLocation) (inserts uint, updates uint, err error) { + return doUpdatesViaFunction(ctx, org, fs, "RodentLocation", "fieldseeker.insert_rodentlocation", func(row *fslayer.RodentLocation) []SqlParam { + return []SqlParam{ Uint("p_objectid", row.ObjectID), String("p_locationname", row.LocationName), String("p_zone", row.Zone), @@ -173,23 +196,10 @@ func SaveOrUpdateRodentLocation(ctx context.Context, org *models.Organization, f Timestamp("p_editdate", row.EditDate), String("p_editor", row.Editor), String("p_jurisdiction", row.Jurisdiction), - ) - query := psql.RawQuery(q) - log.Info().Str("query", q).Msg("querying") - result, err := bob.One[InsertResultRow](ctx, PGInstance.BobDB, query, scan.StructMapper[InsertResultRow]()) - if err != nil { - return inserts, updates, fmt.Errorf("Failed to execute %s: %w", procedure, err) } - if result.Inserted { - if result.Version == 1 { - inserts += 1 - } else { - updates += 1 - } - } - } - return inserts, updates, err + }) } + func SaveOrUpdateSampleCollection(fs []*fslayer.SampleCollection) (inserts uint, updates uint, err error) { //log.Warn().Int("len", len(fs)).Msg("Ignoring SampleCollection rows") return 0, 0, nil