github.com/hellofresh/janus@v0.0.0-20230925145208-ce8de8183c67/pkg/plugin/basic/handler.go (about)

     1  package basic
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"net/http"
     7  
     8  	"github.com/hellofresh/janus/pkg/errors"
     9  	"github.com/hellofresh/janus/pkg/render"
    10  	"github.com/hellofresh/janus/pkg/router"
    11  	log "github.com/sirupsen/logrus"
    12  	"go.opencensus.io/trace"
    13  )
    14  
    15  // Handler is the api rest handlers
    16  type Handler struct {
    17  	repo Repository
    18  }
    19  
    20  // NewHandler creates a new instance of Handler
    21  func NewHandler(repo Repository) *Handler {
    22  	return &Handler{repo}
    23  }
    24  
    25  // Index is the find all handler
    26  func (c *Handler) Index() http.HandlerFunc {
    27  	return func(w http.ResponseWriter, r *http.Request) {
    28  		_, span := trace.StartSpan(r.Context(), "repo.FindAll")
    29  		data, err := c.repo.FindAll()
    30  		span.End()
    31  
    32  		if err != nil {
    33  			errors.Handler(w, r, err)
    34  			return
    35  		}
    36  
    37  		render.JSON(w, http.StatusOK, data)
    38  	}
    39  }
    40  
    41  // Show is the find by handler
    42  func (c *Handler) Show() http.HandlerFunc {
    43  	return func(w http.ResponseWriter, r *http.Request) {
    44  		username := router.URLParam(r, "username")
    45  		_, span := trace.StartSpan(r.Context(), "repo.Show")
    46  		data, err := c.repo.FindByUsername(username)
    47  		span.End()
    48  
    49  		if err != nil {
    50  			errors.Handler(w, r, err)
    51  			return
    52  		}
    53  
    54  		render.JSON(w, http.StatusOK, data)
    55  	}
    56  }
    57  
    58  // Update is the update handler
    59  func (c *Handler) Update() http.HandlerFunc {
    60  	return func(w http.ResponseWriter, r *http.Request) {
    61  		var err error
    62  
    63  		username := router.URLParam(r, "username")
    64  		_, span := trace.StartSpan(r.Context(), "repo.FindByUsername")
    65  		user, err := c.repo.FindByUsername(username)
    66  		span.End()
    67  
    68  		if user == nil {
    69  			errors.Handler(w, r, ErrUserNotFound)
    70  			return
    71  		}
    72  
    73  		if err != nil {
    74  			errors.Handler(w, r, err)
    75  			return
    76  		}
    77  
    78  		err = json.NewDecoder(r.Body).Decode(user)
    79  		if err != nil {
    80  			errors.Handler(w, r, err)
    81  			return
    82  		}
    83  
    84  		_, span = trace.StartSpan(r.Context(), "repo.Add")
    85  		err = c.repo.Add(user)
    86  		span.End()
    87  
    88  		if err != nil {
    89  			errors.Handler(w, r, errors.New(http.StatusBadRequest, err.Error()))
    90  			return
    91  		}
    92  
    93  		w.WriteHeader(http.StatusOK)
    94  	}
    95  }
    96  
    97  // Create is the create handler
    98  func (c *Handler) Create() http.HandlerFunc {
    99  	return func(w http.ResponseWriter, r *http.Request) {
   100  		user := &User{}
   101  
   102  		err := json.NewDecoder(r.Body).Decode(user)
   103  		if nil != err {
   104  			errors.Handler(w, r, err)
   105  			return
   106  		}
   107  
   108  		_, span := trace.StartSpan(r.Context(), "repo.FindByUsername")
   109  		_, err = c.repo.FindByUsername(user.Username)
   110  		span.End()
   111  
   112  		if err != ErrUserNotFound {
   113  			log.WithError(err).Warn("An error occurred when looking for an user")
   114  			errors.Handler(w, r, ErrUserExists)
   115  			return
   116  		}
   117  
   118  		_, span = trace.StartSpan(r.Context(), "repo.Add")
   119  		err = c.repo.Add(user)
   120  		span.End()
   121  
   122  		if err != nil {
   123  			errors.Handler(w, r, errors.New(http.StatusBadRequest, err.Error()))
   124  			return
   125  		}
   126  
   127  		w.Header().Add("Location", fmt.Sprintf("/credentials/basic_auth/%s", user.Username))
   128  		w.WriteHeader(http.StatusCreated)
   129  	}
   130  }
   131  
   132  // Delete is the delete handler
   133  func (c *Handler) Delete() http.HandlerFunc {
   134  	return func(w http.ResponseWriter, r *http.Request) {
   135  		username := router.URLParam(r, "username")
   136  
   137  		_, span := trace.StartSpan(r.Context(), "repo.Remove")
   138  		err := c.repo.Remove(username)
   139  		span.End()
   140  
   141  		if err != nil {
   142  			errors.Handler(w, r, err)
   143  			return
   144  		}
   145  
   146  		w.WriteHeader(http.StatusNoContent)
   147  	}
   148  }