package middleware import ( "dk/internal/auth" "dk/internal/models/users" "dk/internal/router" "dk/internal/session" "github.com/valyala/fasthttp" ) func Auth(authManager *auth.AuthManager) router.Middleware { return func(next router.Handler) router.Handler { return func(ctx router.Ctx, params []string) { sessionID := auth.GetSessionCookie(ctx) if sessionID != "" { if sess, exists := authManager.GetSession(sessionID); exists { authManager.UpdateSession(sessionID) user, err := users.Find(sess.UserID) if err == nil && user != nil { ctx.SetUserValue("session", sess) ctx.SetUserValue("user", user) auth.SetSessionCookie(ctx, sessionID) } } } next(ctx, params) } } } func RequireAuth(paths ...string) router.Middleware { redirect := "/login" if len(paths) > 0 && paths[0] != "" { redirect = paths[0] } return func(next router.Handler) router.Handler { return func(ctx router.Ctx, params []string) { if !IsAuthenticated(ctx) { ctx.Redirect(redirect, fasthttp.StatusFound) return } user := ctx.UserValue("user").(*users.User) user.UpdateLastOnline() user.Save() next(ctx, params) } } } func RequireGuest(paths ...string) router.Middleware { redirect := "/" if len(paths) > 0 && paths[0] != "" { redirect = paths[0] } return func(next router.Handler) router.Handler { return func(ctx router.Ctx, params []string) { if IsAuthenticated(ctx) { ctx.Redirect(redirect, fasthttp.StatusFound) return } next(ctx, params) } } } func IsAuthenticated(ctx router.Ctx) bool { _, exists := ctx.UserValue("user").(*users.User) return exists } func GetCurrentUser(ctx router.Ctx) *users.User { if user, ok := ctx.UserValue("user").(*users.User); ok { return user } return nil } func GetCurrentSession(ctx router.Ctx) *session.Session { if sess, ok := ctx.UserValue("session").(*session.Session); ok { return sess } return nil } func Login(ctx router.Ctx, authManager *auth.AuthManager, user *users.User) { sess := authManager.CreateSession(user) auth.SetSessionCookie(ctx, sess.ID) ctx.SetUserValue("session", sess) ctx.SetUserValue("user", user) } func Logout(ctx router.Ctx, authManager *auth.AuthManager) { sessionID := auth.GetSessionCookie(ctx) if sessionID != "" { authManager.DeleteSession(sessionID) } auth.DeleteSessionCookie(ctx) ctx.SetUserValue("session", nil) ctx.SetUserValue("user", nil) }