Fix create team, update team missing units (#5188)
This commit is contained in:
		
							parent
							
								
									d487a76ee2
								
							
						
					
					
						commit
						b3000ae623
					
				
					 7 changed files with 128 additions and 2 deletions
				
			
		
							
								
								
									
										4
									
								
								Gopkg.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										4
									
								
								Gopkg.lock
									
									
									
										generated
									
									
									
								
							|  | @ -11,11 +11,11 @@ | ||||||
| 
 | 
 | ||||||
| [[projects]] | [[projects]] | ||||||
|   branch = "master" |   branch = "master" | ||||||
|   digest = "1:bf4f822f636b99ac7d4f8fa5210a7439bacaf8d1f15d5783956bdd5dd2069bdc" |   digest = "1:b194da40b41ae99546dfeec5a85f1fec2a6c51350d438e511ef90f4293c6dcd7" | ||||||
|   name = "code.gitea.io/sdk" |   name = "code.gitea.io/sdk" | ||||||
|   packages = ["gitea"] |   packages = ["gitea"] | ||||||
|   pruneopts = "NUT" |   pruneopts = "NUT" | ||||||
|   revision = "11c860c8e49a23be26e6d6c6a039a46ad2ae1d27" |   revision = "4f96d9ac89886e78c50de8c835ebe87461578a5e" | ||||||
| 
 | 
 | ||||||
| [[projects]] | [[projects]] | ||||||
|   digest = "1:3fcef06a1a6561955c94af6c7757a6fa37605eb653f0d06ab960e5bb80092195" |   digest = "1:3fcef06a1a6561955c94af6c7757a6fa37605eb653f0d06ab960e5bb80092195" | ||||||
|  |  | ||||||
|  | @ -40,6 +40,14 @@ func (t *Team) getUnits(e Engine) (err error) { | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // GetUnitNames returns the team units names
 | ||||||
|  | func (t *Team) GetUnitNames() (res []string) { | ||||||
|  | 	for _, u := range t.Units { | ||||||
|  | 		res = append(res, Units[u.Type].NameKey) | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // HasWriteAccess returns true if team has at least write level access mode.
 | // HasWriteAccess returns true if team has at least write level access mode.
 | ||||||
| func (t *Team) HasWriteAccess() bool { | func (t *Team) HasWriteAccess() bool { | ||||||
| 	return t.Authorize >= AccessModeWrite | 	return t.Authorize >= AccessModeWrite | ||||||
|  | @ -367,6 +375,24 @@ func UpdateTeam(t *Team, authChanged bool) (err error) { | ||||||
| 		return fmt.Errorf("update: %v", err) | 		return fmt.Errorf("update: %v", err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// update units for team
 | ||||||
|  | 	if len(t.Units) > 0 { | ||||||
|  | 		for _, unit := range t.Units { | ||||||
|  | 			unit.TeamID = t.ID | ||||||
|  | 		} | ||||||
|  | 		// Delete team-unit.
 | ||||||
|  | 		if _, err := sess. | ||||||
|  | 			Where("team_id=?", t.ID). | ||||||
|  | 			Delete(new(TeamUnit)); err != nil { | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if _, err = sess.Insert(&t.Units); err != nil { | ||||||
|  | 			sess.Rollback() | ||||||
|  | 			return err | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	// Update access for team members if needed.
 | 	// Update access for team members if needed.
 | ||||||
| 	if authChanged { | 	if authChanged { | ||||||
| 		if err = t.getRepositories(sess); err != nil { | 		if err = t.getRepositories(sess); err != nil { | ||||||
|  |  | ||||||
|  | @ -4,6 +4,10 @@ | ||||||
| 
 | 
 | ||||||
| package models | package models | ||||||
| 
 | 
 | ||||||
|  | import ( | ||||||
|  | 	"strings" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
| // UnitType is Unit's Type
 | // UnitType is Unit's Type
 | ||||||
| type UnitType int | type UnitType int | ||||||
| 
 | 
 | ||||||
|  | @ -137,3 +141,16 @@ var ( | ||||||
| 		UnitTypeExternalWiki:    UnitExternalWiki, | 		UnitTypeExternalWiki:    UnitExternalWiki, | ||||||
| 	} | 	} | ||||||
| ) | ) | ||||||
|  | 
 | ||||||
|  | // FindUnitTypes give the unit key name and return unit
 | ||||||
|  | func FindUnitTypes(nameKeys ...string) (res []UnitType) { | ||||||
|  | 	for _, key := range nameKeys { | ||||||
|  | 		for t, u := range Units { | ||||||
|  | 			if strings.EqualFold(key, u.NameKey) { | ||||||
|  | 				res = append(res, t) | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -198,5 +198,6 @@ func ToTeam(team *models.Team) *api.Team { | ||||||
| 		Name:        team.Name, | 		Name:        team.Name, | ||||||
| 		Description: team.Description, | 		Description: team.Description, | ||||||
| 		Permission:  team.Authorize.String(), | 		Permission:  team.Authorize.String(), | ||||||
|  | 		Units:       team.GetUnitNames(), | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -90,6 +90,20 @@ func CreateTeam(ctx *context.APIContext, form api.CreateTeamOption) { | ||||||
| 		Description: form.Description, | 		Description: form.Description, | ||||||
| 		Authorize:   models.ParseAccessMode(form.Permission), | 		Authorize:   models.ParseAccessMode(form.Permission), | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	unitTypes := models.FindUnitTypes(form.Units...) | ||||||
|  | 
 | ||||||
|  | 	if team.Authorize < models.AccessModeOwner { | ||||||
|  | 		var units = make([]*models.TeamUnit, 0, len(form.Units)) | ||||||
|  | 		for _, tp := range unitTypes { | ||||||
|  | 			units = append(units, &models.TeamUnit{ | ||||||
|  | 				OrgID: ctx.Org.Organization.ID, | ||||||
|  | 				Type:  tp, | ||||||
|  | 			}) | ||||||
|  | 		} | ||||||
|  | 		team.Units = units | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	if err := models.NewTeam(team); err != nil { | 	if err := models.NewTeam(team); err != nil { | ||||||
| 		if models.IsErrTeamAlreadyExist(err) { | 		if models.IsErrTeamAlreadyExist(err) { | ||||||
| 			ctx.Error(422, "", err) | 			ctx.Error(422, "", err) | ||||||
|  | @ -128,6 +142,19 @@ func EditTeam(ctx *context.APIContext, form api.EditTeamOption) { | ||||||
| 	team.Name = form.Name | 	team.Name = form.Name | ||||||
| 	team.Description = form.Description | 	team.Description = form.Description | ||||||
| 	team.Authorize = models.ParseAccessMode(form.Permission) | 	team.Authorize = models.ParseAccessMode(form.Permission) | ||||||
|  | 	unitTypes := models.FindUnitTypes(form.Units...) | ||||||
|  | 
 | ||||||
|  | 	if team.Authorize < models.AccessModeOwner { | ||||||
|  | 		var units = make([]*models.TeamUnit, 0, len(form.Units)) | ||||||
|  | 		for _, tp := range unitTypes { | ||||||
|  | 			units = append(units, &models.TeamUnit{ | ||||||
|  | 				OrgID: ctx.Org.Organization.ID, | ||||||
|  | 				Type:  tp, | ||||||
|  | 			}) | ||||||
|  | 		} | ||||||
|  | 		team.Units = units | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	if err := models.UpdateTeam(team, true); err != nil { | 	if err := models.UpdateTeam(team, true); err != nil { | ||||||
| 		ctx.Error(500, "EditTeam", err) | 		ctx.Error(500, "EditTeam", err) | ||||||
| 		return | 		return | ||||||
|  |  | ||||||
|  | @ -6322,6 +6322,22 @@ | ||||||
|             "admin" |             "admin" | ||||||
|           ], |           ], | ||||||
|           "x-go-name": "Permission" |           "x-go-name": "Permission" | ||||||
|  |         }, | ||||||
|  |         "units": { | ||||||
|  |           "type": "array", | ||||||
|  |           "enum": [ | ||||||
|  |             "repo.code", | ||||||
|  |             "repo.issues", | ||||||
|  |             "repo.ext_issues", | ||||||
|  |             "repo.wiki", | ||||||
|  |             "repo.pulls", | ||||||
|  |             "repo.releases", | ||||||
|  |             "repo.ext_wiki" | ||||||
|  |           ], | ||||||
|  |           "items": { | ||||||
|  |             "type": "string" | ||||||
|  |           }, | ||||||
|  |           "x-go-name": "Units" | ||||||
|         } |         } | ||||||
|       }, |       }, | ||||||
|       "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" |       "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" | ||||||
|  | @ -6697,6 +6713,22 @@ | ||||||
|             "admin" |             "admin" | ||||||
|           ], |           ], | ||||||
|           "x-go-name": "Permission" |           "x-go-name": "Permission" | ||||||
|  |         }, | ||||||
|  |         "units": { | ||||||
|  |           "type": "array", | ||||||
|  |           "enum": [ | ||||||
|  |             "repo.code", | ||||||
|  |             "repo.issues", | ||||||
|  |             "repo.ext_issues", | ||||||
|  |             "repo.wiki", | ||||||
|  |             "repo.pulls", | ||||||
|  |             "repo.releases", | ||||||
|  |             "repo.ext_wiki" | ||||||
|  |           ], | ||||||
|  |           "items": { | ||||||
|  |             "type": "string" | ||||||
|  |           }, | ||||||
|  |           "x-go-name": "Units" | ||||||
|         } |         } | ||||||
|       }, |       }, | ||||||
|       "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" |       "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" | ||||||
|  | @ -7744,6 +7776,22 @@ | ||||||
|             "owner" |             "owner" | ||||||
|           ], |           ], | ||||||
|           "x-go-name": "Permission" |           "x-go-name": "Permission" | ||||||
|  |         }, | ||||||
|  |         "units": { | ||||||
|  |           "type": "array", | ||||||
|  |           "enum": [ | ||||||
|  |             "repo.code", | ||||||
|  |             "repo.issues", | ||||||
|  |             "repo.ext_issues", | ||||||
|  |             "repo.wiki", | ||||||
|  |             "repo.pulls", | ||||||
|  |             "repo.releases", | ||||||
|  |             "repo.ext_wiki" | ||||||
|  |           ], | ||||||
|  |           "items": { | ||||||
|  |             "type": "string" | ||||||
|  |           }, | ||||||
|  |           "x-go-name": "Units" | ||||||
|         } |         } | ||||||
|       }, |       }, | ||||||
|       "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" |       "x-go-package": "code.gitea.io/gitea/vendor/code.gitea.io/sdk/gitea" | ||||||
|  |  | ||||||
							
								
								
									
										7
									
								
								vendor/code.gitea.io/sdk/gitea/org_team.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										7
									
								
								vendor/code.gitea.io/sdk/gitea/org_team.go
									
									
									
										generated
									
									
										vendored
									
									
								
							|  | @ -1,4 +1,5 @@ | ||||||
| // Copyright 2016 The Gogs Authors. All rights reserved.
 | // Copyright 2016 The Gogs Authors. All rights reserved.
 | ||||||
|  | // Copyright 2018 The Gitea Authors. All rights reserved.
 | ||||||
| // Use of this source code is governed by a MIT-style
 | // Use of this source code is governed by a MIT-style
 | ||||||
| // license that can be found in the LICENSE file.
 | // license that can be found in the LICENSE file.
 | ||||||
| 
 | 
 | ||||||
|  | @ -11,6 +12,8 @@ type Team struct { | ||||||
| 	Description string `json:"description"` | 	Description string `json:"description"` | ||||||
| 	// enum: none,read,write,admin,owner
 | 	// enum: none,read,write,admin,owner
 | ||||||
| 	Permission string `json:"permission"` | 	Permission string `json:"permission"` | ||||||
|  | 	// enum: repo.code,repo.issues,repo.ext_issues,repo.wiki,repo.pulls,repo.releases,repo.ext_wiki
 | ||||||
|  | 	Units []string `json:"units"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // CreateTeamOption options for creating a team
 | // CreateTeamOption options for creating a team
 | ||||||
|  | @ -20,6 +23,8 @@ type CreateTeamOption struct { | ||||||
| 	Description string `json:"description" binding:"MaxSize(255)"` | 	Description string `json:"description" binding:"MaxSize(255)"` | ||||||
| 	// enum: read,write,admin
 | 	// enum: read,write,admin
 | ||||||
| 	Permission string `json:"permission"` | 	Permission string `json:"permission"` | ||||||
|  | 	// enum: repo.code,repo.issues,repo.ext_issues,repo.wiki,repo.pulls,repo.releases,repo.ext_wiki
 | ||||||
|  | 	Units []string `json:"units"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // EditTeamOption options for editing a team
 | // EditTeamOption options for editing a team
 | ||||||
|  | @ -29,4 +34,6 @@ type EditTeamOption struct { | ||||||
| 	Description string `json:"description" binding:"MaxSize(255)"` | 	Description string `json:"description" binding:"MaxSize(255)"` | ||||||
| 	// enum: read,write,admin
 | 	// enum: read,write,admin
 | ||||||
| 	Permission string `json:"permission"` | 	Permission string `json:"permission"` | ||||||
|  | 	// enum: repo.code,repo.issues,repo.ext_issues,repo.wiki,repo.pulls,repo.releases,repo.ext_wiki
 | ||||||
|  | 	Units []string `json:"units"` | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue