mirror of
https://github.com/navidrome/navidrome.git
synced 2025-07-14 07:31:28 +03:00
* Add migration converting playqueue current to index * refactor Signed-off-by: Deluan <deluan@navidrome.org> * fix(queue): ensure valid current index and improve test coverage Signed-off-by: Deluan <deluan@navidrome.org> --------- Signed-off-by: Deluan <deluan@navidrome.org>
81 lines
2.0 KiB
Go
81 lines
2.0 KiB
Go
package migrations
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"strings"
|
|
|
|
"github.com/pressly/goose/v3"
|
|
)
|
|
|
|
func init() {
|
|
goose.AddMigrationContext(upPlayQueueCurrentToIndex, downPlayQueueCurrentToIndex)
|
|
}
|
|
|
|
func upPlayQueueCurrentToIndex(ctx context.Context, tx *sql.Tx) error {
|
|
_, err := tx.ExecContext(ctx, `
|
|
create table playqueue_dg_tmp(
|
|
id varchar(255) not null,
|
|
user_id varchar(255) not null
|
|
references user(id)
|
|
on update cascade on delete cascade,
|
|
current integer not null default 0,
|
|
position real,
|
|
changed_by varchar(255),
|
|
items varchar(255),
|
|
created_at datetime,
|
|
updated_at datetime
|
|
);`)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
rows, err := tx.QueryContext(ctx, `select id, user_id, current, position, changed_by, items, created_at, updated_at from playqueue`)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer rows.Close()
|
|
|
|
stmt, err := tx.PrepareContext(ctx, `insert into playqueue_dg_tmp(id, user_id, current, position, changed_by, items, created_at, updated_at) values(?,?,?,?,?,?,?,?)`)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer stmt.Close()
|
|
|
|
for rows.Next() {
|
|
var id, userID, currentID, changedBy, items string
|
|
var position sql.NullFloat64
|
|
var createdAt, updatedAt sql.NullString
|
|
if err = rows.Scan(&id, &userID, ¤tID, &position, &changedBy, &items, &createdAt, &updatedAt); err != nil {
|
|
return err
|
|
}
|
|
index := 0
|
|
if currentID != "" && items != "" {
|
|
parts := strings.Split(items, ",")
|
|
for i, p := range parts {
|
|
if p == currentID {
|
|
index = i
|
|
break
|
|
}
|
|
}
|
|
}
|
|
_, err = stmt.Exec(id, userID, index, position, changedBy, items, createdAt, updatedAt)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
if err = rows.Err(); err != nil {
|
|
return err
|
|
}
|
|
|
|
if _, err = tx.ExecContext(ctx, `drop table playqueue;`); err != nil {
|
|
return err
|
|
}
|
|
_, err = tx.ExecContext(ctx, `alter table playqueue_dg_tmp rename to playqueue;`)
|
|
return err
|
|
}
|
|
|
|
func downPlayQueueCurrentToIndex(ctx context.Context, tx *sql.Tx) error {
|
|
return nil
|
|
}
|