Skip to content

Commit

Permalink
create user functions and login routes
Browse files Browse the repository at this point in the history
  • Loading branch information
ErfiDev committed Nov 30, 2021
1 parent 8557fe5 commit a37a0ae
Show file tree
Hide file tree
Showing 7 changed files with 188 additions and 0 deletions.
47 changes: 47 additions & 0 deletions controllers/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -394,4 +394,51 @@ func (r Repository) SearchAvailability(res http.ResponseWriter , req *http.Reque
res.Write(toJson)
}
}
}

func (r Repository) Login(res http.ResponseWriter , req *http.Request) {
utils.RenderTemplate(res , req , "login.page.gohtml" , &models.TmpData{
Data: map[string]interface{}{
"path": "/login",
"title": "login in account",
},
})
}

func (r Repository) LoginPost(res http.ResponseWriter , req *http.Request) {
err := req.ParseForm()
if err != nil {
utils.ServerError(res , err)
return
}

user := models.User{
FirstName: req.Form.Get("first_name"),
LastName: req.Form.Get("last_name"),
Email: req.Form.Get("email"),
Password: req.Form.Get("password"),
AccessLevel: 0,
}

form := forms.New(req.PostForm)

form.Has("first_name" , req)
form.Has("last_name" , req)
form.Has("email" , req)
form.Has("password" , req)

if !form.Valid() {
data := make(map[string]interface{})
data["title"] = "login in account"
data["path"] = "/login"
data["user"] = user

utils.RenderTemplate(res , req , "login.page.gohtml" , &models.TmpData{
Data: data,
Form: form,
})
return
} else {

}
}
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ require (
github.com/jackc/pgx/v4 v4.13.0
github.com/joho/godotenv v1.4.0
github.com/justinas/nosurf v1.1.1
golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871 // indirect
)
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,8 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871 h1:/pEO3GD/ABYAjuakUS6xSEmmlyVS4kxBNkeA9tLJiTI=
golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
Expand All @@ -140,6 +142,7 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
Expand All @@ -152,6 +155,7 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
Expand Down
117 changes: 117 additions & 0 deletions repository/dbrepo/dbrepo.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ package dbrepo
import (
"context"
"database/sql"
"errors"
"github.com/erfidev/hotel-web-app/config"
"github.com/erfidev/hotel-web-app/models"
"github.com/erfidev/hotel-web-app/repository"
"golang.org/x/crypto/bcrypt"
"time"
)

Expand Down Expand Up @@ -166,4 +168,119 @@ func (psdb postgresDbRepo) FindRoomById(id int) (models.Room,error){
}

return room , nil
}

func (psdb postgresDbRepo) InsertUser(user models.User) (bool , error) {
ctx , cancel := context.WithTimeout(context.Background() , 3 * time.Second)
defer cancel()


query := `
insert into users (first_name , last_name , email , password , access_level)
values ($1 , $2 , $3 , $4 , $5);
`

hashPass , err := bcrypt.GenerateFromPassword([]byte(user.Password) , 10)
if err != nil {
return false , err
}

_ , err = psdb.DB.ExecContext(ctx , query ,
user.FirstName ,
user.LastName ,
user.Email ,
hashPass ,
user.AccessLevel,
)

if err != nil {
return false , err
}

return true , nil
}

func (psdb postgresDbRepo) GetUserById(id int) (models.User , error) {
ctx , cancel := context.WithTimeout(context.Background() , 3 * time.Second)
defer cancel()

query := `
select id ,first_name,last_name,email,password,access_level from users
where id = $1
`

var user models.User

row := psdb.DB.QueryRowContext(ctx , query , id)
err := row.Scan(
&user.ID,
&user.FirstName,
&user.LastName,
&user.Email,
&user.Password,
&user.AccessLevel,
)

if err != nil {
return models.User{} , err
}

return user , nil
}

func (psdb postgresDbRepo) Authenticate(email , password string) (bool , error) {
ctx , cancel := context.WithTimeout(context.Background() , 3 * time.Second)
defer cancel()

query := `
select password from users
where email = $1
`

var pass string

row := psdb.DB.QueryRowContext(ctx , query , email)

err := row.Scan(&pass)
if err != nil {
return false , err
}

// check passwords
hashError := bcrypt.CompareHashAndPassword([]byte(pass) , []byte(password))
if hashError == bcrypt.ErrMismatchedHashAndPassword {
return false , errors.New("mismatched hash and password")
} else if hashError != nil {
return false , hashError
}

return true , nil
}

func (psdb postgresDbRepo) UpdateUser(user models.User) (bool , error) {
ctx , cancel := context.WithTimeout(context.Background() , 3 * time.Second)
defer cancel()

query := `
update users set first_name = $1, last_name = $2, email = $3, password = $4 , access_level = $5
`

hashPass , err := bcrypt.GenerateFromPassword([]byte(user.Password) , 10)
if err != nil {
return false , err
}

_ , errOnExec := psdb.DB.ExecContext(ctx , query ,
user.FirstName,
user.LastName,
user.Email,
hashPass,
user.AccessLevel,
)

if errOnExec != nil {
return false , errOnExec
}

return true , nil
}
4 changes: 4 additions & 0 deletions repository/repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,8 @@ type DatabaseRepository interface {
SearchAvailability(roomId int, start , end time.Time) (bool , error)
SearchAvailabilityForAllRooms(start , end time.Time) ([]models.Room , error)
FindRoomById(id int) (models.Room,error)
InsertUser(user models.User) (bool , error)
GetUserById(id int) (models.User , error)
Authenticate(email , password string) (bool , error)
UpdateUser(user models.User) (bool , error)
}
2 changes: 2 additions & 0 deletions routes/routes.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,13 @@ func Routes() http.Handler {
router.Handle("/static/*" , http.StripPrefix("/static" , fileServer))
router.Get("/reservation-summary" , controllers.Repo.ReservationSummary)
router.Get("/choose-room/{id}" , controllers.Repo.ChooseRoom)
router.Get("/login" , controllers.Repo.Login)

// POST routes
router.Post("/book-now" , controllers.Repo.BookNowPost)
router.Post("/make-reservation" , controllers.Repo.MakeReservationPost)
router.Post("/search-availability" , controllers.Repo.SearchAvailability)
router.Post("/login" , controllers.Repo.LoginPost)

// Custom 404 page
router.NotFound(NotFound)
Expand Down
13 changes: 13 additions & 0 deletions views/base.layout.gohtml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,19 @@
</a>
</li>
{{end}}
{{if eq $path "/login"}}
<li class="header-ul-option header-login used">
<a href="/login">
Login
</a>
</li>
{{else}}
<li class="header-ul-option header-login">
<a href="/login">
Login
</a>
</li>
{{end}}
</ul>
</header>

Expand Down

0 comments on commit a37a0ae

Please sign in to comment.