|  | @@ -59,6 +59,16 @@ func (org *User) GetMembers() error {
 | 
	
		
			
				|  |  |  	return nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// AddMember adds new member to organization.
 | 
	
		
			
				|  |  | +func (org *User) AddMember(uid int64) error {
 | 
	
		
			
				|  |  | +	return AddOrgUser(org.Id, uid)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// RemoveMember removes member from organization.
 | 
	
		
			
				|  |  | +func (org *User) RemoveMember(uid int64) error {
 | 
	
		
			
				|  |  | +	return RemoveOrgUser(org.Id, uid)
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  // CreateOrganization creates record of a new organization.
 | 
	
		
			
				|  |  |  func CreateOrganization(org, owner *User) (*User, error) {
 | 
	
		
			
				|  |  |  	if !IsLegalName(org.Name) {
 | 
	
	
		
			
				|  | @@ -241,8 +251,7 @@ func NewTeam(t *Team) error {
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	// Update organization number of teams.
 | 
	
		
			
				|  |  | -	rawSql := "UPDATE `user` SET num_teams = num_teams + 1 WHERE id = ?"
 | 
	
		
			
				|  |  | -	if _, err = sess.Exec(rawSql, t.OrgId); err != nil {
 | 
	
		
			
				|  |  | +	if _, err = sess.Exec("UPDATE `user` SET num_teams = num_teams + 1 WHERE id = ?", t.OrgId); err != nil {
 | 
	
		
			
				|  |  |  		sess.Rollback()
 | 
	
		
			
				|  |  |  		return err
 | 
	
		
			
				|  |  |  	}
 | 
	
	
		
			
				|  | @@ -270,8 +279,8 @@ func UpdateTeam(t *Team) error {
 | 
	
		
			
				|  |  |  // OrgUser represents an organization-user relation.
 | 
	
		
			
				|  |  |  type OrgUser struct {
 | 
	
		
			
				|  |  |  	Id       int64
 | 
	
		
			
				|  |  | -	Uid      int64 `xorm:"INDEX"`
 | 
	
		
			
				|  |  | -	OrgId    int64 `xorm:"INDEX"`
 | 
	
		
			
				|  |  | +	Uid      int64 `xorm:"INDEX UNIQUE(s)"`
 | 
	
		
			
				|  |  | +	OrgId    int64 `xorm:"INDEX UNIQUE(s)"`
 | 
	
		
			
				|  |  |  	IsPublic bool
 | 
	
		
			
				|  |  |  	IsOwner  bool
 | 
	
		
			
				|  |  |  	NumTeam  int
 | 
	
	
		
			
				|  | @@ -289,6 +298,12 @@ func IsOrganizationMember(orgId, uid int64) bool {
 | 
	
		
			
				|  |  |  	return has
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// IsPublicMembership returns ture if given user public his/her membership.
 | 
	
		
			
				|  |  | +func IsPublicMembership(orgId, uid int64) bool {
 | 
	
		
			
				|  |  | +	has, _ := x.Where("uid=?", uid).And("org_id=?", orgId).And("is_public=?", true).Get(new(OrgUser))
 | 
	
		
			
				|  |  | +	return has
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  // GetOrgUsersByUserId returns all organization-user relations by user ID.
 | 
	
		
			
				|  |  |  func GetOrgUsersByUserId(uid int64) ([]*OrgUser, error) {
 | 
	
		
			
				|  |  |  	ous := make([]*OrgUser, 0, 10)
 | 
	
	
		
			
				|  | @@ -303,6 +318,77 @@ func GetOrgUsersByOrgId(orgId int64) ([]*OrgUser, error) {
 | 
	
		
			
				|  |  |  	return ous, err
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +// ChangeOrgUserStatus changes public or private membership status.
 | 
	
		
			
				|  |  | +func ChangeOrgUserStatus(orgId, uid int64, public bool) error {
 | 
	
		
			
				|  |  | +	ou := new(OrgUser)
 | 
	
		
			
				|  |  | +	has, err := x.Where("uid=?", uid).And("org_id=?", orgId).Get(ou)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return err
 | 
	
		
			
				|  |  | +	} else if !has {
 | 
	
		
			
				|  |  | +		return nil
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	ou.IsPublic = public
 | 
	
		
			
				|  |  | +	_, err = x.Id(ou.Id).AllCols().Update(ou)
 | 
	
		
			
				|  |  | +	return err
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// AddOrgUser adds new user to given organization.
 | 
	
		
			
				|  |  | +func AddOrgUser(orgId, uid int64) error {
 | 
	
		
			
				|  |  | +	if IsOrganizationMember(orgId, uid) {
 | 
	
		
			
				|  |  | +		return nil
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	ou := &OrgUser{
 | 
	
		
			
				|  |  | +		Uid:   uid,
 | 
	
		
			
				|  |  | +		OrgId: orgId,
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	sess := x.NewSession()
 | 
	
		
			
				|  |  | +	defer sess.Close()
 | 
	
		
			
				|  |  | +	if err := sess.Begin(); err != nil {
 | 
	
		
			
				|  |  | +		return err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if _, err := sess.Insert(ou); err != nil {
 | 
	
		
			
				|  |  | +		sess.Rollback()
 | 
	
		
			
				|  |  | +		return err
 | 
	
		
			
				|  |  | +	} else if _, err = sess.Exec("UPDATE `user` SET num_members = num_members + 1 WHERE id = ?", orgId); err != nil {
 | 
	
		
			
				|  |  | +		sess.Rollback()
 | 
	
		
			
				|  |  | +		return err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return sess.Commit()
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +// RemoveOrgUser removes user from given organization.
 | 
	
		
			
				|  |  | +func RemoveOrgUser(orgId, uid int64) error {
 | 
	
		
			
				|  |  | +	ou := new(OrgUser)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	has, err := x.Where("uid=?", uid).And("org_id=?", orgId).Get(ou)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return err
 | 
	
		
			
				|  |  | +	} else if !has {
 | 
	
		
			
				|  |  | +		return nil
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	sess := x.NewSession()
 | 
	
		
			
				|  |  | +	defer sess.Close()
 | 
	
		
			
				|  |  | +	if err := sess.Begin(); err != nil {
 | 
	
		
			
				|  |  | +		return err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	if _, err := sess.Id(ou.Id).Delete(ou); err != nil {
 | 
	
		
			
				|  |  | +		sess.Rollback()
 | 
	
		
			
				|  |  | +		return err
 | 
	
		
			
				|  |  | +	} else if _, err = sess.Exec("UPDATE `user` SET num_members = num_members - 1 WHERE id = ?", orgId); err != nil {
 | 
	
		
			
				|  |  | +		sess.Rollback()
 | 
	
		
			
				|  |  | +		return err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return sess.Commit()
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  // ___________                    ____ ___
 | 
	
		
			
				|  |  |  // \__    ___/___ _____    _____ |    |   \______ ___________
 | 
	
		
			
				|  |  |  //   |    |_/ __ \\__  \  /     \|    |   /  ___// __ \_  __ \
 |