1package teamserver
2
3import (
4	"net/http"
5
6	"github.com/concourse/concourse/atc/api/accessor"
7)
8
9func (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}
66