Add edit resource functionality.

This commit is contained in:
2025-05-15 20:10:33 +08:00
parent f8271161cb
commit 9597aa5687
7 changed files with 496 additions and 2 deletions

View File

@@ -183,6 +183,36 @@ func handleGetResourcesWithUser(c fiber.Ctx) error {
})
}
func handleUpdateResource(c fiber.Ctx) error {
idStr := c.Params("id")
if idStr == "" {
return model.NewRequestError("Resource ID is required")
}
id, err := strconv.Atoi(idStr)
if err != nil {
return model.NewRequestError("Invalid resource ID")
}
var params service.ResourceCreateParams
body := c.Body()
err = json.Unmarshal(body, &params)
if err != nil {
return model.NewRequestError("Invalid request body")
}
uid, ok := c.Locals("uid").(uint)
if !ok {
return model.NewUnAuthorizedError("You must be logged in to update a resource")
}
err = service.EditResource(uid, uint(id), &params)
if err != nil {
return err
}
return c.Status(fiber.StatusOK).JSON(model.Response[any]{
Success: true,
Data: nil,
Message: "Resource updated successfully",
})
}
func AddResourceRoutes(api fiber.Router) {
resource := api.Group("/resource")
{
@@ -193,5 +223,6 @@ func AddResourceRoutes(api fiber.Router) {
resource.Delete("/:id", handleDeleteResource)
resource.Get("/tag/:tag", handleListResourcesWithTag)
resource.Get("/user/:username", handleGetResourcesWithUser)
resource.Post("/:id", handleUpdateResource)
}
}

View File

@@ -1,6 +1,7 @@
package service
import (
"github.com/gofiber/fiber/v3/log"
"nysoure/server/dao"
"nysoure/server/model"
@@ -136,3 +137,46 @@ func GetResourcesWithUser(username string, page int) ([]model.ResourceView, int,
}
return views, totalPages, nil
}
func EditResource(uid, rid uint, params *ResourceCreateParams) error {
isAdmin, err := checkUserCanUpload(uid)
if err != nil {
log.Error("checkUserCanUpload error: ", err)
return model.NewInternalServerError("Failed to check user permission")
}
r, err := dao.GetResourceByID(rid)
if err != nil {
return err
}
if r.UserID != uid && !isAdmin {
return model.NewUnAuthorizedError("You have not permission to edit this resource")
}
r.Title = params.Title
r.AlternativeTitles = params.AlternativeTitles
r.Article = params.Article
images := make([]model.Image, len(params.Images))
for i, id := range params.Images {
images[i] = model.Image{
Model: gorm.Model{
ID: id,
},
}
}
tags := make([]model.Tag, len(params.Tags))
for i, id := range params.Tags {
tags[i] = model.Tag{
Model: gorm.Model{
ID: id,
},
}
}
r.Images = images
r.Tags = tags
if err := dao.UpdateResource(r); err != nil {
log.Error("UpdateResource error: ", err)
return model.NewInternalServerError("Failed to update resource")
}
return nil
}