Skip to content

Commit cebdb8e

Browse files
committed
Add removing service
1 parent 02c1554 commit cebdb8e

File tree

4 files changed

+90
-4
lines changed

4 files changed

+90
-4
lines changed

cmd/gopherapi/main.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"log"
77
"net/http"
88

9+
"github.com/friendsofgo/gopherapi/pkg/removing"
10+
911
"github.com/friendsofgo/gopherapi/pkg/modifying"
1012

1113
"github.com/friendsofgo/gopherapi/pkg/adding"
@@ -32,8 +34,9 @@ func main() {
3234
fS := fetching.NewService(repo)
3335
aS := adding.NewService(repo)
3436
mS := modifying.NewService(repo)
37+
rS := removing.NewService(repo)
3538

36-
s := server.New(fS, aS, mS)
39+
s := server.New(fS, aS, mS, rS)
3740

3841
fmt.Println("The gopher server is on tap now: http://localhost:8080")
3942
log.Fatal(http.ListenAndServe(":8080", s.Router()))

pkg/removing/service.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package removing
2+
3+
import (
4+
gopher "github.com/friendsofgo/gopherapi/pkg"
5+
)
6+
7+
// Service provides removing operations.
8+
type Service interface {
9+
RemoveGopher(ID string) error
10+
}
11+
12+
type service struct {
13+
repository gopher.Repository
14+
}
15+
16+
// NewService creates a removing service with the necessary dependencies
17+
func NewService(repository gopher.Repository) Service {
18+
return &service{repository}
19+
}
20+
21+
// RemoveGopher remove gopher from the storage
22+
func (s *service) RemoveGopher(ID string) error {
23+
return s.repository.DeleteGopher(ID)
24+
}

pkg/server/api.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/friendsofgo/gopherapi/pkg/adding"
88
"github.com/friendsofgo/gopherapi/pkg/fetching"
99
"github.com/friendsofgo/gopherapi/pkg/modifying"
10+
"github.com/friendsofgo/gopherapi/pkg/removing"
1011

1112
"github.com/gorilla/mux"
1213
)
@@ -16,6 +17,7 @@ type api struct {
1617
fetching fetching.Service
1718
adding adding.Service
1819
modifying modifying.Service
20+
removing removing.Service
1921
}
2022

2123
// Server representation of gopher server
@@ -25,17 +27,19 @@ type Server interface {
2527
FetchGopher(w http.ResponseWriter, r *http.Request)
2628
AddGopher(w http.ResponseWriter, r *http.Request)
2729
ModifyGopher(w http.ResponseWriter, r *http.Request)
30+
RemoveGopher(w http.ResponseWriter, r *http.Request)
2831
}
2932

3033
// New initialize the server
31-
func New(fS fetching.Service, aS adding.Service, mS modifying.Service) Server {
32-
a := &api{fetching: fS, adding: aS, modifying: mS}
34+
func New(fS fetching.Service, aS adding.Service, mS modifying.Service, rS removing.Service) Server {
35+
a := &api{fetching: fS, adding: aS, modifying: mS, removing: rS}
3336

3437
r := mux.NewRouter()
3538
r.HandleFunc("/gophers", a.FetchGophers).Methods(http.MethodGet)
3639
r.HandleFunc("/gophers/{ID:[a-zA-Z0-9_]+}", a.FetchGopher).Methods(http.MethodGet)
3740
r.HandleFunc("/gophers", a.AddGopher).Methods(http.MethodPost)
3841
r.HandleFunc("/gophers/{ID:[a-zA-Z0-9_]+}", a.ModifyGopher).Methods(http.MethodPut)
42+
r.HandleFunc("/gophers/{ID:[a-zA-Z0-9_]+}", a.RemoveGopher).Methods(http.MethodDelete)
3943

4044
a.router = r
4145
return a
@@ -125,3 +129,11 @@ func (a *api) ModifyGopher(w http.ResponseWriter, r *http.Request) {
125129

126130
w.WriteHeader(http.StatusNoContent)
127131
}
132+
133+
// RemoveGopher remove a gopher
134+
func (a *api) RemoveGopher(w http.ResponseWriter, r *http.Request) {
135+
vars := mux.Vars(r)
136+
a.removing.RemoveGopher(vars["ID"])
137+
w.Header().Set("Content-Type", "application/json")
138+
w.WriteHeader(http.StatusNoContent)
139+
}

pkg/server/api_test.go

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99
"net/http/httptest"
1010
"testing"
1111

12+
"github.com/friendsofgo/gopherapi/pkg/removing"
13+
1214
"github.com/friendsofgo/gopherapi/pkg/adding"
1315
"github.com/friendsofgo/gopherapi/pkg/fetching"
1416
"github.com/friendsofgo/gopherapi/pkg/modifying"
@@ -128,6 +130,50 @@ func TestAddGopher(t *testing.T) {
128130
}
129131
}
130132

133+
func TestModifyGopher(t *testing.T) {
134+
bodyJSON := []byte(`{
135+
"name": "Eustaqio",
136+
"image": "https://storage.googleapis.com/gopherizeme.appspot.com/gophers/f73f25d73c06cc81c482821391a85c4b7dd34ba5.png",
137+
"age": 99
138+
}`)
139+
req, err := http.NewRequest("PUT", "/gophers/01D3XZ89NFJZ9QT2DHVD462AC2", bytes.NewBuffer(bodyJSON))
140+
if err != nil {
141+
t.Fatalf("could not created request: %v", err)
142+
}
143+
s := buildServer()
144+
rec := httptest.NewRecorder()
145+
146+
s.ModifyGopher(rec, req)
147+
res := rec.Result()
148+
defer res.Body.Close()
149+
150+
if res.StatusCode != http.StatusNoContent {
151+
t.Errorf("expected %d, got: %d", http.StatusNoContent, res.StatusCode)
152+
}
153+
}
154+
155+
func TestRemoveGopher(t *testing.T) {
156+
157+
uri := fmt.Sprintf("/gophers/%s", "01D3XZ89NFJZ9QT2DHVD462AC2")
158+
req, err := http.NewRequest("DELETE", uri, nil)
159+
if err != nil {
160+
t.Fatalf("could not created request: %v", err)
161+
}
162+
163+
s := buildServer()
164+
165+
rec := httptest.NewRecorder()
166+
s.Router().ServeHTTP(rec, req)
167+
168+
res := rec.Result()
169+
170+
defer res.Body.Close()
171+
if http.StatusNoContent != res.StatusCode {
172+
t.Errorf("expected %d, got: %d", http.StatusNoContent, res.StatusCode)
173+
}
174+
175+
}
176+
131177
func gopherSample() *gopher.Gopher {
132178
return &gopher.Gopher{
133179
ID: "01D3XZ3ZHCP3KG9VT4FGAD8KDR",
@@ -142,6 +188,7 @@ func buildServer() Server {
142188
fetching := fetching.NewService(repo)
143189
adding := adding.NewService(repo)
144190
modifying := modifying.NewService(repo)
191+
removing := removing.NewService(repo)
145192

146-
return New(fetching, adding, modifying)
193+
return New(fetching, adding, modifying, removing)
147194
}

0 commit comments

Comments
 (0)