From 74d7384f4702f0ce88aba3e770bb0a4390fa3a91 Mon Sep 17 00:00:00 2001 From: Elton Minetto Date: Tue, 30 Jun 2020 11:16:55 -0300 Subject: [PATCH 1/3] feat: refactoring --- api/handler/book.go | 10 +++---- api/handler/loan.go | 8 ++--- api/handler/loan_test.go | 2 +- api/handler/user.go | 10 +++---- api/main.go | 8 ++--- cmd/main.go | 2 +- domain/entity/book/{book.go => entity.go} | 0 domain/entity/book/interface.go | 6 ---- .../entity/book/{service.go => repository.go} | 21 +++++++------- domain/entity/book/repository_inmem.go | 20 ++++++------- domain/entity/book/repository_mysql.go | 20 ++++++------- .../{service_test.go => repository_test.go} | 8 ++--- domain/entity/user/{user.go => entity.go} | 0 domain/entity/user/interface.go | 6 ---- .../entity/user/{service.go => repository.go} | 29 +++++++++++-------- .../{service_test.go => repository_test.go} | 8 ++--- domain/{ => usecase}/loan/interface.go | 0 domain/{ => usecase}/loan/mock/loan.go | 0 .../service.go => usecase/loan/usecase.go} | 17 +++++------ .../loan/usecase_test.go} | 4 +-- 20 files changed, 85 insertions(+), 94 deletions(-) rename domain/entity/book/{book.go => entity.go} (100%) rename domain/entity/book/{service.go => repository.go} (53%) rename domain/entity/book/{service_test.go => repository_test.go} (93%) rename domain/entity/user/{user.go => entity.go} (100%) rename domain/entity/user/{service.go => repository.go} (53%) rename domain/entity/user/{service_test.go => repository_test.go} (89%) rename domain/{ => usecase}/loan/interface.go (100%) rename domain/{ => usecase}/loan/mock/loan.go (100%) rename domain/{loan/service.go => usecase/loan/usecase.go} (83%) rename domain/{loan/service_test.go => usecase/loan/usecase_test.go} (97%) diff --git a/api/handler/book.go b/api/handler/book.go index 2266243..a585c58 100644 --- a/api/handler/book.go +++ b/api/handler/book.go @@ -17,7 +17,7 @@ import ( "github.com/gorilla/mux" ) -func listBooks(service book.UseCase) http.Handler { +func listBooks(service book.Repository) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { errorMessage := "Error reading books" var data []*book.Book @@ -58,7 +58,7 @@ func listBooks(service book.UseCase) http.Handler { }) } -func createBook(service book.UseCase) http.Handler { +func createBook(service book.Repository) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { errorMessage := "Error adding book" var input struct { @@ -107,7 +107,7 @@ func createBook(service book.UseCase) http.Handler { }) } -func getBook(service book.UseCase) http.Handler { +func getBook(service book.Repository) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { errorMessage := "Error reading book" vars := mux.Vars(r) @@ -143,7 +143,7 @@ func getBook(service book.UseCase) http.Handler { }) } -func deleteBook(service book.UseCase) http.Handler { +func deleteBook(service book.Repository) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { errorMessage := "Error removing bookmark" vars := mux.Vars(r) @@ -163,7 +163,7 @@ func deleteBook(service book.UseCase) http.Handler { } //MakeBookHandlers make url handlers -func MakeBookHandlers(r *mux.Router, n negroni.Negroni, service book.UseCase) { +func MakeBookHandlers(r *mux.Router, n negroni.Negroni, service book.Repository) { r.Handle("/v1/book", n.With( negroni.Wrap(listBooks(service)), )).Methods("GET", "OPTIONS").Name("listBooks") diff --git a/api/handler/loan.go b/api/handler/loan.go index d1f1b82..ae3c3ba 100644 --- a/api/handler/loan.go +++ b/api/handler/loan.go @@ -6,7 +6,7 @@ import ( "github.com/eminetto/clean-architecture-go-v2/domain/entity/user" - "github.com/eminetto/clean-architecture-go-v2/domain/loan" + "github.com/eminetto/clean-architecture-go-v2/domain/usecase/loan" "github.com/eminetto/clean-architecture-go-v2/domain" @@ -17,7 +17,7 @@ import ( "github.com/gorilla/mux" ) -func borrowBook(bService book.UseCase, uService user.UseCase, loanService loan.UseCase) http.Handler { +func borrowBook(bService book.Repository, uService user.Repository, loanService loan.UseCase) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { errorMessage := "Error borrowing book" vars := mux.Vars(r) @@ -66,7 +66,7 @@ func borrowBook(bService book.UseCase, uService user.UseCase, loanService loan.U }) } -func returnBook(bService book.UseCase, loanService loan.UseCase) http.Handler { +func returnBook(bService book.Repository, loanService loan.UseCase) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { errorMessage := "Error returning book" vars := mux.Vars(r) @@ -98,7 +98,7 @@ func returnBook(bService book.UseCase, loanService loan.UseCase) http.Handler { } //MakeLoanHandlers make url handlers -func MakeLoanHandlers(r *mux.Router, n negroni.Negroni, bService book.UseCase, uService user.UseCase, loanService loan.UseCase) { +func MakeLoanHandlers(r *mux.Router, n negroni.Negroni, bService book.Repository, uService user.Repository, loanService loan.UseCase) { r.Handle("/v1/loan/borrow/{book_id}/{user_id}", n.With( negroni.Wrap(borrowBook(bService, uService, loanService)), )).Methods("GET", "OPTIONS").Name("borrowBook") diff --git a/api/handler/loan_test.go b/api/handler/loan_test.go index 6c0ef80..7075dce 100644 --- a/api/handler/loan_test.go +++ b/api/handler/loan_test.go @@ -16,7 +16,7 @@ import ( "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" - lmock "github.com/eminetto/clean-architecture-go-v2/domain/loan/mock" + lmock "github.com/eminetto/clean-architecture-go-v2/domain/usecase/loan/mock" "github.com/golang/mock/gomock" "github.com/gorilla/mux" "github.com/stretchr/testify/assert" diff --git a/api/handler/user.go b/api/handler/user.go index 6043c36..784ed97 100644 --- a/api/handler/user.go +++ b/api/handler/user.go @@ -18,7 +18,7 @@ import ( "github.com/gorilla/mux" ) -func listUsers(service user.UseCase) http.Handler { +func listUsers(service user.Repository) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { errorMessage := "Error reading users" var data []*user.User @@ -58,7 +58,7 @@ func listUsers(service user.UseCase) http.Handler { }) } -func createUser(service user.UseCase) http.Handler { +func createUser(service user.Repository) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { errorMessage := "Error adding user" var input struct { @@ -107,7 +107,7 @@ func createUser(service user.UseCase) http.Handler { }) } -func getUser(service user.UseCase) http.Handler { +func getUser(service user.Repository) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { errorMessage := "Error reading user" vars := mux.Vars(r) @@ -143,7 +143,7 @@ func getUser(service user.UseCase) http.Handler { }) } -func deleteUser(service user.UseCase) http.Handler { +func deleteUser(service user.Repository) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { errorMessage := "Error removing user" vars := mux.Vars(r) @@ -163,7 +163,7 @@ func deleteUser(service user.UseCase) http.Handler { } //MakeUserHandlers make url handlers -func MakeUserHandlers(r *mux.Router, n negroni.Negroni, service user.UseCase) { +func MakeUserHandlers(r *mux.Router, n negroni.Negroni, service user.Repository) { r.Handle("/v1/user", n.With( negroni.Wrap(listUsers(service)), )).Methods("GET", "OPTIONS").Name("listUsers") diff --git a/api/main.go b/api/main.go index 6aa4be4..acc03c0 100644 --- a/api/main.go +++ b/api/main.go @@ -11,7 +11,7 @@ import ( "github.com/eminetto/clean-architecture-go-v2/pkg/password" - "github.com/eminetto/clean-architecture-go-v2/domain/loan" + "github.com/eminetto/clean-architecture-go-v2/domain/usecase/loan" "github.com/eminetto/clean-architecture-go-v2/domain/entity/user" @@ -38,12 +38,12 @@ func main() { defer db.Close() bookRepo := book.NewMySQLRepoRepository(db) - bookService := book.NewService(bookRepo) + bookService := book.NewRepository(bookRepo) userRepo := user.NewMySQLRepoRepository(db) - userService := user.NewService(userRepo, password.NewService()) + userService := user.NewRepository(userRepo, password.NewService()) - loanService := loan.NewService(userService, bookService) + loanService := loan.NewUseCase(userService, bookService) metricService, err := metric.NewPrometheusService() if err != nil { diff --git a/cmd/main.go b/cmd/main.go index d4ab153..00ddbea 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -41,7 +41,7 @@ func main() { } defer db.Close() repo := book.NewMySQLRepoRepository(db) - service := book.NewService(repo) + service := book.NewRepository(repo) all, err := service.Search(query) if err != nil { log.Fatal(err) diff --git a/domain/entity/book/book.go b/domain/entity/book/entity.go similarity index 100% rename from domain/entity/book/book.go rename to domain/entity/book/entity.go diff --git a/domain/entity/book/interface.go b/domain/entity/book/interface.go index 2496a28..cfbe549 100644 --- a/domain/entity/book/interface.go +++ b/domain/entity/book/interface.go @@ -21,9 +21,3 @@ type Repository interface { Reader Writer } - -//UseCase use case interface -type UseCase interface { - Reader - Writer -} \ No newline at end of file diff --git a/domain/entity/book/service.go b/domain/entity/book/repository.go similarity index 53% rename from domain/entity/book/service.go rename to domain/entity/book/repository.go index 682c105..6eecc32 100644 --- a/domain/entity/book/service.go +++ b/domain/entity/book/repository.go @@ -7,42 +7,41 @@ import ( "github.com/eminetto/clean-architecture-go-v2/domain/entity" ) -//Service service interface -type Service struct { +type repository struct { repo Repository } -//NewService create new use case -func NewService(r Repository) *Service { - return &Service{ +//NewRepository create new repository +func NewRepository(r Repository) *repository { + return &repository{ repo: r, } } //Create a book -func (s *Service) Create(e *Book) (entity.ID, error) { +func (s *repository) Create(e *Book) (entity.ID, error) { e.ID = entity.NewID() e.CreatedAt = time.Now() return s.repo.Create(e) } //Get a book -func (s *Service) Get(id entity.ID) (*Book, error) { +func (s *repository) Get(id entity.ID) (*Book, error) { return s.repo.Get(id) } //Search books -func (s *Service) Search(query string) ([]*Book, error) { +func (s *repository) Search(query string) ([]*Book, error) { return s.repo.Search(strings.ToLower(query)) } //List books -func (s *Service) List() ([]*Book, error) { +func (s *repository) List() ([]*Book, error) { return s.repo.List() } //Delete a book -func (s *Service) Delete(id entity.ID) error { +func (s *repository) Delete(id entity.ID) error { _, err := s.Get(id) if err != nil { return err @@ -51,6 +50,6 @@ func (s *Service) Delete(id entity.ID) error { } //Update a book -func (s *Service) Update(e *Book) error { +func (s *repository) Update(e *Book) error { return s.repo.Update(e) } diff --git a/domain/entity/book/repository_inmem.go b/domain/entity/book/repository_inmem.go index 8e5a788..1410bea 100644 --- a/domain/entity/book/repository_inmem.go +++ b/domain/entity/book/repository_inmem.go @@ -7,27 +7,27 @@ import ( "github.com/eminetto/clean-architecture-go-v2/domain/entity" ) -//IRepo in memory repo -type IRepo struct { +//iRepo in memory repo +type iRepo struct { m map[entity.ID]*Book } //NewInmemRepository create new repository -func NewInmemRepository() *IRepo { +func NewInmemRepository() *iRepo { var m = map[entity.ID]*Book{} - return &IRepo{ + return &iRepo{ m: m, } } //Create a book -func (r *IRepo) Create(e *Book) (entity.ID, error) { +func (r *iRepo) Create(e *Book) (entity.ID, error) { r.m[e.ID] = e return e.ID, nil } //Get a book -func (r *IRepo) Get(id entity.ID) (*Book, error) { +func (r *iRepo) Get(id entity.ID) (*Book, error) { if r.m[id] == nil { return nil, domain.ErrNotFound } @@ -35,7 +35,7 @@ func (r *IRepo) Get(id entity.ID) (*Book, error) { } //Update a book -func (r *IRepo) Update(e *Book) error { +func (r *iRepo) Update(e *Book) error { _, err := r.Get(e.ID) if err != nil { return err @@ -45,7 +45,7 @@ func (r *IRepo) Update(e *Book) error { } //Search books -func (r *IRepo) Search(query string) ([]*Book, error) { +func (r *iRepo) Search(query string) ([]*Book, error) { var d []*Book for _, j := range r.m { if strings.Contains(strings.ToLower(j.Title), query) { @@ -60,7 +60,7 @@ func (r *IRepo) Search(query string) ([]*Book, error) { } //List books -func (r *IRepo) List() ([]*Book, error) { +func (r *iRepo) List() ([]*Book, error) { var d []*Book for _, j := range r.m { d = append(d, j) @@ -69,7 +69,7 @@ func (r *IRepo) List() ([]*Book, error) { } //Delete a book -func (r *IRepo) Delete(id entity.ID) error { +func (r *iRepo) Delete(id entity.ID) error { if r.m[id] == nil { return domain.ErrNotFound } diff --git a/domain/entity/book/repository_mysql.go b/domain/entity/book/repository_mysql.go index ff345f6..4ab968d 100644 --- a/domain/entity/book/repository_mysql.go +++ b/domain/entity/book/repository_mysql.go @@ -9,20 +9,20 @@ import ( "github.com/eminetto/clean-architecture-go-v2/domain/entity" ) -//MySQLRepo mysql repo -type MySQLRepo struct { +//mySQLRepo mysql repo +type mySQLRepo struct { db *sql.DB } //NewMySQLRepoRepository create new repository -func NewMySQLRepoRepository(db *sql.DB) *MySQLRepo { - return &MySQLRepo{ +func NewMySQLRepoRepository(db *sql.DB) *mySQLRepo { + return &mySQLRepo{ db: db, } } //Create a book -func (r *MySQLRepo) Create(e *Book) (entity.ID, error) { +func (r *mySQLRepo) Create(e *Book) (entity.ID, error) { stmt, err := r.db.Prepare(` insert into book (id, title, author, pages, quantity, created_at) values(?,?,?,?,?,?)`) @@ -48,7 +48,7 @@ func (r *MySQLRepo) Create(e *Book) (entity.ID, error) { } //Get a book -func (r *MySQLRepo) Get(id entity.ID) (*Book, error) { +func (r *mySQLRepo) Get(id entity.ID) (*Book, error) { stmt, err := r.db.Prepare(`select id, title, author, pages, quantity, created_at from book where id = ?`) if err != nil { return nil, err @@ -65,7 +65,7 @@ func (r *MySQLRepo) Get(id entity.ID) (*Book, error) { } //Update a book -func (r *MySQLRepo) Update(e *Book) error { +func (r *mySQLRepo) Update(e *Book) error { e.UpdatedAt = time.Now() _, err := r.db.Exec("update book set title = ?, author = ?, pages = ?, quantity = ?, updated_at = ? where id = ?", e.Title, e.Author, e.Pages, e.Quantity, e.UpdatedAt.Format("2006-01-02"), e.ID) if err != nil { @@ -75,7 +75,7 @@ func (r *MySQLRepo) Update(e *Book) error { } //Search books -func (r *MySQLRepo) Search(query string) ([]*Book, error) { +func (r *mySQLRepo) Search(query string) ([]*Book, error) { stmt, err := r.db.Prepare(`select id, title, author, pages, quantity, created_at from book where title like ?`) if err != nil { return nil, err @@ -100,7 +100,7 @@ func (r *MySQLRepo) Search(query string) ([]*Book, error) { } //List books -func (r *MySQLRepo) List() ([]*Book, error) { +func (r *mySQLRepo) List() ([]*Book, error) { stmt, err := r.db.Prepare(`select id, title, author, pages, quantity, created_at from book`) if err != nil { return nil, err @@ -125,7 +125,7 @@ func (r *MySQLRepo) List() ([]*Book, error) { } //Delete a book -func (r *MySQLRepo) Delete(id entity.ID) error { +func (r *mySQLRepo) Delete(id entity.ID) error { _, err := r.db.Exec("delete from book where id = ?", id) if err != nil { return err diff --git a/domain/entity/book/service_test.go b/domain/entity/book/repository_test.go similarity index 93% rename from domain/entity/book/service_test.go rename to domain/entity/book/repository_test.go index 10afb9e..85e91f3 100644 --- a/domain/entity/book/service_test.go +++ b/domain/entity/book/repository_test.go @@ -10,7 +10,7 @@ import ( func Test_Create(t *testing.T) { repo := NewInmemRepository() - service := NewService(repo) + service := NewRepository(repo) u := NewFixtureBook() id, err := service.Create(u) assert.Nil(t, err) @@ -20,7 +20,7 @@ func Test_Create(t *testing.T) { func Test_SearchAndFind(t *testing.T) { repo := NewInmemRepository() - service := NewService(repo) + service := NewRepository(repo) u1 := NewFixtureBook() u2 := NewFixtureBook() u2.Title = "Lemmy: Biography" @@ -53,7 +53,7 @@ func Test_SearchAndFind(t *testing.T) { func Test_Update(t *testing.T) { repo := NewInmemRepository() - service := NewService(repo) + service := NewRepository(repo) u := NewFixtureBook() id, err := service.Create(u) assert.Nil(t, err) @@ -67,7 +67,7 @@ func Test_Update(t *testing.T) { func TestDelete(t *testing.T) { repo := NewInmemRepository() - service := NewService(repo) + service := NewRepository(repo) u1 := NewFixtureBook() u2 := NewFixtureBook() u2ID, _ := service.Create(u2) diff --git a/domain/entity/user/user.go b/domain/entity/user/entity.go similarity index 100% rename from domain/entity/user/user.go rename to domain/entity/user/entity.go diff --git a/domain/entity/user/interface.go b/domain/entity/user/interface.go index eb5f309..b76c6ea 100644 --- a/domain/entity/user/interface.go +++ b/domain/entity/user/interface.go @@ -21,9 +21,3 @@ type Repository interface { Reader Writer } - -//UseCase use case interface -type UseCase interface { - Reader - Writer -} \ No newline at end of file diff --git a/domain/entity/user/service.go b/domain/entity/user/repository.go similarity index 53% rename from domain/entity/user/service.go rename to domain/entity/user/repository.go index a476849..47d5196 100644 --- a/domain/entity/user/service.go +++ b/domain/entity/user/repository.go @@ -4,27 +4,29 @@ import ( "strings" "time" + "github.com/eminetto/clean-architecture-go-v2/domain" + "github.com/eminetto/clean-architecture-go-v2/pkg/password" "github.com/eminetto/clean-architecture-go-v2/domain/entity" ) -//Service service interface -type Service struct { +//repository service interface +type repository struct { repo Repository pwd password.UseCase } -//NewService create new use case -func NewService(r Repository, pwd password.UseCase) *Service { - return &Service{ +//NewRepository create new repository +func NewRepository(r Repository, pwd password.UseCase) *repository { + return &repository{ repo: r, pwd: pwd, } } //Create an user -func (s *Service) Create(e *User) (entity.ID, error) { +func (s *repository) Create(e *User) (entity.ID, error) { e.ID = entity.NewID() e.CreatedAt = time.Now() pwd, err := s.pwd.Generate(e.Password) @@ -36,31 +38,34 @@ func (s *Service) Create(e *User) (entity.ID, error) { } //Get an user -func (s *Service) Get(id entity.ID) (*User, error) { +func (s *repository) Get(id entity.ID) (*User, error) { return s.repo.Get(id) } //Search users -func (s *Service) Search(query string) ([]*User, error) { +func (s *repository) Search(query string) ([]*User, error) { return s.repo.Search(strings.ToLower(query)) } //List users -func (s *Service) List() ([]*User, error) { +func (s *repository) List() ([]*User, error) { return s.repo.List() } //Delete an user -func (s *Service) Delete(id entity.ID) error { - _, err := s.Get(id) +func (s *repository) Delete(id entity.ID) error { + u, err := s.Get(id) if err != nil { return err } + if len(u.Books) > 0 { + return domain.ErrCannotBeDeleted + } return s.repo.Delete(id) } //Update an user -func (s *Service) Update(e *User) error { +func (s *repository) Update(e *User) error { e.UpdatedAt = time.Now() return s.repo.Update(e) } diff --git a/domain/entity/user/service_test.go b/domain/entity/user/repository_test.go similarity index 89% rename from domain/entity/user/service_test.go rename to domain/entity/user/repository_test.go index 4c6f004..8f7a1c4 100644 --- a/domain/entity/user/service_test.go +++ b/domain/entity/user/repository_test.go @@ -13,7 +13,7 @@ import ( func Test_Create(t *testing.T) { repo := NewInmemRepository() - service := NewService(repo, password.NewFakeService()) + service := NewRepository(repo, password.NewFakeService()) u := NewFixtureUser() id, err := service.Create(u) assert.Nil(t, err) @@ -24,7 +24,7 @@ func Test_Create(t *testing.T) { func Test_SearchAndFind(t *testing.T) { repo := NewInmemRepository() - service := NewService(repo, password.NewFakeService()) + service := NewRepository(repo, password.NewFakeService()) u1 := NewFixtureUser() u2 := NewFixtureUser() u2.FirstName = "Lemmy" @@ -57,7 +57,7 @@ func Test_SearchAndFind(t *testing.T) { func Test_Update(t *testing.T) { repo := NewInmemRepository() - service := NewService(repo, password.NewFakeService()) + service := NewRepository(repo, password.NewFakeService()) u := NewFixtureUser() id, err := service.Create(u) assert.Nil(t, err) @@ -74,7 +74,7 @@ func Test_Update(t *testing.T) { func TestDelete(t *testing.T) { repo := NewInmemRepository() - service := NewService(repo, password.NewFakeService()) + service := NewRepository(repo, password.NewFakeService()) u1 := NewFixtureUser() u2 := NewFixtureUser() u2ID, _ := service.Create(u2) diff --git a/domain/loan/interface.go b/domain/usecase/loan/interface.go similarity index 100% rename from domain/loan/interface.go rename to domain/usecase/loan/interface.go diff --git a/domain/loan/mock/loan.go b/domain/usecase/loan/mock/loan.go similarity index 100% rename from domain/loan/mock/loan.go rename to domain/usecase/loan/mock/loan.go diff --git a/domain/loan/service.go b/domain/usecase/loan/usecase.go similarity index 83% rename from domain/loan/service.go rename to domain/usecase/loan/usecase.go index 6c15d26..3c2acdb 100644 --- a/domain/loan/service.go +++ b/domain/usecase/loan/usecase.go @@ -7,22 +7,21 @@ import ( "github.com/eminetto/clean-architecture-go-v2/domain/entity/user" ) -//Service service interface -type Service struct { - uService user.UseCase - bService book.UseCase +type usecase struct { + uService user.Repository + bService book.Repository } -//NewService create new use case -func NewService(u user.UseCase, b book.UseCase) *Service { - return &Service{ +//NewUseCase create new use case +func NewUseCase(u user.Repository, b book.Repository) *usecase { + return &usecase{ uService: u, bService: b, } } //Borrow borrow a book to an user -func (s *Service) Borrow(u *user.User, b *book.Book) error { +func (s *usecase) Borrow(u *user.User, b *book.Book) error { u, err := s.uService.Get(u.ID) if err != nil { return err @@ -53,7 +52,7 @@ func (s *Service) Borrow(u *user.User, b *book.Book) error { } //Return return a book -func (s *Service) Return(b *book.Book) error { +func (s *usecase) Return(b *book.Book) error { b, err := s.bService.Get(b.ID) if err != nil { return err diff --git a/domain/loan/service_test.go b/domain/usecase/loan/usecase_test.go similarity index 97% rename from domain/loan/service_test.go rename to domain/usecase/loan/usecase_test.go index 020c545..1a33620 100644 --- a/domain/loan/service_test.go +++ b/domain/usecase/loan/usecase_test.go @@ -19,7 +19,7 @@ func Test_Borrow(t *testing.T) { defer controller.Finish() uMock := umock.NewMockUseCase(controller) bMock := bmock.NewMockUseCase(controller) - service := NewService(uMock, bMock) + service := NewUseCase(uMock, bMock) t.Run("user not found", func(t *testing.T) { u := user.NewFixtureUser() b := book.NewFixtureBook() @@ -71,7 +71,7 @@ func Test_Return(t *testing.T) { defer controller.Finish() uMock := umock.NewMockUseCase(controller) bMock := bmock.NewMockUseCase(controller) - service := NewService(uMock, bMock) + service := NewUseCase(uMock, bMock) t.Run("book not found", func(t *testing.T) { b := book.NewFixtureBook() bMock.EXPECT().Get(b.ID).Return(nil, domain.ErrNotFound) From 4c6b43b04d28d3de65a8f6bdc0ad47e4aa37035d Mon Sep 17 00:00:00 2001 From: Elton Minetto Date: Tue, 30 Jun 2020 13:19:03 -0300 Subject: [PATCH 2/3] fix: change function names --- Makefile | 2 +- api/handler/book.go | 20 +++---- api/handler/book_test.go | 44 +++++++------- api/handler/loan.go | 20 +++---- api/handler/loan_test.go | 8 +-- api/handler/user.go | 28 ++++----- api/handler/user_test.go | 44 +++++++------- api/main.go | 14 ++--- cmd/main.go | 6 +- domain/entity/book/interface.go | 5 ++ .../entity/book/{repository.go => manager.go} | 20 +++---- .../{repository_test.go => manager_test.go} | 38 ++++++------ domain/entity/book/mock/book.go | 58 +++++++++---------- domain/entity/book/repository_mysql.go | 4 +- domain/entity/user/interface.go | 5 ++ .../entity/user/{repository.go => manager.go} | 22 +++---- .../{repository_test.go => manager_test.go} | 44 ++++++++------ domain/entity/user/mock/user.go | 58 +++++++++---------- domain/usecase/loan/mock/loan.go | 2 +- domain/usecase/loan/usecase.go | 2 +- domain/usecase/loan/usecase_test.go | 8 +-- 21 files changed, 234 insertions(+), 218 deletions(-) rename domain/entity/book/{repository.go => manager.go} (53%) rename domain/entity/book/{repository_test.go => manager_test.go} (68%) rename domain/entity/user/{repository.go => manager.go} (63%) rename domain/entity/user/{repository_test.go => manager_test.go} (68%) diff --git a/Makefile b/Makefile index 4be1026..68c5479 100644 --- a/Makefile +++ b/Makefile @@ -34,7 +34,7 @@ build-mocks: @go install github.com/golang/mock/mockgen @~/go/bin/mockgen -source=domain/entity/book/interface.go -destination=domain/entity/book/mock/book.go -package=mock @~/go/bin/mockgen -source=domain/entity/user/interface.go -destination=domain/entity/user/mock/user.go -package=mock - @~/go/bin/mockgen -source=domain/loan/interface.go -destination=domain/loan/mock/loan.go -package=mock + @~/go/bin/mockgen -source=domain/usecase/loan/interface.go -destination=domain/usecase/loan/mock/loan.go -package=mock test: go test -tags testing ./... diff --git a/api/handler/book.go b/api/handler/book.go index a585c58..afcbd9e 100644 --- a/api/handler/book.go +++ b/api/handler/book.go @@ -17,7 +17,7 @@ import ( "github.com/gorilla/mux" ) -func listBooks(service book.Repository) http.Handler { +func listBooks(manager book.Manager) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { errorMessage := "Error reading books" var data []*book.Book @@ -25,9 +25,9 @@ func listBooks(service book.Repository) http.Handler { title := r.URL.Query().Get("title") switch { case title == "": - data, err = service.List() + data, err = manager.List() default: - data, err = service.Search(title) + data, err = manager.Search(title) } w.Header().Set("Content-Type", "application/json") if err != nil && err != domain.ErrNotFound { @@ -58,7 +58,7 @@ func listBooks(service book.Repository) http.Handler { }) } -func createBook(service book.Repository) http.Handler { +func createBook(manager book.Manager) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { errorMessage := "Error adding book" var input struct { @@ -82,7 +82,7 @@ func createBook(service book.Repository) http.Handler { Quantity: input.Quantity, CreatedAt: time.Now(), } - b.ID, err = service.Create(b) + b.ID, err = manager.Create(b) if err != nil { log.Println(err.Error()) w.WriteHeader(http.StatusInternalServerError) @@ -107,7 +107,7 @@ func createBook(service book.Repository) http.Handler { }) } -func getBook(service book.Repository) http.Handler { +func getBook(manager book.Manager) 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(service book.Repository) http.Handler { w.Write([]byte(errorMessage)) return } - data, err := service.Get(id) + data, err := manager.Get(id) if err != nil && err != domain.ErrNotFound { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(errorMessage)) @@ -143,7 +143,7 @@ func getBook(service book.Repository) http.Handler { }) } -func deleteBook(service book.Repository) http.Handler { +func deleteBook(manager book.Manager) 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(service book.Repository) http.Handler { w.Write([]byte(errorMessage)) return } - err = service.Delete(id) + err = manager.Delete(id) if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(errorMessage)) @@ -163,7 +163,7 @@ func deleteBook(service book.Repository) http.Handler { } //MakeBookHandlers make url handlers -func MakeBookHandlers(r *mux.Router, n negroni.Negroni, service book.Repository) { +func MakeBookHandlers(r *mux.Router, n negroni.Negroni, service book.Manager) { r.Handle("/v1/book", n.With( negroni.Wrap(listBooks(service)), )).Methods("GET", "OPTIONS").Name("listBooks") diff --git a/api/handler/book_test.go b/api/handler/book_test.go index 857b708..9794b4d 100644 --- a/api/handler/book_test.go +++ b/api/handler/book_test.go @@ -23,18 +23,18 @@ import ( func Test_listBooks(t *testing.T) { controller := gomock.NewController(t) defer controller.Finish() - service := mock.NewMockUseCase(controller) + manager := mock.NewMockManager(controller) r := mux.NewRouter() n := negroni.New() - MakeBookHandlers(r, *n, service) + MakeBookHandlers(r, *n, manager) path, err := r.GetRoute("listBooks").GetPathTemplate() assert.Nil(t, err) assert.Equal(t, "/v1/book", path) b := book.NewFixtureBook() - service.EXPECT(). + manager.EXPECT(). List(). Return([]*book.Book{b}, nil) - ts := httptest.NewServer(listBooks(service)) + ts := httptest.NewServer(listBooks(manager)) defer ts.Close() res, err := http.Get(ts.URL) assert.Nil(t, err) @@ -44,10 +44,10 @@ func Test_listBooks(t *testing.T) { func Test_listBooks_NotFound(t *testing.T) { controller := gomock.NewController(t) defer controller.Finish() - service := mock.NewMockUseCase(controller) - ts := httptest.NewServer(listBooks(service)) + manager := mock.NewMockManager(controller) + ts := httptest.NewServer(listBooks(manager)) defer ts.Close() - service.EXPECT(). + manager.EXPECT(). Search("book of books"). Return(nil, domain.ErrNotFound) res, err := http.Get(ts.URL + "?title=book+of+books") @@ -58,12 +58,12 @@ func Test_listBooks_NotFound(t *testing.T) { func Test_listBooks_Search(t *testing.T) { controller := gomock.NewController(t) defer controller.Finish() - service := mock.NewMockUseCase(controller) + manager := mock.NewMockManager(controller) b := book.NewFixtureBook() - service.EXPECT(). + manager.EXPECT(). Search("ozzy"). Return([]*book.Book{b}, nil) - ts := httptest.NewServer(listBooks(service)) + ts := httptest.NewServer(listBooks(manager)) defer ts.Close() res, err := http.Get(ts.URL + "?title=ozzy") assert.Nil(t, err) @@ -73,18 +73,18 @@ func Test_listBooks_Search(t *testing.T) { func Test_createBook(t *testing.T) { controller := gomock.NewController(t) defer controller.Finish() - service := mock.NewMockUseCase(controller) + manager := mock.NewMockManager(controller) r := mux.NewRouter() n := negroni.New() - MakeBookHandlers(r, *n, service) + MakeBookHandlers(r, *n, manager) path, err := r.GetRoute("createBook").GetPathTemplate() assert.Nil(t, err) assert.Equal(t, "/v1/book", path) - service.EXPECT(). + manager.EXPECT(). Create(gomock.Any()). Return(entity.NewID(), nil) - h := createBook(service) + h := createBook(manager) ts := httptest.NewServer(h) defer ts.Close() @@ -105,18 +105,18 @@ func Test_createBook(t *testing.T) { func Test_getBook(t *testing.T) { controller := gomock.NewController(t) defer controller.Finish() - service := mock.NewMockUseCase(controller) + manager := mock.NewMockManager(controller) r := mux.NewRouter() n := negroni.New() - MakeBookHandlers(r, *n, service) + MakeBookHandlers(r, *n, manager) path, err := r.GetRoute("getBook").GetPathTemplate() assert.Nil(t, err) assert.Equal(t, "/v1/book/{id}", path) b := book.NewFixtureBook() - service.EXPECT(). + manager.EXPECT(). Get(b.ID). Return(b, nil) - handler := getBook(service) + handler := getBook(manager) r.Handle("/v1/book/{id}", handler) ts := httptest.NewServer(r) defer ts.Close() @@ -132,16 +132,16 @@ func Test_getBook(t *testing.T) { func Test_deleteBook(t *testing.T) { controller := gomock.NewController(t) defer controller.Finish() - service := mock.NewMockUseCase(controller) + manager := mock.NewMockManager(controller) r := mux.NewRouter() n := negroni.New() - MakeBookHandlers(r, *n, service) + MakeBookHandlers(r, *n, manager) path, err := r.GetRoute("deleteBook").GetPathTemplate() assert.Nil(t, err) assert.Equal(t, "/v1/book/{id}", path) b := book.NewFixtureBook() - service.EXPECT().Delete(b.ID).Return(nil) - handler := deleteBook(service) + manager.EXPECT().Delete(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") rr := httptest.NewRecorder() diff --git a/api/handler/loan.go b/api/handler/loan.go index ae3c3ba..639f7d0 100644 --- a/api/handler/loan.go +++ b/api/handler/loan.go @@ -17,7 +17,7 @@ import ( "github.com/gorilla/mux" ) -func borrowBook(bService book.Repository, uService user.Repository, loanService loan.UseCase) http.Handler { +func borrowBook(bManager book.Manager, uManager user.Manager, loanUseCase loan.UseCase) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { errorMessage := "Error borrowing book" vars := mux.Vars(r) @@ -27,7 +27,7 @@ func borrowBook(bService book.Repository, uService user.Repository, loanService w.Write([]byte(errorMessage)) return } - b, err := bService.Get(bID) + b, err := bManager.Get(bID) if err != nil && err != domain.ErrNotFound { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(errorMessage)) @@ -44,7 +44,7 @@ func borrowBook(bService book.Repository, uService user.Repository, loanService w.Write([]byte(errorMessage)) return } - u, err := uService.Get(uID) + u, err := uManager.Get(uID) if err != nil && err != domain.ErrNotFound { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(errorMessage)) @@ -55,7 +55,7 @@ func borrowBook(bService book.Repository, uService user.Repository, loanService w.Write([]byte(errorMessage)) return } - err = loanService.Borrow(u, b) + err = loanUseCase.Borrow(u, b) if err != nil { fmt.Println(err) w.WriteHeader(http.StatusInternalServerError) @@ -66,7 +66,7 @@ func borrowBook(bService book.Repository, uService user.Repository, loanService }) } -func returnBook(bService book.Repository, loanService loan.UseCase) http.Handler { +func returnBook(bManager book.Manager, loanUseCase loan.UseCase) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { errorMessage := "Error returning book" vars := mux.Vars(r) @@ -76,7 +76,7 @@ func returnBook(bService book.Repository, loanService loan.UseCase) http.Handler w.Write([]byte(errorMessage)) return } - b, err := bService.Get(bID) + b, err := bManager.Get(bID) if err != nil && err != domain.ErrNotFound { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(errorMessage)) @@ -87,7 +87,7 @@ func returnBook(bService book.Repository, loanService loan.UseCase) http.Handler w.Write([]byte(errorMessage)) return } - err = loanService.Return(b) + err = loanUseCase.Return(b) if err != nil && err != domain.ErrNotFound { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(errorMessage)) @@ -98,12 +98,12 @@ func returnBook(bService book.Repository, loanService loan.UseCase) http.Handler } //MakeLoanHandlers make url handlers -func MakeLoanHandlers(r *mux.Router, n negroni.Negroni, bService book.Repository, uService user.Repository, loanService loan.UseCase) { +func MakeLoanHandlers(r *mux.Router, n negroni.Negroni, bManager book.Manager, uManager user.Manager, loanUseCase loan.UseCase) { r.Handle("/v1/loan/borrow/{book_id}/{user_id}", n.With( - negroni.Wrap(borrowBook(bService, uService, loanService)), + negroni.Wrap(borrowBook(bManager, uManager, loanUseCase)), )).Methods("GET", "OPTIONS").Name("borrowBook") r.Handle("/v1/loan/return/{book_id}", n.With( - negroni.Wrap(returnBook(bService, loanService)), + negroni.Wrap(returnBook(bManager, loanUseCase)), )).Methods("GET", "OPTIONS").Name("returnBook") } diff --git a/api/handler/loan_test.go b/api/handler/loan_test.go index 7075dce..5f28b61 100644 --- a/api/handler/loan_test.go +++ b/api/handler/loan_test.go @@ -25,8 +25,8 @@ import ( func Test_borrowBook(t *testing.T) { controller := gomock.NewController(t) defer controller.Finish() - uMock := umock.NewMockUseCase(controller) - bMock := bmock.NewMockUseCase(controller) + uMock := umock.NewMockManager(controller) + bMock := bmock.NewMockManager(controller) lMock := lmock.NewMockUseCase(controller) r := mux.NewRouter() n := negroni.New() @@ -74,8 +74,8 @@ func Test_borrowBook(t *testing.T) { func Test_returnBook(t *testing.T) { controller := gomock.NewController(t) defer controller.Finish() - uMock := umock.NewMockUseCase(controller) - bMock := bmock.NewMockUseCase(controller) + uMock := umock.NewMockManager(controller) + bMock := bmock.NewMockManager(controller) lMock := lmock.NewMockUseCase(controller) r := mux.NewRouter() n := negroni.New() diff --git a/api/handler/user.go b/api/handler/user.go index 784ed97..6c7f2a0 100644 --- a/api/handler/user.go +++ b/api/handler/user.go @@ -18,7 +18,7 @@ import ( "github.com/gorilla/mux" ) -func listUsers(service user.Repository) http.Handler { +func listUsers(manager user.Manager) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { errorMessage := "Error reading users" var data []*user.User @@ -26,9 +26,9 @@ func listUsers(service user.Repository) http.Handler { name := r.URL.Query().Get("name") switch { case name == "": - data, err = service.List() + data, err = manager.List() default: - data, err = service.Search(name) + data, err = manager.Search(name) } w.Header().Set("Content-Type", "application/json") if err != nil && err != domain.ErrNotFound { @@ -58,7 +58,7 @@ func listUsers(service user.Repository) http.Handler { }) } -func createUser(service user.Repository) http.Handler { +func createUser(manager user.Manager) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { errorMessage := "Error adding user" var input struct { @@ -83,7 +83,7 @@ func createUser(service user.Repository) http.Handler { LastName: input.LastName, CreatedAt: time.Now(), } - u.ID, err = service.Create(u) + u.ID, err = manager.Create(u) if err != nil { log.Println(err.Error()) w.WriteHeader(http.StatusInternalServerError) @@ -107,7 +107,7 @@ func createUser(service user.Repository) http.Handler { }) } -func getUser(service user.Repository) http.Handler { +func getUser(manager user.Manager) 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(service user.Repository) http.Handler { w.Write([]byte(errorMessage)) return } - data, err := service.Get(id) + data, err := manager.Get(id) w.Header().Set("Content-Type", "application/json") if err != nil && err != domain.ErrNotFound { w.WriteHeader(http.StatusInternalServerError) @@ -143,7 +143,7 @@ func getUser(service user.Repository) http.Handler { }) } -func deleteUser(service user.Repository) http.Handler { +func deleteUser(manager user.Manager) 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(service user.Repository) http.Handler { w.Write([]byte(errorMessage)) return } - err = service.Delete(id) + err = manager.Delete(id) if err != nil { w.WriteHeader(http.StatusInternalServerError) w.Write([]byte(errorMessage)) @@ -163,20 +163,20 @@ func deleteUser(service user.Repository) http.Handler { } //MakeUserHandlers make url handlers -func MakeUserHandlers(r *mux.Router, n negroni.Negroni, service user.Repository) { +func MakeUserHandlers(r *mux.Router, n negroni.Negroni, manager user.Manager) { r.Handle("/v1/user", n.With( - negroni.Wrap(listUsers(service)), + negroni.Wrap(listUsers(manager)), )).Methods("GET", "OPTIONS").Name("listUsers") r.Handle("/v1/user", n.With( - negroni.Wrap(createUser(service)), + negroni.Wrap(createUser(manager)), )).Methods("POST", "OPTIONS").Name("createUser") r.Handle("/v1/user/{id}", n.With( - negroni.Wrap(getUser(service)), + negroni.Wrap(getUser(manager)), )).Methods("GET", "OPTIONS").Name("getUser") r.Handle("/v1/user/{id}", n.With( - negroni.Wrap(deleteUser(service)), + negroni.Wrap(deleteUser(manager)), )).Methods("DELETE", "OPTIONS").Name("deleteUser") } diff --git a/api/handler/user_test.go b/api/handler/user_test.go index 5a40110..64dcd54 100644 --- a/api/handler/user_test.go +++ b/api/handler/user_test.go @@ -22,18 +22,18 @@ import ( func Test_listUsers(t *testing.T) { controller := gomock.NewController(t) defer controller.Finish() - service := mock.NewMockUseCase(controller) + m := mock.NewMockManager(controller) r := mux.NewRouter() n := negroni.New() - MakeUserHandlers(r, *n, service) + MakeUserHandlers(r, *n, m) path, err := r.GetRoute("listUsers").GetPathTemplate() assert.Nil(t, err) assert.Equal(t, "/v1/user", path) u := user.NewFixtureUser() - service.EXPECT(). + m.EXPECT(). List(). Return([]*user.User{u}, nil) - ts := httptest.NewServer(listUsers(service)) + ts := httptest.NewServer(listUsers(m)) defer ts.Close() res, err := http.Get(ts.URL) assert.Nil(t, err) @@ -43,10 +43,10 @@ func Test_listUsers(t *testing.T) { func Test_listUsers_NotFound(t *testing.T) { controller := gomock.NewController(t) defer controller.Finish() - service := mock.NewMockUseCase(controller) - ts := httptest.NewServer(listUsers(service)) + m := mock.NewMockManager(controller) + ts := httptest.NewServer(listUsers(m)) defer ts.Close() - service.EXPECT(). + m.EXPECT(). Search("dio"). Return(nil, domain.ErrNotFound) res, err := http.Get(ts.URL + "?name=dio") @@ -57,12 +57,12 @@ func Test_listUsers_NotFound(t *testing.T) { func Test_listUsers_Search(t *testing.T) { controller := gomock.NewController(t) defer controller.Finish() - service := mock.NewMockUseCase(controller) + m := mock.NewMockManager(controller) u := user.NewFixtureUser() - service.EXPECT(). + m.EXPECT(). Search("ozzy"). Return([]*user.User{u}, nil) - ts := httptest.NewServer(listUsers(service)) + ts := httptest.NewServer(listUsers(m)) defer ts.Close() res, err := http.Get(ts.URL + "?name=ozzy") assert.Nil(t, err) @@ -72,18 +72,18 @@ func Test_listUsers_Search(t *testing.T) { func Test_createUser(t *testing.T) { controller := gomock.NewController(t) defer controller.Finish() - service := mock.NewMockUseCase(controller) + m := mock.NewMockManager(controller) r := mux.NewRouter() n := negroni.New() - MakeUserHandlers(r, *n, service) + MakeUserHandlers(r, *n, m) path, err := r.GetRoute("createUser").GetPathTemplate() assert.Nil(t, err) assert.Equal(t, "/v1/user", path) - service.EXPECT(). + m.EXPECT(). Create(gomock.Any()). Return(entity.NewID(), nil) - h := createUser(service) + h := createUser(m) ts := httptest.NewServer(h) defer ts.Close() @@ -105,18 +105,18 @@ func Test_createUser(t *testing.T) { func Test_getUser(t *testing.T) { controller := gomock.NewController(t) defer controller.Finish() - service := mock.NewMockUseCase(controller) + m := mock.NewMockManager(controller) r := mux.NewRouter() n := negroni.New() - MakeUserHandlers(r, *n, service) + MakeUserHandlers(r, *n, m) path, err := r.GetRoute("getUser").GetPathTemplate() assert.Nil(t, err) assert.Equal(t, "/v1/user/{id}", path) u := user.NewFixtureUser() - service.EXPECT(). + m.EXPECT(). Get(u.ID). Return(u, nil) - handler := getUser(service) + handler := getUser(m) r.Handle("/v1/user/{id}", handler) ts := httptest.NewServer(r) defer ts.Close() @@ -132,16 +132,16 @@ func Test_getUser(t *testing.T) { func Test_deleteUser(t *testing.T) { controller := gomock.NewController(t) defer controller.Finish() - service := mock.NewMockUseCase(controller) + m := mock.NewMockManager(controller) r := mux.NewRouter() n := negroni.New() - MakeUserHandlers(r, *n, service) + MakeUserHandlers(r, *n, m) path, err := r.GetRoute("deleteUser").GetPathTemplate() assert.Nil(t, err) assert.Equal(t, "/v1/user/{id}", path) u := user.NewFixtureUser() - service.EXPECT().Delete(u.ID).Return(nil) - handler := deleteUser(service) + m.EXPECT().Delete(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") rr := httptest.NewRecorder() diff --git a/api/main.go b/api/main.go index acc03c0..d040ef1 100644 --- a/api/main.go +++ b/api/main.go @@ -37,13 +37,13 @@ func main() { } defer db.Close() - bookRepo := book.NewMySQLRepoRepository(db) - bookService := book.NewRepository(bookRepo) + bookRepo := book.NewMySQLRepository(db) + bookManager := book.NewManager(bookRepo) userRepo := user.NewMySQLRepoRepository(db) - userService := user.NewRepository(userRepo, password.NewService()) + userManager := user.NewManager(userRepo, password.NewService()) - loanService := loan.NewUseCase(userService, bookService) + loanUseCase := loan.NewUseCase(userManager, bookManager) metricService, err := metric.NewPrometheusService() if err != nil { @@ -57,13 +57,13 @@ func main() { negroni.NewLogger(), ) //book - handler.MakeBookHandlers(r, *n, bookService) + handler.MakeBookHandlers(r, *n, bookManager) //user - handler.MakeUserHandlers(r, *n, userService) + handler.MakeUserHandlers(r, *n, userManager) //loan - handler.MakeLoanHandlers(r, *n, bookService, userService, loanService) + handler.MakeLoanHandlers(r, *n, bookManager, userManager, loanUseCase) http.Handle("/", r) http.Handle("/metrics", promhttp.Handler()) diff --git a/cmd/main.go b/cmd/main.go index 00ddbea..ff2696d 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -40,9 +40,9 @@ func main() { log.Fatal(err.Error()) } defer db.Close() - repo := book.NewMySQLRepoRepository(db) - service := book.NewRepository(repo) - all, err := service.Search(query) + repo := book.NewMySQLRepository(db) + manager := book.NewManager(repo) + all, err := manager.Search(query) if err != nil { log.Fatal(err) } diff --git a/domain/entity/book/interface.go b/domain/entity/book/interface.go index cfbe549..613ef6d 100644 --- a/domain/entity/book/interface.go +++ b/domain/entity/book/interface.go @@ -21,3 +21,8 @@ type Repository interface { Reader Writer } + +//Manager interface +type Manager interface { + Repository +} diff --git a/domain/entity/book/repository.go b/domain/entity/book/manager.go similarity index 53% rename from domain/entity/book/repository.go rename to domain/entity/book/manager.go index 6eecc32..e56a3af 100644 --- a/domain/entity/book/repository.go +++ b/domain/entity/book/manager.go @@ -7,41 +7,41 @@ import ( "github.com/eminetto/clean-architecture-go-v2/domain/entity" ) -type repository struct { +type manager struct { repo Repository } -//NewRepository create new repository -func NewRepository(r Repository) *repository { - return &repository{ +//NewManager create new manager +func NewManager(r Repository) *manager { + return &manager{ repo: r, } } //Create a book -func (s *repository) Create(e *Book) (entity.ID, error) { +func (s *manager) Create(e *Book) (entity.ID, error) { e.ID = entity.NewID() e.CreatedAt = time.Now() return s.repo.Create(e) } //Get a book -func (s *repository) Get(id entity.ID) (*Book, error) { +func (s *manager) Get(id entity.ID) (*Book, error) { return s.repo.Get(id) } //Search books -func (s *repository) Search(query string) ([]*Book, error) { +func (s *manager) Search(query string) ([]*Book, error) { return s.repo.Search(strings.ToLower(query)) } //List books -func (s *repository) List() ([]*Book, error) { +func (s *manager) List() ([]*Book, error) { return s.repo.List() } //Delete a book -func (s *repository) Delete(id entity.ID) error { +func (s *manager) Delete(id entity.ID) error { _, err := s.Get(id) if err != nil { return err @@ -50,6 +50,6 @@ func (s *repository) Delete(id entity.ID) error { } //Update a book -func (s *repository) Update(e *Book) error { +func (s *manager) Update(e *Book) error { return s.repo.Update(e) } diff --git a/domain/entity/book/repository_test.go b/domain/entity/book/manager_test.go similarity index 68% rename from domain/entity/book/repository_test.go rename to domain/entity/book/manager_test.go index 85e91f3..2249154 100644 --- a/domain/entity/book/repository_test.go +++ b/domain/entity/book/manager_test.go @@ -10,9 +10,9 @@ import ( func Test_Create(t *testing.T) { repo := NewInmemRepository() - service := NewRepository(repo) + m := NewManager(repo) u := NewFixtureBook() - id, err := service.Create(u) + id, err := m.Create(u) assert.Nil(t, err) assert.Equal(t, u.ID, id) assert.False(t, u.CreatedAt.IsZero()) @@ -20,32 +20,32 @@ func Test_Create(t *testing.T) { func Test_SearchAndFind(t *testing.T) { repo := NewInmemRepository() - service := NewRepository(repo) + m := NewManager(repo) u1 := NewFixtureBook() u2 := NewFixtureBook() u2.Title = "Lemmy: Biography" - uID, _ := service.Create(u1) - _, _ = service.Create(u2) + uID, _ := m.Create(u1) + _, _ = m.Create(u2) t.Run("search", func(t *testing.T) { - c, err := service.Search("ozzy") + c, err := m.Search("ozzy") assert.Nil(t, err) assert.Equal(t, 1, len(c)) assert.Equal(t, "I Am Ozzy", c[0].Title) - c, err = service.Search("dio") + c, err = m.Search("dio") assert.Equal(t, domain.ErrNotFound, err) assert.Nil(t, c) }) t.Run("list all", func(t *testing.T) { - all, err := service.List() + all, err := m.List() assert.Nil(t, err) assert.Equal(t, 2, len(all)) }) t.Run("get", func(t *testing.T) { - saved, err := service.Get(uID) + saved, err := m.Get(uID) assert.Nil(t, err) assert.Equal(t, u1.Title, saved.Title) }) @@ -53,30 +53,30 @@ func Test_SearchAndFind(t *testing.T) { func Test_Update(t *testing.T) { repo := NewInmemRepository() - service := NewRepository(repo) + m := NewManager(repo) u := NewFixtureBook() - id, err := service.Create(u) + id, err := m.Create(u) assert.Nil(t, err) - saved, _ := service.Get(id) + saved, _ := m.Get(id) saved.Title = "Lemmy: Biography" - assert.Nil(t, service.Update(saved)) - updated, err := service.Get(id) + assert.Nil(t, m.Update(saved)) + updated, err := m.Get(id) assert.Nil(t, err) assert.Equal(t, "Lemmy: Biography", updated.Title) } func TestDelete(t *testing.T) { repo := NewInmemRepository() - service := NewRepository(repo) + m := NewManager(repo) u1 := NewFixtureBook() u2 := NewFixtureBook() - u2ID, _ := service.Create(u2) + u2ID, _ := m.Create(u2) - err := service.Delete(u1.ID) + err := m.Delete(u1.ID) assert.Equal(t, domain.ErrNotFound, err) - err = service.Delete(u2ID) + err = m.Delete(u2ID) assert.Nil(t, err) - _, err = service.Get(u2ID) + _, err = m.Get(u2ID) assert.Equal(t, domain.ErrNotFound, err) } diff --git a/domain/entity/book/mock/book.go b/domain/entity/book/mock/book.go index 335a121..e213511 100644 --- a/domain/entity/book/mock/book.go +++ b/domain/entity/book/mock/book.go @@ -256,31 +256,31 @@ func (mr *MockRepositoryMockRecorder) Delete(id interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockRepository)(nil).Delete), id) } -// MockUseCase is a mock of UseCase interface -type MockUseCase struct { +// MockManager is a mock of Manager interface +type MockManager struct { ctrl *gomock.Controller - recorder *MockUseCaseMockRecorder + recorder *MockManagerMockRecorder } -// MockUseCaseMockRecorder is the mock recorder for MockUseCase -type MockUseCaseMockRecorder struct { - mock *MockUseCase +// MockManagerMockRecorder is the mock recorder for MockManager +type MockManagerMockRecorder struct { + mock *MockManager } -// NewMockUseCase creates a new mock instance -func NewMockUseCase(ctrl *gomock.Controller) *MockUseCase { - mock := &MockUseCase{ctrl: ctrl} - mock.recorder = &MockUseCaseMockRecorder{mock} +// NewMockManager creates a new mock instance +func NewMockManager(ctrl *gomock.Controller) *MockManager { + mock := &MockManager{ctrl: ctrl} + mock.recorder = &MockManagerMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use -func (m *MockUseCase) EXPECT() *MockUseCaseMockRecorder { +func (m *MockManager) EXPECT() *MockManagerMockRecorder { return m.recorder } // Get mocks base method -func (m *MockUseCase) Get(id entity.ID) (*book.Book, error) { +func (m *MockManager) Get(id entity.ID) (*book.Book, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Get", id) ret0, _ := ret[0].(*book.Book) @@ -289,13 +289,13 @@ func (m *MockUseCase) Get(id entity.ID) (*book.Book, error) { } // Get indicates an expected call of Get -func (mr *MockUseCaseMockRecorder) Get(id interface{}) *gomock.Call { +func (mr *MockManagerMockRecorder) Get(id interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockUseCase)(nil).Get), id) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockManager)(nil).Get), id) } // Search mocks base method -func (m *MockUseCase) Search(query string) ([]*book.Book, error) { +func (m *MockManager) Search(query string) ([]*book.Book, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Search", query) ret0, _ := ret[0].([]*book.Book) @@ -304,13 +304,13 @@ func (m *MockUseCase) Search(query string) ([]*book.Book, error) { } // Search indicates an expected call of Search -func (mr *MockUseCaseMockRecorder) Search(query interface{}) *gomock.Call { +func (mr *MockManagerMockRecorder) Search(query interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Search", reflect.TypeOf((*MockUseCase)(nil).Search), query) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Search", reflect.TypeOf((*MockManager)(nil).Search), query) } // List mocks base method -func (m *MockUseCase) List() ([]*book.Book, error) { +func (m *MockManager) List() ([]*book.Book, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "List") ret0, _ := ret[0].([]*book.Book) @@ -319,13 +319,13 @@ func (m *MockUseCase) List() ([]*book.Book, error) { } // List indicates an expected call of List -func (mr *MockUseCaseMockRecorder) List() *gomock.Call { +func (mr *MockManagerMockRecorder) List() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockUseCase)(nil).List)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockManager)(nil).List)) } // Create mocks base method -func (m *MockUseCase) Create(e *book.Book) (entity.ID, error) { +func (m *MockManager) Create(e *book.Book) (entity.ID, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Create", e) ret0, _ := ret[0].(entity.ID) @@ -334,13 +334,13 @@ func (m *MockUseCase) Create(e *book.Book) (entity.ID, error) { } // Create indicates an expected call of Create -func (mr *MockUseCaseMockRecorder) Create(e interface{}) *gomock.Call { +func (mr *MockManagerMockRecorder) Create(e interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockUseCase)(nil).Create), e) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockManager)(nil).Create), e) } // Update mocks base method -func (m *MockUseCase) Update(e *book.Book) error { +func (m *MockManager) Update(e *book.Book) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Update", e) ret0, _ := ret[0].(error) @@ -348,13 +348,13 @@ func (m *MockUseCase) Update(e *book.Book) error { } // Update indicates an expected call of Update -func (mr *MockUseCaseMockRecorder) Update(e interface{}) *gomock.Call { +func (mr *MockManagerMockRecorder) Update(e interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockUseCase)(nil).Update), e) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockManager)(nil).Update), e) } // Delete mocks base method -func (m *MockUseCase) Delete(id entity.ID) error { +func (m *MockManager) Delete(id entity.ID) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Delete", id) ret0, _ := ret[0].(error) @@ -362,7 +362,7 @@ func (m *MockUseCase) Delete(id entity.ID) error { } // Delete indicates an expected call of Delete -func (mr *MockUseCaseMockRecorder) Delete(id interface{}) *gomock.Call { +func (mr *MockManagerMockRecorder) Delete(id interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockUseCase)(nil).Delete), id) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockManager)(nil).Delete), id) } diff --git a/domain/entity/book/repository_mysql.go b/domain/entity/book/repository_mysql.go index 4ab968d..c46f051 100644 --- a/domain/entity/book/repository_mysql.go +++ b/domain/entity/book/repository_mysql.go @@ -14,8 +14,8 @@ type mySQLRepo struct { db *sql.DB } -//NewMySQLRepoRepository create new repository -func NewMySQLRepoRepository(db *sql.DB) *mySQLRepo { +//NewMySQLRepository create new repository +func NewMySQLRepository(db *sql.DB) *mySQLRepo { return &mySQLRepo{ db: db, } diff --git a/domain/entity/user/interface.go b/domain/entity/user/interface.go index b76c6ea..0fe933d 100644 --- a/domain/entity/user/interface.go +++ b/domain/entity/user/interface.go @@ -21,3 +21,8 @@ type Repository interface { Reader Writer } + +//Manager interface +type Manager interface { + Repository +} diff --git a/domain/entity/user/repository.go b/domain/entity/user/manager.go similarity index 63% rename from domain/entity/user/repository.go rename to domain/entity/user/manager.go index 47d5196..b6527e0 100644 --- a/domain/entity/user/repository.go +++ b/domain/entity/user/manager.go @@ -11,22 +11,22 @@ import ( "github.com/eminetto/clean-architecture-go-v2/domain/entity" ) -//repository service interface -type repository struct { +//manager interface +type manager struct { repo Repository pwd password.UseCase } -//NewRepository create new repository -func NewRepository(r Repository, pwd password.UseCase) *repository { - return &repository{ +//NewManager create new repository +func NewManager(r Repository, pwd password.UseCase) *manager { + return &manager{ repo: r, pwd: pwd, } } //Create an user -func (s *repository) Create(e *User) (entity.ID, error) { +func (s *manager) Create(e *User) (entity.ID, error) { e.ID = entity.NewID() e.CreatedAt = time.Now() pwd, err := s.pwd.Generate(e.Password) @@ -38,22 +38,22 @@ func (s *repository) Create(e *User) (entity.ID, error) { } //Get an user -func (s *repository) Get(id entity.ID) (*User, error) { +func (s *manager) Get(id entity.ID) (*User, error) { return s.repo.Get(id) } //Search users -func (s *repository) Search(query string) ([]*User, error) { +func (s *manager) Search(query string) ([]*User, error) { return s.repo.Search(strings.ToLower(query)) } //List users -func (s *repository) List() ([]*User, error) { +func (s *manager) List() ([]*User, error) { return s.repo.List() } //Delete an user -func (s *repository) Delete(id entity.ID) error { +func (s *manager) Delete(id entity.ID) error { u, err := s.Get(id) if err != nil { return err @@ -65,7 +65,7 @@ func (s *repository) Delete(id entity.ID) error { } //Update an user -func (s *repository) Update(e *User) error { +func (s *manager) Update(e *User) error { e.UpdatedAt = time.Now() return s.repo.Update(e) } diff --git a/domain/entity/user/repository_test.go b/domain/entity/user/manager_test.go similarity index 68% rename from domain/entity/user/repository_test.go rename to domain/entity/user/manager_test.go index 8f7a1c4..dba9b6e 100644 --- a/domain/entity/user/repository_test.go +++ b/domain/entity/user/manager_test.go @@ -13,9 +13,9 @@ import ( func Test_Create(t *testing.T) { repo := NewInmemRepository() - service := NewRepository(repo, password.NewFakeService()) + m := NewManager(repo, password.NewFakeService()) u := NewFixtureUser() - id, err := service.Create(u) + id, err := m.Create(u) assert.Nil(t, err) assert.Equal(t, u.ID, id) assert.False(t, u.CreatedAt.IsZero()) @@ -24,32 +24,32 @@ func Test_Create(t *testing.T) { func Test_SearchAndFind(t *testing.T) { repo := NewInmemRepository() - service := NewRepository(repo, password.NewFakeService()) + m := NewManager(repo, password.NewFakeService()) u1 := NewFixtureUser() u2 := NewFixtureUser() u2.FirstName = "Lemmy" - uID, _ := service.Create(u1) - _, _ = service.Create(u2) + uID, _ := m.Create(u1) + _, _ = m.Create(u2) t.Run("search", func(t *testing.T) { - c, err := service.Search("ozzy") + c, err := m.Search("ozzy") assert.Nil(t, err) assert.Equal(t, 1, len(c)) assert.Equal(t, "Osbourne", c[0].LastName) - c, err = service.Search("dio") + c, err = m.Search("dio") assert.Equal(t, domain.ErrNotFound, err) assert.Nil(t, c) }) t.Run("list all", func(t *testing.T) { - all, err := service.List() + all, err := m.List() assert.Nil(t, err) assert.Equal(t, 2, len(all)) }) t.Run("get", func(t *testing.T) { - saved, err := service.Get(uID) + saved, err := m.Get(uID) assert.Nil(t, err) assert.Equal(t, u1.FirstName, saved.FirstName) }) @@ -57,15 +57,15 @@ func Test_SearchAndFind(t *testing.T) { func Test_Update(t *testing.T) { repo := NewInmemRepository() - service := NewRepository(repo, password.NewFakeService()) + m := NewManager(repo, password.NewFakeService()) u := NewFixtureUser() - id, err := service.Create(u) + id, err := m.Create(u) assert.Nil(t, err) - saved, _ := service.Get(id) + saved, _ := m.Get(id) saved.FirstName = "Dio" saved.Books = append(saved.Books, entity.NewID()) - assert.Nil(t, service.Update(saved)) - updated, err := service.Get(id) + assert.Nil(t, m.Update(saved)) + updated, err := m.Get(id) assert.Nil(t, err) assert.Equal(t, "Dio", updated.FirstName) assert.False(t, u.UpdatedAt.IsZero()) @@ -74,16 +74,22 @@ func Test_Update(t *testing.T) { func TestDelete(t *testing.T) { repo := NewInmemRepository() - service := NewRepository(repo, password.NewFakeService()) + m := NewManager(repo, password.NewFakeService()) u1 := NewFixtureUser() u2 := NewFixtureUser() - u2ID, _ := service.Create(u2) + u2ID, _ := m.Create(u2) - err := service.Delete(u1.ID) + err := m.Delete(u1.ID) assert.Equal(t, domain.ErrNotFound, err) - err = service.Delete(u2ID) + err = m.Delete(u2ID) assert.Nil(t, err) - _, err = service.Get(u2ID) + _, err = m.Get(u2ID) assert.Equal(t, domain.ErrNotFound, err) + + u3 := NewFixtureUser() + u3.Books = []entity.ID{entity.NewID()} + _, _ = m.Create(u3) + err = m.Delete(u3.ID) + assert.Equal(t, domain.ErrCannotBeDeleted, err) } diff --git a/domain/entity/user/mock/user.go b/domain/entity/user/mock/user.go index b8aba8d..506b675 100644 --- a/domain/entity/user/mock/user.go +++ b/domain/entity/user/mock/user.go @@ -256,31 +256,31 @@ func (mr *MockRepositoryMockRecorder) Delete(id interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockRepository)(nil).Delete), id) } -// MockUseCase is a mock of UseCase interface -type MockUseCase struct { +// MockManager is a mock of Manager interface +type MockManager struct { ctrl *gomock.Controller - recorder *MockUseCaseMockRecorder + recorder *MockManagerMockRecorder } -// MockUseCaseMockRecorder is the mock recorder for MockUseCase -type MockUseCaseMockRecorder struct { - mock *MockUseCase +// MockManagerMockRecorder is the mock recorder for MockManager +type MockManagerMockRecorder struct { + mock *MockManager } -// NewMockUseCase creates a new mock instance -func NewMockUseCase(ctrl *gomock.Controller) *MockUseCase { - mock := &MockUseCase{ctrl: ctrl} - mock.recorder = &MockUseCaseMockRecorder{mock} +// NewMockManager creates a new mock instance +func NewMockManager(ctrl *gomock.Controller) *MockManager { + mock := &MockManager{ctrl: ctrl} + mock.recorder = &MockManagerMockRecorder{mock} return mock } // EXPECT returns an object that allows the caller to indicate expected use -func (m *MockUseCase) EXPECT() *MockUseCaseMockRecorder { +func (m *MockManager) EXPECT() *MockManagerMockRecorder { return m.recorder } // Get mocks base method -func (m *MockUseCase) Get(id entity.ID) (*user.User, error) { +func (m *MockManager) Get(id entity.ID) (*user.User, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Get", id) ret0, _ := ret[0].(*user.User) @@ -289,13 +289,13 @@ func (m *MockUseCase) Get(id entity.ID) (*user.User, error) { } // Get indicates an expected call of Get -func (mr *MockUseCaseMockRecorder) Get(id interface{}) *gomock.Call { +func (mr *MockManagerMockRecorder) Get(id interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockUseCase)(nil).Get), id) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockManager)(nil).Get), id) } // Search mocks base method -func (m *MockUseCase) Search(query string) ([]*user.User, error) { +func (m *MockManager) Search(query string) ([]*user.User, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Search", query) ret0, _ := ret[0].([]*user.User) @@ -304,13 +304,13 @@ func (m *MockUseCase) Search(query string) ([]*user.User, error) { } // Search indicates an expected call of Search -func (mr *MockUseCaseMockRecorder) Search(query interface{}) *gomock.Call { +func (mr *MockManagerMockRecorder) Search(query interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Search", reflect.TypeOf((*MockUseCase)(nil).Search), query) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Search", reflect.TypeOf((*MockManager)(nil).Search), query) } // List mocks base method -func (m *MockUseCase) List() ([]*user.User, error) { +func (m *MockManager) List() ([]*user.User, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "List") ret0, _ := ret[0].([]*user.User) @@ -319,13 +319,13 @@ func (m *MockUseCase) List() ([]*user.User, error) { } // List indicates an expected call of List -func (mr *MockUseCaseMockRecorder) List() *gomock.Call { +func (mr *MockManagerMockRecorder) List() *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockUseCase)(nil).List)) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "List", reflect.TypeOf((*MockManager)(nil).List)) } // Create mocks base method -func (m *MockUseCase) Create(e *user.User) (entity.ID, error) { +func (m *MockManager) Create(e *user.User) (entity.ID, error) { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Create", e) ret0, _ := ret[0].(entity.ID) @@ -334,13 +334,13 @@ func (m *MockUseCase) Create(e *user.User) (entity.ID, error) { } // Create indicates an expected call of Create -func (mr *MockUseCaseMockRecorder) Create(e interface{}) *gomock.Call { +func (mr *MockManagerMockRecorder) Create(e interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockUseCase)(nil).Create), e) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Create", reflect.TypeOf((*MockManager)(nil).Create), e) } // Update mocks base method -func (m *MockUseCase) Update(e *user.User) error { +func (m *MockManager) Update(e *user.User) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Update", e) ret0, _ := ret[0].(error) @@ -348,13 +348,13 @@ func (m *MockUseCase) Update(e *user.User) error { } // Update indicates an expected call of Update -func (mr *MockUseCaseMockRecorder) Update(e interface{}) *gomock.Call { +func (mr *MockManagerMockRecorder) Update(e interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockUseCase)(nil).Update), e) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Update", reflect.TypeOf((*MockManager)(nil).Update), e) } // Delete mocks base method -func (m *MockUseCase) Delete(id entity.ID) error { +func (m *MockManager) Delete(id entity.ID) error { m.ctrl.T.Helper() ret := m.ctrl.Call(m, "Delete", id) ret0, _ := ret[0].(error) @@ -362,7 +362,7 @@ func (m *MockUseCase) Delete(id entity.ID) error { } // Delete indicates an expected call of Delete -func (mr *MockUseCaseMockRecorder) Delete(id interface{}) *gomock.Call { +func (mr *MockManagerMockRecorder) Delete(id interface{}) *gomock.Call { mr.mock.ctrl.T.Helper() - return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockUseCase)(nil).Delete), id) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Delete", reflect.TypeOf((*MockManager)(nil).Delete), id) } diff --git a/domain/usecase/loan/mock/loan.go b/domain/usecase/loan/mock/loan.go index 8369c26..ce46511 100644 --- a/domain/usecase/loan/mock/loan.go +++ b/domain/usecase/loan/mock/loan.go @@ -1,5 +1,5 @@ // Code generated by MockGen. DO NOT EDIT. -// Source: domain/loan/interface.go +// Source: domain/usecase/loan/interface.go // Package mock is a generated GoMock package. package mock diff --git a/domain/usecase/loan/usecase.go b/domain/usecase/loan/usecase.go index 3c2acdb..b759586 100644 --- a/domain/usecase/loan/usecase.go +++ b/domain/usecase/loan/usecase.go @@ -13,7 +13,7 @@ type usecase struct { } //NewUseCase create new use case -func NewUseCase(u user.Repository, b book.Repository) *usecase { +func NewUseCase(u user.Manager, b book.Manager) *usecase { return &usecase{ uService: u, bService: b, diff --git a/domain/usecase/loan/usecase_test.go b/domain/usecase/loan/usecase_test.go index 1a33620..78f0f0e 100644 --- a/domain/usecase/loan/usecase_test.go +++ b/domain/usecase/loan/usecase_test.go @@ -17,8 +17,8 @@ import ( func Test_Borrow(t *testing.T) { controller := gomock.NewController(t) defer controller.Finish() - uMock := umock.NewMockUseCase(controller) - bMock := bmock.NewMockUseCase(controller) + uMock := umock.NewMockManager(controller) + bMock := bmock.NewMockManager(controller) service := NewUseCase(uMock, bMock) t.Run("user not found", func(t *testing.T) { u := user.NewFixtureUser() @@ -69,8 +69,8 @@ func Test_Borrow(t *testing.T) { func Test_Return(t *testing.T) { controller := gomock.NewController(t) defer controller.Finish() - uMock := umock.NewMockUseCase(controller) - bMock := bmock.NewMockUseCase(controller) + uMock := umock.NewMockManager(controller) + bMock := bmock.NewMockManager(controller) service := NewUseCase(uMock, bMock) t.Run("book not found", func(t *testing.T) { b := book.NewFixtureBook() From 2ae9c3982442215c77bbd38f2d79946ef46db7da Mon Sep 17 00:00:00 2001 From: Elton Minetto Date: Tue, 30 Jun 2020 13:37:51 -0300 Subject: [PATCH 3/3] fix: function names --- api/handler/book.go | 10 +++++----- api/middleware/metrics.go | 2 +- domain/entity/book/interface.go | 6 +++--- domain/entity/book/manager.go | 4 ++-- domain/entity/user/interface.go | 6 +++--- domain/entity/user/manager.go | 6 +++--- domain/usecase/loan/usecase.go | 26 +++++++++++++------------- domain/usecase/loan/usecase_test.go | 20 ++++++++++---------- pkg/metric/interface.go | 4 ++-- pkg/metric/prometheus.go | 12 ++++++------ pkg/password/interface.go | 4 ++-- 11 files changed, 50 insertions(+), 50 deletions(-) diff --git a/api/handler/book.go b/api/handler/book.go index afcbd9e..a3947ad 100644 --- a/api/handler/book.go +++ b/api/handler/book.go @@ -163,20 +163,20 @@ func deleteBook(manager book.Manager) http.Handler { } //MakeBookHandlers make url handlers -func MakeBookHandlers(r *mux.Router, n negroni.Negroni, service book.Manager) { +func MakeBookHandlers(r *mux.Router, n negroni.Negroni, manager book.Manager) { r.Handle("/v1/book", n.With( - negroni.Wrap(listBooks(service)), + negroni.Wrap(listBooks(manager)), )).Methods("GET", "OPTIONS").Name("listBooks") r.Handle("/v1/book", n.With( - negroni.Wrap(createBook(service)), + negroni.Wrap(createBook(manager)), )).Methods("POST", "OPTIONS").Name("createBook") r.Handle("/v1/book/{id}", n.With( - negroni.Wrap(getBook(service)), + negroni.Wrap(getBook(manager)), )).Methods("GET", "OPTIONS").Name("getBook") r.Handle("/v1/book/{id}", n.With( - negroni.Wrap(deleteBook(service)), + negroni.Wrap(deleteBook(manager)), )).Methods("DELETE", "OPTIONS").Name("deleteBook") } diff --git a/api/middleware/metrics.go b/api/middleware/metrics.go index 4ea74e6..0d60dbc 100755 --- a/api/middleware/metrics.go +++ b/api/middleware/metrics.go @@ -10,7 +10,7 @@ import ( ) //Metrics to prometheus -func Metrics(mService metric.UseCase) negroni.HandlerFunc { +func Metrics(mService metric.Service) negroni.HandlerFunc { return func(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) { appMetric := metric.NewHTTP(r.URL.Path, r.Method) appMetric.Started() diff --git a/domain/entity/book/interface.go b/domain/entity/book/interface.go index 613ef6d..233e6cb 100644 --- a/domain/entity/book/interface.go +++ b/domain/entity/book/interface.go @@ -16,13 +16,13 @@ type Writer interface { Delete(id entity.ID) error } -//Repository repository interface -type Repository interface { +//repository interface +type repository interface { Reader Writer } //Manager interface type Manager interface { - Repository + repository } diff --git a/domain/entity/book/manager.go b/domain/entity/book/manager.go index e56a3af..893dc2b 100644 --- a/domain/entity/book/manager.go +++ b/domain/entity/book/manager.go @@ -8,11 +8,11 @@ import ( ) type manager struct { - repo Repository + repo repository } //NewManager create new manager -func NewManager(r Repository) *manager { +func NewManager(r repository) *manager { return &manager{ repo: r, } diff --git a/domain/entity/user/interface.go b/domain/entity/user/interface.go index 0fe933d..edecb79 100644 --- a/domain/entity/user/interface.go +++ b/domain/entity/user/interface.go @@ -16,13 +16,13 @@ type Writer interface { Delete(id entity.ID) error } -//Repository repository interface -type Repository interface { +//repository interface +type repository interface { Reader Writer } //Manager interface type Manager interface { - Repository + repository } diff --git a/domain/entity/user/manager.go b/domain/entity/user/manager.go index b6527e0..117c16e 100644 --- a/domain/entity/user/manager.go +++ b/domain/entity/user/manager.go @@ -13,12 +13,12 @@ import ( //manager interface type manager struct { - repo Repository - pwd password.UseCase + repo repository + pwd password.Service } //NewManager create new repository -func NewManager(r Repository, pwd password.UseCase) *manager { +func NewManager(r repository, pwd password.Service) *manager { return &manager{ repo: r, pwd: pwd, diff --git a/domain/usecase/loan/usecase.go b/domain/usecase/loan/usecase.go index b759586..7daa7d0 100644 --- a/domain/usecase/loan/usecase.go +++ b/domain/usecase/loan/usecase.go @@ -8,25 +8,25 @@ import ( ) type usecase struct { - uService user.Repository - bService book.Repository + uManager user.Manager + bManager book.Manager } //NewUseCase create new use case func NewUseCase(u user.Manager, b book.Manager) *usecase { return &usecase{ - uService: u, - bService: b, + uManager: u, + bManager: b, } } //Borrow borrow a book to an user func (s *usecase) Borrow(u *user.User, b *book.Book) error { - u, err := s.uService.Get(u.ID) + u, err := s.uManager.Get(u.ID) if err != nil { return err } - b, err = s.bService.Get(b.ID) + b, err = s.bManager.Get(b.ID) if err != nil { return err } @@ -39,12 +39,12 @@ func (s *usecase) Borrow(u *user.User, b *book.Book) error { } } u.Books = append(u.Books, b.ID) - err = s.uService.Update(u) + err = s.uManager.Update(u) if err != nil { return err } b.Quantity-- - err = s.bService.Update(b) + err = s.bManager.Update(b) if err != nil { return err } @@ -53,12 +53,12 @@ func (s *usecase) Borrow(u *user.User, b *book.Book) error { //Return return a book func (s *usecase) Return(b *book.Book) error { - b, err := s.bService.Get(b.ID) + b, err := s.bManager.Get(b.ID) if err != nil { return err } - all, err := s.uService.List() + all, err := s.uManager.List() if err != nil { return err } @@ -76,14 +76,14 @@ func (s *usecase) Return(b *book.Book) error { if !borrowed { return domain.ErrBookNotBorrowed } - u, err := s.uService.Get(borrowedBy) + u, err := s.uManager.Get(borrowedBy) if err != nil { return err } for i, j := range u.Books { if j == b.ID { u.Books = append(u.Books[:i], u.Books[i+1:]...) - err = s.uService.Update(u) + err = s.uManager.Update(u) if err != nil { return err } @@ -91,7 +91,7 @@ func (s *usecase) Return(b *book.Book) error { } } b.Quantity++ - err = s.bService.Update(b) + err = s.bManager.Update(b) if err != nil { return err } diff --git a/domain/usecase/loan/usecase_test.go b/domain/usecase/loan/usecase_test.go index 78f0f0e..233b02d 100644 --- a/domain/usecase/loan/usecase_test.go +++ b/domain/usecase/loan/usecase_test.go @@ -19,12 +19,12 @@ func Test_Borrow(t *testing.T) { defer controller.Finish() uMock := umock.NewMockManager(controller) bMock := bmock.NewMockManager(controller) - service := NewUseCase(uMock, bMock) + uc := NewUseCase(uMock, bMock) t.Run("user not found", func(t *testing.T) { u := user.NewFixtureUser() b := book.NewFixtureBook() uMock.EXPECT().Get(u.ID).Return(nil, domain.ErrNotFound) - err := service.Borrow(u, b) + err := uc.Borrow(u, b) assert.Equal(t, domain.ErrNotFound, err) }) t.Run("book not found", func(t *testing.T) { @@ -32,7 +32,7 @@ func Test_Borrow(t *testing.T) { b := book.NewFixtureBook() uMock.EXPECT().Get(u.ID).Return(u, nil) bMock.EXPECT().Get(b.ID).Return(nil, domain.ErrNotFound) - err := service.Borrow(u, b) + err := uc.Borrow(u, b) assert.Equal(t, domain.ErrNotFound, err) }) t.Run("not enough books to borrow", func(t *testing.T) { @@ -41,7 +41,7 @@ func Test_Borrow(t *testing.T) { b.Quantity = 0 uMock.EXPECT().Get(u.ID).Return(u, nil) bMock.EXPECT().Get(b.ID).Return(b, nil) - err := service.Borrow(u, b) + err := uc.Borrow(u, b) assert.Equal(t, domain.ErrNotEnoughBooks, err) }) t.Run("book already borrowed", func(t *testing.T) { @@ -51,7 +51,7 @@ func Test_Borrow(t *testing.T) { b.Quantity = 1 uMock.EXPECT().Get(u.ID).Return(u, nil) bMock.EXPECT().Get(b.ID).Return(b, nil) - err := service.Borrow(u, b) + err := uc.Borrow(u, b) assert.Equal(t, domain.ErrBookAlreadyBorrowed, err) }) t.Run("sucess", func(t *testing.T) { @@ -61,7 +61,7 @@ func Test_Borrow(t *testing.T) { bMock.EXPECT().Get(b.ID).Return(b, nil) uMock.EXPECT().Update(u).Return(nil) bMock.EXPECT().Update(b).Return(nil) - err := service.Borrow(u, b) + err := uc.Borrow(u, b) assert.Nil(t, err) }) } @@ -71,11 +71,11 @@ func Test_Return(t *testing.T) { defer controller.Finish() uMock := umock.NewMockManager(controller) bMock := bmock.NewMockManager(controller) - service := NewUseCase(uMock, bMock) + uc := NewUseCase(uMock, bMock) t.Run("book not found", func(t *testing.T) { b := book.NewFixtureBook() bMock.EXPECT().Get(b.ID).Return(nil, domain.ErrNotFound) - err := service.Return(b) + err := uc.Return(b) assert.Equal(t, domain.ErrNotFound, err) }) t.Run("book not borrowed", func(t *testing.T) { @@ -83,7 +83,7 @@ func Test_Return(t *testing.T) { b := book.NewFixtureBook() bMock.EXPECT().Get(b.ID).Return(b, nil) uMock.EXPECT().List().Return([]*user.User{u}, nil) - err := service.Return(b) + err := uc.Return(b) assert.Equal(t, domain.ErrBookNotBorrowed, err) }) t.Run("success", func(t *testing.T) { @@ -95,7 +95,7 @@ func Test_Return(t *testing.T) { uMock.EXPECT().List().Return([]*user.User{u}, nil) uMock.EXPECT().Update(u).Return(nil) bMock.EXPECT().Update(b).Return(nil) - err := service.Return(b) + err := uc.Return(b) assert.Nil(t, err) }) } diff --git a/pkg/metric/interface.go b/pkg/metric/interface.go index b270be3..02a5f98 100755 --- a/pkg/metric/interface.go +++ b/pkg/metric/interface.go @@ -57,8 +57,8 @@ func (h *HTTP) Finished() { h.Duration = time.Since(h.StartedAt).Seconds() } -//UseCase definition -type UseCase interface { +//Service definition +type Service interface { SaveCLI(c *CLI) error SaveHTTP(h *HTTP) } diff --git a/pkg/metric/prometheus.go b/pkg/metric/prometheus.go index 2362d73..f56f1fb 100755 --- a/pkg/metric/prometheus.go +++ b/pkg/metric/prometheus.go @@ -6,14 +6,14 @@ import ( "github.com/prometheus/client_golang/prometheus/push" ) -//Service implements UseCase interface -type Service struct { +//service implements Service interface +type service struct { pHistogram *prometheus.HistogramVec httpRequestHistogram *prometheus.HistogramVec } //NewPrometheusService create a new prometheus service -func NewPrometheusService() (*Service, error) { +func NewPrometheusService() (*service, error) { cli := prometheus.NewHistogramVec(prometheus.HistogramOpts{ Namespace: "pushgateway", Name: "cmd_duration_seconds", @@ -27,7 +27,7 @@ func NewPrometheusService() (*Service, error) { Buckets: prometheus.DefBuckets, }, []string{"handler", "method", "code"}) - s := &Service{ + s := &service{ pHistogram: cli, httpRequestHistogram: http, } @@ -43,13 +43,13 @@ func NewPrometheusService() (*Service, error) { } //SaveCLI send metrics to server -func (s *Service) SaveCLI(c *CLI) error { +func (s *service) SaveCLI(c *CLI) error { gatewayURL := config.PROMETHEUS_PUSHGATEWAY s.pHistogram.WithLabelValues(c.Name).Observe(c.Duration) return push.New(gatewayURL, "cmd_job").Collector(s.pHistogram).Push() } //SaveHTTP send metrics to server -func (s *Service) SaveHTTP(h *HTTP) { +func (s *service) SaveHTTP(h *HTTP) { s.httpRequestHistogram.WithLabelValues(h.Handler, h.Method, h.StatusCode).Observe(h.Duration) } diff --git a/pkg/password/interface.go b/pkg/password/interface.go index ba8c7e3..e1af482 100644 --- a/pkg/password/interface.go +++ b/pkg/password/interface.go @@ -1,7 +1,7 @@ package password -//UseCase interface -type UseCase interface { +//Service interface +type Service interface { Generate(raw string) (string, error) Compare(p1, p2 string) error }