70 lines
1.5 KiB
Go
70 lines
1.5 KiB
Go
package auth
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/gorilla/sessions"
|
|
"github.com/labstack/echo-contrib/session"
|
|
"github.com/labstack/echo/v4"
|
|
"gitnet.fr/deblan/budget/backend/view"
|
|
"gitnet.fr/deblan/budget/backend/view/template/auth"
|
|
"gitnet.fr/deblan/budget/database/manager"
|
|
"gitnet.fr/deblan/budget/database/model"
|
|
)
|
|
|
|
type Controller struct {
|
|
}
|
|
|
|
func New(e *echo.Echo) *Controller {
|
|
c := Controller{}
|
|
|
|
e.GET("/login", c.LoginGet)
|
|
e.POST("/login", c.LoginPost)
|
|
e.GET("/logout", c.LogoutGet)
|
|
|
|
return &c
|
|
}
|
|
|
|
func (ctrl *Controller) LoginGet(c echo.Context) error {
|
|
return view.Render(c, 200, auth.Page(false))
|
|
}
|
|
|
|
func (ctrl *Controller) LoginPost(c echo.Context) error {
|
|
username := c.FormValue("username")
|
|
password := c.FormValue("password")
|
|
|
|
var count int64
|
|
db := manager.Get()
|
|
db.Db.Model(model.User{}).Where("username = ?", username).Count(&count)
|
|
|
|
if count > 0 {
|
|
var user model.User
|
|
db.Db.Model(model.User{}).Where("username = ?", username).Find(&user)
|
|
|
|
if user.HasPassword(password) {
|
|
user.LoggedAt = time.Now()
|
|
db.Db.Save(user)
|
|
|
|
sess, _ := session.Get("session", c)
|
|
sess.Options = &sessions.Options{
|
|
Path: "/",
|
|
MaxAge: 3600 * 24 * 2,
|
|
HttpOnly: true,
|
|
}
|
|
sess.Values["user"] = user.ID
|
|
sess.Save(c.Request(), c.Response())
|
|
|
|
return c.Redirect(302, "/")
|
|
}
|
|
}
|
|
|
|
return view.Render(c, 200, auth.Page(true))
|
|
}
|
|
|
|
func (ctrl *Controller) LogoutGet(c echo.Context) error {
|
|
sess, _ := session.Get("session", c)
|
|
sess.Values["user"] = nil
|
|
sess.Save(c.Request(), c.Response())
|
|
|
|
return c.Redirect(302, "/login")
|
|
}
|