You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

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