github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/api/teamserver/set.go (about)

     1  package teamserver
     2  
     3  import (
     4  	"encoding/json"
     5  	"net/http"
     6  
     7  	"code.cloudfoundry.org/lager"
     8  
     9  	"github.com/pf-qiu/concourse/v6/atc"
    10  	"github.com/pf-qiu/concourse/v6/atc/api/accessor"
    11  	"github.com/pf-qiu/concourse/v6/atc/api/present"
    12  )
    13  
    14  type SetTeamResponse struct {
    15  	Errors   []string            `json:"errors,omitempty"`
    16  	Warnings []atc.ConfigWarning `json:"warnings,omitempty"`
    17  	Team     atc.Team            `json:"team"`
    18  }
    19  
    20  func (s *Server) SetTeam(w http.ResponseWriter, r *http.Request) {
    21  	hLog := s.logger.Session("set-team")
    22  
    23  	hLog.Debug("setting-team")
    24  
    25  	acc := accessor.GetAccessor(r)
    26  
    27  	teamName := r.FormValue(":team_name")
    28  
    29  	var atcTeam atc.Team
    30  	err := json.NewDecoder(r.Body).Decode(&atcTeam)
    31  	if err != nil {
    32  		hLog.Error("malformed-request", err)
    33  		w.WriteHeader(http.StatusBadRequest)
    34  		return
    35  	}
    36  
    37  	if err := atcTeam.Validate(); err != nil {
    38  		hLog.Error("malformed-auth-config", err)
    39  		w.WriteHeader(http.StatusBadRequest)
    40  		return
    41  	}
    42  
    43  	atcTeam.Name = teamName
    44  	if !acc.IsAdmin() && !acc.IsAuthorized(teamName) {
    45  		hLog.Debug("not-allowed")
    46  		w.WriteHeader(http.StatusForbidden)
    47  		return
    48  	}
    49  
    50  	team, found, err := s.teamFactory.FindTeam(teamName)
    51  	if err != nil {
    52  		hLog.Error("failed-to-lookup-team", err, lager.Data{"teamName": teamName})
    53  		w.WriteHeader(http.StatusInternalServerError)
    54  		return
    55  	}
    56  
    57  	response := SetTeamResponse{}
    58  	if found {
    59  		hLog.Debug("updating-credentials")
    60  		err = team.UpdateProviderAuth(atcTeam.Auth)
    61  		if err != nil {
    62  			hLog.Error("failed-to-update-team", err, lager.Data{"teamName": teamName})
    63  			w.WriteHeader(http.StatusInternalServerError)
    64  			return
    65  		}
    66  
    67  		w.Header().Set("Content-Type", "application/json")
    68  		w.WriteHeader(http.StatusOK)
    69  	} else if acc.IsAdmin() {
    70  		hLog.Debug("creating team")
    71  
    72  		warning := atc.ValidateIdentifier(atcTeam.Name, "team")
    73  		if warning != nil {
    74  			response.Warnings = append(response.Warnings, *warning)
    75  		}
    76  
    77  		team, err = s.teamFactory.CreateTeam(atcTeam)
    78  		if err != nil {
    79  			hLog.Error("failed-to-save-team", err, lager.Data{"teamName": teamName})
    80  			w.WriteHeader(http.StatusInternalServerError)
    81  			return
    82  		}
    83  		w.Header().Set("Content-Type", "application/json")
    84  		w.WriteHeader(http.StatusCreated)
    85  	} else {
    86  		w.WriteHeader(http.StatusForbidden)
    87  		return
    88  	}
    89  
    90  	err = s.teamFactory.NotifyCacher()
    91  	if err != nil {
    92  		hLog.Error("failed-to-notify-cacher", err, lager.Data{"teamName": teamName})
    93  		w.WriteHeader(http.StatusInternalServerError)
    94  		return
    95  	}
    96  
    97  	response.Team = present.Team(team)
    98  
    99  	err = json.NewEncoder(w).Encode(response)
   100  	if err != nil {
   101  		hLog.Error("failed-to-encode-team", err)
   102  		w.WriteHeader(http.StatusInternalServerError)
   103  	}
   104  
   105  }