2015-12-04 17:16:42 -05:00
// Copyright 2015 The Gogs Authors. All rights reserved.
// 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"
2019-06-08 10:31:11 -04:00
"time"
2015-12-04 17:16:42 -05:00
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-04-15 17:36:59 +01:00
"code.gitea.io/gitea/modules/markup"
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
2019-11-16 20:39:18 +01:00
func ToBranch ( repo * models . Repository , b * git . Branch , c * git . Commit , bp * models . ProtectedBranch , user * models . User ) * api . Branch {
if bp == nil {
return & api . Branch {
Name : b . Name ,
Commit : ToCommit ( repo , c ) ,
Protected : false ,
RequiredApprovals : 0 ,
EnableStatusCheck : false ,
StatusCheckContexts : [ ] string { } ,
UserCanPush : true ,
UserCanMerge : true ,
}
}
2016-01-28 20:49:05 +01:00
return & api . Branch {
2019-11-16 20:39:18 +01:00
Name : b . Name ,
Commit : ToCommit ( repo , c ) ,
Protected : true ,
RequiredApprovals : bp . RequiredApprovals ,
EnableStatusCheck : bp . EnableStatusCheck ,
StatusCheckContexts : bp . StatusCheckContexts ,
UserCanPush : bp . CanUserPush ( user . ID ) ,
2020-01-11 08:29:34 +01:00
UserCanMerge : bp . IsUserMergeWhitelisted ( user . ID ) ,
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
// ToCommit convert a git.Commit to api.PayloadCommit
2018-02-20 04:50:42 -08:00
func ToCommit ( repo * models . Repository , c * git . Commit ) * api . PayloadCommit {
2016-08-09 22:01:57 -07:00
authorUsername := ""
2018-02-20 04:50:42 -08:00
if author , err := models . GetUserByEmail ( c . Author . Email ) ; err == nil {
2016-08-09 22:01:57 -07:00
authorUsername = author . Name
2018-02-20 04:50:42 -08:00
} else if ! models . IsErrUserNotExist ( err ) {
2019-04-02 08:48:31 +01:00
log . Error ( "GetUserByEmail: %v" , err )
2016-08-09 22:01:57 -07:00
}
2018-02-20 04:50:42 -08:00
2016-08-09 22:01:57 -07:00
committerUsername := ""
2018-02-20 04:50:42 -08:00
if committer , err := models . GetUserByEmail ( c . Committer . Email ) ; err == nil {
2016-08-09 22:01:57 -07:00
committerUsername = committer . Name
2018-02-20 04:50:42 -08:00
} else if ! models . IsErrUserNotExist ( err ) {
2019-04-02 08:48:31 +01:00
log . Error ( "GetUserByEmail: %v" , err )
2016-08-09 22:01:57 -07:00
}
2018-02-20 04:50:42 -08:00
2016-01-28 20:49:05 +01:00
return & api . PayloadCommit {
2016-03-13 23:20:22 -04:00
ID : c . ID . String ( ) ,
2016-01-28 20:49:05 +01:00
Message : c . Message ( ) ,
2019-06-08 10:31:11 -04:00
URL : util . URLJoin ( repo . HTMLURL ( ) , "commit" , c . ID . String ( ) ) ,
2016-08-14 04:17:26 -07:00
Author : & api . PayloadUser {
2016-08-09 22:01:57 -07:00
Name : c . Author . Name ,
Email : c . Author . Email ,
UserName : authorUsername ,
} ,
2016-08-14 04:17:26 -07:00
Committer : & api . PayloadUser {
2016-08-09 22:01:57 -07:00
Name : c . Committer . Name ,
Email : c . Committer . Email ,
UserName : committerUsername ,
2016-01-28 20:49:05 +01:00
} ,
2019-06-08 10:31:11 -04:00
Timestamp : c . Author . When ,
Verification : ToVerification ( c ) ,
}
}
// 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 {
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
// ToUser convert models.User to api.User
2019-11-24 20:45:58 +01:00
// signed shall only be set if requester is logged in. authed shall only be set if user is site admin or user himself
2019-07-27 21:15:30 +08:00
func ToUser ( user * models . User , signed , authed bool ) * api . User {
2019-04-15 17:36:59 +01:00
result := & api . User {
UserName : user . Name ,
AvatarURL : user . AvatarLink ( ) ,
FullName : markup . Sanitize ( user . FullName ) ,
2019-06-16 04:28:32 +01:00
Created : user . CreatedUnix . AsTime ( ) ,
2019-04-15 17:36:59 +01:00
}
2019-11-24 20:45:58 +01:00
// hide primary email if API caller is anonymous or user keep email private
if signed && ( ! user . KeepEmailPrivate || authed ) {
2019-04-15 17:36:59 +01:00
result . Email = user . Email
2019-11-24 20:45:58 +01:00
}
// only site admin will get these information and possibly user himself
if authed {
result . ID = user . ID
2019-10-24 10:52:17 +08:00
result . IsAdmin = user . IsAdmin
result . LastLogin = user . LastLoginUnix . AsTime ( )
2019-11-30 17:18:40 +01:00
result . Language = user . Language
2019-04-15 17:36:59 +01:00
}
return result
}
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 ( ) ) ,
}
}
// ToCommitUser convert a git.Signature to an api.CommitUser
func ToCommitUser ( sig * git . Signature ) * api . CommitUser {
return & api . CommitUser {
Identity : api . Identity {
Name : sig . Name ,
Email : sig . Email ,
} ,
Date : sig . When . UTC ( ) . Format ( time . RFC3339 ) ,
}
}
// ToCommitMeta convert a git.Tag to an api.CommitMeta
func ToCommitMeta ( repo * models . Repository , tag * git . Tag ) * api . CommitMeta {
return & api . CommitMeta {
2019-06-29 06:44:17 -04:00
SHA : tag . Object . String ( ) ,
2019-06-08 10:31:11 -04:00
// TODO: Add the /commits API endpoint and use it here (https://developer.github.com/v3/repos/commits/#get-a-single-commit)
URL : util . URLJoin ( repo . APIURL ( ) , "git/commits" , tag . 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 ( ) ,
}
}