2014-08-26 14:11:15 +04:00
// Copyright 2014 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.
package v1
import (
2014-08-29 07:24:37 +04:00
"fmt"
2014-08-26 14:11:15 +04:00
"path"
2014-08-29 07:24:37 +04:00
"strings"
2014-08-26 14:11:15 +04:00
"github.com/Unknwon/com"
"github.com/gogits/gogs/models"
2014-08-29 07:24:37 +04:00
"github.com/gogits/gogs/modules/auth"
"github.com/gogits/gogs/modules/log"
2014-08-26 14:11:15 +04:00
"github.com/gogits/gogs/modules/middleware"
)
type repo struct {
RepoLink string ` json:"repolink" `
}
func SearchRepos ( ctx * middleware . Context ) {
opt := models . SearchOption {
Keyword : path . Base ( ctx . Query ( "q" ) ) ,
Uid : com . StrTo ( ctx . Query ( "uid" ) ) . MustInt64 ( ) ,
Limit : com . StrTo ( ctx . Query ( "limit" ) ) . MustInt ( ) ,
}
if opt . Limit == 0 {
opt . Limit = 10
}
2014-10-25 15:50:19 +04:00
// Check visibility.
if ctx . IsSigned && opt . Uid > 0 {
if ctx . User . Id == opt . Uid {
opt . Private = true
} else {
u , err := models . GetUserById ( opt . Uid )
if err != nil {
ctx . JSON ( 500 , map [ string ] interface { } {
"ok" : false ,
"error" : err . Error ( ) ,
} )
return
}
if u . IsOrganization ( ) && u . IsOrgOwner ( ctx . User . Id ) {
opt . Private = true
}
// FIXME: how about collaborators?
}
}
2014-08-26 14:11:15 +04:00
repos , err := models . SearchRepositoryByName ( opt )
if err != nil {
ctx . JSON ( 500 , map [ string ] interface { } {
"ok" : false ,
"error" : err . Error ( ) ,
} )
return
}
results := make ( [ ] * repo , len ( repos ) )
for i := range repos {
if err = repos [ i ] . GetOwner ( ) ; err != nil {
ctx . JSON ( 500 , map [ string ] interface { } {
"ok" : false ,
"error" : err . Error ( ) ,
} )
return
}
results [ i ] = & repo {
RepoLink : path . Join ( repos [ i ] . Owner . Name , repos [ i ] . Name ) ,
}
}
ctx . Render . JSON ( 200 , map [ string ] interface { } {
"ok" : true ,
"data" : results ,
} )
}
2014-08-29 07:24:37 +04:00
func Migrate ( ctx * middleware . Context , form auth . MigrateRepoForm ) {
2014-08-29 13:31:53 +04:00
u , err := models . GetUserByName ( ctx . Query ( "username" ) )
if err != nil {
ctx . JSON ( 500 , map [ string ] interface { } {
"ok" : false ,
"error" : err . Error ( ) ,
} )
return
}
if ! u . ValidtePassword ( ctx . Query ( "password" ) ) {
ctx . JSON ( 500 , map [ string ] interface { } {
"ok" : false ,
"error" : "username or password is not correct" ,
} )
return
}
ctxUser := u
2014-08-29 07:24:37 +04:00
// Not equal means current user is an organization.
2014-08-29 13:31:53 +04:00
if form . Uid != u . Id {
2014-08-29 07:24:37 +04:00
org , err := models . GetUserById ( form . Uid )
2014-08-29 13:31:53 +04:00
if err != nil {
2014-08-29 07:24:37 +04:00
ctx . JSON ( 500 , map [ string ] interface { } {
2014-08-29 13:31:53 +04:00
"ok" : false ,
"error" : err . Error ( ) ,
2014-08-29 07:24:37 +04:00
} )
return
}
ctxUser = org
}
if ctx . HasError ( ) {
ctx . JSON ( 500 , map [ string ] interface { } {
2014-08-29 13:31:53 +04:00
"ok" : false ,
"error" : ctx . GetErrMsg ( ) ,
2014-08-29 07:24:37 +04:00
} )
return
}
if ctxUser . IsOrganization ( ) {
// Check ownership of organization.
2014-08-29 13:31:53 +04:00
if ! ctxUser . IsOrgOwner ( u . Id ) {
2014-08-29 07:24:37 +04:00
ctx . JSON ( 403 , map [ string ] interface { } {
2014-08-29 13:31:53 +04:00
"ok" : false ,
"error" : "given user is not owner of organization" ,
2014-08-29 07:24:37 +04:00
} )
return
}
}
authStr := strings . Replace ( fmt . Sprintf ( "://%s:%s" ,
form . AuthUserName , form . AuthPasswd ) , "@" , "%40" , - 1 )
url := strings . Replace ( form . HttpsUrl , "://" , authStr + "@" , 1 )
repo , err := models . MigrateRepository ( ctxUser , form . RepoName , form . Description , form . Private ,
form . Mirror , url )
if err == nil {
log . Trace ( "Repository migrated: %s/%s" , ctxUser . Name , form . RepoName )
2014-08-29 13:31:53 +04:00
ctx . JSON ( 200 , map [ string ] interface { } {
"ok" : true ,
"data" : "/" + ctxUser . Name + "/" + form . RepoName ,
2014-08-29 07:24:37 +04:00
} )
return
}
if repo != nil {
if errDelete := models . DeleteRepository ( ctxUser . Id , repo . Id , ctxUser . Name ) ; errDelete != nil {
log . Error ( 4 , "DeleteRepository: %v" , errDelete )
}
}
ctx . JSON ( 500 , map [ string ] interface { } {
2014-08-29 13:31:53 +04:00
"ok" : false ,
"error" : err . Error ( ) ,
2014-08-29 07:24:37 +04:00
} )
}