I have put too much code into the same files. Also, I put everything into the same package: main. This package is only meant for executables. Therefore, I have refactored my code to use multiple packages. These packages also guarantee separation of concerns since Golang doesn't allow cyclic imports.
52 lines
1.1 KiB
Go
52 lines
1.1 KiB
Go
package middleware
|
|
|
|
import (
|
|
"database/sql"
|
|
"net/http"
|
|
"time"
|
|
|
|
"git.ekzyis.com/ekzyis/delphi.market/db"
|
|
"github.com/labstack/echo/v4"
|
|
)
|
|
|
|
func Session(envVars map[string]any) echo.MiddlewareFunc {
|
|
return func(next echo.HandlerFunc) echo.HandlerFunc {
|
|
return func(c echo.Context) error {
|
|
var (
|
|
cookie *http.Cookie
|
|
err error
|
|
s *db.Session
|
|
u *db.User
|
|
)
|
|
if cookie, err = c.Cookie("session"); err != nil {
|
|
// cookie not found
|
|
return next(c)
|
|
}
|
|
s = &db.Session{SessionId: cookie.Value}
|
|
if err = db.FetchSession(s); err == nil {
|
|
// session found
|
|
u = &db.User{Pubkey: s.Pubkey, LastSeen: time.Now()}
|
|
if err = db.UpdateUser(u); err != nil {
|
|
return err
|
|
}
|
|
c.Set("session", *u)
|
|
} else if err != sql.ErrNoRows {
|
|
return err
|
|
}
|
|
return next(c)
|
|
}
|
|
}
|
|
}
|
|
|
|
func SessionGuard(envVars map[string]any) echo.MiddlewareFunc {
|
|
return func(next echo.HandlerFunc) echo.HandlerFunc {
|
|
return func(c echo.Context) error {
|
|
session := c.Get("session")
|
|
if session == nil {
|
|
return c.Redirect(http.StatusTemporaryRedirect, "/login")
|
|
}
|
|
return next(c)
|
|
}
|
|
}
|
|
}
|