Skip to content

Move notification APIFormat #13783

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Dec 2, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 0 additions & 60 deletions models/notification.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import (

"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/modules/timeutil"

"xorm.io/builder"
Expand Down Expand Up @@ -332,56 +331,6 @@ func countUnread(e Engine, userID int64) int64 {
return exist
}

// APIFormat converts a Notification to api.NotificationThread
func (n *Notification) APIFormat() *api.NotificationThread {
result := &api.NotificationThread{
ID: n.ID,
Unread: !(n.Status == NotificationStatusRead || n.Status == NotificationStatusPinned),
Pinned: n.Status == NotificationStatusPinned,
UpdatedAt: n.UpdatedUnix.AsTime(),
URL: n.APIURL(),
}

//since user only get notifications when he has access to use minimal access mode
if n.Repository != nil {
result.Repository = n.Repository.APIFormat(AccessModeRead)
}

//handle Subject
switch n.Source {
case NotificationSourceIssue:
result.Subject = &api.NotificationSubject{Type: "Issue"}
if n.Issue != nil {
result.Subject.Title = n.Issue.Title
result.Subject.URL = n.Issue.APIURL()
result.Subject.State = n.Issue.State()
comment, err := n.Issue.GetLastComment()
if err == nil && comment != nil {
result.Subject.LatestCommentURL = comment.APIURL()
}
}
case NotificationSourcePullRequest:
result.Subject = &api.NotificationSubject{Type: "Pull"}
if n.Issue != nil {
result.Subject.Title = n.Issue.Title
result.Subject.URL = n.Issue.APIURL()
result.Subject.State = n.Issue.State()
comment, err := n.Issue.GetLastComment()
if err == nil && comment != nil {
result.Subject.LatestCommentURL = comment.APIURL()
}
}
case NotificationSourceCommit:
result.Subject = &api.NotificationSubject{
Type: "Commit",
Title: n.CommitID,
}
//unused until now
}

return result
}

// LoadAttributes load Repo Issue User and Comment if not loaded
func (n *Notification) LoadAttributes() (err error) {
return n.loadAttributes(x)
Expand Down Expand Up @@ -470,15 +419,6 @@ func (n *Notification) APIURL() string {
// NotificationList contains a list of notifications
type NotificationList []*Notification

// APIFormat converts a NotificationList to api.NotificationThread list
func (nl NotificationList) APIFormat() []*api.NotificationThread {
var result = make([]*api.NotificationThread, 0, len(nl))
for _, n := range nl {
result = append(result, n.APIFormat())
}
return result
}

// LoadAttributes load Repo Issue User and Comment if not loaded
func (nl NotificationList) LoadAttributes() (err error) {
for i := 0; i < len(nl); i++ {
Expand Down
69 changes: 69 additions & 0 deletions modules/convert/notification.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
// Copyright 2020 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 convert

import (
"code.gitea.io/gitea/models"
api "code.gitea.io/gitea/modules/structs"
)

// ToNotificationThread convert a Notification to api.NotificationThread
func ToNotificationThread(n *models.Notification) *api.NotificationThread {
result := &api.NotificationThread{
ID: n.ID,
Unread: !(n.Status == models.NotificationStatusRead || n.Status == models.NotificationStatusPinned),
Pinned: n.Status == models.NotificationStatusPinned,
UpdatedAt: n.UpdatedUnix.AsTime(),
URL: n.APIURL(),
}

//since user only get notifications when he has access to use minimal access mode
if n.Repository != nil {
result.Repository = n.Repository.APIFormat(models.AccessModeRead)
}

//handle Subject
switch n.Source {
case models.NotificationSourceIssue:
result.Subject = &api.NotificationSubject{Type: "Issue"}
if n.Issue != nil {
result.Subject.Title = n.Issue.Title
result.Subject.URL = n.Issue.APIURL()
result.Subject.State = n.Issue.State()
comment, err := n.Issue.GetLastComment()
if err == nil && comment != nil {
result.Subject.LatestCommentURL = comment.APIURL()
}
}
case models.NotificationSourcePullRequest:
result.Subject = &api.NotificationSubject{Type: "Pull"}
if n.Issue != nil {
result.Subject.Title = n.Issue.Title
result.Subject.URL = n.Issue.APIURL()
result.Subject.State = n.Issue.State()
comment, err := n.Issue.GetLastComment()
if err == nil && comment != nil {
result.Subject.LatestCommentURL = comment.APIURL()
}
}
case models.NotificationSourceCommit:
result.Subject = &api.NotificationSubject{
Type: "Commit",
Title: n.CommitID,
}
//unused until now
}

return result
}

// ToNotifications convert list of Notification to api.NotificationThread list
func ToNotifications(nl models.NotificationList) []*api.NotificationThread {
var result = make([]*api.NotificationThread, 0, len(nl))
for _, n := range nl {
result = append(result, ToNotificationThread(n))
}
return result
}
3 changes: 2 additions & 1 deletion routers/api/v1/notify/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (

"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/convert"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/routers/api/v1/utils"
)
Expand Down Expand Up @@ -127,7 +128,7 @@ func ListRepoNotifications(ctx *context.APIContext) {
return
}

ctx.JSON(http.StatusOK, nl.APIFormat())
ctx.JSON(http.StatusOK, convert.ToNotifications(nl))
}

// ReadRepoNotifications mark notification threads as read on a specific repo
Expand Down
3 changes: 2 additions & 1 deletion routers/api/v1/notify/threads.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (

"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/convert"
)

// GetThread get notification by ID
Expand Down Expand Up @@ -44,7 +45,7 @@ func GetThread(ctx *context.APIContext) {
return
}

ctx.JSON(http.StatusOK, n.APIFormat())
ctx.JSON(http.StatusOK, convert.ToNotificationThread(n))
}

// ReadThread mark notification as read by ID
Expand Down
3 changes: 2 additions & 1 deletion routers/api/v1/notify/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (

"code.gitea.io/gitea/models"
"code.gitea.io/gitea/modules/context"
"code.gitea.io/gitea/modules/convert"
"code.gitea.io/gitea/routers/api/v1/utils"
)

Expand Down Expand Up @@ -87,7 +88,7 @@ func ListNotifications(ctx *context.APIContext) {
return
}

ctx.JSON(http.StatusOK, nl.APIFormat())
ctx.JSON(http.StatusOK, convert.ToNotifications(nl))
}

// ReadNotifications mark notification threads as read, unread, or pinned
Expand Down