2014-06-25 08:44:48 +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 models
2014-06-27 11:37:01 +04:00
import (
2014-07-03 00:42:16 +04:00
"errors"
2015-02-23 10:15:53 +03:00
"fmt"
2014-07-05 06:43:39 +04:00
"os"
2014-06-27 11:37:01 +04:00
"strings"
2015-09-07 20:58:23 +03:00
2016-11-11 20:31:37 +03:00
"github.com/go-xorm/builder"
2015-09-07 20:58:23 +03:00
"github.com/go-xorm/xorm"
2014-06-27 11:37:01 +04:00
)
2014-07-03 00:42:16 +04:00
var (
2016-11-26 03:20:18 +03:00
// ErrOrgNotExist organization does not exist
ErrOrgNotExist = errors . New ( "Organization does not exist" )
// ErrTeamNotExist team does not exist
2016-01-30 01:06:14 +03:00
ErrTeamNotExist = errors . New ( "Team does not exist" )
2014-07-03 00:42:16 +04:00
)
2014-12-13 04:30:32 +03:00
// IsOwnedBy returns true if given user is in the owner team.
func ( org * User ) IsOwnedBy ( uid int64 ) bool {
2016-07-23 20:08:22 +03:00
return IsOrganizationOwner ( org . ID , uid )
2014-06-30 00:30:41 +04:00
}
// IsOrgMember returns true if given user is member of organization.
func ( org * User ) IsOrgMember ( uid int64 ) bool {
2016-07-23 20:08:22 +03:00
return org . IsOrganization ( ) && IsOrganizationMember ( org . ID , uid )
2014-06-30 00:30:41 +04:00
}
2015-02-13 08:58:46 +03:00
func ( org * User ) getTeam ( e Engine , name string ) ( * Team , error ) {
2016-07-23 20:08:22 +03:00
return getTeam ( e , org . ID , name )
2015-02-13 08:58:46 +03:00
}
2014-08-16 12:21:17 +04:00
// GetTeam returns named team of organization.
func ( org * User ) GetTeam ( name string ) ( * Team , error ) {
2015-02-13 08:58:46 +03:00
return org . getTeam ( x , name )
}
func ( org * User ) getOwnerTeam ( e Engine ) ( * Team , error ) {
2016-11-28 04:30:08 +03:00
return org . getTeam ( e , ownerTeamName )
2014-08-16 12:21:17 +04:00
}
2014-06-28 08:40:07 +04:00
// GetOwnerTeam returns owner team of organization.
func ( org * User ) GetOwnerTeam ( ) ( * Team , error ) {
2015-02-13 08:58:46 +03:00
return org . getOwnerTeam ( x )
}
func ( org * User ) getTeams ( e Engine ) error {
2016-11-10 18:16:32 +03:00
return e .
Where ( "org_id=?" , org . ID ) .
2016-11-28 04:30:08 +03:00
OrderBy ( "CASE WHEN name LIKE '" + ownerTeamName + "' THEN '' ELSE name END" ) .
2016-11-10 18:16:32 +03:00
Find ( & org . Teams )
2014-06-28 08:40:07 +04:00
}
2014-06-28 23:43:25 +04:00
// GetTeams returns all teams that belong to organization.
func ( org * User ) GetTeams ( ) error {
2015-02-13 08:58:46 +03:00
return org . getTeams ( x )
2014-06-28 23:43:25 +04:00
}
// GetMembers returns all members of organization.
func ( org * User ) GetMembers ( ) error {
2016-07-23 20:08:22 +03:00
ous , err := GetOrgUsersByOrgID ( org . ID )
2014-06-28 23:43:25 +04:00
if err != nil {
return err
}
2016-11-10 11:10:35 +03:00
var ids = make ( [ ] int64 , len ( ous ) )
2014-06-28 23:43:25 +04:00
for i , ou := range ous {
2016-11-26 03:20:18 +03:00
ids [ i ] = ou . UID
2014-06-28 23:43:25 +04:00
}
2016-11-10 11:10:35 +03:00
org . Members , err = GetUsersByIDs ( ids )
return err
2014-06-28 23:43:25 +04:00
}
2014-08-15 14:29:41 +04:00
// AddMember adds new member to organization.
func ( org * User ) AddMember ( uid int64 ) error {
2016-07-23 20:08:22 +03:00
return AddOrgUser ( org . ID , uid )
2014-08-15 14:29:41 +04:00
}
// RemoveMember removes member from organization.
func ( org * User ) RemoveMember ( uid int64 ) error {
2016-07-23 20:08:22 +03:00
return RemoveOrgUser ( org . ID , uid )
2014-08-15 14:29:41 +04:00
}
2015-03-01 05:44:09 +03:00
func ( org * User ) removeOrgRepo ( e Engine , repoID int64 ) error {
2016-07-23 20:08:22 +03:00
return removeOrgRepo ( e , org . ID , repoID )
2015-03-01 05:44:09 +03:00
}
// RemoveOrgRepo removes all team-repository relations of organization.
func ( org * User ) RemoveOrgRepo ( repoID int64 ) error {
return org . removeOrgRepo ( x , repoID )
}
2014-06-27 11:37:01 +04:00
// CreateOrganization creates record of a new organization.
2015-03-27 00:11:47 +03:00
func CreateOrganization ( org , owner * User ) ( err error ) {
2016-07-23 13:58:18 +03:00
if err = IsUsableUsername ( org . Name ) ; err != nil {
2015-03-27 00:11:47 +03:00
return err
2014-06-27 11:37:01 +04:00
}
2015-02-23 02:24:49 +03:00
isExist , err := IsUserExist ( 0 , org . Name )
2014-06-27 11:37:01 +04:00
if err != nil {
2015-03-27 00:11:47 +03:00
return err
2014-06-27 11:37:01 +04:00
} else if isExist {
2015-03-27 00:11:47 +03:00
return ErrUserAlreadyExist { org . Name }
2014-06-27 11:37:01 +04:00
}
org . LowerName = strings . ToLower ( org . Name )
2016-12-20 15:32:02 +03:00
if org . Rands , err = GetUserSalt ( ) ; err != nil {
return err
}
if org . Salt , err = GetUserSalt ( ) ; err != nil {
return err
}
2015-09-06 17:08:14 +03:00
org . UseCustomAvatar = true
2015-12-11 23:48:02 +03:00
org . MaxRepoCreation = - 1
2014-06-27 11:37:01 +04:00
org . NumTeams = 1
org . NumMembers = 1
sess := x . NewSession ( )
2015-02-23 10:15:53 +03:00
defer sessionRelease ( sess )
2014-06-27 11:37:01 +04:00
if err = sess . Begin ( ) ; err != nil {
2015-03-27 00:11:47 +03:00
return err
2014-06-27 11:37:01 +04:00
}
if _ , err = sess . Insert ( org ) ; err != nil {
2015-03-27 00:11:47 +03:00
return fmt . Errorf ( "insert organization: %v" , err )
2014-07-05 06:43:39 +04:00
}
2015-09-06 17:08:14 +03:00
org . GenerateRandomAvatar ( )
// Add initial creator to organization and owner team.
if _ , err = sess . Insert ( & OrgUser {
2016-11-26 03:20:18 +03:00
UID : owner . ID ,
2016-07-23 20:08:22 +03:00
OrgID : org . ID ,
2015-09-06 17:08:14 +03:00
IsOwner : true ,
NumTeams : 1 ,
} ) ; err != nil {
return fmt . Errorf ( "insert org-user relation: %v" , err )
}
2014-07-05 06:43:39 +04:00
2014-06-27 11:37:01 +04:00
// Create default owner team.
t := & Team {
2016-07-23 20:08:22 +03:00
OrgID : org . ID ,
2016-11-28 04:30:08 +03:00
LowerName : strings . ToLower ( ownerTeamName ) ,
Name : ownerTeamName ,
2016-11-07 19:20:37 +03:00
Authorize : AccessModeOwner ,
2014-06-27 11:37:01 +04:00
NumMembers : 1 ,
}
if _ , err = sess . Insert ( t ) ; err != nil {
2015-03-27 00:11:47 +03:00
return fmt . Errorf ( "insert owner team: %v" , err )
2014-06-27 11:37:01 +04:00
}
2015-09-06 17:08:14 +03:00
if _ , err = sess . Insert ( & TeamUser {
2016-11-28 04:30:08 +03:00
UID : owner . ID ,
2016-07-23 20:08:22 +03:00
OrgID : org . ID ,
2015-02-23 10:15:53 +03:00
TeamID : t . ID ,
2015-09-06 17:08:14 +03:00
} ) ; err != nil {
2015-03-27 00:11:47 +03:00
return fmt . Errorf ( "insert team-user relation: %v" , err )
2015-02-23 10:15:53 +03:00
}
if err = os . MkdirAll ( UserPath ( org . Name ) , os . ModePerm ) ; err != nil {
2015-03-27 00:11:47 +03:00
return fmt . Errorf ( "create directory: %v" , err )
2014-06-27 11:37:01 +04:00
}
2015-03-27 00:11:47 +03:00
return sess . Commit ( )
2014-06-27 11:37:01 +04:00
}
2014-12-13 04:30:32 +03:00
// GetOrgByName returns organization by given name.
func GetOrgByName ( name string ) ( * User , error ) {
if len ( name ) == 0 {
return nil , ErrOrgNotExist
}
u := & User {
LowerName : strings . ToLower ( name ) ,
2016-11-07 19:53:22 +03:00
Type : UserTypeOrganization ,
2014-12-13 04:30:32 +03:00
}
has , err := x . Get ( u )
if err != nil {
return nil , err
} else if ! has {
return nil , ErrOrgNotExist
}
return u , nil
}
2014-08-28 18:29:00 +04:00
// CountOrganizations returns number of organizations.
func CountOrganizations ( ) int64 {
2016-11-10 18:16:32 +03:00
count , _ := x .
Where ( "type=1" ) .
Count ( new ( User ) )
2014-08-28 18:29:00 +04:00
return count
}
2015-09-25 20:54:52 +03:00
// Organizations returns number of organizations in given page.
2016-12-24 17:42:26 +03:00
func Organizations ( opts * SearchUserOptions ) ( [ ] * User , error ) {
orgs := make ( [ ] * User , 0 , opts . PageSize )
if len ( opts . OrderBy ) == 0 {
opts . OrderBy = "name ASC"
}
sess := x .
Limit ( opts . PageSize , ( opts . Page - 1 ) * opts . PageSize ) .
Where ( "type=1" )
return orgs , sess .
OrderBy ( opts . OrderBy ) .
2016-11-10 18:16:32 +03:00
Find ( & orgs )
2014-08-29 16:50:43 +04:00
}
2014-06-28 08:40:07 +04:00
// DeleteOrganization completely and permanently deletes everything of organization.
func DeleteOrganization ( org * User ) ( err error ) {
if err := DeleteUser ( org ) ; err != nil {
return err
}
sess := x . NewSession ( )
2015-09-06 15:54:08 +03:00
defer sessionRelease ( sess )
2014-06-28 08:40:07 +04:00
if err = sess . Begin ( ) ; err != nil {
return err
}
2015-09-06 15:54:08 +03:00
if err = deleteBeans ( sess ,
2016-07-23 20:08:22 +03:00
& Team { OrgID : org . ID } ,
& OrgUser { OrgID : org . ID } ,
& TeamUser { OrgID : org . ID } ,
2015-09-06 15:54:08 +03:00
) ; err != nil {
return fmt . Errorf ( "deleteBeans: %v" , err )
2014-06-28 08:40:07 +04:00
}
2015-09-06 15:54:08 +03:00
if err = deleteUser ( sess , org ) ; err != nil {
return fmt . Errorf ( "deleteUser: %v" , err )
2014-06-28 08:40:07 +04:00
}
2015-09-06 15:54:08 +03:00
2014-06-28 08:40:07 +04:00
return sess . Commit ( )
}
2014-06-25 08:44:48 +04:00
// ________ ____ ___
// \_____ \_______ ____ | | \______ ___________
// / | \_ __ \/ ___\| | / ___// __ \_ __ \
// / | \ | \/ /_/ > | /\___ \\ ___/| | \/
// \_______ /__| \___ /|______//____ >\___ >__|
// \/ /_____/ \/ \/
// OrgUser represents an organization-user relation.
type OrgUser struct {
2015-02-23 10:15:53 +03:00
ID int64 ` xorm:"pk autoincr" `
2016-11-26 03:20:18 +03:00
UID int64 ` xorm:"INDEX UNIQUE(s)" `
2015-02-23 10:15:53 +03:00
OrgID int64 ` xorm:"INDEX UNIQUE(s)" `
2014-06-25 08:44:48 +04:00
IsPublic bool
IsOwner bool
2014-08-24 17:09:05 +04:00
NumTeams int
2014-06-25 08:44:48 +04:00
}
2014-06-30 00:30:41 +04:00
// IsOrganizationOwner returns true if given user is in the owner team.
2016-11-26 03:20:18 +03:00
func IsOrganizationOwner ( orgID , uid int64 ) bool {
2016-11-10 18:16:32 +03:00
has , _ := x .
Where ( "is_owner=?" , true ) .
And ( "uid=?" , uid ) .
2016-11-26 03:20:18 +03:00
And ( "org_id=?" , orgID ) .
2016-11-10 18:16:32 +03:00
Get ( new ( OrgUser ) )
2014-06-30 00:30:41 +04:00
return has
}
// IsOrganizationMember returns true if given user is member of organization.
2016-11-26 03:20:18 +03:00
func IsOrganizationMember ( orgID , uid int64 ) bool {
2016-11-10 18:16:32 +03:00
has , _ := x .
Where ( "uid=?" , uid ) .
2016-11-26 03:20:18 +03:00
And ( "org_id=?" , orgID ) .
2016-11-10 18:16:32 +03:00
Get ( new ( OrgUser ) )
2014-06-30 00:30:41 +04:00
return has
}
2014-12-07 04:22:48 +03:00
// IsPublicMembership returns true if given user public his/her membership.
2016-11-26 03:20:18 +03:00
func IsPublicMembership ( orgID , uid int64 ) bool {
2016-11-10 18:16:32 +03:00
has , _ := x .
Where ( "uid=?" , uid ) .
2016-11-26 03:20:18 +03:00
And ( "org_id=?" , orgID ) .
2016-11-10 18:16:32 +03:00
And ( "is_public=?" , true ) .
Get ( new ( OrgUser ) )
2014-08-15 14:29:41 +04:00
return has
}
2016-02-20 02:10:03 +03:00
func getOrgsByUserID ( sess * xorm . Session , userID int64 , showAll bool ) ( [ ] * User , error ) {
2016-01-31 00:51:11 +03:00
orgs := make ( [ ] * User , 0 , 10 )
2016-02-20 02:10:03 +03:00
if ! showAll {
sess . And ( "`org_user`.is_public=?" , true )
}
2016-11-10 11:10:35 +03:00
return orgs , sess .
And ( "`org_user`.uid=?" , userID ) .
Join ( "INNER" , "`org_user`" , "`org_user`.org_id=`user`.id" ) .
Asc ( "`user`.name" ) .
Find ( & orgs )
2016-01-31 00:51:11 +03:00
}
2016-02-15 04:36:03 +03:00
// GetOrgsByUserID returns a list of organizations that the given user ID
// has joined.
2016-02-20 02:10:03 +03:00
func GetOrgsByUserID ( userID int64 , showAll bool ) ( [ ] * User , error ) {
return getOrgsByUserID ( x . NewSession ( ) , userID , showAll )
2016-01-31 00:51:11 +03:00
}
2016-02-15 04:36:03 +03:00
// GetOrgsByUserIDDesc returns a list of organizations that the given user ID
// has joined, ordered descending by the given condition.
2016-02-20 02:10:03 +03:00
func GetOrgsByUserIDDesc ( userID int64 , desc string , showAll bool ) ( [ ] * User , error ) {
return getOrgsByUserID ( x . NewSession ( ) . Desc ( desc ) , userID , showAll )
2016-01-31 00:51:11 +03:00
}
2015-09-07 20:58:23 +03:00
func getOwnedOrgsByUserID ( sess * xorm . Session , userID int64 ) ( [ ] * User , error ) {
orgs := make ( [ ] * User , 0 , 10 )
2016-11-10 11:10:35 +03:00
return orgs , sess .
Where ( "`org_user`.uid=?" , userID ) .
And ( "`org_user`.is_owner=?" , true ) .
Join ( "INNER" , "`org_user`" , "`org_user`.org_id=`user`.id" ) .
Asc ( "`user`.name" ) .
Find ( & orgs )
2015-09-07 20:58:23 +03:00
}
// GetOwnedOrgsByUserID returns a list of organizations are owned by given user ID.
func GetOwnedOrgsByUserID ( userID int64 ) ( [ ] * User , error ) {
sess := x . NewSession ( )
return getOwnedOrgsByUserID ( sess , userID )
}
2016-11-26 03:20:18 +03:00
// GetOwnedOrgsByUserIDDesc returns a list of organizations are owned by
2016-01-31 00:51:11 +03:00
// given user ID, ordered descending by the given condition.
2015-09-07 20:58:23 +03:00
func GetOwnedOrgsByUserIDDesc ( userID int64 , desc string ) ( [ ] * User , error ) {
sess := x . NewSession ( )
return getOwnedOrgsByUserID ( sess . Desc ( desc ) , userID )
}
2015-12-17 10:28:47 +03:00
// GetOrgUsersByUserID returns all organization-user relations by user ID.
func GetOrgUsersByUserID ( uid int64 , all bool ) ( [ ] * OrgUser , error ) {
2014-06-25 08:44:48 +04:00
ous := make ( [ ] * OrgUser , 0 , 10 )
2016-11-10 11:10:35 +03:00
sess := x .
2016-11-11 19:55:06 +03:00
Join ( "LEFT" , "user" , "`org_user`.org_id=`user`.id" ) .
Where ( "`org_user`.uid=?" , uid )
2015-12-17 10:28:47 +03:00
if ! all {
// Only show public organizations
sess . And ( "is_public=?" , true )
}
2016-11-10 11:10:35 +03:00
err := sess .
Asc ( "`user`.name" ) .
Find ( & ous )
2014-06-25 08:44:48 +04:00
return ous , err
}
2016-07-15 19:36:39 +03:00
// GetOrgUsersByOrgID returns all organization-user relations by organization ID.
func GetOrgUsersByOrgID ( orgID int64 ) ( [ ] * OrgUser , error ) {
2014-06-25 13:14:36 +04:00
ous := make ( [ ] * OrgUser , 0 , 10 )
2016-11-10 18:16:32 +03:00
err := x .
Where ( "org_id=?" , orgID ) .
Find ( & ous )
2014-06-25 13:14:36 +04:00
return ous , err
}
2014-08-15 14:29:41 +04:00
// ChangeOrgUserStatus changes public or private membership status.
2016-07-24 09:32:46 +03:00
func ChangeOrgUserStatus ( orgID , uid int64 , public bool ) error {
2014-08-15 14:29:41 +04:00
ou := new ( OrgUser )
2016-11-10 18:16:32 +03:00
has , err := x .
Where ( "uid=?" , uid ) .
And ( "org_id=?" , orgID ) .
Get ( ou )
2014-08-15 14:29:41 +04:00
if err != nil {
return err
} else if ! has {
return nil
}
ou . IsPublic = public
2015-02-23 10:15:53 +03:00
_ , err = x . Id ( ou . ID ) . AllCols ( ) . Update ( ou )
2014-08-15 14:29:41 +04:00
return err
}
// AddOrgUser adds new user to given organization.
2016-07-24 09:32:46 +03:00
func AddOrgUser ( orgID , uid int64 ) error {
if IsOrganizationMember ( orgID , uid ) {
2014-08-15 14:29:41 +04:00
return nil
}
sess := x . NewSession ( )
defer sess . Close ( )
if err := sess . Begin ( ) ; err != nil {
return err
}
2014-08-24 17:09:05 +04:00
ou := & OrgUser {
2016-11-26 03:20:18 +03:00
UID : uid ,
2016-07-24 09:32:46 +03:00
OrgID : orgID ,
2014-08-24 17:09:05 +04:00
}
2014-08-15 14:29:41 +04:00
if _ , err := sess . Insert ( ou ) ; err != nil {
sess . Rollback ( )
return err
2016-07-24 09:32:46 +03:00
} else if _ , err = sess . Exec ( "UPDATE `user` SET num_members = num_members + 1 WHERE id = ?" , orgID ) ; err != nil {
2014-08-15 14:29:41 +04:00
sess . Rollback ( )
return err
}
return sess . Commit ( )
}
// RemoveOrgUser removes user from given organization.
2016-07-24 09:32:46 +03:00
func RemoveOrgUser ( orgID , userID int64 ) error {
2014-08-15 14:29:41 +04:00
ou := new ( OrgUser )
2016-11-10 18:16:32 +03:00
has , err := x .
Where ( "uid=?" , userID ) .
And ( "org_id=?" , orgID ) .
Get ( ou )
2014-08-15 14:29:41 +04:00
if err != nil {
2015-03-18 04:51:39 +03:00
return fmt . Errorf ( "get org-user: %v" , err )
2014-08-15 14:29:41 +04:00
} else if ! has {
return nil
}
2016-07-24 09:32:46 +03:00
user , err := GetUserByID ( userID )
if err != nil {
return fmt . Errorf ( "GetUserByID [%d]: %v" , userID , err )
}
org , err := GetUserByID ( orgID )
2014-08-24 17:09:05 +04:00
if err != nil {
2016-07-24 09:32:46 +03:00
return fmt . Errorf ( "GetUserByID [%d]: %v" , orgID , err )
2014-08-24 17:09:05 +04:00
}
2016-07-24 09:32:46 +03:00
// FIXME: only need to get IDs here, not all fields of repository.
repos , _ , err := org . GetUserRepositories ( user . ID , 1 , org . NumRepos )
2014-08-24 17:09:05 +04:00
if err != nil {
2016-07-24 09:32:46 +03:00
return fmt . Errorf ( "GetUserRepositories [%d]: %v" , user . ID , err )
2014-08-24 17:09:05 +04:00
}
2014-08-16 12:21:17 +04:00
// Check if the user to delete is the last member in owner team.
2016-07-24 09:32:46 +03:00
if IsOrganizationOwner ( orgID , userID ) {
2014-08-16 12:21:17 +04:00
t , err := org . GetOwnerTeam ( )
if err != nil {
return err
}
if t . NumMembers == 1 {
2016-07-24 09:32:46 +03:00
return ErrLastOrgOwner { UID : userID }
2014-08-16 12:21:17 +04:00
}
}
2014-08-15 14:29:41 +04:00
sess := x . NewSession ( )
2015-03-18 04:51:39 +03:00
defer sessionRelease ( sess )
2014-08-15 14:29:41 +04:00
if err := sess . Begin ( ) ; err != nil {
return err
}
2015-02-23 10:15:53 +03:00
if _ , err := sess . Id ( ou . ID ) . Delete ( ou ) ; err != nil {
2014-08-15 14:29:41 +04:00
return err
2016-07-24 09:32:46 +03:00
} else if _ , err = sess . Exec ( "UPDATE `user` SET num_members=num_members-1 WHERE id=?" , orgID ) ; err != nil {
2014-08-15 14:29:41 +04:00
return err
}
2016-07-24 09:32:46 +03:00
// Delete all repository accesses and unwatch them.
repoIDs := make ( [ ] int64 , len ( repos ) )
for i := range repos {
repoIDs = append ( repoIDs , repos [ i ] . ID )
if err = watchRepo ( sess , user . ID , repos [ i ] . ID , false ) ; err != nil {
2014-08-27 12:39:36 +04:00
return err
2014-08-24 17:09:05 +04:00
}
}
2016-08-10 21:06:51 +03:00
if len ( repoIDs ) > 0 {
2016-11-10 18:16:32 +03:00
if _ , err = sess .
Where ( "user_id = ?" , user . ID ) .
In ( "repo_id" , repoIDs ) .
Delete ( new ( Access ) ) ; err != nil {
2016-08-10 21:06:51 +03:00
return err
}
2016-07-24 09:32:46 +03:00
}
2014-08-24 17:09:05 +04:00
// Delete member in his/her teams.
2016-07-24 09:32:46 +03:00
teams , err := getUserTeams ( sess , org . ID , user . ID )
2014-08-24 17:09:05 +04:00
if err != nil {
return err
}
2015-03-18 04:51:39 +03:00
for _ , t := range teams {
2016-07-24 09:32:46 +03:00
if err = removeTeamMember ( sess , org . ID , t . ID , user . ID ) ; err != nil {
2014-08-24 17:09:05 +04:00
return err
}
}
2014-08-15 14:29:41 +04:00
return sess . Commit ( )
}
2015-03-01 05:44:09 +03:00
func removeOrgRepo ( e Engine , orgID , repoID int64 ) error {
_ , err := e . Delete ( & TeamRepo {
OrgID : orgID ,
RepoID : repoID ,
} )
return err
}
// RemoveOrgRepo removes all team-repository relations of given organization.
func RemoveOrgRepo ( orgID , repoID int64 ) error {
return removeOrgRepo ( x , orgID , repoID )
}
2016-01-31 13:46:04 +03:00
2016-07-24 13:09:45 +03:00
func ( org * User ) getUserTeams ( e Engine , userID int64 , cols ... string ) ( [ ] * Team , error ) {
teams := make ( [ ] * Team , 0 , org . NumTeams )
2016-11-10 11:10:35 +03:00
return teams , e .
Where ( "`team_user`.org_id = ?" , org . ID ) .
Join ( "INNER" , "team_user" , "`team_user`.team_id = team.id" ) .
Join ( "INNER" , "user" , "`user`.id=team_user.uid" ) .
And ( "`team_user`.uid = ?" , userID ) .
Asc ( "`user`.name" ) .
Cols ( cols ... ) .
2016-11-10 18:16:32 +03:00
Find ( & teams )
2016-07-24 13:09:45 +03:00
}
2016-11-27 14:59:12 +03:00
// GetUserTeamIDs returns of all team IDs of the organization that user is member of.
2016-07-24 09:32:46 +03:00
func ( org * User ) GetUserTeamIDs ( userID int64 ) ( [ ] int64 , error ) {
2016-07-24 13:09:45 +03:00
teams , err := org . getUserTeams ( x , userID , "team.id" )
if err != nil {
return nil , fmt . Errorf ( "getUserTeams [%d]: %v" , userID , err )
2016-01-31 13:46:04 +03:00
}
2016-07-24 09:32:46 +03:00
teamIDs := make ( [ ] int64 , len ( teams ) )
2016-02-04 21:03:34 +03:00
for i := range teams {
2016-07-24 09:32:46 +03:00
teamIDs [ i ] = teams [ i ] . ID
2016-01-31 13:46:04 +03:00
}
2016-07-24 09:32:46 +03:00
return teamIDs , nil
}
2016-11-26 03:20:18 +03:00
// GetUserTeams returns all teams that belong to user,
2016-07-24 13:09:45 +03:00
// and that the user has joined.
func ( org * User ) GetUserTeams ( userID int64 ) ( [ ] * Team , error ) {
return org . getUserTeams ( x , userID )
}
// GetUserRepositories returns a range of repositories in organization
// that the user with the given userID has access to,
// and total number of records based on given condition.
2016-07-24 09:32:46 +03:00
func ( org * User ) GetUserRepositories ( userID int64 , page , pageSize int ) ( [ ] * Repository , int64 , error ) {
teamIDs , err := org . GetUserTeamIDs ( userID )
if err != nil {
return nil , 0 , fmt . Errorf ( "GetUserTeamIDs: %v" , err )
2016-01-31 21:13:39 +03:00
}
2016-07-24 13:09:45 +03:00
if len ( teamIDs ) == 0 {
// user has no team but "IN ()" is invalid SQL
teamIDs = [ ] int64 { - 1 } // there is no repo with id=-1
}
2016-01-31 21:13:39 +03:00
2016-07-24 09:32:46 +03:00
if page <= 0 {
page = 1
}
repos := make ( [ ] * Repository , 0 , pageSize )
2016-11-10 18:16:32 +03:00
if err := x .
Select ( "`repository`.*" ) .
Join ( "INNER" , "team_repo" , "`team_repo`.repo_id=`repository`.id" ) .
Where ( "(`repository`.owner_id=? AND `repository`.is_private=?)" , org . ID , false ) .
2016-11-11 20:31:37 +03:00
Or ( builder . In ( "team_repo.team_id" , teamIDs ) ) .
2016-11-10 18:16:32 +03:00
GroupBy ( "`repository`.id" ) .
OrderBy ( "updated_unix DESC" ) .
Limit ( pageSize , ( page - 1 ) * pageSize ) .
Find ( & repos ) ; err != nil {
2016-07-24 09:32:46 +03:00
return nil , 0 , fmt . Errorf ( "get repositories: %v" , err )
}
2016-11-10 18:16:32 +03:00
repoCount , err := x .
Join ( "INNER" , "team_repo" , "`team_repo`.repo_id=`repository`.id" ) .
Where ( "(`repository`.owner_id=? AND `repository`.is_private=?)" , org . ID , false ) .
2016-11-11 20:31:37 +03:00
Or ( builder . In ( "team_repo.team_id" , teamIDs ) ) .
2016-11-10 18:16:32 +03:00
GroupBy ( "`repository`.id" ) .
Count ( & Repository { } )
2016-07-24 09:32:46 +03:00
if err != nil {
2016-11-10 18:16:32 +03:00
return nil , 0 , fmt . Errorf ( "count user repositories in organization: %v" , err )
2016-01-31 13:46:04 +03:00
}
2016-11-10 18:16:32 +03:00
return repos , repoCount , nil
2016-07-24 09:32:46 +03:00
}
2016-11-26 03:20:18 +03:00
// GetUserMirrorRepositories returns mirror repositories of the user
2016-07-24 09:32:46 +03:00
// that the user with the given userID has access to.
func ( org * User ) GetUserMirrorRepositories ( userID int64 ) ( [ ] * Repository , error ) {
teamIDs , err := org . GetUserTeamIDs ( userID )
if err != nil {
return nil , fmt . Errorf ( "GetUserTeamIDs: %v" , err )
}
2016-07-24 13:09:45 +03:00
if len ( teamIDs ) == 0 {
teamIDs = [ ] int64 { - 1 }
}
2016-07-24 09:32:46 +03:00
repos := make ( [ ] * Repository , 0 , 10 )
2016-11-10 18:16:32 +03:00
return repos , x .
Select ( "`repository`.*" ) .
Join ( "INNER" , "team_repo" , "`team_repo`.repo_id=`repository`.id AND `repository`.is_mirror=?" , true ) .
Where ( "(`repository`.owner_id=? AND `repository`.is_private=?)" , org . ID , false ) .
2016-11-11 20:31:37 +03:00
Or ( builder . In ( "team_repo.team_id" , teamIDs ) ) .
2016-11-10 18:16:32 +03:00
GroupBy ( "`repository`.id" ) .
OrderBy ( "updated_unix DESC" ) .
Find ( & repos )
2016-01-31 13:46:04 +03:00
}