siyuan/kernel/api/attr.go

196 lines
4.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// SiYuan - Refactor your thinking
// Copyright (c) 2020-present, b3log.org
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
package api
import (
"fmt"
"net/http"
"github.com/88250/gulu"
"github.com/gin-gonic/gin"
"github.com/siyuan-note/siyuan/kernel/model"
"github.com/siyuan-note/siyuan/kernel/sql"
"github.com/siyuan-note/siyuan/kernel/treenode"
"github.com/siyuan-note/siyuan/kernel/util"
)
func getBookmarkLabels(c *gin.Context) {
ret := gulu.Ret.NewResult()
defer c.JSON(http.StatusOK, ret)
ret.Data = model.BookmarkLabels()
}
func batchGetBlockAttrs(c *gin.Context) {
ret := gulu.Ret.NewResult()
defer c.JSON(http.StatusOK, ret)
arg, ok := util.JsonArg(c, ret)
if !ok {
return
}
ids := arg["ids"].([]interface{})
var idList []string
for _, id := range ids {
idList = append(idList, id.(string))
}
ret.Data = sql.BatchGetBlockAttrs(idList)
}
func getBlockAttrs(c *gin.Context) {
ret := gulu.Ret.NewResult()
defer c.JSON(http.StatusOK, ret)
arg, ok := util.JsonArg(c, ret)
if !ok {
return
}
id := arg["id"].(string)
if util.InvalidIDPattern(id, ret) {
return
}
ret.Data = sql.GetBlockAttrs(id)
}
func setBlockAttrs(c *gin.Context) {
ret := gulu.Ret.NewResult()
defer c.JSON(http.StatusOK, ret)
arg, ok := util.JsonArg(c, ret)
if !ok {
return
}
id := arg["id"].(string)
if util.InvalidIDPattern(id, ret) {
return
}
attrs := arg["attrs"].(map[string]interface{})
if 1 == len(attrs) && "" != attrs["scroll"] {
// 不记录用户指南滚动位置
if b := treenode.GetBlockTree(id); nil != b && (model.IsUserGuide(b.BoxID)) {
attrs["scroll"] = ""
}
}
nameValues := map[string]string{}
for name, value := range attrs {
if nil == value { // API `setBlockAttrs` 中如果存在属性值设置为 `null` 时移除该属性 https://github.com/siyuan-note/siyuan/issues/5577
nameValues[name] = ""
} else {
strValue, ok := value.(string)
if !ok {
ret.Code = -1
ret.Msg = fmt.Sprintf("the value of attr [%s] must be a string", name)
return
}
nameValues[name] = strValue
}
}
err := model.SetBlockAttrs(id, nameValues)
if err != nil {
ret.Code = -1
ret.Msg = err.Error()
return
}
}
func batchSetBlockAttrs(c *gin.Context) {
ret := gulu.Ret.NewResult()
defer c.JSON(http.StatusOK, ret)
arg, ok := util.JsonArg(c, ret)
if !ok {
return
}
blockAttrsArg := arg["blockAttrs"].([]interface{})
var blockAttrs []map[string]interface{}
for _, blockAttrArg := range blockAttrsArg {
blockAttr := blockAttrArg.(map[string]interface{})
id := blockAttr["id"].(string)
if util.InvalidIDPattern(id, ret) {
return
}
attrs := blockAttr["attrs"].(map[string]interface{})
nameValues := map[string]string{}
for name, value := range attrs {
if nil == value {
nameValues[name] = ""
} else {
strValue, ok := value.(string)
if !ok {
ret.Code = -1
ret.Msg = fmt.Sprintf("the value of attr [%s] must be a string", name)
return
}
nameValues[name] = strValue
}
}
blockAttrs = append(blockAttrs, map[string]interface{}{
"id": id,
"attrs": nameValues,
})
}
err := model.BatchSetBlockAttrs(blockAttrs)
if err != nil {
ret.Code = -1
ret.Msg = err.Error()
return
}
}
func resetBlockAttrs(c *gin.Context) {
ret := gulu.Ret.NewResult()
defer c.JSON(http.StatusOK, ret)
arg, ok := util.JsonArg(c, ret)
if !ok {
return
}
id := arg["id"].(string)
attrs := arg["attrs"].(map[string]interface{})
nameValues := map[string]string{}
for name, value := range attrs {
if nil == value {
// 接口会先清空所有属性nil 值可忽略
continue
}
strValue, ok := value.(string)
if !ok {
ret.Code = -1
ret.Msg = fmt.Sprintf("the value of attr [%s] must be a string", name)
return
}
nameValues[name] = strValue
}
err := model.ResetBlockAttrs(id, nameValues)
if err != nil {
ret.Code = -1
ret.Msg = err.Error()
return
}
}