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

     1  package teamserver
     2  
     3  import (
     4  	"net/http"
     5  
     6  	"github.com/pf-qiu/concourse/v6/atc/api/accessor"
     7  )
     8  
     9  func (s *Server) DestroyTeam(w http.ResponseWriter, r *http.Request) {
    10  	hLog := s.logger.Session("destroy-team")
    11  	hLog.Debug("destroying-team")
    12  
    13  	teamName := r.FormValue(":team_name")
    14  
    15  	acc := accessor.GetAccessor(r)
    16  	if !acc.IsAdmin() {
    17  		hLog.Info("requesting-team-is-not-admin")
    18  		w.WriteHeader(http.StatusForbidden)
    19  		return
    20  	}
    21  
    22  	team, found, err := s.teamFactory.FindTeam(teamName)
    23  	if err != nil {
    24  		hLog.Error("failed-to-get-team", err)
    25  		w.WriteHeader(http.StatusInternalServerError)
    26  		return
    27  	}
    28  
    29  	if !found {
    30  		hLog.Info("team-not-found")
    31  		w.WriteHeader(http.StatusNotFound)
    32  		return
    33  	}
    34  
    35  	if team.Admin() {
    36  		allTeams, err := s.teamFactory.GetTeams()
    37  		if err != nil {
    38  			hLog.Error("failed-to-get-teams", err)
    39  			w.WriteHeader(http.StatusInternalServerError)
    40  			return
    41  		}
    42  
    43  		adminTeams := 0
    44  		for _, candidate := range allTeams {
    45  			if candidate.Admin() {
    46  				adminTeams = adminTeams + 1
    47  			}
    48  		}
    49  
    50  		if adminTeams == 1 {
    51  			hLog.Info("team-is-last-admin-team")
    52  			w.WriteHeader(http.StatusForbidden)
    53  			return
    54  		}
    55  	}
    56  
    57  	err = team.Delete()
    58  	if err != nil {
    59  		hLog.Error("failed-to-delete-team", err)
    60  		w.WriteHeader(http.StatusInternalServerError)
    61  		return
    62  	}
    63  
    64  	w.WriteHeader(http.StatusNoContent)
    65  }