feat: improvements in structures
This commit is contained in:
+19
-19
@@ -6,28 +6,28 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/book"
|
||||
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain"
|
||||
|
||||
"github.com/eminetto/clean-architecture-go-v2/api/presenter"
|
||||
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity"
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity/book"
|
||||
|
||||
"github.com/codegangsta/negroni"
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity"
|
||||
"github.com/gorilla/mux"
|
||||
)
|
||||
|
||||
func listBooks(manager book.Manager) http.Handler {
|
||||
func listBooks(service book.UseCase) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
errorMessage := "Error reading books"
|
||||
var data []*book.Book
|
||||
var data []*entity.Book
|
||||
var err error
|
||||
title := r.URL.Query().Get("title")
|
||||
switch {
|
||||
case title == "":
|
||||
data, err = manager.List()
|
||||
data, err = service.ListBooks()
|
||||
default:
|
||||
data, err = manager.Search(title)
|
||||
data, err = service.SearchBooks(title)
|
||||
}
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
if err != nil && err != domain.ErrNotFound {
|
||||
@@ -58,7 +58,7 @@ func listBooks(manager book.Manager) http.Handler {
|
||||
})
|
||||
}
|
||||
|
||||
func createBook(manager book.Manager) http.Handler {
|
||||
func createBook(service book.UseCase) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
errorMessage := "Error adding book"
|
||||
var input struct {
|
||||
@@ -74,7 +74,7 @@ func createBook(manager book.Manager) http.Handler {
|
||||
w.Write([]byte(errorMessage))
|
||||
return
|
||||
}
|
||||
b := &book.Book{
|
||||
b := &entity.Book{
|
||||
ID: entity.NewID(),
|
||||
Title: input.Title,
|
||||
Author: input.Author,
|
||||
@@ -82,7 +82,7 @@ func createBook(manager book.Manager) http.Handler {
|
||||
Quantity: input.Quantity,
|
||||
CreatedAt: time.Now(),
|
||||
}
|
||||
b.ID, err = manager.Create(b)
|
||||
b.ID, err = service.CreateBook(b)
|
||||
if err != nil {
|
||||
log.Println(err.Error())
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
@@ -107,7 +107,7 @@ func createBook(manager book.Manager) http.Handler {
|
||||
})
|
||||
}
|
||||
|
||||
func getBook(manager book.Manager) http.Handler {
|
||||
func getBook(service book.UseCase) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
errorMessage := "Error reading book"
|
||||
vars := mux.Vars(r)
|
||||
@@ -117,7 +117,7 @@ func getBook(manager book.Manager) http.Handler {
|
||||
w.Write([]byte(errorMessage))
|
||||
return
|
||||
}
|
||||
data, err := manager.Get(id)
|
||||
data, err := service.GetBook(id)
|
||||
if err != nil && err != domain.ErrNotFound {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
w.Write([]byte(errorMessage))
|
||||
@@ -143,7 +143,7 @@ func getBook(manager book.Manager) http.Handler {
|
||||
})
|
||||
}
|
||||
|
||||
func deleteBook(manager book.Manager) http.Handler {
|
||||
func deleteBook(service book.UseCase) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
errorMessage := "Error removing bookmark"
|
||||
vars := mux.Vars(r)
|
||||
@@ -153,7 +153,7 @@ func deleteBook(manager book.Manager) http.Handler {
|
||||
w.Write([]byte(errorMessage))
|
||||
return
|
||||
}
|
||||
err = manager.Delete(id)
|
||||
err = service.DeleteBook(id)
|
||||
if err != nil {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
w.Write([]byte(errorMessage))
|
||||
@@ -163,20 +163,20 @@ func deleteBook(manager book.Manager) http.Handler {
|
||||
}
|
||||
|
||||
//MakeBookHandlers make url handlers
|
||||
func MakeBookHandlers(r *mux.Router, n negroni.Negroni, manager book.Manager) {
|
||||
func MakeBookHandlers(r *mux.Router, n negroni.Negroni, service book.UseCase) {
|
||||
r.Handle("/v1/book", n.With(
|
||||
negroni.Wrap(listBooks(manager)),
|
||||
negroni.Wrap(listBooks(service)),
|
||||
)).Methods("GET", "OPTIONS").Name("listBooks")
|
||||
|
||||
r.Handle("/v1/book", n.With(
|
||||
negroni.Wrap(createBook(manager)),
|
||||
negroni.Wrap(createBook(service)),
|
||||
)).Methods("POST", "OPTIONS").Name("createBook")
|
||||
|
||||
r.Handle("/v1/book/{id}", n.With(
|
||||
negroni.Wrap(getBook(manager)),
|
||||
negroni.Wrap(getBook(service)),
|
||||
)).Methods("GET", "OPTIONS").Name("getBook")
|
||||
|
||||
r.Handle("/v1/book/{id}", n.With(
|
||||
negroni.Wrap(deleteBook(manager)),
|
||||
negroni.Wrap(deleteBook(service)),
|
||||
)).Methods("DELETE", "OPTIONS").Name("deleteBook")
|
||||
}
|
||||
|
||||
+21
-23
@@ -11,10 +11,8 @@ import (
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain"
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity"
|
||||
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity/book"
|
||||
|
||||
"github.com/codegangsta/negroni"
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity/book/mock"
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/book/mock"
|
||||
"github.com/golang/mock/gomock"
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/stretchr/testify/assert"
|
||||
@@ -23,17 +21,17 @@ import (
|
||||
func Test_listBooks(t *testing.T) {
|
||||
controller := gomock.NewController(t)
|
||||
defer controller.Finish()
|
||||
manager := mock.NewMockManager(controller)
|
||||
manager := mock.NewMockUseCase(controller)
|
||||
r := mux.NewRouter()
|
||||
n := negroni.New()
|
||||
MakeBookHandlers(r, *n, manager)
|
||||
path, err := r.GetRoute("listBooks").GetPathTemplate()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "/v1/book", path)
|
||||
b := book.NewFixtureBook()
|
||||
b := entity.NewFixtureBook()
|
||||
manager.EXPECT().
|
||||
List().
|
||||
Return([]*book.Book{b}, nil)
|
||||
ListBooks().
|
||||
Return([]*entity.Book{b}, nil)
|
||||
ts := httptest.NewServer(listBooks(manager))
|
||||
defer ts.Close()
|
||||
res, err := http.Get(ts.URL)
|
||||
@@ -44,11 +42,11 @@ func Test_listBooks(t *testing.T) {
|
||||
func Test_listBooks_NotFound(t *testing.T) {
|
||||
controller := gomock.NewController(t)
|
||||
defer controller.Finish()
|
||||
manager := mock.NewMockManager(controller)
|
||||
manager := mock.NewMockUseCase(controller)
|
||||
ts := httptest.NewServer(listBooks(manager))
|
||||
defer ts.Close()
|
||||
manager.EXPECT().
|
||||
Search("book of books").
|
||||
SearchBooks("book of books").
|
||||
Return(nil, domain.ErrNotFound)
|
||||
res, err := http.Get(ts.URL + "?title=book+of+books")
|
||||
assert.Nil(t, err)
|
||||
@@ -58,11 +56,11 @@ func Test_listBooks_NotFound(t *testing.T) {
|
||||
func Test_listBooks_Search(t *testing.T) {
|
||||
controller := gomock.NewController(t)
|
||||
defer controller.Finish()
|
||||
manager := mock.NewMockManager(controller)
|
||||
b := book.NewFixtureBook()
|
||||
manager := mock.NewMockUseCase(controller)
|
||||
b := entity.NewFixtureBook()
|
||||
manager.EXPECT().
|
||||
Search("ozzy").
|
||||
Return([]*book.Book{b}, nil)
|
||||
SearchBooks("ozzy").
|
||||
Return([]*entity.Book{b}, nil)
|
||||
ts := httptest.NewServer(listBooks(manager))
|
||||
defer ts.Close()
|
||||
res, err := http.Get(ts.URL + "?title=ozzy")
|
||||
@@ -73,7 +71,7 @@ func Test_listBooks_Search(t *testing.T) {
|
||||
func Test_createBook(t *testing.T) {
|
||||
controller := gomock.NewController(t)
|
||||
defer controller.Finish()
|
||||
manager := mock.NewMockManager(controller)
|
||||
manager := mock.NewMockUseCase(controller)
|
||||
r := mux.NewRouter()
|
||||
n := negroni.New()
|
||||
MakeBookHandlers(r, *n, manager)
|
||||
@@ -82,7 +80,7 @@ func Test_createBook(t *testing.T) {
|
||||
assert.Equal(t, "/v1/book", path)
|
||||
|
||||
manager.EXPECT().
|
||||
Create(gomock.Any()).
|
||||
CreateBook(gomock.Any()).
|
||||
Return(entity.NewID(), nil)
|
||||
h := createBook(manager)
|
||||
|
||||
@@ -97,7 +95,7 @@ func Test_createBook(t *testing.T) {
|
||||
resp, _ := http.Post(ts.URL+"/v1/book", "application/json", strings.NewReader(payload))
|
||||
assert.Equal(t, http.StatusCreated, resp.StatusCode)
|
||||
|
||||
var b *book.Book
|
||||
var b *entity.Book
|
||||
json.NewDecoder(resp.Body).Decode(&b)
|
||||
assert.Equal(t, "Ozzy Osbourne", b.Author)
|
||||
}
|
||||
@@ -105,16 +103,16 @@ func Test_createBook(t *testing.T) {
|
||||
func Test_getBook(t *testing.T) {
|
||||
controller := gomock.NewController(t)
|
||||
defer controller.Finish()
|
||||
manager := mock.NewMockManager(controller)
|
||||
manager := mock.NewMockUseCase(controller)
|
||||
r := mux.NewRouter()
|
||||
n := negroni.New()
|
||||
MakeBookHandlers(r, *n, manager)
|
||||
path, err := r.GetRoute("getBook").GetPathTemplate()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "/v1/book/{id}", path)
|
||||
b := book.NewFixtureBook()
|
||||
b := entity.NewFixtureBook()
|
||||
manager.EXPECT().
|
||||
Get(b.ID).
|
||||
GetBook(b.ID).
|
||||
Return(b, nil)
|
||||
handler := getBook(manager)
|
||||
r.Handle("/v1/book/{id}", handler)
|
||||
@@ -123,7 +121,7 @@ func Test_getBook(t *testing.T) {
|
||||
res, err := http.Get(ts.URL + "/v1/book/" + b.ID.String())
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, http.StatusOK, res.StatusCode)
|
||||
var d *book.Book
|
||||
var d *entity.Book
|
||||
json.NewDecoder(res.Body).Decode(&d)
|
||||
assert.NotNil(t, d)
|
||||
assert.Equal(t, b.ID, d.ID)
|
||||
@@ -132,15 +130,15 @@ func Test_getBook(t *testing.T) {
|
||||
func Test_deleteBook(t *testing.T) {
|
||||
controller := gomock.NewController(t)
|
||||
defer controller.Finish()
|
||||
manager := mock.NewMockManager(controller)
|
||||
manager := mock.NewMockUseCase(controller)
|
||||
r := mux.NewRouter()
|
||||
n := negroni.New()
|
||||
MakeBookHandlers(r, *n, manager)
|
||||
path, err := r.GetRoute("deleteBook").GetPathTemplate()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "/v1/book/{id}", path)
|
||||
b := book.NewFixtureBook()
|
||||
manager.EXPECT().Delete(b.ID).Return(nil)
|
||||
b := entity.NewFixtureBook()
|
||||
manager.EXPECT().DeleteBook(b.ID).Return(nil)
|
||||
handler := deleteBook(manager)
|
||||
req, _ := http.NewRequest("DELETE", "/v1/bookmark/"+b.ID.String(), nil)
|
||||
r.Handle("/v1/bookmark/{id}", handler).Methods("DELETE", "OPTIONS")
|
||||
|
||||
+13
-14
@@ -4,20 +4,19 @@ import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity/user"
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/book"
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/user"
|
||||
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/loan"
|
||||
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain"
|
||||
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity"
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity/book"
|
||||
|
||||
"github.com/codegangsta/negroni"
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity"
|
||||
"github.com/gorilla/mux"
|
||||
)
|
||||
|
||||
func borrowBook(bManager book.Manager, uManager user.Manager, loanUseCase loan.UseCase) http.Handler {
|
||||
func borrowBook(bookService book.UseCase, userService user.UseCase, loanService loan.UseCase) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
errorMessage := "Error borrowing book"
|
||||
vars := mux.Vars(r)
|
||||
@@ -27,7 +26,7 @@ func borrowBook(bManager book.Manager, uManager user.Manager, loanUseCase loan.U
|
||||
w.Write([]byte(errorMessage))
|
||||
return
|
||||
}
|
||||
b, err := bManager.Get(bID)
|
||||
b, err := bookService.GetBook(bID)
|
||||
if err != nil && err != domain.ErrNotFound {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
w.Write([]byte(errorMessage))
|
||||
@@ -44,7 +43,7 @@ func borrowBook(bManager book.Manager, uManager user.Manager, loanUseCase loan.U
|
||||
w.Write([]byte(errorMessage))
|
||||
return
|
||||
}
|
||||
u, err := uManager.Get(uID)
|
||||
u, err := userService.GetUser(uID)
|
||||
if err != nil && err != domain.ErrNotFound {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
w.Write([]byte(errorMessage))
|
||||
@@ -55,7 +54,7 @@ func borrowBook(bManager book.Manager, uManager user.Manager, loanUseCase loan.U
|
||||
w.Write([]byte(errorMessage))
|
||||
return
|
||||
}
|
||||
err = loanUseCase.Borrow(u, b)
|
||||
err = loanService.Borrow(u, b)
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
@@ -66,7 +65,7 @@ func borrowBook(bManager book.Manager, uManager user.Manager, loanUseCase loan.U
|
||||
})
|
||||
}
|
||||
|
||||
func returnBook(bManager book.Manager, loanUseCase loan.UseCase) http.Handler {
|
||||
func returnBook(bookService book.UseCase, loanService loan.UseCase) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
errorMessage := "Error returning book"
|
||||
vars := mux.Vars(r)
|
||||
@@ -76,7 +75,7 @@ func returnBook(bManager book.Manager, loanUseCase loan.UseCase) http.Handler {
|
||||
w.Write([]byte(errorMessage))
|
||||
return
|
||||
}
|
||||
b, err := bManager.Get(bID)
|
||||
b, err := bookService.GetBook(bID)
|
||||
if err != nil && err != domain.ErrNotFound {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
w.Write([]byte(errorMessage))
|
||||
@@ -87,7 +86,7 @@ func returnBook(bManager book.Manager, loanUseCase loan.UseCase) http.Handler {
|
||||
w.Write([]byte(errorMessage))
|
||||
return
|
||||
}
|
||||
err = loanUseCase.Return(b)
|
||||
err = loanService.Return(b)
|
||||
if err != nil && err != domain.ErrNotFound {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
w.Write([]byte(errorMessage))
|
||||
@@ -98,12 +97,12 @@ func returnBook(bManager book.Manager, loanUseCase loan.UseCase) http.Handler {
|
||||
}
|
||||
|
||||
//MakeLoanHandlers make url handlers
|
||||
func MakeLoanHandlers(r *mux.Router, n negroni.Negroni, bManager book.Manager, uManager user.Manager, loanUseCase loan.UseCase) {
|
||||
func MakeLoanHandlers(r *mux.Router, n negroni.Negroni, bookService book.UseCase, userService user.UseCase, loanService loan.UseCase) {
|
||||
r.Handle("/v1/loan/borrow/{book_id}/{user_id}", n.With(
|
||||
negroni.Wrap(borrowBook(bManager, uManager, loanUseCase)),
|
||||
negroni.Wrap(borrowBook(bookService, userService, loanService)),
|
||||
)).Methods("GET", "OPTIONS").Name("borrowBook")
|
||||
|
||||
r.Handle("/v1/loan/return/{book_id}", n.With(
|
||||
negroni.Wrap(returnBook(bManager, loanUseCase)),
|
||||
negroni.Wrap(returnBook(bookService, loanService)),
|
||||
)).Methods("GET", "OPTIONS").Name("returnBook")
|
||||
}
|
||||
|
||||
+17
-21
@@ -6,17 +6,13 @@ import (
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity/user"
|
||||
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity/book"
|
||||
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain"
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity"
|
||||
|
||||
"github.com/codegangsta/negroni"
|
||||
bmock "github.com/eminetto/clean-architecture-go-v2/domain/entity/book/mock"
|
||||
umock "github.com/eminetto/clean-architecture-go-v2/domain/entity/user/mock"
|
||||
bmock "github.com/eminetto/clean-architecture-go-v2/domain/usecase/book/mock"
|
||||
lmock "github.com/eminetto/clean-architecture-go-v2/domain/usecase/loan/mock"
|
||||
umock "github.com/eminetto/clean-architecture-go-v2/domain/usecase/user/mock"
|
||||
"github.com/golang/mock/gomock"
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/stretchr/testify/assert"
|
||||
@@ -25,8 +21,8 @@ import (
|
||||
func Test_borrowBook(t *testing.T) {
|
||||
controller := gomock.NewController(t)
|
||||
defer controller.Finish()
|
||||
uMock := umock.NewMockManager(controller)
|
||||
bMock := bmock.NewMockManager(controller)
|
||||
uMock := umock.NewMockUseCase(controller)
|
||||
bMock := bmock.NewMockUseCase(controller)
|
||||
lMock := lmock.NewMockUseCase(controller)
|
||||
r := mux.NewRouter()
|
||||
n := negroni.New()
|
||||
@@ -39,7 +35,7 @@ func Test_borrowBook(t *testing.T) {
|
||||
t.Run("book not found", func(t *testing.T) {
|
||||
bID := entity.NewID()
|
||||
uID := entity.NewID()
|
||||
bMock.EXPECT().Get(bID).Return(nil, domain.ErrNotFound)
|
||||
bMock.EXPECT().GetBook(bID).Return(nil, domain.ErrNotFound)
|
||||
ts := httptest.NewServer(r)
|
||||
defer ts.Close()
|
||||
res, err := http.Get(fmt.Sprintf("%s/v1/loan/borrow/%s/%s", ts.URL, bID.String(), uID.String()))
|
||||
@@ -47,10 +43,10 @@ func Test_borrowBook(t *testing.T) {
|
||||
assert.Equal(t, http.StatusNotFound, res.StatusCode)
|
||||
})
|
||||
t.Run("user not found", func(t *testing.T) {
|
||||
b := book.NewFixtureBook()
|
||||
b := entity.NewFixtureBook()
|
||||
uID := entity.NewID()
|
||||
bMock.EXPECT().Get(b.ID).Return(b, nil)
|
||||
uMock.EXPECT().Get(uID).Return(nil, domain.ErrNotFound)
|
||||
bMock.EXPECT().GetBook(b.ID).Return(b, nil)
|
||||
uMock.EXPECT().GetUser(uID).Return(nil, domain.ErrNotFound)
|
||||
ts := httptest.NewServer(r)
|
||||
defer ts.Close()
|
||||
res, err := http.Get(fmt.Sprintf("%s/v1/loan/borrow/%s/%s", ts.URL, b.ID.String(), uID.String()))
|
||||
@@ -58,10 +54,10 @@ func Test_borrowBook(t *testing.T) {
|
||||
assert.Equal(t, http.StatusNotFound, res.StatusCode)
|
||||
})
|
||||
t.Run("success", func(t *testing.T) {
|
||||
b := book.NewFixtureBook()
|
||||
u := user.NewFixtureUser()
|
||||
bMock.EXPECT().Get(b.ID).Return(b, nil)
|
||||
uMock.EXPECT().Get(u.ID).Return(u, nil)
|
||||
b := entity.NewFixtureBook()
|
||||
u := entity.NewFixtureUser()
|
||||
bMock.EXPECT().GetBook(b.ID).Return(b, nil)
|
||||
uMock.EXPECT().GetUser(u.ID).Return(u, nil)
|
||||
lMock.EXPECT().Borrow(u, b).Return(nil)
|
||||
ts := httptest.NewServer(r)
|
||||
defer ts.Close()
|
||||
@@ -74,8 +70,8 @@ func Test_borrowBook(t *testing.T) {
|
||||
func Test_returnBook(t *testing.T) {
|
||||
controller := gomock.NewController(t)
|
||||
defer controller.Finish()
|
||||
uMock := umock.NewMockManager(controller)
|
||||
bMock := bmock.NewMockManager(controller)
|
||||
uMock := umock.NewMockUseCase(controller)
|
||||
bMock := bmock.NewMockUseCase(controller)
|
||||
lMock := lmock.NewMockUseCase(controller)
|
||||
r := mux.NewRouter()
|
||||
n := negroni.New()
|
||||
@@ -87,7 +83,7 @@ func Test_returnBook(t *testing.T) {
|
||||
r.Handle("/v1/loan/return/{book_id}", handler)
|
||||
t.Run("book not found", func(t *testing.T) {
|
||||
bID := entity.NewID()
|
||||
bMock.EXPECT().Get(bID).Return(nil, domain.ErrNotFound)
|
||||
bMock.EXPECT().GetBook(bID).Return(nil, domain.ErrNotFound)
|
||||
ts := httptest.NewServer(r)
|
||||
defer ts.Close()
|
||||
res, err := http.Get(fmt.Sprintf("%s/v1/loan/return/%s", ts.URL, bID.String()))
|
||||
@@ -95,8 +91,8 @@ func Test_returnBook(t *testing.T) {
|
||||
assert.Equal(t, http.StatusNotFound, res.StatusCode)
|
||||
})
|
||||
t.Run("success", func(t *testing.T) {
|
||||
b := book.NewFixtureBook()
|
||||
bMock.EXPECT().Get(b.ID).Return(b, nil)
|
||||
b := entity.NewFixtureBook()
|
||||
bMock.EXPECT().GetBook(b.ID).Return(b, nil)
|
||||
lMock.EXPECT().Return(b).Return(nil)
|
||||
ts := httptest.NewServer(r)
|
||||
defer ts.Close()
|
||||
|
||||
+17
-17
@@ -6,7 +6,7 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity/user"
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/user"
|
||||
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain"
|
||||
|
||||
@@ -18,17 +18,17 @@ import (
|
||||
"github.com/gorilla/mux"
|
||||
)
|
||||
|
||||
func listUsers(manager user.Manager) http.Handler {
|
||||
func listUsers(service user.UseCase) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
errorMessage := "Error reading users"
|
||||
var data []*user.User
|
||||
var data []*entity.User
|
||||
var err error
|
||||
name := r.URL.Query().Get("name")
|
||||
switch {
|
||||
case name == "":
|
||||
data, err = manager.List()
|
||||
data, err = service.ListUsers()
|
||||
default:
|
||||
data, err = manager.Search(name)
|
||||
data, err = service.SearchUsers(name)
|
||||
}
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
if err != nil && err != domain.ErrNotFound {
|
||||
@@ -58,7 +58,7 @@ func listUsers(manager user.Manager) http.Handler {
|
||||
})
|
||||
}
|
||||
|
||||
func createUser(manager user.Manager) http.Handler {
|
||||
func createUser(service user.UseCase) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
errorMessage := "Error adding user"
|
||||
var input struct {
|
||||
@@ -75,7 +75,7 @@ func createUser(manager user.Manager) http.Handler {
|
||||
return
|
||||
}
|
||||
//TODO: validate data ;)
|
||||
u := &user.User{
|
||||
u := &entity.User{
|
||||
ID: entity.NewID(),
|
||||
Email: input.Email,
|
||||
Password: input.Password,
|
||||
@@ -83,7 +83,7 @@ func createUser(manager user.Manager) http.Handler {
|
||||
LastName: input.LastName,
|
||||
CreatedAt: time.Now(),
|
||||
}
|
||||
u.ID, err = manager.Create(u)
|
||||
u.ID, err = service.CreateUser(u)
|
||||
if err != nil {
|
||||
log.Println(err.Error())
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
@@ -107,7 +107,7 @@ func createUser(manager user.Manager) http.Handler {
|
||||
})
|
||||
}
|
||||
|
||||
func getUser(manager user.Manager) http.Handler {
|
||||
func getUser(service user.UseCase) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
errorMessage := "Error reading user"
|
||||
vars := mux.Vars(r)
|
||||
@@ -117,7 +117,7 @@ func getUser(manager user.Manager) http.Handler {
|
||||
w.Write([]byte(errorMessage))
|
||||
return
|
||||
}
|
||||
data, err := manager.Get(id)
|
||||
data, err := service.GetUser(id)
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
if err != nil && err != domain.ErrNotFound {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
@@ -143,7 +143,7 @@ func getUser(manager user.Manager) http.Handler {
|
||||
})
|
||||
}
|
||||
|
||||
func deleteUser(manager user.Manager) http.Handler {
|
||||
func deleteUser(service user.UseCase) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
errorMessage := "Error removing user"
|
||||
vars := mux.Vars(r)
|
||||
@@ -153,7 +153,7 @@ func deleteUser(manager user.Manager) http.Handler {
|
||||
w.Write([]byte(errorMessage))
|
||||
return
|
||||
}
|
||||
err = manager.Delete(id)
|
||||
err = service.DeleteUser(id)
|
||||
if err != nil {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
w.Write([]byte(errorMessage))
|
||||
@@ -163,20 +163,20 @@ func deleteUser(manager user.Manager) http.Handler {
|
||||
}
|
||||
|
||||
//MakeUserHandlers make url handlers
|
||||
func MakeUserHandlers(r *mux.Router, n negroni.Negroni, manager user.Manager) {
|
||||
func MakeUserHandlers(r *mux.Router, n negroni.Negroni, service user.UseCase) {
|
||||
r.Handle("/v1/user", n.With(
|
||||
negroni.Wrap(listUsers(manager)),
|
||||
negroni.Wrap(listUsers(service)),
|
||||
)).Methods("GET", "OPTIONS").Name("listUsers")
|
||||
|
||||
r.Handle("/v1/user", n.With(
|
||||
negroni.Wrap(createUser(manager)),
|
||||
negroni.Wrap(createUser(service)),
|
||||
)).Methods("POST", "OPTIONS").Name("createUser")
|
||||
|
||||
r.Handle("/v1/user/{id}", n.With(
|
||||
negroni.Wrap(getUser(manager)),
|
||||
negroni.Wrap(getUser(service)),
|
||||
)).Methods("GET", "OPTIONS").Name("getUser")
|
||||
|
||||
r.Handle("/v1/user/{id}", n.With(
|
||||
negroni.Wrap(deleteUser(manager)),
|
||||
negroni.Wrap(deleteUser(service)),
|
||||
)).Methods("DELETE", "OPTIONS").Name("deleteUser")
|
||||
}
|
||||
|
||||
+19
-20
@@ -12,8 +12,7 @@ import (
|
||||
"github.com/eminetto/clean-architecture-go-v2/api/presenter"
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain"
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity"
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity/user"
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity/user/mock"
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/user/mock"
|
||||
"github.com/golang/mock/gomock"
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/stretchr/testify/assert"
|
||||
@@ -22,17 +21,17 @@ import (
|
||||
func Test_listUsers(t *testing.T) {
|
||||
controller := gomock.NewController(t)
|
||||
defer controller.Finish()
|
||||
m := mock.NewMockManager(controller)
|
||||
m := mock.NewMockUseCase(controller)
|
||||
r := mux.NewRouter()
|
||||
n := negroni.New()
|
||||
MakeUserHandlers(r, *n, m)
|
||||
path, err := r.GetRoute("listUsers").GetPathTemplate()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "/v1/user", path)
|
||||
u := user.NewFixtureUser()
|
||||
u := entity.NewFixtureUser()
|
||||
m.EXPECT().
|
||||
List().
|
||||
Return([]*user.User{u}, nil)
|
||||
ListUsers().
|
||||
Return([]*entity.User{u}, nil)
|
||||
ts := httptest.NewServer(listUsers(m))
|
||||
defer ts.Close()
|
||||
res, err := http.Get(ts.URL)
|
||||
@@ -43,11 +42,11 @@ func Test_listUsers(t *testing.T) {
|
||||
func Test_listUsers_NotFound(t *testing.T) {
|
||||
controller := gomock.NewController(t)
|
||||
defer controller.Finish()
|
||||
m := mock.NewMockManager(controller)
|
||||
m := mock.NewMockUseCase(controller)
|
||||
ts := httptest.NewServer(listUsers(m))
|
||||
defer ts.Close()
|
||||
m.EXPECT().
|
||||
Search("dio").
|
||||
SearchUsers("dio").
|
||||
Return(nil, domain.ErrNotFound)
|
||||
res, err := http.Get(ts.URL + "?name=dio")
|
||||
assert.Nil(t, err)
|
||||
@@ -57,11 +56,11 @@ func Test_listUsers_NotFound(t *testing.T) {
|
||||
func Test_listUsers_Search(t *testing.T) {
|
||||
controller := gomock.NewController(t)
|
||||
defer controller.Finish()
|
||||
m := mock.NewMockManager(controller)
|
||||
u := user.NewFixtureUser()
|
||||
m := mock.NewMockUseCase(controller)
|
||||
u := entity.NewFixtureUser()
|
||||
m.EXPECT().
|
||||
Search("ozzy").
|
||||
Return([]*user.User{u}, nil)
|
||||
SearchUsers("ozzy").
|
||||
Return([]*entity.User{u}, nil)
|
||||
ts := httptest.NewServer(listUsers(m))
|
||||
defer ts.Close()
|
||||
res, err := http.Get(ts.URL + "?name=ozzy")
|
||||
@@ -72,7 +71,7 @@ func Test_listUsers_Search(t *testing.T) {
|
||||
func Test_createUser(t *testing.T) {
|
||||
controller := gomock.NewController(t)
|
||||
defer controller.Finish()
|
||||
m := mock.NewMockManager(controller)
|
||||
m := mock.NewMockUseCase(controller)
|
||||
r := mux.NewRouter()
|
||||
n := negroni.New()
|
||||
MakeUserHandlers(r, *n, m)
|
||||
@@ -81,7 +80,7 @@ func Test_createUser(t *testing.T) {
|
||||
assert.Equal(t, "/v1/user", path)
|
||||
|
||||
m.EXPECT().
|
||||
Create(gomock.Any()).
|
||||
CreateUser(gomock.Any()).
|
||||
Return(entity.NewID(), nil)
|
||||
h := createUser(m)
|
||||
|
||||
@@ -105,16 +104,16 @@ func Test_createUser(t *testing.T) {
|
||||
func Test_getUser(t *testing.T) {
|
||||
controller := gomock.NewController(t)
|
||||
defer controller.Finish()
|
||||
m := mock.NewMockManager(controller)
|
||||
m := mock.NewMockUseCase(controller)
|
||||
r := mux.NewRouter()
|
||||
n := negroni.New()
|
||||
MakeUserHandlers(r, *n, m)
|
||||
path, err := r.GetRoute("getUser").GetPathTemplate()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "/v1/user/{id}", path)
|
||||
u := user.NewFixtureUser()
|
||||
u := entity.NewFixtureUser()
|
||||
m.EXPECT().
|
||||
Get(u.ID).
|
||||
GetUser(u.ID).
|
||||
Return(u, nil)
|
||||
handler := getUser(m)
|
||||
r.Handle("/v1/user/{id}", handler)
|
||||
@@ -132,15 +131,15 @@ func Test_getUser(t *testing.T) {
|
||||
func Test_deleteUser(t *testing.T) {
|
||||
controller := gomock.NewController(t)
|
||||
defer controller.Finish()
|
||||
m := mock.NewMockManager(controller)
|
||||
m := mock.NewMockUseCase(controller)
|
||||
r := mux.NewRouter()
|
||||
n := negroni.New()
|
||||
MakeUserHandlers(r, *n, m)
|
||||
path, err := r.GetRoute("deleteUser").GetPathTemplate()
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, "/v1/user/{id}", path)
|
||||
u := user.NewFixtureUser()
|
||||
m.EXPECT().Delete(u.ID).Return(nil)
|
||||
u := entity.NewFixtureUser()
|
||||
m.EXPECT().DeleteUser(u.ID).Return(nil)
|
||||
handler := deleteUser(m)
|
||||
req, _ := http.NewRequest("DELETE", "/v1/user/"+u.ID.String(), nil)
|
||||
r.Handle("/v1/user/{id}", handler).Methods("DELETE", "OPTIONS")
|
||||
|
||||
+10
-8
@@ -9,13 +9,15 @@ import (
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
brepo "github.com/eminetto/clean-architecture-go-v2/domain/repository/book"
|
||||
urepo "github.com/eminetto/clean-architecture-go-v2/domain/repository/user"
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/book"
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/user"
|
||||
|
||||
"github.com/eminetto/clean-architecture-go-v2/pkg/password"
|
||||
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/usecase/loan"
|
||||
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity/user"
|
||||
|
||||
"github.com/eminetto/clean-architecture-go-v2/domain/entity/book"
|
||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||
|
||||
"github.com/codegangsta/negroni"
|
||||
@@ -37,13 +39,13 @@ func main() {
|
||||
}
|
||||
defer db.Close()
|
||||
|
||||
bookRepo := book.NewMySQLRepository(db)
|
||||
bookManager := book.NewManager(bookRepo)
|
||||
bookRepo := brepo.NewMySQLRepository(db)
|
||||
bookManager := book.NewService(bookRepo)
|
||||
|
||||
userRepo := user.NewMySQLRepoRepository(db)
|
||||
userManager := user.NewManager(userRepo, password.NewService())
|
||||
userRepo := urepo.NewMySQLRepoRepository(db)
|
||||
userManager := user.NewService(userRepo, password.NewService())
|
||||
|
||||
loanUseCase := loan.NewUseCase(userManager, bookManager)
|
||||
loanUseCase := loan.NewService(userManager, bookManager)
|
||||
|
||||
metricService, err := metric.NewPrometheusService()
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user