Files
payments/internal/storage/migrations/6-add-missing-reference-transfer-initiations-for-v2.go

90 lines
1.9 KiB
Go

package migrations
import (
"context"
"github.com/hanzo-fi/go-libs/v5/pkg/storage/bun/paginate"
"github.com/hanzo-fi/payments/pkg/domain/models"
"github.com/uptrace/bun"
)
type v2TransferInitiation struct {
bun.BaseModel `bun:"transfers.transfer_initiation"`
ID models.PaymentInitiationID `bun:"id"`
Reference string `bun:"reference"`
}
func FixMissingReferenceTransferInitiation(ctx context.Context, db bun.IDB) error {
exist, err := isTableExisting(ctx, db, "transfers", "transfer_initiation")
if err != nil {
return err
}
if !exist {
// Nothing to migrate
return nil
}
_, err = db.ExecContext(ctx, `
ALTER TABLE transfers.transfer_initiation ADD COLUMN IF NOT EXISTS reference text;
`)
if err != nil {
return err
}
_, err = db.ExecContext(ctx, `
ALTER TABLE transfers.transfer_initiation ADD COLUMN IF NOT EXISTS sort_id bigserial;
`)
if err != nil {
return err
}
q := paginate.OffsetPaginatedQuery[paginate.PaginatedQueryOptions[any]]{
Order: paginate.OrderAsc,
PageSize: 1000,
Options: paginate.PaginatedQueryOptions[any]{
PageSize: 1000,
},
}
for {
cursor, err := paginateWithOffset[paginate.PaginatedQueryOptions[any], v2TransferInitiation](
ctx,
db,
(*paginate.OffsetPaginatedQuery[paginate.PaginatedQueryOptions[any]])(&q),
func(query *bun.SelectQuery) *bun.SelectQuery {
return query.
Column("id").
Order("created_at ASC", "sort_id ASC")
},
)
if err != nil {
return err
}
for i := range cursor.Data {
cursor.Data[i].Reference = cursor.Data[i].ID.Reference
_, err = db.NewUpdate().
Model(&cursor.Data[i]).
Set("reference = ?", cursor.Data[i].Reference).
Where("id = ?", cursor.Data[i].ID).
Exec(ctx)
if err != nil {
return err
}
}
if !cursor.HasMore {
break
}
err = paginate.UnmarshalCursor(cursor.Next, &q)
if err != nil {
return err
}
}
return nil
}