internal/seeder/seed.go (67 lines of code) (raw):

package seeder import ( "context" "fmt" "log" "cloud.google.com/go/storage" "github.com/GoogleCloudPlatform/gcs-metadata-server/internal/model" "github.com/GoogleCloudPlatform/gcs-metadata-server/internal/repo" "google.golang.org/api/iterator" ) type SeedService struct { client *storage.Client bucketId string directoryRepo repo.DirectoryRepository metadataRepo repo.MetadataRepository } func NewSeedService(client *storage.Client, bucketId string, directoryRepo repo.DirectoryRepository, metadataRepo repo.MetadataRepository) *SeedService { return &SeedService{ client: client, bucketId: bucketId, directoryRepo: directoryRepo, metadataRepo: metadataRepo, } } func newMetadata(obj *storage.ObjectAttrs) *model.Metadata { return &model.Metadata{ Bucket: obj.Bucket, Name: obj.Name, Size: obj.Size, StorageClass: obj.StorageClass, Created: obj.Created, Updated: obj.Updated, } } type objectIterator interface { Next() (*storage.ObjectAttrs, error) } // Seed initiates the seeding process by traversing bucket and inserting into db func (s *SeedService) Start(ctx context.Context) error { b := s.client.Bucket(s.bucketId) if _, err := b.Attrs(ctx); err != nil { return err } it := b.Objects(ctx, nil) if err := s.insertFromIterator(it); err != nil { return err } return nil } // insertFromIterator traverses iterator while inserting all containing items into db func (s *SeedService) insertFromIterator(it objectIterator) error { for { obj, err := it.Next() if err != nil { if err == iterator.Done { break } return fmt.Errorf("error retrieving iterator object: %v", err) } metadata := newMetadata(obj) if err := s.metadataRepo.Insert(metadata); err != nil { log.Printf("Error inserting metadata: %v", err) } if err := s.directoryRepo.UpsertParentDirs(repo.StorageClass(metadata.StorageClass), metadata.Bucket, metadata.Name, metadata.Size, 1); err != nil { log.Printf("Error upserting directories: %v", err) } } return nil }