cloudfoundry/cf-k8s-controllers

View on GitHub
api/handlers/whoami.go

Summary

Maintainability
A
0 mins
Test Coverage
package handlers

import (
    "context"
    "net/http"
    "net/url"

    "code.cloudfoundry.org/korifi/api/authorization"
    apierrors "code.cloudfoundry.org/korifi/api/errors"
    "code.cloudfoundry.org/korifi/api/presenter"
    "code.cloudfoundry.org/korifi/api/routing"
    "github.com/go-logr/logr"
)

const (
    WhoAmIPath = "/whoami"
)

//counterfeiter:generate -o fake -fake-name IdentityProvider . IdentityProvider

type IdentityProvider interface {
    GetIdentity(context.Context, authorization.Info) (authorization.Identity, error)
}

type WhoAmI struct {
    identityProvider IdentityProvider
    apiBaseURL       url.URL
}

func NewWhoAmI(identityProvider IdentityProvider, apiBaseURL url.URL) *WhoAmI {
    return &WhoAmI{
        identityProvider: identityProvider,
        apiBaseURL:       apiBaseURL,
    }
}

func (h *WhoAmI) whoAmI(r *http.Request) (*routing.Response, error) {
    authInfo, _ := authorization.InfoFromContext(r.Context())
    logger := logr.FromContextOrDiscard(r.Context()).WithName("handlers.whoami")

    identity, err := h.identityProvider.GetIdentity(r.Context(), authInfo)
    if err != nil {
        return nil, apierrors.LogAndReturn(logger, err, "failed to get identity")
    }

    return routing.NewResponse(http.StatusOK).WithBody(presenter.ForWhoAmI(identity)), nil
}

func (h *WhoAmI) UnauthenticatedRoutes() []routing.Route {
    return nil
}

func (h *WhoAmI) AuthenticatedRoutes() []routing.Route {
    return []routing.Route{
        {Method: "GET", Pattern: WhoAmIPath, Handler: h.whoAmI},
    }
}