mirror of
https://github.com/wgh136/nysoure.git
synced 2025-09-27 12:17:24 +00:00
Add tag description.
This commit is contained in:
@@ -2,6 +2,7 @@ package api
|
||||
|
||||
import (
|
||||
"github.com/gofiber/fiber/v3"
|
||||
"net/url"
|
||||
"nysoure/server/model"
|
||||
"nysoure/server/service"
|
||||
"strconv"
|
||||
@@ -65,11 +66,59 @@ func handleDeleteTag(c fiber.Ctx) error {
|
||||
})
|
||||
}
|
||||
|
||||
func handleSetTagDescription(c fiber.Ctx) error {
|
||||
uid, ok := c.Locals("uid").(uint)
|
||||
if !ok {
|
||||
return model.NewUnAuthorizedError("You must be logged in to set tag description")
|
||||
}
|
||||
id, err := strconv.Atoi(c.Params("id"))
|
||||
if err != nil {
|
||||
return model.NewRequestError("Invalid tag ID")
|
||||
}
|
||||
description := c.FormValue("description")
|
||||
if description == "" {
|
||||
return model.NewRequestError("Description is required")
|
||||
}
|
||||
description = strings.TrimSpace(description)
|
||||
t, err := service.SetTagDescription(uid, uint(id), description)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return c.Status(fiber.StatusOK).JSON(model.Response[model.TagView]{
|
||||
Success: true,
|
||||
Data: *t,
|
||||
Message: "Tag description updated successfully",
|
||||
})
|
||||
}
|
||||
|
||||
func handleGetTagByName(c fiber.Ctx) error {
|
||||
name := c.Params("name")
|
||||
if name == "" {
|
||||
return model.NewRequestError("Tag name is required")
|
||||
}
|
||||
name, err := url.PathUnescape(name)
|
||||
if err != nil {
|
||||
return model.NewRequestError("Invalid tag name format")
|
||||
}
|
||||
name = strings.TrimSpace(name)
|
||||
t, err := service.GetTagByName(name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return c.Status(fiber.StatusOK).JSON(model.Response[model.TagView]{
|
||||
Success: true,
|
||||
Data: *t,
|
||||
Message: "Tag retrieved successfully",
|
||||
})
|
||||
}
|
||||
|
||||
func AddTagRoutes(api fiber.Router) {
|
||||
tag := api.Group("/tag")
|
||||
{
|
||||
tag.Post("/", handleCreateTag)
|
||||
tag.Get("/search", handleSearchTag)
|
||||
tag.Delete("/:id", handleDeleteTag)
|
||||
tag.Put("/:id/description", handleSetTagDescription)
|
||||
tag.Get("/:name", handleGetTagByName)
|
||||
}
|
||||
}
|
||||
|
@@ -58,3 +58,10 @@ func GetTagByName(name string) (model.Tag, error) {
|
||||
}
|
||||
return t, nil
|
||||
}
|
||||
|
||||
func SetTagDescription(id uint, description string) error {
|
||||
if err := db.Model(model.Tag{}).Where("id = ?", id).Update("description", description).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@@ -40,7 +40,7 @@ func handleRobotsTxt(c fiber.Ctx) error {
|
||||
c.Set("Content-Type", "text/plain; charset=utf-8")
|
||||
c.Set("Cache-Control", "no-cache")
|
||||
c.Set("X-Robots-Tag", "noindex")
|
||||
return c.SendString("User-agent: *\nDisallow: /api/\nDisallow: /admin/\n")
|
||||
return c.SendString("User-agent: *\nDisallow: /api/\n\nSitemap: " + c.BaseURL() + "/sitemap.xml\n")
|
||||
}
|
||||
|
||||
func handleSiteMap(c fiber.Ctx) error {
|
||||
@@ -92,6 +92,13 @@ func serveIndexHtml(c fiber.Ctx) error {
|
||||
title = u.Username
|
||||
description = "User " + u.Username + "'s profile"
|
||||
}
|
||||
} else if strings.HasPrefix(path, "/tag/") {
|
||||
tagName := strings.TrimPrefix(path, "/tag/")
|
||||
t, err := service.GetTagByName(tagName)
|
||||
if err == nil {
|
||||
title = "Tag: " + t.Name
|
||||
description = utils.ArticleToDescription(t.Description, 256)
|
||||
}
|
||||
}
|
||||
|
||||
content = strings.ReplaceAll(content, "{{SiteName}}", siteName)
|
||||
|
@@ -4,18 +4,21 @@ import "gorm.io/gorm"
|
||||
|
||||
type Tag struct {
|
||||
gorm.Model
|
||||
Name string `gorm:"unique"`
|
||||
Resources []Resource `gorm:"many2many:resource_tags;"`
|
||||
Name string `gorm:"unique"`
|
||||
Description string
|
||||
Resources []Resource `gorm:"many2many:resource_tags;"`
|
||||
}
|
||||
|
||||
type TagView struct {
|
||||
ID uint `json:"id"`
|
||||
Name string `json:"name"`
|
||||
ID uint `json:"id"`
|
||||
Name string `json:"name"`
|
||||
Description string `json:"description"`
|
||||
}
|
||||
|
||||
func (t *Tag) ToView() *TagView {
|
||||
return &TagView{
|
||||
ID: t.ID,
|
||||
Name: t.Name,
|
||||
ID: t.ID,
|
||||
Name: t.Name,
|
||||
Description: t.Description,
|
||||
}
|
||||
}
|
||||
|
@@ -30,6 +30,14 @@ func GetTag(id uint) (*model.TagView, error) {
|
||||
return t.ToView(), nil
|
||||
}
|
||||
|
||||
func GetTagByName(name string) (*model.TagView, error) {
|
||||
t, err := dao.GetTagByName(name)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return t.ToView(), nil
|
||||
}
|
||||
|
||||
func SearchTag(name string) ([]model.TagView, error) {
|
||||
tags, err := dao.SearchTag(name)
|
||||
if err != nil {
|
||||
@@ -45,3 +53,23 @@ func SearchTag(name string) ([]model.TagView, error) {
|
||||
func DeleteTag(id uint) error {
|
||||
return dao.DeleteTag(id)
|
||||
}
|
||||
|
||||
func SetTagDescription(uid uint, id uint, description string) (*model.TagView, error) {
|
||||
canUpload, err := checkUserCanUpload(uid)
|
||||
if err != nil {
|
||||
log.Error("Error checking user permissions:", err)
|
||||
return nil, model.NewInternalServerError("Error checking user permissions")
|
||||
}
|
||||
if !canUpload {
|
||||
return nil, model.NewUnAuthorizedError("User cannot set tag description")
|
||||
}
|
||||
t, err := dao.GetTagByID(id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
t.Description = description
|
||||
if err := dao.SetTagDescription(id, description); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return t.ToView(), nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user