From 5a85c71d51d281a5fa5e6e81a24fcfcec5d4d066 Mon Sep 17 00:00:00 2001 From: Calvin McLean Date: Mon, 2 Sep 2024 20:38:01 -0700 Subject: [PATCH] Fix migration for end-dated and mixed versions --- garden-app/gardens.yaml.example | 4 ++-- garden-app/pkg/storage/migrations.go | 17 ++++++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/garden-app/gardens.yaml.example b/garden-app/gardens.yaml.example index 6a863ca8..cee270ff 100644 --- a/garden-app/gardens.yaml.example +++ b/garden-app/gardens.yaml.example @@ -1,12 +1,12 @@ Garden_chokmn1nhf81274ru2mg: '{"name":"Indoor Seed Starting","topic_prefix":"seed-garden","id":"chokmn1nhf81274ru2mg","max_zones":3,"created_at":"2023-05-27T00:14:20.324Z","light_schedule":{"duration":"16h0m0s","start_time":"06:00:00-07:00"},"version":1}' Garden_cos1pt0n1e43o39cs40g: '{"name":"Front Yard","topic_prefix":"front-yard","id":"cos1pt0n1e43o39cs40g","max_zones":4,"created_at":"2024-05-05T16:58:10.206246-07:00","version":1}' -WaterSchedule_chokmq1nhf81274ru2n0: '{"id":"chokmq1nhf81274ru2n0","duration":"1s","interval":"30s","start_time":"15:00:00Z","end_date":"2024-05-05T17:01:10.335976-07:00","name":"WaterEvery30s"}' +WaterSchedule_chokmq1nhf81274ru2n0: '{"id":"chokmq1nhf81274ru2n0","duration":"1s","interval":"30s","start_date":null,"start_time":"15:00:00Z","end_date":"2024-05-05T17:01:10.335976-07:00","name":"WaterEvery30s","version":1}' WaterSchedule_cii72s9nhf8f7gdpckug: '{"id":"cii72s9nhf8f7gdpckug","duration":"1h0m0s","interval":"480h0m0s","start_date":null,"start_time":"12:00:00Z","name":"Winter Trees","description":"Water deeply and infrequently in the winter","active_period":{"start_month":"October","end_month":"March"},"version":1}' WaterSchedule_cjbg22a8tio6of9s8o0g: '{"id":"cjbg22a8tio6of9s8o0g","duration":"30s","interval":"24h0m0s","start_date":null,"start_time":"15:00:00Z","name":"Seedlings","description":"Water seedlings a bit every day","version":1}' WaterSchedule_cos1s28n1e43sc2vb4k0: '{"id":"cos1s28n1e43sc2vb4k0","duration":"1h30m0s","interval":"240h0m0s","start_date":null,"start_time":"12:00:00Z","name":"Summer Trees","description":"Water deeply every 10 days","active_period":{"start_month":"April","end_month":"September"},"version":1}' WaterSchedule_cos1suon1e43sc2vb4kg: '{"id":"cos1suon1e43sc2vb4kg","duration":"45m0s","interval":"120h0m0s","start_date":null,"start_time":"15:04:05Z","name":"Shrubs","description":"Water shrubs every 5 days","version":1}' Zone_chokn19nhf81274ru2o0: '{"name":"Zone 1","id":"chokn19nhf81274ru2o0","garden_id":"chokmn1nhf81274ru2mg","position":0,"created_at":"2023-05-27T00:15:01.683Z","water_schedule_ids":["cjbg22a8tio6of9s8o0g"],"skip_count":null,"version":1}' -Zone_cij42vpnhf85d3acsgu0: '{"name":"Zone 2","id":"cij42vpnhf85d3acsgu0","garden_id":"chokmn1nhf81274ru2mg","position":0,"created_at":"2023-07-06T04:22:23.331Z","end_date":"2024-05-05T17:00:29.204187-07:00","water_schedule_ids":["chokmq1nhf81274ru2n0"],"skip_count":null}' +Zone_cij42vpnhf85d3acsgu0: '{"name":"Zone 2","id":"cij42vpnhf85d3acsgu0","garden_id":"chokmn1nhf81274ru2mg","position":0,"created_at":"2023-07-06T04:22:23.331Z","end_date":"2024-05-05T17:00:29.204187-07:00","water_schedule_ids":["chokmq1nhf81274ru2n0"],"skip_count":null,"version":1}' Zone_cij436pnhf85d3acsgug: '{"name":"Zone 1","id":"cij436pnhf85d3acsgug","garden_id":"cihpp51nhf84tr94jtfg","position":0,"created_at":"2023-07-06T04:22:51.608Z","water_schedule_ids":["cii72s9nhf8f7gdpckug"],"skip_count":null,"version":1}' Zone_cos1q8gn1e43o39cs410: '{"name":"Trees","details":{"description":"This zone controls watering to two trees that are watered deeply"},"id":"cos1q8gn1e43o39cs410","garden_id":"cos1pt0n1e43o39cs40g","position":0,"created_at":"2024-05-05T16:58:49.357958-07:00","water_schedule_ids":["cos1s28n1e43sc2vb4k0","cii72s9nhf8f7gdpckug"],"skip_count":null,"version":1}' Zone_cos1qf0n1e43o39cs41g: '{"name":"Shrubs","details":{"description":"This zone has a few shrubs that need water more frequently"},"id":"cos1qf0n1e43o39cs41g","garden_id":"cos1pt0n1e43o39cs40g","position":2,"created_at":"2024-05-05T16:59:08.973836-07:00","water_schedule_ids":["cos1suon1e43sc2vb4kg"],"skip_count":null,"version":1}' diff --git a/garden-app/pkg/storage/migrations.go b/garden-app/pkg/storage/migrations.go index 2cfc9ba0..8f5f7a9e 100644 --- a/garden-app/pkg/storage/migrations.go +++ b/garden-app/pkg/storage/migrations.go @@ -2,10 +2,12 @@ package storage import ( "context" + "errors" "fmt" "github.com/calvinmclean/automated-garden/garden-app/pkg" "github.com/calvinmclean/automated-garden/garden-app/pkg/storage/migrate" + "github.com/calvinmclean/babyapi" ) var ( @@ -48,13 +50,16 @@ func (c *Client) RunMigrations(ctx context.Context) error { } func (c *Client) RunZoneMigrations(ctx context.Context) error { - zones, err := c.Zones.GetAll(ctx, nil) + zones, err := c.Zones.GetAll(ctx, babyapi.EndDatedQueryParam(true)) if err != nil { return fmt.Errorf("error getting all Zones: %w", err) } for zone, err := range migrate.Each[*pkg.Zone, *pkg.Zone](zoneMigrations, zones) { if err != nil { + if errors.Is(err, migrate.ErrNotFound) { + continue + } return fmt.Errorf("error migrating Zone: %w", err) } @@ -68,13 +73,16 @@ func (c *Client) RunZoneMigrations(ctx context.Context) error { } func (c *Client) RunGardenMigrations(ctx context.Context) error { - gardens, err := c.Gardens.GetAll(ctx, nil) + gardens, err := c.Gardens.GetAll(ctx, babyapi.EndDatedQueryParam(true)) if err != nil { return fmt.Errorf("error getting all Gardens: %w", err) } for garden, err := range migrate.Each[*pkg.Garden, *pkg.Garden](gardenMigrations, gardens) { if err != nil { + if errors.Is(err, migrate.ErrNotFound) { + continue + } return fmt.Errorf("error migrating Garden: %w", err) } @@ -88,13 +96,16 @@ func (c *Client) RunGardenMigrations(ctx context.Context) error { } func (c *Client) RunWaterScheduleMigrations(ctx context.Context) error { - waterSchedules, err := c.WaterSchedules.GetAll(ctx, nil) + waterSchedules, err := c.WaterSchedules.GetAll(ctx, babyapi.EndDatedQueryParam(true)) if err != nil { return fmt.Errorf("error getting all WaterSchedules: %w", err) } for waterSchedule, err := range migrate.Each[*pkg.WaterSchedule, *pkg.WaterSchedule](waterScheduleMigrations, waterSchedules) { if err != nil { + if errors.Is(err, migrate.ErrNotFound) { + continue + } return fmt.Errorf("error migrating WaterSchedule: %w", err) }