package channels import ( "database/sql" "fmt" "github.com/go-errors/errors" "edge-infra.dev/pkg/edge/api/graph/model" ) func scanChannelServiceAccount(scanner interface{ Scan(...any) error }) (model.ChannelIAMPolicy, error) { var channelIAMPolicy model.ChannelIAMPolicy err := scanner.Scan( &channelIAMPolicy.ChannelSaID, &channelIAMPolicy.ChannelID, &channelIAMPolicy.SaEmail, &channelIAMPolicy.CreatedAt) if err != nil && errors.Is(err, sql.ErrNoRows) { return channelIAMPolicy, errors.Join(ErrChannelDoesNotExist, err) } else if err != nil { return channelIAMPolicy, fmt.Errorf("failed to scan channel: %w", err) } return channelIAMPolicy, nil } // scanChannel requires SELECT and RETURNING statements to use the following order: // // channel_id, name, description, team, expire_buffer_duration, rotation_interval_duration, created_at // // please keep queries consistent and use this function. func scanChannel(scanner interface{ Scan(...any) error }) (Channel, error) { var x Channel err := scanner.Scan( &x.ID, &x.Name, &x.Description, &x.Team, &x.ExpireBufferDuration, &x.RotationIntervalDuration, &x.CreatedAt, ) if err != nil && errors.Is(err, sql.ErrNoRows) { return x, errors.Join(ErrChannelDoesNotExist, err) } else if err != nil { return x, fmt.Errorf("failed to scan channel: %w", err) } return x, x.validateScan() // sanity assertion } // scanChannelKeyVersion requires SELECT and RETURNING statements to use the following order: // // channel_key_versions_id, channel_id, banner_edge_id, version, sm_link, expire_at, rotate_at, created_at // // please keep queries consistent and use this function. func scanChannelKeyVersion(scanner interface{ Scan(...any) error }) (ChannelKeyVersion, error) { var ckv ChannelKeyVersion var rotateAt sql.NullTime err := scanner.Scan( &ckv.ID, &ckv.ChannelID, &ckv.BannerEdgeID, &ckv.Version, &ckv.SecretManagerLink, &ckv.ExpireAt, &rotateAt, &ckv.CreatedAt, ) if err != nil { return ckv, fmt.Errorf("failed to scan channel key version: %w", err) } // if `rotate_at IS NULL` then `rotateAt.Time.IsZero() == true` ckv.RotateAt = rotateAt.Time return ckv, ckv.validateScan() // sanity assertion }