add RealUserMiddleware and update resource retrieval to track real users

This commit is contained in:
2025-09-01 17:40:57 +08:00
parent f067e802a2
commit 44b876ba0e
5 changed files with 29 additions and 7 deletions

View File

@@ -21,6 +21,8 @@ func main() {
app.Use(middleware.ErrorHandler)
app.Use(middleware.RealUserMiddleware)
app.Use(middleware.JwtMiddleware)
app.Use(middleware.FrontendMiddleware)

View File

@@ -56,7 +56,7 @@ func handleGetResource(c fiber.Ctx) error {
return model.NewRequestError("Invalid resource ID")
}
host := c.Hostname()
resource, err := service.GetResource(uint(id), host)
resource, err := service.GetResource(uint(id), host, c)
if err != nil {
return err
}

View File

@@ -79,7 +79,7 @@ func serveIndexHtml(c fiber.Ctx) error {
idStr := strings.TrimPrefix(path, "/resources/")
id, err := strconv.Atoi(idStr)
if err == nil {
r, err := service.GetResource(uint(id), c.Hostname())
r, err := service.GetResource(uint(id), c.Hostname(), c)
if err == nil {
if len(r.Images) > 0 {
preview = fmt.Sprintf("%s/api/image/%d", serverBaseURL, r.Images[0].ID)

View File

@@ -0,0 +1,17 @@
package middleware
import (
"strings"
"github.com/gofiber/fiber/v3"
)
func RealUserMiddleware(c fiber.Ctx) error {
userAgent := c.Get("User-Agent")
if strings.Contains(userAgent, "Mozilla") || strings.Contains(userAgent, "AppleWebKit") {
c.Locals("real_user", true)
} else {
c.Locals("real_user", false)
}
return c.Next()
}

View File

@@ -8,6 +8,7 @@ import (
"strconv"
"strings"
"github.com/gofiber/fiber/v3"
"github.com/gofiber/fiber/v3/log"
"gorm.io/gorm"
@@ -122,14 +123,16 @@ func parseResourceIfPresent(line string, host string) *model.ResourceView {
return &v
}
func GetResource(id uint, host string) (*model.ResourceDetailView, error) {
func GetResource(id uint, host string, ctx fiber.Ctx) (*model.ResourceDetailView, error) {
r, err := dao.GetResourceByID(id)
if err != nil {
return nil, err
}
err = dao.AddResourceViewCount(id)
if err != nil {
log.Error("AddResourceViewCount error: ", err)
if ctx != nil && ctx.Locals("real_user") == true {
err = dao.AddResourceViewCount(id)
if err != nil {
log.Error("AddResourceViewCount error: ", err)
}
}
v := r.ToDetailView()
if host != "" {
@@ -177,7 +180,7 @@ func DeleteResource(uid, id uint) error {
return model.NewUnAuthorizedError("You have not permission to delete this resource")
}
}
r, err := GetResource(id, "")
r, err := GetResource(id, "", nil)
if err != nil {
return err
}