// Copyright (c) 2025 Nikolai Papin // // This file is part of Easywish // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See // the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . package middleware import ( "easywish/internal/dto" "easywish/internal/utils/enums" "easywish/internal/validation" "fmt" "net/http" "github.com/gin-gonic/gin" "github.com/go-playground/validator/v10" ) const requestKey = "request" // Deprecated: no longer used, embedded into controllers.GetRequest instead func ClientInfoFromContext(c *gin.Context) (*dto.ClientInfo, bool) { var ok bool ip := c.ClientIP() userAgent := c.Request.UserAgent() sessionInfoFromCtx, ok := c.Get("session_info"); if !ok { return nil, false } sessionInfo := sessionInfoFromCtx.(dto.SessionInfo) if sessionInfo.Username == "" { return &dto.ClientInfo{ SessionInfo: sessionInfo, IP: ip, UserAgent: userAgent, }, true } return &dto.ClientInfo{ SessionInfo: sessionInfo, IP: ip, UserAgent: userAgent, }, true } // Deprecated: no longer used, see controllers.GetRequest func RequestFromContext[T any](c *gin.Context) dto.Request[T] { return c.Value(requestKey).(dto.Request[T]) } // Deprecated: no longer used, see controllers.GetRequest func RequestMiddleware[T any](role enums.Role) gin.HandlerFunc { return gin.HandlerFunc(func(c *gin.Context) { clientInfo, ok := ClientInfoFromContext(c) if !ok { c.Status(http.StatusUnauthorized) return } if clientInfo.Role < role { c.Status(http.StatusForbidden) return } var body T if err := c.ShouldBindJSON(&body); err != nil { c.String(http.StatusBadRequest, err.Error()) return } validate := validation.NewValidator() if err := validate.Struct(body); err != nil { errorList := err.(validator.ValidationErrors) c.String(http.StatusBadRequest, fmt.Sprintf("Validation error: %s", errorList)) return } request := dto.Request[T]{ User: *clientInfo, Body: body, } c.Set(requestKey, request) c.Next() }) }