Evan Reichard
f1414e3e4e
This fixed various issues related to calculating streaks, etc. Now we appropriately handle time as it was, vs as it is relative to an offset.
59 lines
1.2 KiB
Go
59 lines
1.2 KiB
Go
package migrations
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
|
|
"github.com/pressly/goose/v3"
|
|
)
|
|
|
|
func init() {
|
|
goose.AddMigrationContext(upUserTimezone, downUserTimezone)
|
|
}
|
|
|
|
func upUserTimezone(ctx context.Context, tx *sql.Tx) error {
|
|
// Determine if we have a new DB or not
|
|
isNew := ctx.Value("isNew").(bool)
|
|
if isNew {
|
|
return nil
|
|
}
|
|
|
|
// Copy table & create column
|
|
_, err := tx.Exec(`
|
|
-- Copy Table
|
|
CREATE TABLE temp_users AS SELECT * FROM users;
|
|
ALTER TABLE temp_users DROP COLUMN time_offset;
|
|
ALTER TABLE temp_users ADD COLUMN timezone TEXT;
|
|
UPDATE temp_users SET timezone = 'Europe/London';
|
|
|
|
-- Clean Table
|
|
DELETE FROM users;
|
|
ALTER TABLE users DROP COLUMN time_offset;
|
|
ALTER TABLE users ADD COLUMN timezone TEXT NOT NULL DEFAULT 'Europe/London';
|
|
|
|
-- Copy Temp Table -> Clean Table
|
|
INSERT INTO users SELECT * FROM temp_users;
|
|
|
|
-- Drop Temp Table
|
|
DROP TABLE temp_users;
|
|
`)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func downUserTimezone(ctx context.Context, tx *sql.Tx) error {
|
|
// Update column name & value
|
|
_, err := tx.Exec(`
|
|
ALTER TABLE users RENAME COLUMN timezone TO time_offset;
|
|
UPDATE users SET time_offset = '0 hours';
|
|
`)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|