summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author6543 <6543@obermui.de>2021-06-23 21:58:44 +0200
committerGitHub <noreply@github.com>2021-06-23 15:58:44 -0400
commit58501a26821160c3258c1ad3501f4c1d8db0a597 (patch)
treed8a75bc1e8145e83b02c220006b9bc24d8ba2f9b
parent8640717f5fb045ee88eda14c7dbe3731b8c068b2 (diff)
downloadgitea-58501a26821160c3258c1ad3501f4c1d8db0a597.tar.gz
gitea-58501a26821160c3258c1ad3501f4c1d8db0a597.zip
[API] GET / SET User Settings (#16169)
* API: GET/SET User Settings * linter * Apply suggestions from code review * Update modules/structs/user.go * lint * fix swagger * move User2UserSettings to convert * as per @zeripath "preferences" -> "settings" Co-authored-by: techknowlogick <matti@mdranta.net> Co-authored-by: techknowlogick <techknowlogick@gitea.io>
-rw-r--r--modules/convert/user.go15
-rw-r--r--modules/structs/user.go30
-rw-r--r--routers/api/v1/api.go4
-rw-r--r--routers/api/v1/swagger/options.go3
-rw-r--r--routers/api/v1/swagger/user.go7
-rw-r--r--routers/api/v1/user/settings.go83
-rw-r--r--templates/swagger/v1_json.tmpl140
7 files changed, 281 insertions, 1 deletions
diff --git a/modules/convert/user.go b/modules/convert/user.go
index 07a4efd41a..894be3bd44 100644
--- a/modules/convert/user.go
+++ b/modules/convert/user.go
@@ -76,3 +76,18 @@ func toUser(user *models.User, signed, authed bool) *api.User {
}
return result
}
+
+// User2UserSettings return UserSettings based on a user
+func User2UserSettings(user *models.User) api.UserSettings {
+ return api.UserSettings{
+ FullName: user.FullName,
+ Website: user.Website,
+ Location: user.Location,
+ Language: user.Language,
+ Description: user.Description,
+ Theme: user.Theme,
+ HideEmail: user.KeepEmailPrivate,
+ HideActivity: user.KeepActivityPrivate,
+ DiffViewStyle: user.DiffViewStyle,
+ }
+}
diff --git a/modules/structs/user.go b/modules/structs/user.go
index de2e68c2a2..0d8b0300c3 100644
--- a/modules/structs/user.go
+++ b/modules/structs/user.go
@@ -60,3 +60,33 @@ func (u User) MarshalJSON() ([]byte, error) {
CompatUserName string `json:"username"`
}{shadow(u), u.UserName})
}
+
+// UserSettings represents user settings
+// swagger:model
+type UserSettings struct {
+ FullName string `json:"full_name"`
+ Website string `json:"website"`
+ Description string `json:"description"`
+ Location string `json:"location"`
+ Language string `json:"language"`
+ Theme string `json:"theme"`
+ DiffViewStyle string `json:"diff_view_style"`
+ // Privacy
+ HideEmail bool `json:"hide_email"`
+ HideActivity bool `json:"hide_activity"`
+}
+
+// UserSettingsOptions represents options to change user settings
+// swagger:model
+type UserSettingsOptions struct {
+ FullName *string `json:"full_name" binding:"MaxSize(100)"`
+ Website *string `json:"website" binding:"OmitEmpty;ValidUrl;MaxSize(255)"`
+ Description *string `json:"description" binding:"MaxSize(255)"`
+ Location *string `json:"location" binding:"MaxSize(50)"`
+ Language *string `json:"language"`
+ Theme *string `json:"theme"`
+ DiffViewStyle *string `json:"diff_view_style"`
+ // Privacy
+ HideEmail *bool `json:"hide_email"`
+ HideActivity *bool `json:"hide_activity"`
+}
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go
index 9efc2af244..87db804dcb 100644
--- a/routers/api/v1/api.go
+++ b/routers/api/v1/api.go
@@ -649,6 +649,10 @@ func Routes() *web.Route {
m.Group("/user", func() {
m.Get("", user.GetAuthenticatedUser)
+ m.Group("/settings", func() {
+ m.Get("", user.GetUserSettings)
+ m.Patch("", bind(api.UserSettingsOptions{}), user.UpdateUserSettings)
+ }, reqToken())
m.Combo("/emails").Get(user.ListEmails).
Post(bind(api.CreateEmailOption{}), user.AddEmail).
Delete(bind(api.DeleteEmailOption{}), user.DeleteEmail)
diff --git a/routers/api/v1/swagger/options.go b/routers/api/v1/swagger/options.go
index 11158fb86d..b5f34e86a3 100644
--- a/routers/api/v1/swagger/options.go
+++ b/routers/api/v1/swagger/options.go
@@ -161,4 +161,7 @@ type swaggerParameterBodies struct {
// in:body
CreateTagOption api.CreateTagOption
+
+ // in:body
+ UserSettingsOptions api.UserSettingsOptions
}
diff --git a/routers/api/v1/swagger/user.go b/routers/api/v1/swagger/user.go
index a2df40e4cf..a4d5201236 100644
--- a/routers/api/v1/swagger/user.go
+++ b/routers/api/v1/swagger/user.go
@@ -42,3 +42,10 @@ type swaggerResponseUserHeatmapData struct {
// in:body
Body []models.UserHeatmapData `json:"body"`
}
+
+// UserSettings
+// swagger:response UserSettings
+type swaggerResponseUserSettings struct {
+ // in:body
+ Body []api.UserSettings `json:"body"`
+}
diff --git a/routers/api/v1/user/settings.go b/routers/api/v1/user/settings.go
new file mode 100644
index 0000000000..b4548e7443
--- /dev/null
+++ b/routers/api/v1/user/settings.go
@@ -0,0 +1,83 @@
+// Copyright 2021 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package user
+
+import (
+ "net/http"
+
+ "code.gitea.io/gitea/models"
+ "code.gitea.io/gitea/modules/context"
+ "code.gitea.io/gitea/modules/convert"
+ api "code.gitea.io/gitea/modules/structs"
+ "code.gitea.io/gitea/modules/web"
+)
+
+// GetUserSettings returns user settings
+func GetUserSettings(ctx *context.APIContext) {
+ // swagger:operation GET /user/settings user getUserSettings
+ // ---
+ // summary: Get user settings
+ // produces:
+ // - application/json
+ // responses:
+ // "200":
+ // "$ref": "#/responses/UserSettings"
+ ctx.JSON(http.StatusOK, convert.User2UserSettings(ctx.User))
+}
+
+// UpdateUserSettings returns user settings
+func UpdateUserSettings(ctx *context.APIContext) {
+ // swagger:operation PATCH /user/settings user updateUserSettings
+ // ---
+ // summary: Update user settings
+ // parameters:
+ // - name: body
+ // in: body
+ // schema:
+ // "$ref": "#/definitions/UserSettingsOptions"
+ // produces:
+ // - application/json
+ // responses:
+ // "200":
+ // "$ref": "#/responses/UserSettings"
+
+ form := web.GetForm(ctx).(*api.UserSettingsOptions)
+
+ if form.FullName != nil {
+ ctx.User.FullName = *form.FullName
+ }
+ if form.Description != nil {
+ ctx.User.Description = *form.Description
+ }
+ if form.Website != nil {
+ ctx.User.Website = *form.Website
+ }
+ if form.Location != nil {
+ ctx.User.Location = *form.Location
+ }
+ if form.Language != nil {
+ ctx.User.Language = *form.Language
+ }
+ if form.Theme != nil {
+ ctx.User.Theme = *form.Theme
+ }
+ if form.DiffViewStyle != nil {
+ ctx.User.DiffViewStyle = *form.DiffViewStyle
+ }
+
+ if form.HideEmail != nil {
+ ctx.User.KeepEmailPrivate = *form.HideEmail
+ }
+ if form.HideActivity != nil {
+ ctx.User.KeepActivityPrivate = *form.HideActivity
+ }
+
+ if err := models.UpdateUser(ctx.User); err != nil {
+ ctx.InternalServerError(err)
+ return
+ }
+
+ ctx.JSON(http.StatusOK, convert.User2UserSettings(ctx.User))
+}
diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl
index 017dc824d7..7425150a98 100644
--- a/templates/swagger/v1_json.tmpl
+++ b/templates/swagger/v1_json.tmpl
@@ -10911,6 +10911,47 @@
}
}
},
+ "/user/settings": {
+ "get": {
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "user"
+ ],
+ "summary": "Get user settings",
+ "operationId": "getUserSettings",
+ "responses": {
+ "200": {
+ "$ref": "#/responses/UserSettings"
+ }
+ }
+ },
+ "patch": {
+ "produces": [
+ "application/json"
+ ],
+ "tags": [
+ "user"
+ ],
+ "summary": "Update user settings",
+ "operationId": "updateUserSettings",
+ "parameters": [
+ {
+ "name": "body",
+ "in": "body",
+ "schema": {
+ "$ref": "#/definitions/UserSettingsOptions"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "$ref": "#/responses/UserSettings"
+ }
+ }
+ }
+ },
"/user/starred": {
"get": {
"produces": [
@@ -16578,6 +16619,94 @@
},
"x-go-package": "code.gitea.io/gitea/models"
},
+ "UserSettings": {
+ "description": "UserSettings represents user settings",
+ "type": "object",
+ "properties": {
+ "description": {
+ "type": "string",
+ "x-go-name": "Description"
+ },
+ "diff_view_style": {
+ "type": "string",
+ "x-go-name": "DiffViewStyle"
+ },
+ "full_name": {
+ "type": "string",
+ "x-go-name": "FullName"
+ },
+ "hide_activity": {
+ "type": "boolean",
+ "x-go-name": "HideActivity"
+ },
+ "hide_email": {
+ "description": "Privacy",
+ "type": "boolean",
+ "x-go-name": "HideEmail"
+ },
+ "language": {
+ "type": "string",
+ "x-go-name": "Language"
+ },
+ "location": {
+ "type": "string",
+ "x-go-name": "Location"
+ },
+ "theme": {
+ "type": "string",
+ "x-go-name": "Theme"
+ },
+ "website": {
+ "type": "string",
+ "x-go-name": "Website"
+ }
+ },
+ "x-go-package": "code.gitea.io/gitea/modules/structs"
+ },
+ "UserSettingsOptions": {
+ "description": "UserSettingsOptions represents options to change user settings",
+ "type": "object",
+ "properties": {
+ "description": {
+ "type": "string",
+ "x-go-name": "Description"
+ },
+ "diff_view_style": {
+ "type": "string",
+ "x-go-name": "DiffViewStyle"
+ },
+ "full_name": {
+ "type": "string",
+ "x-go-name": "FullName"
+ },
+ "hide_activity": {
+ "type": "boolean",
+ "x-go-name": "HideActivity"
+ },
+ "hide_email": {
+ "description": "Privacy",
+ "type": "boolean",
+ "x-go-name": "HideEmail"
+ },
+ "language": {
+ "type": "string",
+ "x-go-name": "Language"
+ },
+ "location": {
+ "type": "string",
+ "x-go-name": "Location"
+ },
+ "theme": {
+ "type": "string",
+ "x-go-name": "Theme"
+ },
+ "website": {
+ "type": "string",
+ "x-go-name": "Website"
+ }
+ },
+ "x-go-package": "code.gitea.io/gitea/modules/structs"
+ },
"WatchInfo": {
"description": "WatchInfo represents an API watch status of one repository",
"type": "object",
@@ -17281,6 +17410,15 @@
}
}
},
+ "UserSettings": {
+ "description": "UserSettings",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/UserSettings"
+ }
+ }
+ },
"WatchInfo": {
"description": "WatchInfo",
"schema": {
@@ -17335,7 +17473,7 @@
"parameterBodies": {
"description": "parameterBodies",
"schema": {
- "$ref": "#/definitions/CreateTagOption"
+ "$ref": "#/definitions/UserSettingsOptions"
}
},
"redirect": {