diff --git a/server/server.go b/server/server.go index c49d7b1c..4633174e 100644 --- a/server/server.go +++ b/server/server.go @@ -40,7 +40,6 @@ import ( login/account endpoints reset daily Limits for users - set last_stats_reset in migration - set sync_topic in migration update last_seen when API is accessed Make sure account endpoints make sense for admins diff --git a/user/manager.go b/user/manager.go index 44ca81be..94edd1e8 100644 --- a/user/manager.go +++ b/user/manager.go @@ -232,6 +232,8 @@ const ( DROP TABLE access; DROP TABLE user_old; ` + migrate1To2SelectAllUsersIDsNoTx = `SELECT id FROM user` + migrate1To2UpdateSyncTopicNoTx = `UPDATE user SET sync_topic = ? WHERE id = ?` ) // Manager is an implementation of Manager. It stores users and access control list @@ -481,7 +483,6 @@ func (a *Manager) AddUser(username, password string, role Role, createdBy string if err != nil { return err } - // INSERT INTO user (user, pass, role, sync_topic, created_by, created_at, last_seen) syncTopic, now := util.RandomString(syncTopicLength), time.Now().Unix() if _, err = a.db.Exec(insertUserQuery, username, hash, role, syncTopic, createdBy, now, now); err != nil { return err @@ -885,6 +886,27 @@ func migrateFrom1(db *sql.DB) error { if _, err := tx.Exec(migrate1To2InsertFromOldTablesAndDropNoTx); err != nil { return err } + rows, err := tx.Query(migrate1To2SelectAllUsersIDsNoTx) + if err != nil { + return err + } + defer rows.Close() + syncTopics := make(map[int]string) + for rows.Next() { + var userID int + if err := rows.Scan(&userID); err != nil { + return err + } + syncTopics[userID] = util.RandomString(syncTopicLength) + } + if err := rows.Close(); err != nil { + return err + } + for userID, syncTopic := range syncTopics { + if _, err := tx.Exec(migrate1To2UpdateSyncTopicNoTx, syncTopic, userID); err != nil { + return err + } + } if _, err := tx.Exec(updateSchemaVersion, 2); err != nil { return err } diff --git a/user/manager_test.go b/user/manager_test.go index edffd3d3..3c7b35a8 100644 --- a/user/manager_test.go +++ b/user/manager_test.go @@ -600,10 +600,13 @@ func TestSqliteCache_Migration_From1(t *testing.T) { require.Equal(t, "phil", phil.Name) require.Equal(t, RoleAdmin, phil.Role) + require.Equal(t, syncTopicLength, len(phil.SyncTopic)) require.Equal(t, 0, len(philGrants)) require.Equal(t, "ben", ben.Name) require.Equal(t, RoleUser, ben.Role) + require.Equal(t, syncTopicLength, len(ben.SyncTopic)) + require.NotEqual(t, ben.SyncTopic, phil.SyncTopic) require.Equal(t, 2, len(benGrants)) require.Equal(t, "stats", benGrants[0].TopicPattern) require.Equal(t, PermissionReadWrite, benGrants[0].Allow)