diff --git a/api/user_auth.go b/api/user_auth.go index 1fd7e79..562ebb1 100644 --- a/api/user_auth.go +++ b/api/user_auth.go @@ -58,9 +58,10 @@ func init() { } type DisplayUser struct { - Id int64 `json:"id"` - Email string `json:"email"` - RegistrationTime *time.Time `json:"registration_time,omitempty"` + Id int64 `json:"id"` + Email string `json:"email"` + RegistrationTime *time.Time `json:"registration_time,omitempty"` + Settings happydns.UserSettings `json:"settings,omitempty"` } func currentUser(u *happydns.User) *DisplayUser { @@ -68,6 +69,7 @@ func currentUser(u *happydns.User) *DisplayUser { Id: u.Id, Email: u.Email, RegistrationTime: u.RegistrationTime, + Settings: u.Settings, } } diff --git a/api/users.go b/api/users.go index 847d595..fcb64d7 100644 --- a/api/users.go +++ b/api/users.go @@ -58,6 +58,8 @@ func init() { router.POST("/api/users", ApiHandler(registerUser)) router.PATCH("/api/users", ApiHandler(specialUserOperations)) router.GET("/api/users/:uid", apiAuthHandler(sameUserHandler(getUser))) + router.GET("/api/users/:uid/settings", apiAuthHandler(sameUserHandler(getUserSettings))) + router.POST("/api/users/:uid/settings", apiAuthHandler(sameUserHandler(changeUserSettings))) router.POST("/api/users/:uid/delete", apiAuthHandler(sameUserHandler(deleteUser))) router.POST("/api/users/:uid/email", ApiHandler(userHandler(validateUserAddress))) router.POST("/api/users/:uid/new_password", apiAuthHandler(sameUserHandler(changePassword))) @@ -254,6 +256,33 @@ func getUser(opts *config.Options, req *RequestResources, _ io.Reader) Response } } +func getUserSettings(opts *config.Options, req *RequestResources, _ io.Reader) Response { + return APIResponse{ + response: req.User.Settings, + } +} + +func changeUserSettings(opts *config.Options, req *RequestResources, body io.Reader) Response { + var us happydns.UserSettings + if err := json.NewDecoder(body).Decode(&us); err != nil { + return APIErrorResponse{ + err: err, + } + } + + req.User.Settings = us + + if err := storage.MainStore.UpdateUser(req.User); err != nil { + return APIErrorResponse{ + err: err, + } + } + + return APIResponse{ + response: req.User.Settings, + } +} + type passwordForm struct { Current string Password string diff --git a/htdocs/src/App.vue b/htdocs/src/App.vue index fb20342..ec33da5 100644 --- a/htdocs/src/App.vue +++ b/htdocs/src/App.vue @@ -156,6 +156,9 @@ export default { (response) => { sessionStorage.loggedUser = JSON.stringify(response.data) this.loggedUser = response.data + if (this.loggedUser.settings && this.loggedUser.settings.language && this.$i18n.locale !== this.loggedUser.settings.language) { + this.$i18n.locale = this.loggedUser.settings.language + } }, (error) => { this.loggedUser = null diff --git a/htdocs/src/i18n.js b/htdocs/src/i18n.js index 2b285c5..898466e 100644 --- a/htdocs/src/i18n.js +++ b/htdocs/src/i18n.js @@ -19,5 +19,6 @@ function loadLocaleMessages () { export default new VueI18n({ locale: process.env.VUE_APP_I18N_LOCALE || 'en', fallbackLocale: process.env.VUE_APP_I18N_FALLBACK_LOCALE || 'en', - messages: loadLocaleMessages() + messages: loadLocaleMessages(), + silentTranslationWarn: process.env.NODE_ENV === 'production' }) diff --git a/htdocs/src/locales/en.json b/htdocs/src/locales/en.json index 41dfb50..ed8ec72 100644 --- a/htdocs/src/locales/en.json +++ b/htdocs/src/locales/en.json @@ -157,6 +157,7 @@ "registration": "Registration problem", "rr-add": "An error occurs when trying to add RR to the zone:", "rr-delete": "An error occurs when trying to delete RR in the zone:", + "settings-change": "Unable to change your settings", "source-delete": "Something went wrong during source deletion", "session": { "title": "Authentication timeout", @@ -216,6 +217,13 @@ "delete": "@:common.delete service", "update": "Update service" }, + "settings": { + "language": "Language", + "save": "Save settings", + "title": "Settings", + "success": "Continue to enjoy happyDNS.", + "success-change": "Your settings has been saved." + }, "source": { "available-types": "Resources Types available", "delete": "@:common.delete this @:source.kind", diff --git a/htdocs/src/views/me.vue b/htdocs/src/views/me.vue index 69be422..88847e5 100644 --- a/htdocs/src/views/me.vue +++ b/htdocs/src/views/me.vue @@ -33,6 +33,26 @@