@@ -6,14 +6,16 @@ import (
66
77 "github.com/friendsofgo/gopherapi/pkg/adding"
88 "github.com/friendsofgo/gopherapi/pkg/fetching"
9+ "github.com/friendsofgo/gopherapi/pkg/modifying"
910
1011 "github.com/gorilla/mux"
1112)
1213
1314type api struct {
14- router http.Handler
15- fetching fetching.Service
16- adding adding.Service
15+ router http.Handler
16+ fetching fetching.Service
17+ adding adding.Service
18+ modifying modifying.Service
1719}
1820
1921// Server representation of gopher server
@@ -22,16 +24,18 @@ type Server interface {
2224 FetchGophers (w http.ResponseWriter , r * http.Request )
2325 FetchGopher (w http.ResponseWriter , r * http.Request )
2426 AddGopher (w http.ResponseWriter , r * http.Request )
27+ ModifyGopher (w http.ResponseWriter , r * http.Request )
2528}
2629
2730// New initialize the server
28- func New (fS fetching.Service , aS adding.Service ) Server {
29- a := & api {fetching : fS , adding : aS }
31+ func New (fS fetching.Service , aS adding.Service , mS modifying. Service ) Server {
32+ a := & api {fetching : fS , adding : aS , modifying : mS }
3033
3134 r := mux .NewRouter ()
3235 r .HandleFunc ("/gophers" , a .FetchGophers ).Methods (http .MethodGet )
3336 r .HandleFunc ("/gophers/{ID:[a-zA-Z0-9_]+}" , a .FetchGopher ).Methods (http .MethodGet )
3437 r .HandleFunc ("/gophers" , a .AddGopher ).Methods (http .MethodPost )
38+ r .HandleFunc ("/gophers/{ID:[a-zA-Z0-9_]+}" , a .ModifyGopher ).Methods (http .MethodPut )
3539
3640 a .router = r
3741 return a
@@ -77,6 +81,7 @@ func (a *api) AddGopher(w http.ResponseWriter, r *http.Request) {
7781 var g addGopherRequest
7882 err := decoder .Decode (& g )
7983
84+ w .Header ().Set ("Content-Type" , "application/json" )
8085 if err != nil {
8186 w .WriteHeader (http .StatusInternalServerError )
8287 json .NewEncoder (w ).Encode ("Error unmarshalling request body" )
@@ -91,3 +96,32 @@ func (a *api) AddGopher(w http.ResponseWriter, r *http.Request) {
9196
9297 w .WriteHeader (http .StatusCreated )
9398}
99+
100+ type modifyGopherRequest struct {
101+ Name string `json:"name"`
102+ Image string `json:"image"`
103+ Age int `json:"age"`
104+ }
105+
106+ // ModifyGopher modify gopher data
107+ func (a * api ) ModifyGopher (w http.ResponseWriter , r * http.Request ) {
108+ decoder := json .NewDecoder (r .Body )
109+
110+ var g addGopherRequest
111+ err := decoder .Decode (& g )
112+
113+ w .Header ().Set ("Content-Type" , "application/json" )
114+ if err != nil {
115+ w .WriteHeader (http .StatusInternalServerError )
116+ json .NewEncoder (w ).Encode ("Error unmarshalling request body" )
117+ return
118+ }
119+ vars := mux .Vars (r )
120+ if err := a .modifying .ModifyGopher (vars ["ID" ], g .Name , g .Image , g .Age ); err != nil {
121+ w .WriteHeader (http .StatusInternalServerError )
122+ json .NewEncoder (w ).Encode ("Can't modify a gopher" )
123+ return
124+ }
125+
126+ w .WriteHeader (http .StatusNoContent )
127+ }
0 commit comments