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 }