2015-12-04 17:16:42 -05:00
// Copyright 2015 The Gogs Authors. All rights reserved.
2020-09-17 23:33:23 +02:00
// Copyright 2018 The Gitea Authors. All rights reserved.
2015-12-04 17:16:42 -05:00
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
2015-12-17 02:28:47 -05:00
package convert
2015-12-04 17:16:42 -05:00
import (
"fmt"
2016-11-10 17:24:48 +01:00
"code.gitea.io/gitea/models"
2019-03-27 17:33:00 +08:00
"code.gitea.io/gitea/modules/git"
2018-02-20 04:50:42 -08:00
"code.gitea.io/gitea/modules/log"
2019-10-16 14:42:42 +01:00
"code.gitea.io/gitea/modules/structs"
2019-05-11 18:21:34 +08:00
api "code.gitea.io/gitea/modules/structs"
2018-02-20 04:50:42 -08:00
"code.gitea.io/gitea/modules/util"
2019-11-04 06:13:25 +08:00
"code.gitea.io/gitea/modules/webhook"
2019-03-27 17:33:00 +08:00
2019-08-23 09:40:30 -07:00
"github.com/unknwon/com"
2015-12-04 17:16:42 -05:00
)
2016-11-24 15:04:31 +08:00
// ToEmail convert models.EmailAddress to api.Email
2016-03-13 23:20:22 -04:00
func ToEmail ( email * models . EmailAddress ) * api . Email {
2015-12-15 22:57:18 -05:00
return & api . Email {
Email : email . Email ,
Verified : email . IsActivated ,
Primary : email . IsPrimary ,
}
}
2019-06-08 10:31:11 -04:00
// ToBranch convert a git.Commit and git.Branch to an api.Branch
2020-03-21 11:41:33 +08:00
func ToBranch ( repo * models . Repository , b * git . Branch , c * git . Commit , bp * models . ProtectedBranch , user * models . User , isRepoAdmin bool ) ( * api . Branch , error ) {
2019-11-16 20:39:18 +01:00
if bp == nil {
2020-03-21 11:41:33 +08:00
var hasPerm bool
var err error
if user != nil {
hasPerm , err = models . HasAccessUnit ( user , repo , models . UnitTypeCode , models . AccessModeWrite )
if err != nil {
return nil , err
}
2019-11-16 20:39:18 +01:00
}
2020-03-21 11:41:33 +08:00
return & api . Branch {
Name : b . Name ,
2020-09-18 14:09:26 +02:00
Commit : ToPayloadCommit ( repo , c ) ,
2020-03-21 11:41:33 +08:00
Protected : false ,
RequiredApprovals : 0 ,
EnableStatusCheck : false ,
StatusCheckContexts : [ ] string { } ,
UserCanPush : hasPerm ,
UserCanMerge : hasPerm ,
} , nil
2020-02-13 00:19:35 +01:00
}
2020-03-19 23:39:08 +08:00
branch := & api . Branch {
2020-03-21 11:41:33 +08:00
Name : b . Name ,
2020-09-18 14:09:26 +02:00
Commit : ToPayloadCommit ( repo , c ) ,
2020-03-21 11:41:33 +08:00
Protected : true ,
RequiredApprovals : bp . RequiredApprovals ,
EnableStatusCheck : bp . EnableStatusCheck ,
StatusCheckContexts : bp . StatusCheckContexts ,
}
if isRepoAdmin {
branch . EffectiveBranchProtectionName = bp . BranchName
2020-02-13 00:19:35 +01:00
}
2020-03-19 23:39:08 +08:00
if user != nil {
2020-08-20 08:48:40 +01:00
permission , err := models . GetUserRepoPermission ( repo , user )
if err != nil {
return nil , err
}
2020-03-19 23:39:08 +08:00
branch . UserCanPush = bp . CanUserPush ( user . ID )
2020-08-20 08:48:40 +01:00
branch . UserCanMerge = bp . IsUserMergeWhitelisted ( user . ID , permission )
2020-03-19 23:39:08 +08:00
}
2020-03-21 11:41:33 +08:00
return branch , nil
2020-02-13 00:19:35 +01:00
}
// ToBranchProtection convert a ProtectedBranch to api.BranchProtection
func ToBranchProtection ( bp * models . ProtectedBranch ) * api . BranchProtection {
pushWhitelistUsernames , err := models . GetUserNamesByIDs ( bp . WhitelistUserIDs )
if err != nil {
log . Error ( "GetUserNamesByIDs (WhitelistUserIDs): %v" , err )
}
mergeWhitelistUsernames , err := models . GetUserNamesByIDs ( bp . MergeWhitelistUserIDs )
if err != nil {
log . Error ( "GetUserNamesByIDs (MergeWhitelistUserIDs): %v" , err )
}
approvalsWhitelistUsernames , err := models . GetUserNamesByIDs ( bp . ApprovalsWhitelistUserIDs )
if err != nil {
log . Error ( "GetUserNamesByIDs (ApprovalsWhitelistUserIDs): %v" , err )
}
pushWhitelistTeams , err := models . GetTeamNamesByID ( bp . WhitelistTeamIDs )
if err != nil {
log . Error ( "GetTeamNamesByID (WhitelistTeamIDs): %v" , err )
}
mergeWhitelistTeams , err := models . GetTeamNamesByID ( bp . MergeWhitelistTeamIDs )
if err != nil {
log . Error ( "GetTeamNamesByID (MergeWhitelistTeamIDs): %v" , err )
}
approvalsWhitelistTeams , err := models . GetTeamNamesByID ( bp . ApprovalsWhitelistTeamIDs )
if err != nil {
log . Error ( "GetTeamNamesByID (ApprovalsWhitelistTeamIDs): %v" , err )
}
return & api . BranchProtection {
BranchName : bp . BranchName ,
EnablePush : bp . CanPush ,
EnablePushWhitelist : bp . EnableWhitelist ,
PushWhitelistUsernames : pushWhitelistUsernames ,
PushWhitelistTeams : pushWhitelistTeams ,
PushWhitelistDeployKeys : bp . WhitelistDeployKeys ,
EnableMergeWhitelist : bp . EnableMergeWhitelist ,
MergeWhitelistUsernames : mergeWhitelistUsernames ,
MergeWhitelistTeams : mergeWhitelistTeams ,
EnableStatusCheck : bp . EnableStatusCheck ,
StatusCheckContexts : bp . StatusCheckContexts ,
RequiredApprovals : bp . RequiredApprovals ,
EnableApprovalsWhitelist : bp . EnableApprovalsWhitelist ,
ApprovalsWhitelistUsernames : approvalsWhitelistUsernames ,
ApprovalsWhitelistTeams : approvalsWhitelistTeams ,
BlockOnRejectedReviews : bp . BlockOnRejectedReviews ,
2020-04-17 03:00:36 +02:00
BlockOnOutdatedBranch : bp . BlockOnOutdatedBranch ,
2020-02-13 00:19:35 +01:00
DismissStaleApprovals : bp . DismissStaleApprovals ,
RequireSignedCommits : bp . RequireSignedCommits ,
2020-03-27 00:26:34 +02:00
ProtectedFilePatterns : bp . ProtectedFilePatterns ,
2020-02-13 00:19:35 +01:00
Created : bp . CreatedUnix . AsTime ( ) ,
Updated : bp . UpdatedUnix . AsTime ( ) ,
2016-03-13 23:20:22 -04:00
}
2016-01-28 20:49:05 +01:00
}
2019-06-08 10:31:11 -04:00
// ToTag convert a git.Tag to an api.Tag
2019-02-07 20:00:52 +08:00
func ToTag ( repo * models . Repository , t * git . Tag ) * api . Tag {
return & api . Tag {
2019-06-08 10:31:11 -04:00
Name : t . Name ,
ID : t . ID . String ( ) ,
Commit : ToCommitMeta ( repo , t ) ,
ZipballURL : util . URLJoin ( repo . HTMLURL ( ) , "archive" , t . Name + ".zip" ) ,
TarballURL : util . URLJoin ( repo . HTMLURL ( ) , "archive" , t . Name + ".tar.gz" ) ,
2019-02-07 20:00:52 +08:00
}
}
2019-06-08 10:31:11 -04:00
// ToVerification convert a git.Commit.Signature to an api.PayloadCommitVerification
func ToVerification ( c * git . Commit ) * api . PayloadCommitVerification {
verif := models . ParseCommitWithSignature ( c )
2019-10-16 14:42:42 +01:00
commitVerification := & api . PayloadCommitVerification {
Verified : verif . Verified ,
Reason : verif . Reason ,
}
2019-06-08 10:31:11 -04:00
if c . Signature != nil {
2019-10-16 14:42:42 +01:00
commitVerification . Signature = c . Signature . Signature
commitVerification . Payload = c . Signature . Payload
2019-06-08 10:31:11 -04:00
}
2019-10-16 14:42:42 +01:00
if verif . SigningUser != nil {
commitVerification . Signer = & structs . PayloadUser {
Name : verif . SigningUser . Name ,
Email : verif . SigningUser . Email ,
}
2016-01-28 20:49:05 +01:00
}
2019-10-16 14:42:42 +01:00
return commitVerification
2016-01-28 20:49:05 +01:00
}
2016-11-24 15:04:31 +08:00
// ToPublicKey convert models.PublicKey to api.PublicKey
2016-03-13 23:20:22 -04:00
func ToPublicKey ( apiLink string , key * models . PublicKey ) * api . PublicKey {
2015-12-04 17:16:42 -05:00
return & api . PublicKey {
2017-11-28 17:21:39 +02:00
ID : key . ID ,
Key : key . Content ,
URL : apiLink + com . ToStr ( key . ID ) ,
Title : key . Name ,
Fingerprint : key . Fingerprint ,
2017-12-11 12:37:04 +08:00
Created : key . CreatedUnix . AsTime ( ) ,
2015-12-04 17:16:42 -05:00
}
}
2017-03-16 02:27:35 +01:00
// ToGPGKey converts models.GPGKey to api.GPGKey
func ToGPGKey ( key * models . GPGKey ) * api . GPGKey {
subkeys := make ( [ ] * api . GPGKey , len ( key . SubsKey ) )
for id , k := range key . SubsKey {
subkeys [ id ] = & api . GPGKey {
ID : k . ID ,
PrimaryKeyID : k . PrimaryKeyID ,
KeyID : k . KeyID ,
PublicKey : k . Content ,
2017-12-11 12:37:04 +08:00
Created : k . CreatedUnix . AsTime ( ) ,
Expires : k . ExpiredUnix . AsTime ( ) ,
2017-03-16 02:27:35 +01:00
CanSign : k . CanSign ,
CanEncryptComms : k . CanEncryptComms ,
CanEncryptStorage : k . CanEncryptStorage ,
CanCertify : k . CanSign ,
}
}
emails := make ( [ ] * api . GPGKeyEmail , len ( key . Emails ) )
for i , e := range key . Emails {
emails [ i ] = ToGPGKeyEmail ( e )
}
return & api . GPGKey {
ID : key . ID ,
PrimaryKeyID : key . PrimaryKeyID ,
KeyID : key . KeyID ,
PublicKey : key . Content ,
2017-12-11 12:37:04 +08:00
Created : key . CreatedUnix . AsTime ( ) ,
Expires : key . ExpiredUnix . AsTime ( ) ,
2017-03-16 02:27:35 +01:00
Emails : emails ,
SubsKey : subkeys ,
CanSign : key . CanSign ,
CanEncryptComms : key . CanEncryptComms ,
CanEncryptStorage : key . CanEncryptStorage ,
CanCertify : key . CanSign ,
}
}
// ToGPGKeyEmail convert models.EmailAddress to api.GPGKeyEmail
func ToGPGKeyEmail ( email * models . EmailAddress ) * api . GPGKeyEmail {
return & api . GPGKeyEmail {
Email : email . Email ,
Verified : email . IsActivated ,
}
}
2016-11-24 15:04:31 +08:00
// ToHook convert models.Webhook to api.Hook
2016-03-13 23:20:22 -04:00
func ToHook ( repoLink string , w * models . Webhook ) * api . Hook {
2015-12-04 17:16:42 -05:00
config := map [ string ] string {
"url" : w . URL ,
"content_type" : w . ContentType . Name ( ) ,
}
if w . HookTaskType == models . SLACK {
2019-11-04 06:13:25 +08:00
s := webhook . GetSlackHook ( w )
2015-12-04 17:16:42 -05:00
config [ "channel" ] = s . Channel
config [ "username" ] = s . Username
config [ "icon_url" ] = s . IconURL
config [ "color" ] = s . Color
}
return & api . Hook {
ID : w . ID ,
Type : w . HookTaskType . Name ( ) ,
URL : fmt . Sprintf ( "%s/settings/hooks/%d" , repoLink , w . ID ) ,
Active : w . IsActive ,
Config : config ,
Events : w . EventsArray ( ) ,
2017-12-11 12:37:04 +08:00
Updated : w . UpdatedUnix . AsTime ( ) ,
Created : w . CreatedUnix . AsTime ( ) ,
2015-12-04 17:16:42 -05:00
}
}
2019-04-17 08:31:08 +03:00
// ToGitHook convert git.Hook to api.GitHook
func ToGitHook ( h * git . Hook ) * api . GitHook {
return & api . GitHook {
Name : h . Name ( ) ,
IsActive : h . IsActive ,
Content : h . Content ,
}
}
2016-11-24 15:04:31 +08:00
// ToDeployKey convert models.DeployKey to api.DeployKey
2016-03-13 23:20:22 -04:00
func ToDeployKey ( apiLink string , key * models . DeployKey ) * api . DeployKey {
2015-12-04 17:16:42 -05:00
return & api . DeployKey {
2018-11-01 03:40:49 +00:00
ID : key . ID ,
KeyID : key . KeyID ,
Key : key . Content ,
Fingerprint : key . Fingerprint ,
URL : apiLink + com . ToStr ( key . ID ) ,
Title : key . Name ,
Created : key . CreatedUnix . AsTime ( ) ,
ReadOnly : key . Mode == models . AccessModeRead , // All deploy keys are read-only.
2015-12-04 17:16:42 -05:00
}
}
2015-12-17 02:28:47 -05:00
2016-11-24 15:04:31 +08:00
// ToOrganization convert models.User to api.Organization
2016-03-13 23:20:22 -04:00
func ToOrganization ( org * models . User ) * api . Organization {
2015-12-17 02:28:47 -05:00
return & api . Organization {
2019-09-23 22:08:03 +02:00
ID : org . ID ,
AvatarURL : org . AvatarLink ( ) ,
UserName : org . Name ,
FullName : org . FullName ,
Description : org . Description ,
Website : org . Website ,
Location : org . Location ,
Visibility : org . Visibility . String ( ) ,
RepoAdminChangeTeamAccess : org . RepoAdminChangeTeamAccess ,
2015-12-17 02:28:47 -05:00
}
}
2016-03-21 12:47:54 -04:00
2016-11-24 15:04:31 +08:00
// ToTeam convert models.Team to api.Team
2016-03-21 12:47:54 -04:00
func ToTeam ( team * models . Team ) * api . Team {
2020-10-21 02:18:25 +08:00
if team == nil {
return nil
}
2016-03-21 12:47:54 -04:00
return & api . Team {
2019-11-06 10:37:14 +01:00
ID : team . ID ,
Name : team . Name ,
Description : team . Description ,
IncludesAllRepositories : team . IncludesAllRepositories ,
2019-11-20 12:27:49 +01:00
CanCreateOrgRepo : team . CanCreateOrgRepo ,
2019-11-06 10:37:14 +01:00
Permission : team . Authorize . String ( ) ,
Units : team . GetUnitNames ( ) ,
2016-03-21 12:47:54 -04:00
}
}
2019-04-15 17:36:59 +01:00
2019-06-08 10:31:11 -04:00
// ToAnnotatedTag convert git.Tag to api.AnnotatedTag
func ToAnnotatedTag ( repo * models . Repository , t * git . Tag , c * git . Commit ) * api . AnnotatedTag {
return & api . AnnotatedTag {
Tag : t . Name ,
SHA : t . ID . String ( ) ,
Object : ToAnnotatedTagObject ( repo , c ) ,
Message : t . Message ,
URL : util . URLJoin ( repo . APIURL ( ) , "git/tags" , t . ID . String ( ) ) ,
Tagger : ToCommitUser ( t . Tagger ) ,
Verification : ToVerification ( c ) ,
}
}
// ToAnnotatedTagObject convert a git.Commit to an api.AnnotatedTagObject
func ToAnnotatedTagObject ( repo * models . Repository , commit * git . Commit ) * api . AnnotatedTagObject {
return & api . AnnotatedTagObject {
SHA : commit . ID . String ( ) ,
Type : string ( git . ObjectCommit ) ,
URL : util . URLJoin ( repo . APIURL ( ) , "git/commits" , commit . ID . String ( ) ) ,
}
}
2019-09-03 17:46:24 +02:00
// ToTopicResponse convert from models.Topic to api.TopicResponse
func ToTopicResponse ( topic * models . Topic ) * api . TopicResponse {
return & api . TopicResponse {
ID : topic . ID ,
Name : topic . Name ,
RepoCount : topic . RepoCount ,
Created : topic . CreatedUnix . AsTime ( ) ,
Updated : topic . UpdatedUnix . AsTime ( ) ,
}
}
2020-02-29 07:19:32 +01:00
// ToOAuth2Application convert from models.OAuth2Application to api.OAuth2Application
func ToOAuth2Application ( app * models . OAuth2Application ) * api . OAuth2Application {
return & api . OAuth2Application {
ID : app . ID ,
Name : app . Name ,
ClientID : app . ClientID ,
ClientSecret : app . ClientSecret ,
RedirectURIs : app . RedirectURIs ,
Created : app . CreatedUnix . AsTime ( ) ,
}
}
2020-10-17 06:23:08 +02:00
// ToCommitStatus converts models.CommitStatus to api.Status
func ToCommitStatus ( status * models . CommitStatus ) * api . Status {
apiStatus := & api . Status {
Created : status . CreatedUnix . AsTime ( ) ,
Updated : status . CreatedUnix . AsTime ( ) ,
State : api . StatusState ( status . State ) ,
TargetURL : status . TargetURL ,
Description : status . Description ,
ID : status . Index ,
URL : status . APIURL ( ) ,
Context : status . Context ,
}
if status . CreatorID != 0 {
creator , _ := models . GetUserByID ( status . CreatorID )
apiStatus . Creator = ToUser ( creator , false , false )
}
return apiStatus
}