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{} loginRoute := "/login" logoutRoute := "/logout" e.GET(loginRoute, c.LoginGet) e.POST(loginRoute, c.LoginPost) e.GET(logoutRoute, 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, Secure: 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") }