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)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |