github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/service/explorer/tag.go (about)

     1  package explorer
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	model "github.com/cloudreve/Cloudreve/v3/models"
     8  	"github.com/cloudreve/Cloudreve/v3/pkg/hashid"
     9  	"github.com/cloudreve/Cloudreve/v3/pkg/serializer"
    10  	"github.com/gin-gonic/gin"
    11  )
    12  
    13  // FilterTagCreateService 文件分类标签创建服务
    14  type FilterTagCreateService struct {
    15  	Expression string `json:"expression" binding:"required,min=1,max=65535"`
    16  	Icon       string `json:"icon" binding:"required,min=1,max=255"`
    17  	Name       string `json:"name" binding:"required,min=1,max=255"`
    18  	Color      string `json:"color" binding:"hexcolor|rgb|rgba|hsl"`
    19  }
    20  
    21  // LinkTagCreateService 目录快捷方式标签创建服务
    22  type LinkTagCreateService struct {
    23  	Path string `json:"path" binding:"required,min=1,max=65535"`
    24  	Name string `json:"name" binding:"required,min=1,max=255"`
    25  }
    26  
    27  // TagService 标签服务
    28  type TagService struct {
    29  }
    30  
    31  // Delete 删除标签
    32  func (service *TagService) Delete(c *gin.Context, user *model.User) serializer.Response {
    33  	id, _ := c.Get("object_id")
    34  	if err := model.DeleteTagByID(id.(uint), user.ID); err != nil {
    35  		return serializer.DBErr("Failed to delete a tag", err)
    36  	}
    37  	return serializer.Response{}
    38  }
    39  
    40  // Create 创建标签
    41  func (service *LinkTagCreateService) Create(c *gin.Context, user *model.User) serializer.Response {
    42  	// 创建标签
    43  	tag := model.Tag{
    44  		Name:       service.Name,
    45  		Icon:       "FolderHeartOutline",
    46  		Type:       model.DirectoryLinkType,
    47  		Expression: service.Path,
    48  		UserID:     user.ID,
    49  	}
    50  	id, err := tag.Create()
    51  	if err != nil {
    52  		return serializer.DBErr("Failed to create a tag", err)
    53  	}
    54  
    55  	return serializer.Response{
    56  		Data: hashid.HashID(id, hashid.TagID),
    57  	}
    58  }
    59  
    60  // Create 创建标签
    61  func (service *FilterTagCreateService) Create(c *gin.Context, user *model.User) serializer.Response {
    62  	// 分割表达式,将通配符转换为SQL内的%
    63  	expressions := strings.Split(service.Expression, "\n")
    64  	for i := 0; i < len(expressions); i++ {
    65  		expressions[i] = strings.ReplaceAll(expressions[i], "*", "%")
    66  		if expressions[i] == "" {
    67  			return serializer.ParamErr(fmt.Sprintf("The %d line contains an empty match expression", i+1), nil)
    68  		}
    69  	}
    70  
    71  	// 创建标签
    72  	tag := model.Tag{
    73  		Name:       service.Name,
    74  		Icon:       service.Icon,
    75  		Color:      service.Color,
    76  		Type:       model.FileTagType,
    77  		Expression: strings.Join(expressions, "\n"),
    78  		UserID:     user.ID,
    79  	}
    80  	id, err := tag.Create()
    81  	if err != nil {
    82  		return serializer.DBErr("Failed to create a tag", err)
    83  	}
    84  
    85  	return serializer.Response{
    86  		Data: hashid.HashID(id, hashid.TagID),
    87  	}
    88  }