You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

user_heatmap.go 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // Copyright 2018 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.package models
  4. package models
  5. import (
  6. "code.gitea.io/gitea/modules/setting"
  7. "code.gitea.io/gitea/modules/timeutil"
  8. )
  9. // UserHeatmapData represents the data needed to create a heatmap
  10. type UserHeatmapData struct {
  11. Timestamp timeutil.TimeStamp `json:"timestamp"`
  12. Contributions int64 `json:"contributions"`
  13. }
  14. // GetUserHeatmapDataByUser returns an array of UserHeatmapData
  15. func GetUserHeatmapDataByUser(user, doer *User) ([]*UserHeatmapData, error) {
  16. return getUserHeatmapData(user, nil, doer)
  17. }
  18. // GetUserHeatmapDataByUserTeam returns an array of UserHeatmapData
  19. func GetUserHeatmapDataByUserTeam(user *User, team *Team, doer *User) ([]*UserHeatmapData, error) {
  20. return getUserHeatmapData(user, team, doer)
  21. }
  22. func getUserHeatmapData(user *User, team *Team, doer *User) ([]*UserHeatmapData, error) {
  23. hdata := make([]*UserHeatmapData, 0)
  24. if !activityReadable(user, doer) {
  25. return hdata, nil
  26. }
  27. var groupBy string
  28. groupByName := "timestamp" // We need this extra case because mssql doesn't allow grouping by alias
  29. switch {
  30. case setting.Database.UseSQLite3:
  31. groupBy = "strftime('%s', strftime('%Y-%m-%d', created_unix, 'unixepoch'))"
  32. case setting.Database.UseMySQL:
  33. groupBy = "UNIX_TIMESTAMP(DATE(FROM_UNIXTIME(created_unix)))"
  34. case setting.Database.UsePostgreSQL:
  35. groupBy = "extract(epoch from date_trunc('day', to_timestamp(created_unix)))"
  36. case setting.Database.UseMSSQL:
  37. groupBy = "datediff(SECOND, '19700101', dateadd(DAY, 0, datediff(day, 0, dateadd(s, created_unix, '19700101'))))"
  38. groupByName = groupBy
  39. }
  40. cond, err := activityQueryCondition(GetFeedsOptions{
  41. RequestedUser: user,
  42. RequestedTeam: team,
  43. Actor: doer,
  44. IncludePrivate: true, // don't filter by private, as we already filter by repo access
  45. IncludeDeleted: true,
  46. // * Heatmaps for individual users only include actions that the user themself did.
  47. // * For organizations actions by all users that were made in owned
  48. // repositories are counted.
  49. OnlyPerformedBy: !user.IsOrganization(),
  50. })
  51. if err != nil {
  52. return nil, err
  53. }
  54. return hdata, x.
  55. Select(groupBy+" AS timestamp, count(user_id) as contributions").
  56. Table("action").
  57. Where(cond).
  58. And("created_unix > ?", timeutil.TimeStampNow()-31536000).
  59. GroupBy(groupByName).
  60. OrderBy("timestamp").
  61. Find(&hdata)
  62. }