diff --git a/cmd/web/handlers_user.go b/cmd/web/handlers_user.go index 45f2087..8690065 100644 --- a/cmd/web/handlers_user.go +++ b/cmd/web/handlers_user.go @@ -3,6 +3,7 @@ package main import ( "errors" "net/http" + "time" "git.32bit.cafe/32bitcafe/guestbook/internal/forms" "git.32bit.cafe/32bitcafe/guestbook/internal/models" @@ -137,7 +138,7 @@ func (app *application) getUserSettings(w http.ResponseWriter, r *http.Request) } func (app *application) putUserSettings(w http.ResponseWriter, r *http.Request) { - userId := app.getCurrentUser(r).ID + user := app.getCurrentUser(r) var form forms.UserSettingsForm err := app.decodePostForm(r, &form) if err != nil { @@ -150,7 +151,12 @@ func (app *application) putUserSettings(w http.ResponseWriter, r *http.Request) // TODO: rerender template with errors app.clientError(w, http.StatusUnprocessableEntity) } - err = app.users.SetLocalTimezone(userId, form.LocalTimezone) + user.Settings.LocalTimezone, err = time.LoadLocation(form.LocalTimezone) + if err != nil { + app.serverError(w, r, err) + return + } + err = app.users.UpdateUserSettings(user.ID, user.Settings) if err != nil { app.serverError(w, r, err) return diff --git a/internal/models/user.go b/internal/models/user.go index 5f107cd..85f5b65 100644 --- a/internal/models/user.go +++ b/internal/models/user.go @@ -15,7 +15,7 @@ type UserSettings struct { } const ( - USER_TIMEZONE = "local_timezone" + SettingUserTimezone = "local_timezone" ) type User struct { @@ -88,6 +88,9 @@ func (m *UserModel) Insert(shortId uint64, username string, email string, passwo return err } err = m.initializeUserSettings(id, settings) + if err != nil { + return err + } return nil } @@ -201,7 +204,7 @@ func (m *UserModel) GetSettings(userId int64) (UserSettings, error) { return settings, err } switch id { - case m.Settings[USER_TIMEZONE].id: + case m.Settings[SettingUserTimezone].id: settings.LocalTimezone, err = time.LoadLocation(unconstrainedValue.String) if err != nil { panic(err) @@ -214,7 +217,7 @@ func (m *UserModel) GetSettings(userId int64) (UserSettings, error) { func (m *UserModel) initializeUserSettings(userId int64, settings UserSettings) error { stmt := `INSERT INTO user_settings (UserId, SettingId, AllowedSettingValueId, UnconstrainedValue) VALUES (?, ?, ?, ?)` - _, err := m.DB.Exec(stmt, userId, m.Settings[USER_TIMEZONE].id, nil, settings.LocalTimezone.String()) + _, err := m.DB.Exec(stmt, userId, m.Settings[SettingUserTimezone].id, nil, settings.LocalTimezone.String()) if err != nil { return err } @@ -222,7 +225,7 @@ func (m *UserModel) initializeUserSettings(userId int64, settings UserSettings) } func (m *UserModel) UpdateUserSettings(userId int64, settings UserSettings) error { - err := m.UpdateSetting(userId, m.Settings[USER_TIMEZONE], settings.LocalTimezone.String()) + err := m.UpdateSetting(userId, m.Settings[SettingUserTimezone], settings.LocalTimezone.String()) if err != nil { return err } @@ -230,6 +233,10 @@ func (m *UserModel) UpdateUserSettings(userId int64, settings UserSettings) erro } func (m *UserModel) UpdateSetting(userId int64, setting Setting, value string) error { + valid := setting.Validate(value) + if !valid { + return ErrInvalidSettingValue + } stmt := `UPDATE user_settings SET AllowedSettingValueId=IFNULL( (SELECT Id FROM allowed_setting_values WHERE SettingId = user_settings.SettingId AND ItemValue = ?), AllowedSettingValueId @@ -250,16 +257,3 @@ func (m *UserModel) UpdateSetting(userId int64, setting Setting, value string) e } return nil } - -func (m *UserModel) SetLocalTimezone(userId int64, timezone string) error { - setting := m.Settings[USER_TIMEZONE] - valid := setting.Validate(timezone) - if !valid { - return ErrInvalidSettingValue - } - err := m.UpdateSetting(userId, setting, timezone) - if err != nil { - return err - } - return nil -}