2020-12-02 12:24:35 +03:00
// Copyright 2020 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2020-12-02 12:24:35 +03:00
package convert
import (
2023-09-29 15:12:54 +03:00
"context"
2021-11-16 21:18:25 +03:00
"net/url"
2022-08-25 05:31:57 +03:00
activities_model "code.gitea.io/gitea/models/activities"
2021-11-28 14:58:28 +03:00
"code.gitea.io/gitea/models/perm"
2023-06-22 16:08:08 +03:00
access_model "code.gitea.io/gitea/models/perm/access"
2020-12-02 12:24:35 +03:00
api "code.gitea.io/gitea/modules/structs"
)
// ToNotificationThread convert a Notification to api.NotificationThread
2023-09-29 15:12:54 +03:00
func ToNotificationThread ( ctx context . Context , n * activities_model . Notification ) * api . NotificationThread {
2020-12-02 12:24:35 +03:00
result := & api . NotificationThread {
ID : n . ID ,
2022-08-25 05:31:57 +03:00
Unread : ! ( n . Status == activities_model . NotificationStatusRead || n . Status == activities_model . NotificationStatusPinned ) ,
Pinned : n . Status == activities_model . NotificationStatusPinned ,
2020-12-02 12:24:35 +03:00
UpdatedAt : n . UpdatedUnix . AsTime ( ) ,
URL : n . APIURL ( ) ,
}
2022-01-20 20:46:10 +03:00
// since user only get notifications when he has access to use minimal access mode
2020-12-02 12:24:35 +03:00
if n . Repository != nil {
2023-09-29 15:12:54 +03:00
result . Repository = ToRepo ( ctx , n . Repository , access_model . Permission { AccessMode : perm . AccessModeRead } )
2022-05-20 19:57:49 +03:00
// This permission is not correct and we should not be reporting it
for repository := result . Repository ; repository != nil ; repository = repository . Parent {
repository . Permissions = nil
}
2020-12-02 12:24:35 +03:00
}
2022-01-20 20:46:10 +03:00
// handle Subject
2020-12-02 12:24:35 +03:00
switch n . Source {
2022-08-25 05:31:57 +03:00
case activities_model . 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
2023-10-03 13:30:41 +03:00
result . Subject . URL = n . Issue . APIURL ( ctx )
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 ( )
2023-10-03 13:30:41 +03:00
comment , err := n . Issue . GetLastComment ( ctx )
2020-12-02 12:24:35 +03:00
if err == nil && comment != nil {
2023-09-29 15:12:54 +03:00
result . Subject . LatestCommentURL = comment . APIURL ( ctx )
result . Subject . LatestCommentHTMLURL = comment . HTMLURL ( ctx )
2020-12-02 12:24:35 +03:00
}
}
2022-08-25 05:31:57 +03:00
case activities_model . 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
2023-10-03 13:30:41 +03:00
result . Subject . URL = n . Issue . APIURL ( ctx )
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 ( )
2023-10-03 13:30:41 +03:00
comment , err := n . Issue . GetLastComment ( ctx )
2020-12-02 12:24:35 +03:00
if err == nil && comment != nil {
2023-09-29 15:12:54 +03:00
result . Subject . LatestCommentURL = comment . APIURL ( ctx )
result . Subject . LatestCommentHTMLURL = comment . HTMLURL ( ctx )
2020-12-02 12:24:35 +03:00
}
2021-04-09 04:36:23 +03:00
2023-10-03 13:30:41 +03:00
pr , _ := n . Issue . GetPullRequest ( ctx )
2021-04-09 04:36:23 +03:00
if pr != nil && pr . HasMerged {
result . Subject . State = "merged"
}
2020-12-02 12:24:35 +03:00
}
2022-08-25 05:31:57 +03:00
case activities_model . 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
}
2022-08-25 05:31:57 +03:00
case activities_model . NotificationSourceRepository :
2021-03-01 03:47:30 +03:00
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
2023-09-29 15:12:54 +03:00
func ToNotifications ( ctx context . Context , nl activities_model . NotificationList ) [ ] * api . NotificationThread {
2022-01-20 20:46:10 +03:00
result := make ( [ ] * api . NotificationThread , 0 , len ( nl ) )
2020-12-02 12:24:35 +03:00
for _ , n := range nl {
2023-09-29 15:12:54 +03:00
result = append ( result , ToNotificationThread ( ctx , n ) )
2020-12-02 12:24:35 +03:00
}
return result
}