2020-05-02 02:20:51 +02: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 (
2022-01-19 23:26:57 +00:00
"context"
2020-05-02 02:20:51 +02:00
"strings"
"code.gitea.io/gitea/models"
2021-11-24 17:49:20 +08:00
user_model "code.gitea.io/gitea/models/user"
2020-05-02 02:20:51 +02:00
api "code.gitea.io/gitea/modules/structs"
)
// ToPullReview convert a review to api format
2022-01-19 23:26:57 +00:00
func ToPullReview ( ctx context . Context , r * models . Review , doer * user_model . User ) ( * api . PullReview , error ) {
if err := r . LoadAttributes ( ctx ) ; err != nil {
2021-11-24 17:49:20 +08:00
if ! user_model . IsErrUserNotExist ( err ) {
2020-05-02 02:20:51 +02:00
return nil , err
}
2021-11-24 17:49:20 +08:00
r . Reviewer = user_model . NewGhostUser ( )
2020-05-02 02:20:51 +02:00
}
result := & api . PullReview {
ID : r . ID ,
2021-03-27 17:45:26 +01:00
Reviewer : ToUser ( r . Reviewer , doer ) ,
2020-10-21 02:18:25 +08:00
ReviewerTeam : ToTeam ( r . ReviewerTeam ) ,
2020-05-02 02:20:51 +02:00
State : api . ReviewStateUnknown ,
Body : r . Content ,
CommitID : r . CommitID ,
Stale : r . Stale ,
Official : r . Official ,
2021-02-12 01:32:25 +08:00
Dismissed : r . Dismissed ,
2020-05-02 02:20:51 +02:00
CodeCommentsCount : r . GetCodeCommentsCount ( ) ,
Submitted : r . CreatedUnix . AsTime ( ) ,
HTMLURL : r . HTMLURL ( ) ,
HTMLPullURL : r . Issue . HTMLURL ( ) ,
}
switch r . Type {
case models . ReviewTypeApprove :
result . State = api . ReviewStateApproved
case models . ReviewTypeReject :
result . State = api . ReviewStateRequestChanges
case models . ReviewTypeComment :
result . State = api . ReviewStateComment
case models . ReviewTypePending :
result . State = api . ReviewStatePending
case models . ReviewTypeRequest :
result . State = api . ReviewStateRequestReview
}
return result , nil
}
// ToPullReviewList convert a list of review to it's api format
2022-01-19 23:26:57 +00:00
func ToPullReviewList ( ctx context . Context , rl [ ] * models . Review , doer * user_model . User ) ( [ ] * api . PullReview , error ) {
2020-05-02 02:20:51 +02:00
result := make ( [ ] * api . PullReview , 0 , len ( rl ) )
for i := range rl {
// show pending reviews only for the user who created them
if rl [ i ] . Type == models . ReviewTypePending && ! ( doer . IsAdmin || doer . ID == rl [ i ] . ReviewerID ) {
continue
}
2022-01-19 23:26:57 +00:00
r , err := ToPullReview ( ctx , rl [ i ] , doer )
2020-05-02 02:20:51 +02:00
if err != nil {
return nil , err
}
result = append ( result , r )
}
return result , nil
}
// ToPullReviewCommentList convert the CodeComments of an review to it's api format
2022-01-19 23:26:57 +00:00
func ToPullReviewCommentList ( ctx context . Context , review * models . Review , doer * user_model . User ) ( [ ] * api . PullReviewComment , error ) {
if err := review . LoadAttributes ( ctx ) ; err != nil {
2021-11-24 17:49:20 +08:00
if ! user_model . IsErrUserNotExist ( err ) {
2020-05-02 02:20:51 +02:00
return nil , err
}
2021-11-24 17:49:20 +08:00
review . Reviewer = user_model . NewGhostUser ( )
2020-05-02 02:20:51 +02:00
}
apiComments := make ( [ ] * api . PullReviewComment , 0 , len ( review . CodeComments ) )
for _ , lines := range review . CodeComments {
for _ , comments := range lines {
for _ , comment := range comments {
apiComment := & api . PullReviewComment {
ID : comment . ID ,
Body : comment . Content ,
2021-03-28 00:37:51 +01:00
Poster : ToUser ( comment . Poster , doer ) ,
Resolver : ToUser ( comment . ResolveDoer , doer ) ,
2021-03-26 03:46:41 +01:00
ReviewID : review . ID ,
2020-05-02 02:20:51 +02:00
Created : comment . CreatedUnix . AsTime ( ) ,
Updated : comment . UpdatedUnix . AsTime ( ) ,
Path : comment . TreePath ,
CommitID : comment . CommitSHA ,
OrigCommitID : comment . OldRef ,
DiffHunk : patch2diff ( comment . Patch ) ,
HTMLURL : comment . HTMLURL ( ) ,
2020-05-21 03:41:30 +01:00
HTMLPullURL : review . Issue . HTMLURL ( ) ,
2020-05-02 02:20:51 +02:00
}
if comment . Line < 0 {
apiComment . OldLineNum = comment . UnsignedLine ( )
} else {
apiComment . LineNum = comment . UnsignedLine ( )
}
apiComments = append ( apiComments , apiComment )
}
}
}
return apiComments , nil
}
func patch2diff ( patch string ) string {
split := strings . Split ( patch , "\n@@" )
if len ( split ) == 2 {
return "@@" + split [ 1 ]
}
return ""
}