2020-01-11 05:59:41 +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 (
2020-02-29 05:49:50 +03:00
"strings"
2020-01-11 05:59:41 +03:00
"code.gitea.io/gitea/models"
api "code.gitea.io/gitea/modules/structs"
)
2020-02-29 05:49:50 +03:00
// ToAPIIssue converts an Issue to API format
// it assumes some fields assigned with values:
// Required - Poster, Labels,
// Optional - Milestone, Assignee, PullRequest
func ToAPIIssue ( issue * models . Issue ) * api . Issue {
if err := issue . LoadLabels ( ) ; err != nil {
return & api . Issue { }
}
if err := issue . LoadPoster ( ) ; err != nil {
return & api . Issue { }
}
if err := issue . LoadRepo ( ) ; err != nil {
return & api . Issue { }
}
apiIssue := & api . Issue {
ID : issue . ID ,
URL : issue . APIURL ( ) ,
HTMLURL : issue . HTMLURL ( ) ,
Index : issue . Index ,
Poster : issue . Poster . APIFormat ( ) ,
Title : issue . Title ,
Body : issue . Content ,
Labels : ToLabelList ( issue . Labels ) ,
State : issue . State ( ) ,
2020-06-02 00:01:55 +03:00
IsLocked : issue . IsLocked ,
2020-02-29 05:49:50 +03:00
Comments : issue . NumComments ,
Created : issue . CreatedUnix . AsTime ( ) ,
Updated : issue . UpdatedUnix . AsTime ( ) ,
}
apiIssue . Repo = & api . RepositoryMeta {
ID : issue . Repo . ID ,
Name : issue . Repo . Name ,
Owner : issue . Repo . OwnerName ,
FullName : issue . Repo . FullName ( ) ,
}
if issue . ClosedUnix != 0 {
apiIssue . Closed = issue . ClosedUnix . AsTimePtr ( )
}
if err := issue . LoadMilestone ( ) ; err != nil {
return & api . Issue { }
}
if issue . Milestone != nil {
2020-05-13 00:54:35 +03:00
apiIssue . Milestone = ToAPIMilestone ( issue . Milestone )
2020-02-29 05:49:50 +03:00
}
if err := issue . LoadAssignees ( ) ; err != nil {
return & api . Issue { }
}
if len ( issue . Assignees ) > 0 {
for _ , assignee := range issue . Assignees {
apiIssue . Assignees = append ( apiIssue . Assignees , assignee . APIFormat ( ) )
}
apiIssue . Assignee = issue . Assignees [ 0 ] . APIFormat ( ) // For compatibility, we're keeping the first assignee as `apiIssue.Assignee`
}
if issue . IsPull {
if err := issue . LoadPullRequest ( ) ; err != nil {
return & api . Issue { }
}
apiIssue . PullRequest = & api . PullRequestMeta {
HasMerged : issue . PullRequest . HasMerged ,
}
if issue . PullRequest . HasMerged {
apiIssue . PullRequest . Merged = issue . PullRequest . MergedUnix . AsTimePtr ( )
}
}
if issue . DeadlineUnix != 0 {
apiIssue . Deadline = issue . DeadlineUnix . AsTimePtr ( )
}
return apiIssue
}
// ToAPIIssueList converts an IssueList to API format
func ToAPIIssueList ( il models . IssueList ) [ ] * api . Issue {
result := make ( [ ] * api . Issue , len ( il ) )
for i := range il {
result [ i ] = ToAPIIssue ( il [ i ] )
}
return result
}
2020-01-11 05:59:41 +03:00
// ToTrackedTime converts TrackedTime to API format
func ToTrackedTime ( t * models . TrackedTime ) ( apiT * api . TrackedTime ) {
apiT = & api . TrackedTime {
ID : t . ID ,
IssueID : t . IssueID ,
UserID : t . UserID ,
UserName : t . User . Name ,
Time : t . Time ,
Created : t . Created ,
}
if t . Issue != nil {
2020-02-29 05:49:50 +03:00
apiT . Issue = ToAPIIssue ( t . Issue )
2020-01-11 05:59:41 +03:00
}
if t . User != nil {
apiT . UserName = t . User . Name
}
return
}
// ToTrackedTimeList converts TrackedTimeList to API format
func ToTrackedTimeList ( tl models . TrackedTimeList ) api . TrackedTimeList {
result := make ( [ ] * api . TrackedTime , 0 , len ( tl ) )
for _ , t := range tl {
result = append ( result , ToTrackedTime ( t ) )
}
return result
}
2020-02-29 05:49:50 +03:00
// ToLabel converts Label to API format
func ToLabel ( label * models . Label ) * api . Label {
return & api . Label {
ID : label . ID ,
Name : label . Name ,
Color : strings . TrimLeft ( label . Color , "#" ) ,
Description : label . Description ,
}
}
// ToLabelList converts list of Label to API format
func ToLabelList ( labels [ ] * models . Label ) [ ] * api . Label {
result := make ( [ ] * api . Label , len ( labels ) )
for i := range labels {
result [ i ] = ToLabel ( labels [ i ] )
}
return result
}
2020-05-13 00:54:35 +03:00
// ToAPIMilestone converts Milestone into API Format
func ToAPIMilestone ( m * models . Milestone ) * api . Milestone {
apiMilestone := & api . Milestone {
ID : m . ID ,
State : m . State ( ) ,
Title : m . Name ,
Description : m . Content ,
OpenIssues : m . NumOpenIssues ,
ClosedIssues : m . NumClosedIssues ,
2020-09-05 20:38:54 +03:00
Created : m . CreatedUnix . AsTime ( ) ,
Updated : m . UpdatedUnix . AsTimePtr ( ) ,
2020-05-13 00:54:35 +03:00
}
if m . IsClosed {
apiMilestone . Closed = m . ClosedDateUnix . AsTimePtr ( )
}
if m . DeadlineUnix . Year ( ) < 9999 {
apiMilestone . Deadline = m . DeadlineUnix . AsTimePtr ( )
}
return apiMilestone
}