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

     1  package api
     2  
     3  import (
     4  	"errors"
     5  	"net/http"
     6  
     7  	"code.cloudfoundry.org/lager"
     8  
     9  	"github.com/pf-qiu/concourse/v6/atc/api/accessor"
    10  	"github.com/pf-qiu/concourse/v6/atc/db"
    11  )
    12  
    13  type TeamScopedHandlerFactory struct {
    14  	logger      lager.Logger
    15  	teamFactory db.TeamFactory
    16  }
    17  
    18  func NewTeamScopedHandlerFactory(
    19  	logger lager.Logger,
    20  	teamFactory db.TeamFactory,
    21  ) *TeamScopedHandlerFactory {
    22  	return &TeamScopedHandlerFactory{
    23  		logger:      logger,
    24  		teamFactory: teamFactory,
    25  	}
    26  }
    27  
    28  func (f *TeamScopedHandlerFactory) HandlerFor(teamScopedHandler func(db.Team) http.Handler) http.HandlerFunc {
    29  	return func(w http.ResponseWriter, r *http.Request) {
    30  		logger := f.logger.Session("team-scoped-handler")
    31  		acc := accessor.GetAccessor(r)
    32  
    33  		teamName := r.FormValue(":team_name")
    34  
    35  		if acc.IsAuthorized(teamName) {
    36  			team, found, err := f.teamFactory.FindTeam(teamName)
    37  			if err != nil {
    38  				logger.Error("failed-to-find-team-in-db", err)
    39  				w.WriteHeader(http.StatusInternalServerError)
    40  				return
    41  			}
    42  
    43  			if !found {
    44  				logger.Error("team-not-found-in-database", errors.New("team-not-found-in-database"), lager.Data{"team-name": teamName})
    45  				w.WriteHeader(http.StatusNotFound)
    46  				return
    47  			}
    48  
    49  			teamScopedHandler(team).ServeHTTP(w, r)
    50  		} else {
    51  			w.WriteHeader(http.StatusForbidden)
    52  		}
    53  	}
    54  }