org.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  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. "errors"
  7. "strings"
  8. "github.com/gogits/gogs/modules/base"
  9. )
  10. var (
  11. ErrOrgNotExist = errors.New("Organization does not exist")
  12. ErrTeamAlreadyExist = errors.New("Team already exist")
  13. )
  14. // IsOrgOwner returns true if given user is in the owner team.
  15. func (org *User) IsOrgOwner(uid int64) bool {
  16. return IsOrganizationOwner(org.Id, uid)
  17. }
  18. // IsOrgMember returns true if given user is member of organization.
  19. func (org *User) IsOrgMember(uid int64) bool {
  20. return IsOrganizationMember(org.Id, uid)
  21. }
  22. // GetOwnerTeam returns owner team of organization.
  23. func (org *User) GetOwnerTeam() (*Team, error) {
  24. t := &Team{
  25. OrgId: org.Id,
  26. Name: OWNER_TEAM,
  27. }
  28. _, err := x.Get(t)
  29. return t, err
  30. }
  31. // GetTeams returns all teams that belong to organization.
  32. func (org *User) GetTeams() error {
  33. return x.Where("org_id=?", org.Id).Find(&org.Teams)
  34. }
  35. // GetMembers returns all members of organization.
  36. func (org *User) GetMembers() error {
  37. ous, err := GetOrgUsersByOrgId(org.Id)
  38. if err != nil {
  39. return err
  40. }
  41. org.Members = make([]*User, len(ous))
  42. for i, ou := range ous {
  43. org.Members[i], err = GetUserById(ou.Uid)
  44. if err != nil {
  45. return err
  46. }
  47. }
  48. return nil
  49. }
  50. // CreateOrganization creates record of a new organization.
  51. func CreateOrganization(org, owner *User) (*User, error) {
  52. if !IsLegalName(org.Name) {
  53. return nil, ErrUserNameIllegal
  54. }
  55. isExist, err := IsUserExist(org.Name)
  56. if err != nil {
  57. return nil, err
  58. } else if isExist {
  59. return nil, ErrUserAlreadyExist
  60. }
  61. isExist, err = IsEmailUsed(org.Email)
  62. if err != nil {
  63. return nil, err
  64. } else if isExist {
  65. return nil, ErrEmailAlreadyUsed
  66. }
  67. org.LowerName = strings.ToLower(org.Name)
  68. org.FullName = org.Name
  69. org.Avatar = base.EncodeMd5(org.Email)
  70. org.AvatarEmail = org.Email
  71. // No password for organization.
  72. org.NumTeams = 1
  73. org.NumMembers = 1
  74. sess := x.NewSession()
  75. defer sess.Close()
  76. if err = sess.Begin(); err != nil {
  77. return nil, err
  78. }
  79. if _, err = sess.Insert(org); err != nil {
  80. sess.Rollback()
  81. return nil, err
  82. }
  83. // Create default owner team.
  84. t := &Team{
  85. OrgId: org.Id,
  86. Name: OWNER_TEAM,
  87. Authorize: ORG_ADMIN,
  88. NumMembers: 1,
  89. }
  90. if _, err = sess.Insert(t); err != nil {
  91. sess.Rollback()
  92. return nil, err
  93. }
  94. // Add initial creator to organization and owner team.
  95. ou := &OrgUser{
  96. Uid: owner.Id,
  97. OrgId: org.Id,
  98. IsOwner: true,
  99. NumTeam: 1,
  100. }
  101. if _, err = sess.Insert(ou); err != nil {
  102. sess.Rollback()
  103. return nil, err
  104. }
  105. tu := &TeamUser{
  106. Uid: owner.Id,
  107. OrgId: org.Id,
  108. TeamId: t.Id,
  109. }
  110. if _, err = sess.Insert(tu); err != nil {
  111. sess.Rollback()
  112. return nil, err
  113. }
  114. return org, sess.Commit()
  115. }
  116. // TODO: need some kind of mechanism to record failure.
  117. // DeleteOrganization completely and permanently deletes everything of organization.
  118. func DeleteOrganization(org *User) (err error) {
  119. if err := DeleteUser(org); err != nil {
  120. return err
  121. }
  122. sess := x.NewSession()
  123. defer sess.Close()
  124. if err = sess.Begin(); err != nil {
  125. return err
  126. }
  127. if _, err = sess.Delete(&Team{OrgId: org.Id}); err != nil {
  128. sess.Rollback()
  129. return err
  130. }
  131. if _, err = sess.Delete(&OrgUser{OrgId: org.Id}); err != nil {
  132. sess.Rollback()
  133. return err
  134. }
  135. if _, err = sess.Delete(&TeamUser{OrgId: org.Id}); err != nil {
  136. sess.Rollback()
  137. return err
  138. }
  139. return sess.Commit()
  140. }
  141. // ___________
  142. // \__ ___/___ _____ _____
  143. // | |_/ __ \\__ \ / \
  144. // | |\ ___/ / __ \| Y Y \
  145. // |____| \___ >____ /__|_| /
  146. // \/ \/ \/
  147. type AuthorizeType int
  148. const (
  149. ORG_READABLE AuthorizeType = iota + 1
  150. ORG_WRITABLE
  151. ORG_ADMIN
  152. )
  153. const OWNER_TEAM = "Owners"
  154. // Team represents a organization team.
  155. type Team struct {
  156. Id int64
  157. OrgId int64 `xorm:"INDEX"`
  158. LowerName string
  159. Name string
  160. Description string
  161. Authorize AuthorizeType
  162. RepoIds string `xorm:"TEXT"`
  163. NumMembers int
  164. NumRepos int
  165. Members []*User `xorm:"-"`
  166. }
  167. // IsTeamMember returns true if given user is a member of team.
  168. func (t *Team) IsMember(uid int64) bool {
  169. return IsTeamMember(t.OrgId, t.Id, uid)
  170. }
  171. // GetMembers returns all members in given team of organization.
  172. func (t *Team) GetMembers() (err error) {
  173. t.Members, err = GetTeamMembers(t.OrgId, t.Id)
  174. return err
  175. }
  176. // NewTeam creates a record of new team.
  177. // It's caller's responsibility to assign organization ID.
  178. func NewTeam(t *Team) error {
  179. has, err := x.Id(t.OrgId).Get(new(User))
  180. if err != nil {
  181. return err
  182. } else if !has {
  183. return ErrOrgNotExist
  184. }
  185. t.LowerName = strings.ToLower(t.Name)
  186. has, err = x.Where("org_id=?", t.OrgId).And("lower_name=?", t.LowerName).Get(new(Team))
  187. if err != nil {
  188. return err
  189. } else if has {
  190. return ErrTeamAlreadyExist
  191. }
  192. sess := x.NewSession()
  193. defer sess.Close()
  194. if err = sess.Begin(); err != nil {
  195. return err
  196. }
  197. if _, err = sess.Insert(t); err != nil {
  198. sess.Rollback()
  199. return err
  200. }
  201. // Update organization number of teams.
  202. rawSql := "UPDATE `user` SET num_teams = num_teams + 1 WHERE id = ?"
  203. if _, err = sess.Exec(rawSql, t.OrgId); err != nil {
  204. sess.Rollback()
  205. return err
  206. }
  207. return sess.Commit()
  208. }
  209. // UpdateTeam updates information of team.
  210. func UpdateTeam(t *Team) error {
  211. if len(t.Description) > 255 {
  212. t.Description = t.Description[:255]
  213. }
  214. t.LowerName = strings.ToLower(t.Name)
  215. _, err := x.Id(t.Id).AllCols().Update(t)
  216. return err
  217. }
  218. // ________ ____ ___
  219. // \_____ \_______ ____ | | \______ ___________
  220. // / | \_ __ \/ ___\| | / ___// __ \_ __ \
  221. // / | \ | \/ /_/ > | /\___ \\ ___/| | \/
  222. // \_______ /__| \___ /|______//____ >\___ >__|
  223. // \/ /_____/ \/ \/
  224. // OrgUser represents an organization-user relation.
  225. type OrgUser struct {
  226. Id int64
  227. Uid int64 `xorm:"INDEX"`
  228. OrgId int64 `xorm:"INDEX"`
  229. IsPublic bool
  230. IsOwner bool
  231. NumTeam int
  232. }
  233. // IsOrganizationOwner returns true if given user is in the owner team.
  234. func IsOrganizationOwner(orgId, uid int64) bool {
  235. has, _ := x.Where("is_owner=?", true).And("uid=?", uid).And("org_id=?", orgId).Get(new(OrgUser))
  236. return has
  237. }
  238. // IsOrganizationMember returns true if given user is member of organization.
  239. func IsOrganizationMember(orgId, uid int64) bool {
  240. has, _ := x.Where("uid=?", uid).And("org_id=?", orgId).Get(new(OrgUser))
  241. return has
  242. }
  243. // GetOrgUsersByUserId returns all organization-user relations by user ID.
  244. func GetOrgUsersByUserId(uid int64) ([]*OrgUser, error) {
  245. ous := make([]*OrgUser, 0, 10)
  246. err := x.Where("uid=?", uid).Find(&ous)
  247. return ous, err
  248. }
  249. // GetOrgUsersByOrgId returns all organization-user relations by organization ID.
  250. func GetOrgUsersByOrgId(orgId int64) ([]*OrgUser, error) {
  251. ous := make([]*OrgUser, 0, 10)
  252. err := x.Where("org_id=?", orgId).Find(&ous)
  253. return ous, err
  254. }
  255. // ___________ ____ ___
  256. // \__ ___/___ _____ _____ | | \______ ___________
  257. // | |_/ __ \\__ \ / \| | / ___// __ \_ __ \
  258. // | |\ ___/ / __ \| Y Y \ | /\___ \\ ___/| | \/
  259. // |____| \___ >____ /__|_| /______//____ >\___ >__|
  260. // \/ \/ \/ \/ \/
  261. // TeamUser represents an team-user relation.
  262. type TeamUser struct {
  263. Id int64
  264. Uid int64
  265. OrgId int64 `xorm:"INDEX"`
  266. TeamId int64
  267. }
  268. // IsTeamMember returns true if given user is a member of team.
  269. func IsTeamMember(orgId, teamId, uid int64) bool {
  270. has, _ := x.Where("uid=?", uid).And("org_id=?", orgId).And("team_id=?", teamId).Get(new(TeamUser))
  271. return has
  272. }
  273. // GetTeamMembers returns all members in given team of organization.
  274. func GetTeamMembers(orgId, teamId int64) ([]*User, error) {
  275. tus := make([]*TeamUser, 0, 10)
  276. err := x.Where("org_id=?", orgId).And("team_id=?", teamId).Find(&tus)
  277. if err != nil {
  278. return nil, err
  279. }
  280. us := make([]*User, len(tus))
  281. for i, tu := range tus {
  282. us[i], err = GetUserById(tu.Uid)
  283. if err != nil {
  284. return nil, err
  285. }
  286. }
  287. return us, nil
  288. }