* API: orgEditTeam make Fields optional * add TestCase * Update integrations/api_team_test.go * suggestions from lafriks use len() to check if string is empty Co-Authored-By: Lauris BH <lauris@nix.lv> * change ... * use Where not ID to get mssql * add return and code format * fix test * fix test ... null pointer exept * update specific colums * only specific colums too Co-authored-by: Lauris BH <lauris@nix.lv> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>tags/v1.21.12.1
| @@ -71,19 +71,33 @@ func TestAPITeam(t *testing.T) { | |||||
| teamID := apiTeam.ID | teamID := apiTeam.ID | ||||
| // Edit team. | // Edit team. | ||||
| editDescription := "team 1" | |||||
| editFalse := false | |||||
| teamToEdit := &api.EditTeamOption{ | teamToEdit := &api.EditTeamOption{ | ||||
| Name: "teamone", | Name: "teamone", | ||||
| Description: "team 1", | |||||
| IncludesAllRepositories: false, | |||||
| Description: &editDescription, | |||||
| Permission: "admin", | Permission: "admin", | ||||
| IncludesAllRepositories: &editFalse, | |||||
| Units: []string{"repo.code", "repo.pulls", "repo.releases"}, | Units: []string{"repo.code", "repo.pulls", "repo.releases"}, | ||||
| } | } | ||||
| req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/teams/%d?token=%s", teamID, token), teamToEdit) | req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/teams/%d?token=%s", teamID, token), teamToEdit) | ||||
| resp = session.MakeRequest(t, req, http.StatusOK) | resp = session.MakeRequest(t, req, http.StatusOK) | ||||
| DecodeJSON(t, resp, &apiTeam) | DecodeJSON(t, resp, &apiTeam) | ||||
| checkTeamResponse(t, &apiTeam, teamToEdit.Name, teamToEdit.Description, teamToEdit.IncludesAllRepositories, | |||||
| checkTeamResponse(t, &apiTeam, teamToEdit.Name, *teamToEdit.Description, *teamToEdit.IncludesAllRepositories, | |||||
| teamToEdit.Permission, teamToEdit.Units) | |||||
| checkTeamBean(t, apiTeam.ID, teamToEdit.Name, *teamToEdit.Description, *teamToEdit.IncludesAllRepositories, | |||||
| teamToEdit.Permission, teamToEdit.Units) | |||||
| // Edit team Description only | |||||
| editDescription = "first team" | |||||
| teamToEditDesc := api.EditTeamOption{Description: &editDescription} | |||||
| req = NewRequestWithJSON(t, "PATCH", fmt.Sprintf("/api/v1/teams/%d?token=%s", teamID, token), teamToEditDesc) | |||||
| resp = session.MakeRequest(t, req, http.StatusOK) | |||||
| DecodeJSON(t, resp, &apiTeam) | |||||
| checkTeamResponse(t, &apiTeam, teamToEdit.Name, *teamToEditDesc.Description, *teamToEdit.IncludesAllRepositories, | |||||
| teamToEdit.Permission, teamToEdit.Units) | teamToEdit.Permission, teamToEdit.Units) | ||||
| checkTeamBean(t, apiTeam.ID, teamToEdit.Name, teamToEdit.Description, teamToEdit.IncludesAllRepositories, | |||||
| checkTeamBean(t, apiTeam.ID, teamToEdit.Name, *teamToEditDesc.Description, *teamToEdit.IncludesAllRepositories, | |||||
| teamToEdit.Permission, teamToEdit.Units) | teamToEdit.Permission, teamToEdit.Units) | ||||
| // Read team. | // Read team. | ||||
| @@ -91,7 +105,7 @@ func TestAPITeam(t *testing.T) { | |||||
| req = NewRequestf(t, "GET", "/api/v1/teams/%d?token="+token, teamID) | req = NewRequestf(t, "GET", "/api/v1/teams/%d?token="+token, teamID) | ||||
| resp = session.MakeRequest(t, req, http.StatusOK) | resp = session.MakeRequest(t, req, http.StatusOK) | ||||
| DecodeJSON(t, resp, &apiTeam) | DecodeJSON(t, resp, &apiTeam) | ||||
| checkTeamResponse(t, &apiTeam, teamRead.Name, teamRead.Description, teamRead.IncludesAllRepositories, | |||||
| checkTeamResponse(t, &apiTeam, teamRead.Name, *teamToEditDesc.Description, teamRead.IncludesAllRepositories, | |||||
| teamRead.Authorize.String(), teamRead.GetUnitNames()) | teamRead.Authorize.String(), teamRead.GetUnitNames()) | ||||
| // Delete team. | // Delete team. | ||||
| @@ -590,7 +590,8 @@ func UpdateTeam(t *Team, authChanged bool, includeAllChanged bool) (err error) { | |||||
| return ErrTeamAlreadyExist{t.OrgID, t.LowerName} | return ErrTeamAlreadyExist{t.OrgID, t.LowerName} | ||||
| } | } | ||||
| if _, err = sess.ID(t.ID).AllCols().Update(t); err != nil { | |||||
| if _, err = sess.ID(t.ID).Cols("name", "lower_name", "description", | |||||
| "can_create_org_repo", "authorize", "includes_all_repositories").Update(t); err != nil { | |||||
| return fmt.Errorf("update: %v", err) | return fmt.Errorf("update: %v", err) | ||||
| } | } | ||||
| @@ -605,8 +606,7 @@ func UpdateTeam(t *Team, authChanged bool, includeAllChanged bool) (err error) { | |||||
| Delete(new(TeamUnit)); err != nil { | Delete(new(TeamUnit)); err != nil { | ||||
| return err | return err | ||||
| } | } | ||||
| if _, err = sess.Insert(&t.Units); err != nil { | |||||
| if _, err = sess.Cols("org_id", "team_id", "type").Insert(&t.Units); err != nil { | |||||
| errRollback := sess.Rollback() | errRollback := sess.Rollback() | ||||
| if errRollback != nil { | if errRollback != nil { | ||||
| log.Error("UpdateTeam sess.Rollback: %v", errRollback) | log.Error("UpdateTeam sess.Rollback: %v", errRollback) | ||||
| @@ -35,12 +35,12 @@ type CreateTeamOption struct { | |||||
| // EditTeamOption options for editing a team | // EditTeamOption options for editing a team | ||||
| type EditTeamOption struct { | type EditTeamOption struct { | ||||
| // required: true | // required: true | ||||
| Name string `json:"name" binding:"Required;AlphaDashDot;MaxSize(30)"` | |||||
| Description string `json:"description" binding:"MaxSize(255)"` | |||||
| IncludesAllRepositories bool `json:"includes_all_repositories"` | |||||
| Name string `json:"name" binding:"AlphaDashDot;MaxSize(30)"` | |||||
| Description *string `json:"description" binding:"MaxSize(255)"` | |||||
| IncludesAllRepositories *bool `json:"includes_all_repositories"` | |||||
| // enum: read,write,admin | // enum: read,write,admin | ||||
| Permission string `json:"permission"` | Permission string `json:"permission"` | ||||
| // example: ["repo.code","repo.issues","repo.ext_issues","repo.wiki","repo.pulls","repo.releases","repo.ext_wiki"] | // example: ["repo.code","repo.issues","repo.ext_issues","repo.wiki","repo.pulls","repo.releases","repo.ext_wiki"] | ||||
| Units []string `json:"units"` | Units []string `json:"units"` | ||||
| CanCreateOrgRepo bool `json:"can_create_org_repo"` | |||||
| CanCreateOrgRepo *bool `json:"can_create_org_repo"` | |||||
| } | } | ||||
| @@ -192,37 +192,52 @@ func EditTeam(ctx *context.APIContext, form api.EditTeamOption) { | |||||
| // "$ref": "#/responses/Team" | // "$ref": "#/responses/Team" | ||||
| team := ctx.Org.Team | team := ctx.Org.Team | ||||
| team.Description = form.Description | |||||
| unitTypes := models.FindUnitTypes(form.Units...) | |||||
| team.CanCreateOrgRepo = form.CanCreateOrgRepo | |||||
| if err := team.GetUnits(); err != nil { | |||||
| ctx.InternalServerError(err) | |||||
| return | |||||
| } | |||||
| if form.CanCreateOrgRepo != nil { | |||||
| team.CanCreateOrgRepo = *form.CanCreateOrgRepo | |||||
| } | |||||
| if len(form.Name) > 0 { | |||||
| team.Name = form.Name | |||||
| } | |||||
| if form.Description != nil { | |||||
| team.Description = *form.Description | |||||
| } | |||||
| isAuthChanged := false | isAuthChanged := false | ||||
| isIncludeAllChanged := false | isIncludeAllChanged := false | ||||
| if !team.IsOwnerTeam() { | |||||
| if !team.IsOwnerTeam() && len(form.Permission) != 0 { | |||||
| // Validate permission level. | // Validate permission level. | ||||
| auth := models.ParseAccessMode(form.Permission) | auth := models.ParseAccessMode(form.Permission) | ||||
| team.Name = form.Name | |||||
| if team.Authorize != auth { | if team.Authorize != auth { | ||||
| isAuthChanged = true | isAuthChanged = true | ||||
| team.Authorize = auth | team.Authorize = auth | ||||
| } | } | ||||
| if team.IncludesAllRepositories != form.IncludesAllRepositories { | |||||
| if form.IncludesAllRepositories != nil { | |||||
| isIncludeAllChanged = true | isIncludeAllChanged = true | ||||
| team.IncludesAllRepositories = form.IncludesAllRepositories | |||||
| team.IncludesAllRepositories = *form.IncludesAllRepositories | |||||
| } | } | ||||
| } | } | ||||
| if team.Authorize < models.AccessModeOwner { | 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.Team.OrgID, | |||||
| Type: tp, | |||||
| }) | |||||
| if len(form.Units) > 0 { | |||||
| var units = make([]*models.TeamUnit, 0, len(form.Units)) | |||||
| unitTypes := models.FindUnitTypes(form.Units...) | |||||
| for _, tp := range unitTypes { | |||||
| units = append(units, &models.TeamUnit{ | |||||
| OrgID: ctx.Org.Team.OrgID, | |||||
| Type: tp, | |||||
| }) | |||||
| } | |||||
| team.Units = units | |||||
| } | } | ||||
| team.Units = units | |||||
| } | } | ||||
| if err := models.UpdateTeam(team, isAuthChanged, isIncludeAllChanged); err != nil { | if err := models.UpdateTeam(team, isAuthChanged, isIncludeAllChanged); err != nil { | ||||