gitea源码

notifications.go 2.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package notify
  4. import (
  5. "net/http"
  6. "strings"
  7. activities_model "code.gitea.io/gitea/models/activities"
  8. "code.gitea.io/gitea/models/db"
  9. api "code.gitea.io/gitea/modules/structs"
  10. "code.gitea.io/gitea/routers/api/v1/utils"
  11. "code.gitea.io/gitea/services/context"
  12. )
  13. // NewAvailable check if unread notifications exist
  14. func NewAvailable(ctx *context.APIContext) {
  15. // swagger:operation GET /notifications/new notification notifyNewAvailable
  16. // ---
  17. // summary: Check if unread notifications exist
  18. // responses:
  19. // "200":
  20. // "$ref": "#/responses/NotificationCount"
  21. total, err := db.Count[activities_model.Notification](ctx, activities_model.FindNotificationOptions{
  22. UserID: ctx.Doer.ID,
  23. Status: []activities_model.NotificationStatus{activities_model.NotificationStatusUnread},
  24. })
  25. if err != nil {
  26. ctx.APIError(http.StatusUnprocessableEntity, err)
  27. return
  28. }
  29. ctx.JSON(http.StatusOK, api.NotificationCount{New: total})
  30. }
  31. func getFindNotificationOptions(ctx *context.APIContext) *activities_model.FindNotificationOptions {
  32. before, since, err := context.GetQueryBeforeSince(ctx.Base)
  33. if err != nil {
  34. ctx.APIError(http.StatusUnprocessableEntity, err)
  35. return nil
  36. }
  37. opts := &activities_model.FindNotificationOptions{
  38. ListOptions: utils.GetListOptions(ctx),
  39. UserID: ctx.Doer.ID,
  40. UpdatedBeforeUnix: before,
  41. UpdatedAfterUnix: since,
  42. }
  43. if !ctx.FormBool("all") {
  44. statuses := ctx.FormStrings("status-types")
  45. opts.Status = statusStringsToNotificationStatuses(statuses, []string{"unread", "pinned"})
  46. }
  47. subjectTypes := ctx.FormStrings("subject-type")
  48. if len(subjectTypes) != 0 {
  49. opts.Source = subjectToSource(subjectTypes)
  50. }
  51. return opts
  52. }
  53. func subjectToSource(value []string) (result []activities_model.NotificationSource) {
  54. for _, v := range value {
  55. switch strings.ToLower(v) {
  56. case "issue":
  57. result = append(result, activities_model.NotificationSourceIssue)
  58. case "pull":
  59. result = append(result, activities_model.NotificationSourcePullRequest)
  60. case "commit":
  61. result = append(result, activities_model.NotificationSourceCommit)
  62. case "repository":
  63. result = append(result, activities_model.NotificationSourceRepository)
  64. }
  65. }
  66. return result
  67. }