64 lines
1.1 KiB
Go
64 lines
1.1 KiB
Go
|
package migrations
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"database/sql"
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/pressly/goose/v3"
|
||
|
"reichard.io/antholume/utils"
|
||
|
)
|
||
|
|
||
|
func init() {
|
||
|
goose.AddMigrationContext(upUserAuthHash, downUserAuthHash)
|
||
|
}
|
||
|
|
||
|
func upUserAuthHash(ctx context.Context, tx *sql.Tx) error {
|
||
|
// Create now column
|
||
|
_, err := tx.Exec("ALTER TABLE users ADD COLUMN auth_hash TEXT")
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// Get current users
|
||
|
rows, err := tx.Query("SELECT id FROM users")
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// Query existing users
|
||
|
var users []string
|
||
|
for rows.Next() {
|
||
|
var user string
|
||
|
if err := rows.Scan(&user); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
users = append(users, user)
|
||
|
}
|
||
|
|
||
|
// Create auth hash per user
|
||
|
for _, user := range users {
|
||
|
rawAuthHash, err := utils.GenerateToken(64)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
authHash := fmt.Sprintf("%x", rawAuthHash)
|
||
|
_, err = tx.Exec("UPDATE users SET auth_hash = ? WHERE id = ?", authHash, user)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func downUserAuthHash(ctx context.Context, tx *sql.Tx) error {
|
||
|
// Drop column
|
||
|
_, err := tx.Exec("ALTER users DROP COLUMN auth_hash")
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|