* 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>tags/v1.15.0-rc1
@@ -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, | |||
} | |||
} |
@@ -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"` | |||
} |
@@ -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) |
@@ -161,4 +161,7 @@ type swaggerParameterBodies struct { | |||
// in:body | |||
CreateTagOption api.CreateTagOption | |||
// in:body | |||
UserSettingsOptions api.UserSettingsOptions | |||
} |
@@ -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"` | |||
} |
@@ -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)) | |||
} |
@@ -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": { |