mirror of
https://github.com/wgh136/nysoure.git
synced 2025-09-27 12:17:24 +00:00
Add Random resource retrieval and navigation.
This commit is contained in:
@@ -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)
|
||||
|
@@ -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
|
||||
}
|
||||
}
|
||||
|
@@ -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
|
||||
}
|
||||
|
Reference in New Issue
Block a user