diff options
author | kolaente <konrad@kola-entertainments.de> | 2018-10-23 04:57:42 +0200 |
---|---|---|
committer | Lunny Xiao <xiaolunwen@gmail.com> | 2018-10-23 10:57:42 +0800 |
commit | 6759237eda5b7ddfe9284c81900cc9deed1f6bf9 (patch) | |
tree | d6fa6ea9da9b218fcc74bcd9d9d11dc92662a349 /routers | |
parent | f38fce916ec92cb9ac9fe78fb5284bc8b55a726f (diff) | |
download | gitea-6759237eda5b7ddfe9284c81900cc9deed1f6bf9.tar.gz gitea-6759237eda5b7ddfe9284c81900cc9deed1f6bf9.zip |
User action heatmap (#5131)
* Added basic heatmap data
* Added extra case for sqlite
* Built basic heatmap into user profile
* Get contribution data from api & styling
* Fixed lint & added extra group by statements for all database types
* generated swagger spec
* generated swagger spec
* generated swagger spec
* fixed swagger spec
* fmt
* Added tests
* Added setting to enable/disable user heatmap
* Added locale for loading text
* Removed UseTiDB
* Updated librejs & moment.js
* Fixed import order
* Fixed heatmap in postgresql
* Update docs/content/doc/advanced/config-cheat-sheet.en-us.md
Co-Authored-By: kolaente <konrad@kola-entertainments.de>
* Added copyright header
* Fixed a bug to show the heatmap for the actual user instead of the currently logged in
* Added integration test for heatmaps
* Added a heatmap on the dashboard
* Fixed timestamp parsing
* Hide heatmap on mobile
* optimized postgresql group by query
* Improved sqlite group by statement
Diffstat (limited to 'routers')
-rw-r--r-- | routers/api/v1/api.go | 8 | ||||
-rw-r--r-- | routers/api/v1/swagger/user.go | 8 | ||||
-rw-r--r-- | routers/api/v1/user/user.go | 39 | ||||
-rw-r--r-- | routers/user/home.go | 2 | ||||
-rw-r--r-- | routers/user/profile.go | 2 |
5 files changed, 59 insertions, 0 deletions
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go index 3a539f6ce7..b12cb1374a 100644 --- a/routers/api/v1/api.go +++ b/routers/api/v1/api.go @@ -324,6 +324,13 @@ func mustEnableIssuesOrPulls(ctx *context.Context) { } } +func mustEnableUserHeatmap(ctx *context.Context) { + if !setting.Service.EnableUserHeatmap { + ctx.Status(404) + return + } +} + // RegisterRoutes registers all v1 APIs routes to web application. // FIXME: custom form error response func RegisterRoutes(m *macaron.Macaron) { @@ -348,6 +355,7 @@ func RegisterRoutes(m *macaron.Macaron) { m.Group("/:username", func() { m.Get("", user.GetInfo) + m.Get("/heatmap", mustEnableUserHeatmap, user.GetUserHeatmapData) m.Get("/repos", user.ListUserRepos) m.Group("/tokens", func() { diff --git a/routers/api/v1/swagger/user.go b/routers/api/v1/swagger/user.go index 7ae046a9b0..caaf7df705 100644 --- a/routers/api/v1/swagger/user.go +++ b/routers/api/v1/swagger/user.go @@ -5,6 +5,7 @@ package swagger import ( + "code.gitea.io/gitea/models" api "code.gitea.io/sdk/gitea" ) @@ -34,3 +35,10 @@ type swaggerModelEditUserOption struct { // in:body Options api.EditUserOption } + +// UserHeatmapData +// swagger:response UserHeatmapData +type swaggerResponseUserHeatmapData struct { + // in:body + Body []models.UserHeatmapData `json:"body"` +} diff --git a/routers/api/v1/user/user.go b/routers/api/v1/user/user.go index 51d69aa2c3..f76b443661 100644 --- a/routers/api/v1/user/user.go +++ b/routers/api/v1/user/user.go @@ -5,6 +5,7 @@ package user import ( + "net/http" "strings" "code.gitea.io/gitea/models" @@ -133,3 +134,41 @@ func GetAuthenticatedUser(ctx *context.APIContext) { // "$ref": "#/responses/User" ctx.JSON(200, ctx.User.APIFormat()) } + +// GetUserHeatmapData is the handler to get a users heatmap +func GetUserHeatmapData(ctx *context.APIContext) { + // swagger:operation GET /users/{username}/heatmap user userGetHeatmapData + // --- + // summary: Get a user's heatmap + // produces: + // - application/json + // parameters: + // - name: username + // in: path + // description: username of user to get + // type: string + // required: true + // responses: + // "200": + // "$ref": "#/responses/UserHeatmapData" + // "404": + // "$ref": "#/responses/notFound" + + // Get the user to throw an error if it does not exist + user, err := models.GetUserByName(ctx.Params(":username")) + if err != nil { + if models.IsErrUserNotExist(err) { + ctx.Status(http.StatusNotFound) + } else { + ctx.Error(http.StatusInternalServerError, "GetUserByName", err) + } + return + } + + heatmap, err := models.GetUserHeatmapDataByUser(user) + if err != nil { + ctx.Error(http.StatusInternalServerError, "GetUserHeatmapDataByUser", err) + return + } + ctx.JSON(200, heatmap) +} diff --git a/routers/user/home.go b/routers/user/home.go index cbab5c8350..a0e2922898 100644 --- a/routers/user/home.go +++ b/routers/user/home.go @@ -99,6 +99,8 @@ func Dashboard(ctx *context.Context) { ctx.Data["PageIsDashboard"] = true ctx.Data["PageIsNews"] = true ctx.Data["SearchLimit"] = setting.UI.User.RepoPagingNum + ctx.Data["EnableHeatmap"] = setting.Service.EnableUserHeatmap + ctx.Data["HeatmapUser"] = ctxUser.Name var err error var mirrors []*models.Repository diff --git a/routers/user/profile.go b/routers/user/profile.go index 827226d3e1..afb74fe8c3 100644 --- a/routers/user/profile.go +++ b/routers/user/profile.go @@ -87,6 +87,8 @@ func Profile(ctx *context.Context) { ctx.Data["PageIsUserProfile"] = true ctx.Data["Owner"] = ctxUser ctx.Data["OpenIDs"] = openIDs + ctx.Data["EnableHeatmap"] = setting.Service.EnableUserHeatmap + ctx.Data["HeatmapUser"] = ctxUser.Name showPrivate := ctx.IsSigned && (ctx.User.IsAdmin || ctx.User.ID == ctxUser.ID) orgs, err := models.GetOrgsByUserID(ctxUser.ID, showPrivate) |