org.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. // Copyright 2014 The Gogs Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package models
  5. import (
  6. "strings"
  7. "github.com/gogits/gogs/modules/base"
  8. )
  9. // GetOwnerTeam returns owner team of organization.
  10. func (org *User) GetOwnerTeam() (*Team, error) {
  11. t := &Team{
  12. OrgId: org.Id,
  13. Name: OWNER_TEAM,
  14. }
  15. _, err := x.Get(t)
  16. return t, err
  17. }
  18. // GetTeams returns all teams that belong to organization.
  19. func (org *User) GetTeams() error {
  20. return x.Where("org_id=?", org.Id).Find(&org.Teams)
  21. }
  22. // GetMembers returns all members of organization.
  23. func (org *User) GetMembers() error {
  24. ous, err := GetOrgUsersByOrgId(org.Id)
  25. if err != nil {
  26. return err
  27. }
  28. org.Members = make([]*User, len(ous))
  29. for i, ou := range ous {
  30. org.Members[i], err = GetUserById(ou.Uid)
  31. if err != nil {
  32. return err
  33. }
  34. }
  35. return nil
  36. }
  37. // CreateOrganization creates record of a new organization.
  38. func CreateOrganization(org, owner *User) (*User, error) {
  39. if !IsLegalName(org.Name) {
  40. return nil, ErrUserNameIllegal
  41. }
  42. isExist, err := IsUserExist(org.Name)
  43. if err != nil {
  44. return nil, err
  45. } else if isExist {
  46. return nil, ErrUserAlreadyExist
  47. }
  48. isExist, err = IsEmailUsed(org.Email)
  49. if err != nil {
  50. return nil, err
  51. } else if isExist {
  52. return nil, ErrEmailAlreadyUsed
  53. }
  54. org.LowerName = strings.ToLower(org.Name)
  55. org.FullName = org.Name
  56. org.Avatar = base.EncodeMd5(org.Email)
  57. org.AvatarEmail = org.Email
  58. // No password for organization.
  59. org.NumTeams = 1
  60. org.NumMembers = 1
  61. sess := x.NewSession()
  62. defer sess.Close()
  63. if err = sess.Begin(); err != nil {
  64. return nil, err
  65. }
  66. if _, err = sess.Insert(org); err != nil {
  67. sess.Rollback()
  68. return nil, err
  69. }
  70. // Create default owner team.
  71. t := &Team{
  72. OrgId: org.Id,
  73. Name: OWNER_TEAM,
  74. Authorize: ORG_ADMIN,
  75. NumMembers: 1,
  76. }
  77. if _, err = sess.Insert(t); err != nil {
  78. sess.Rollback()
  79. return nil, err
  80. }
  81. // Add initial creator to organization and owner team.
  82. ou := &OrgUser{
  83. Uid: owner.Id,
  84. OrgId: org.Id,
  85. IsOwner: true,
  86. NumTeam: 1,
  87. }
  88. if _, err = sess.Insert(ou); err != nil {
  89. sess.Rollback()
  90. return nil, err
  91. }
  92. tu := &TeamUser{
  93. Uid: owner.Id,
  94. OrgId: org.Id,
  95. TeamId: t.Id,
  96. }
  97. if _, err = sess.Insert(tu); err != nil {
  98. sess.Rollback()
  99. return nil, err
  100. }
  101. return org, sess.Commit()
  102. }
  103. // TODO: need some kind of mechanism to record failure.
  104. // DeleteOrganization completely and permanently deletes everything of organization.
  105. func DeleteOrganization(org *User) (err error) {
  106. if err := DeleteUser(org); err != nil {
  107. return err
  108. }
  109. sess := x.NewSession()
  110. defer sess.Close()
  111. if err = sess.Begin(); err != nil {
  112. return err
  113. }
  114. if _, err = sess.Delete(&Team{OrgId: org.Id}); err != nil {
  115. sess.Rollback()
  116. return err
  117. }
  118. if _, err = sess.Delete(&OrgUser{OrgId: org.Id}); err != nil {
  119. sess.Rollback()
  120. return err
  121. }
  122. if _, err = sess.Delete(&TeamUser{OrgId: org.Id}); err != nil {
  123. sess.Rollback()
  124. return err
  125. }
  126. return sess.Commit()
  127. }
  128. type AuthorizeType int
  129. const (
  130. ORG_READABLE AuthorizeType = iota + 1
  131. ORG_WRITABLE
  132. ORG_ADMIN
  133. )
  134. const OWNER_TEAM = "Owners"
  135. // Team represents a organization team.
  136. type Team struct {
  137. Id int64
  138. OrgId int64 `xorm:"INDEX"`
  139. LowerName string
  140. Name string
  141. Description string
  142. Authorize AuthorizeType
  143. RepoIds string `xorm:"TEXT"`
  144. NumMembers int
  145. NumRepos int
  146. }
  147. // NewTeam creates a record of new team.
  148. func NewTeam(t *Team) error {
  149. // TODO: check if same name team of organization exists.
  150. t.LowerName = strings.ToLower(t.Name)
  151. _, err := x.Insert(t)
  152. return err
  153. }
  154. // UpdateTeam updates information of team.
  155. func UpdateTeam(t *Team) error {
  156. if len(t.Description) > 255 {
  157. t.Description = t.Description[:255]
  158. }
  159. t.LowerName = strings.ToLower(t.Name)
  160. _, err := x.Id(t.Id).AllCols().Update(t)
  161. return err
  162. }
  163. // ________ ____ ___
  164. // \_____ \_______ ____ | | \______ ___________
  165. // / | \_ __ \/ ___\| | / ___// __ \_ __ \
  166. // / | \ | \/ /_/ > | /\___ \\ ___/| | \/
  167. // \_______ /__| \___ /|______//____ >\___ >__|
  168. // \/ /_____/ \/ \/
  169. // OrgUser represents an organization-user relation.
  170. type OrgUser struct {
  171. Id int64
  172. Uid int64 `xorm:"INDEX"`
  173. OrgId int64 `xorm:"INDEX"`
  174. IsPublic bool
  175. IsOwner bool
  176. NumTeam int
  177. }
  178. // GetOrgUsersByUserId returns all organization-user relations by user ID.
  179. func GetOrgUsersByUserId(uid int64) ([]*OrgUser, error) {
  180. ous := make([]*OrgUser, 0, 10)
  181. err := x.Where("uid=?", uid).Find(&ous)
  182. return ous, err
  183. }
  184. // GetOrgUsersByOrgId returns all organization-user relations by organization ID.
  185. func GetOrgUsersByOrgId(orgId int64) ([]*OrgUser, error) {
  186. ous := make([]*OrgUser, 0, 10)
  187. err := x.Where("org_id=?", orgId).Find(&ous)
  188. return ous, err
  189. }
  190. // IsOrganizationOwner returns true if given user is in the owner team.
  191. func IsOrganizationOwner(orgId, uid int64) bool {
  192. has, _ := x.Where("is_owner=?", true).Get(&OrgUser{Uid: uid, OrgId: orgId})
  193. return has
  194. }
  195. // IsOrganizationMember returns true if given user is member of organization.
  196. func IsOrganizationMember(orgId, uid int64) bool {
  197. has, _ := x.Get(&OrgUser{Uid: uid, OrgId: orgId})
  198. return has
  199. }
  200. // ___________ ____ ___
  201. // \__ ___/___ _____ _____ | | \______ ___________
  202. // | |_/ __ \\__ \ / \| | / ___// __ \_ __ \
  203. // | |\ ___/ / __ \| Y Y \ | /\___ \\ ___/| | \/
  204. // |____| \___ >____ /__|_| /______//____ >\___ >__|
  205. // \/ \/ \/ \/ \/
  206. // TeamUser represents an team-user relation.
  207. type TeamUser struct {
  208. Id int64
  209. Uid int64
  210. OrgId int64 `xorm:"INDEX"`
  211. TeamId int64
  212. }
  213. // GetTeamMembers returns all members in given team of organization.
  214. func GetTeamMembers(orgId, teamId int64) ([]*User, error) {
  215. tus := make([]*TeamUser, 0, 10)
  216. err := x.Where("org_id=?", orgId).And("team_id=?", teamId).Find(&tus)
  217. if err != nil {
  218. return nil, err
  219. }
  220. us := make([]*User, len(tus))
  221. for i, tu := range tus {
  222. us[i], err = GetUserById(tu.Uid)
  223. if err != nil {
  224. return nil, err
  225. }
  226. }
  227. return us, nil
  228. }