From 64b7b21437aaffd9353eaf98be0689c87450cc36 Mon Sep 17 00:00:00 2001 From: Denis Arh Date: Fri, 6 Jul 2018 09:33:18 +0200 Subject: [PATCH] Implement user login & search Took 21 minutes --- sam/user.go | 37 +++++++++++++++++++++++++++++++++++-- sam/user.structs.go | 5 +++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/sam/user.go b/sam/user.go index a00435d97..801364e45 100644 --- a/sam/user.go +++ b/sam/user.go @@ -2,13 +2,46 @@ package sam import ( "github.com/pkg/errors" + "github.com/titpetric/factory" ) var _ = errors.Wrap +// User lookup & login func (*User) Login(r *userLoginRequest) (interface{}, error) { - return nil, errors.New("Not implemented: User.login") + db, err := factory.Database.Get() + if err != nil { + return nil, err + } + + u := &User{} + if err != db.Get(u, "SELECT * FROM users WHERE username = ?", r.username) { + return nil, err + } + + if u.ID == 0 || !u.ValidatePassword(r.password) { + return nil, errors.New("Invalid username and password combination") + } + + if !u.CanLogin() { + return nil, errors.New("User is not allowed to login") + } + + return u, nil } + +// Searches the users table in the database to find users by matching (by-prefix) their username func (*User) Search(r *userSearchRequest) (interface{}, error) { - return nil, errors.New("Not implemented: User.search") + db, err := factory.Database.Get() + if err != nil { + return nil, err + } + + uu := []*User{} + + if err != db.Get(uu, "SELECT * FROM users WHERE username LIKE ?", r.query+"%") { + return nil, err + } + + return uu, nil } diff --git a/sam/user.structs.go b/sam/user.structs.go index 4d0d1b814..430b4a9fb 100644 --- a/sam/user.structs.go +++ b/sam/user.structs.go @@ -17,6 +17,11 @@ func (User) new() *User { return &User{} } +// Basic user validation +func (u *User) CanLogin() bool { + return u.ID > 0 +} + func (u *User) GetID() uint64 { return u.ID }