Add Random resource retrieval and navigation.

This commit is contained in:
2025-06-08 17:49:49 +08:00
parent b0680fa94f
commit 99a2d328f1
9 changed files with 132 additions and 10 deletions

View File

@@ -251,12 +251,28 @@ func handleUpdateResource(c fiber.Ctx) error {
})
}
func handleGetRandomResource(c fiber.Ctx) error {
resource, err := service.RandomResource()
if err != nil {
return err
}
if resource == nil {
return model.NewNotFoundError("No resources found")
}
return c.Status(fiber.StatusOK).JSON(model.Response[model.ResourceDetailView]{
Success: true,
Data: *resource,
Message: "Random resource retrieved successfully",
})
}
func AddResourceRoutes(api fiber.Router) {
resource := api.Group("/resource")
{
resource.Post("/", handleCreateResource)
resource.Get("/search", handleSearchResources)
resource.Get("/", handleListResources)
resource.Get("/random", handleGetRandomResource)
resource.Get("/:id", handleGetResource)
resource.Delete("/:id", handleDeleteResource)
resource.Get("/tag/:tag", handleListResourcesWithTag)

View File

@@ -3,6 +3,7 @@ package dao
import (
"errors"
"github.com/gofiber/fiber/v3/log"
"math/rand"
"nysoure/server/model"
"strings"
"sync"
@@ -510,3 +511,27 @@ func AddResourceDownloadCount(id uint) error {
stats.downloads.Add(1)
return nil
}
func RandomResource() (model.Resource, error) {
var maxID int64
if err := db.Model(&model.Resource{}).Select("MAX(id)").Scan(&maxID).Error; err != nil {
return model.Resource{}, err
}
for {
randomID := uint(1 + rand.Int63n(maxID-1))
var resource model.Resource
if err := db.
Preload("User").
Preload("Images").
Preload("Tags").
Preload("Files").
Where("id = ?", randomID).
First(&resource).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
continue // Try again if the resource does not exist
}
return model.Resource{}, err // Return error if any other issue occurs
}
return resource, nil // Return the found resource
}
}

View File

@@ -255,3 +255,12 @@ func EditResource(uid, rid uint, params *ResourceCreateParams) error {
}
return nil
}
func RandomResource() (*model.ResourceDetailView, error) {
r, err := dao.RandomResource()
if err != nil {
return nil, err
}
v := r.ToDetailView()
return &v, nil
}