2020-12-02 12:24:35 +03:00
// 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 (
2021-11-16 21:18:25 +03:00
"net/url"
2020-12-02 12:24:35 +03:00
"code.gitea.io/gitea/models"
2021-11-28 14:58:28 +03:00
"code.gitea.io/gitea/models/perm"
2020-12-02 12:24:35 +03:00
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 {
2021-11-28 14:58:28 +03:00
result . Repository = ToRepo ( n . Repository , perm . AccessModeRead )
2020-12-02 12:24:35 +03:00
}
//handle Subject
switch n . Source {
case models . NotificationSourceIssue :
2021-07-01 13:51:24 +03:00
result . Subject = & api . NotificationSubject { Type : api . NotifySubjectIssue }
2020-12-02 12:24:35 +03:00
if n . Issue != nil {
result . Subject . Title = n . Issue . Title
result . Subject . URL = n . Issue . APIURL ( )
2021-09-30 07:17:39 +03:00
result . Subject . HTMLURL = n . Issue . HTMLURL ( )
2020-12-02 12:24:35 +03:00
result . Subject . State = n . Issue . State ( )
comment , err := n . Issue . GetLastComment ( )
if err == nil && comment != nil {
result . Subject . LatestCommentURL = comment . APIURL ( )
2021-09-30 07:17:39 +03:00
result . Subject . LatestCommentHTMLURL = comment . HTMLURL ( )
2020-12-02 12:24:35 +03:00
}
}
case models . NotificationSourcePullRequest :
2021-07-01 13:51:24 +03:00
result . Subject = & api . NotificationSubject { Type : api . NotifySubjectPull }
2020-12-02 12:24:35 +03:00
if n . Issue != nil {
result . Subject . Title = n . Issue . Title
result . Subject . URL = n . Issue . APIURL ( )
2021-09-30 07:17:39 +03:00
result . Subject . HTMLURL = n . Issue . HTMLURL ( )
2020-12-02 12:24:35 +03:00
result . Subject . State = n . Issue . State ( )
comment , err := n . Issue . GetLastComment ( )
if err == nil && comment != nil {
result . Subject . LatestCommentURL = comment . APIURL ( )
2021-09-30 07:17:39 +03:00
result . Subject . LatestCommentHTMLURL = comment . HTMLURL ( )
2020-12-02 12:24:35 +03:00
}
2021-04-09 04:36:23 +03:00
pr , _ := n . Issue . GetPullRequest ( )
if pr != nil && pr . HasMerged {
result . Subject . State = "merged"
}
2020-12-02 12:24:35 +03:00
}
case models . NotificationSourceCommit :
2021-11-16 21:18:25 +03:00
url := n . Repository . HTMLURL ( ) + "/commit/" + url . PathEscape ( n . CommitID )
2020-12-02 12:24:35 +03:00
result . Subject = & api . NotificationSubject {
2021-09-30 07:17:39 +03:00
Type : api . NotifySubjectCommit ,
Title : n . CommitID ,
URL : url ,
HTMLURL : url ,
2021-03-01 03:47:30 +03:00
}
case models . NotificationSourceRepository :
result . Subject = & api . NotificationSubject {
2021-07-01 13:51:24 +03:00
Type : api . NotifySubjectRepository ,
2021-03-01 03:47:30 +03:00
Title : n . Repository . FullName ( ) ,
2021-09-30 07:17:39 +03:00
// FIXME: this is a relative URL, rather useless and inconsistent, but keeping for backwards compat
URL : n . Repository . Link ( ) ,
HTMLURL : n . Repository . HTMLURL ( ) ,
2020-12-02 12:24:35 +03:00
}
}
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
}