feat: add password and fix errors

This commit is contained in:
Elton Minetto
2020-06-29 13:38:13 -03:00
parent 328b4e428c
commit d4b9b713e4
12 changed files with 246 additions and 21 deletions
+111 -4
View File
@@ -4,6 +4,8 @@ import (
"database/sql"
"time"
"github.com/eminetto/clean-architecture-go-v2/domain"
"github.com/eminetto/clean-architecture-go-v2/domain/entity"
)
@@ -47,26 +49,131 @@ func (r *MySQLRepo) Create(e *User) (entity.ID, error) {
//Get an user
func (r *MySQLRepo) Get(id entity.ID) (*User, error) {
return nil, nil
return getUser(id, r.db)
}
func getUser(id entity.ID, db *sql.DB) (*User, error) {
stmt, err := db.Prepare(`select id, email, first_name, last_name, created_at from user where id = ?`)
if err != nil {
return nil, err
}
var u User
rows, err := stmt.Query(id)
if err != nil {
return nil, err
}
for rows.Next() {
err = rows.Scan(&u.ID, &u.Email, &u.FirstName, &u.LastName, &u.CreatedAt)
}
stmt, err = db.Prepare(`select book_id from book_user where user_id = ?`)
if err != nil {
return nil, err
}
rows, err = stmt.Query(id)
if err != nil {
return nil, err
}
for rows.Next() {
var i entity.ID
err = rows.Scan(&i)
u.Books = append(u.Books, i)
}
return &u, nil
}
//Update an user
func (r *MySQLRepo) Update(e *User) error {
e.UpdatedAt = time.Now()
_, err := r.db.Exec("update user set email = ?, password = ?, first_name = ?, last_name = ?, updated_at = ? where id = ?", e.Email, e.Password, e.FirstName, e.LastName, e.UpdatedAt.Format("2006-01-02"), e.ID)
if err != nil {
return err
}
_, err = r.db.Exec("delete from book_user where user_id = ?", e.ID)
if err != nil {
return err
}
for _, b := range e.Books {
_, err := r.db.Exec("insert into book_user values(?,?,?)", e.ID, b, time.Now().Format("2006-01-02"))
if err != nil {
return err
}
}
return nil
}
//Search users
func (r *MySQLRepo) Search(query string) ([]*User, error) {
return nil, nil
stmt, err := r.db.Prepare(`select id from user where name like ?`)
if err != nil {
return nil, err
}
defer stmt.Close()
var ids []entity.ID
rows, err := stmt.Query()
if err != nil {
return nil, err
}
for rows.Next() {
var i entity.ID
err = rows.Scan(&i)
if err != nil {
return nil, err
}
ids = append(ids, i)
}
if len(ids) == 0 {
return nil, domain.ErrNotFound
}
var users []*User
for _, id := range ids {
u, err := getUser(id, r.db)
if err != nil {
return nil, err
}
users = append(users, u)
}
return users, nil
}
//List users
func (r *MySQLRepo) List() ([]*User, error) {
return nil, nil
stmt, err := r.db.Prepare(`select id from user`)
if err != nil {
return nil, err
}
defer stmt.Close()
var ids []entity.ID
rows, err := stmt.Query()
if err != nil {
return nil, err
}
for rows.Next() {
var i entity.ID
err = rows.Scan(&i)
if err != nil {
return nil, err
}
ids = append(ids, i)
}
if len(ids) == 0 {
return nil, domain.ErrNotFound
}
var users []*User
for _, id := range ids {
u, err := getUser(id, r.db)
if err != nil {
return nil, err
}
users = append(users, u)
}
return users, nil
}
//Delete an user
func (r *MySQLRepo) Delete(id entity.ID) error {
_, err := r.db.Exec("delete from user where id = ?", id)
if err != nil {
return err
}
return nil
}
+10 -1
View File
@@ -4,18 +4,22 @@ import (
"strings"
"time"
"github.com/eminetto/clean-architecture-go-v2/pkg/password"
"github.com/eminetto/clean-architecture-go-v2/domain/entity"
)
//Service service interface
type Service struct {
repo Repository
pwd password.UseCase
}
//NewService create new use case
func NewService(r Repository) *Service {
func NewService(r Repository, pwd password.UseCase) *Service {
return &Service{
repo: r,
pwd: pwd,
}
}
@@ -23,6 +27,11 @@ func NewService(r Repository) *Service {
func (s *Service) Create(e *User) (entity.ID, error) {
e.ID = entity.NewID()
e.CreatedAt = time.Now()
pwd, err := s.pwd.Generate(e.Password)
if err != nil {
return e.ID, err
}
e.Password = pwd
return s.repo.Create(e)
}
+6 -4
View File
@@ -3,6 +3,8 @@ package user
import (
"testing"
"github.com/eminetto/clean-architecture-go-v2/pkg/password"
"github.com/eminetto/clean-architecture-go-v2/domain"
"github.com/eminetto/clean-architecture-go-v2/domain/entity"
@@ -11,7 +13,7 @@ import (
func Test_Create(t *testing.T) {
repo := NewInmemRepository()
service := NewService(repo)
service := NewService(repo, password.NewFakeService())
u := NewFixtureUser()
id, err := service.Create(u)
assert.Nil(t, err)
@@ -22,7 +24,7 @@ func Test_Create(t *testing.T) {
func Test_SearchAndFind(t *testing.T) {
repo := NewInmemRepository()
service := NewService(repo)
service := NewService(repo, password.NewFakeService())
u1 := NewFixtureUser()
u2 := NewFixtureUser()
u2.FirstName = "Lemmy"
@@ -55,7 +57,7 @@ func Test_SearchAndFind(t *testing.T) {
func Test_Update(t *testing.T) {
repo := NewInmemRepository()
service := NewService(repo)
service := NewService(repo, password.NewFakeService())
u := NewFixtureUser()
id, err := service.Create(u)
assert.Nil(t, err)
@@ -72,7 +74,7 @@ func Test_Update(t *testing.T) {
func TestDelete(t *testing.T) {
repo := NewInmemRepository()
service := NewService(repo)
service := NewService(repo, password.NewFakeService())
u1 := NewFixtureUser()
u2 := NewFixtureUser()
u2ID, _ := service.Create(u2)