Browse Source

:art: Add some database related internal kernel APIs https://github.com/siyuan-note/siyuan/issues/10160

Daniel 1 year ago
parent
commit
6bd04ecb2a
3 changed files with 93 additions and 23 deletions
  1. 65 0
      kernel/api/av.go
  2. 3 0
      kernel/api/router.go
  3. 25 23
      kernel/model/attribute_view.go

+ 65 - 0
kernel/api/av.go

@@ -26,6 +26,71 @@ import (
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 
+func addAttributeViewCol(c *gin.Context) {
+	ret := gulu.Ret.NewResult()
+	defer c.JSON(http.StatusOK, ret)
+
+	arg, _ := util.JsonArg(c, ret)
+	if nil == arg {
+		return
+	}
+
+	avID := arg["avID"].(string)
+	keyID := arg["keyID"].(string)
+	keyName := arg["keyName"].(string)
+	keyType := arg["keyType"].(string)
+	keyIcon := arg["keyIcon"].(string)
+	previousKeyID := arg["previousKeyID"].(string)
+
+	err := model.AddAttributeViewKey(avID, keyID, keyName, keyType, keyIcon, previousKeyID)
+	if nil != err {
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+}
+
+func removeAttributeViewCol(c *gin.Context) {
+	ret := gulu.Ret.NewResult()
+	defer c.JSON(http.StatusOK, ret)
+
+	arg, _ := util.JsonArg(c, ret)
+	if nil == arg {
+		return
+	}
+
+	avID := arg["avID"].(string)
+	keyID := arg["keyID"].(string)
+
+	err := model.RemoveAttributeViewKey(avID, keyID)
+	if nil != err {
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+}
+
+func sortAttributeViewCol(c *gin.Context) {
+	ret := gulu.Ret.NewResult()
+	defer c.JSON(http.StatusOK, ret)
+
+	arg, ok := util.JsonArg(c, ret)
+	if !ok {
+		return
+	}
+
+	avID := arg["avID"].(string)
+	keyID := arg["keyID"].(string)
+	previousKeyID := arg["previousKeyID"].(string)
+
+	err := model.SortAttributeViewKey(avID, keyID, previousKeyID)
+	if nil != err {
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+}
+
 func getAttributeViewFilterSort(c *gin.Context) {
 	ret := gulu.Ret.NewResult()
 	defer c.JSON(http.StatusOK, ret)

+ 3 - 0
kernel/api/router.go

@@ -398,6 +398,9 @@ func ServeAPI(ginServer *gin.Engine) {
 	ginServer.Handle("POST", "/api/av/searchAttributeViewRelationKey", model.CheckAuth, model.CheckReadonly, searchAttributeViewRelationKey)
 	ginServer.Handle("POST", "/api/av/searchAttributeViewNonRelationKey", model.CheckAuth, model.CheckReadonly, searchAttributeViewNonRelationKey)
 	ginServer.Handle("POST", "/api/av/getAttributeViewFilterSort", model.CheckAuth, model.CheckReadonly, getAttributeViewFilterSort)
+	ginServer.Handle("POST", "/api/av/addAttributeViewKey", model.CheckAuth, model.CheckReadonly, addAttributeViewCol)
+	ginServer.Handle("POST", "/api/av/removeAttributeViewKey", model.CheckAuth, model.CheckReadonly, removeAttributeViewCol)
+	ginServer.Handle("POST", "/api/av/sortAttributeViewKey", model.CheckAuth, model.CheckReadonly, sortAttributeViewCol)
 
 	ginServer.Handle("POST", "/api/ai/chatGPT", model.CheckAuth, chatGPT)
 	ginServer.Handle("POST", "/api/ai/chatGPTWithAction", model.CheckAuth, chatGPTWithAction)

+ 25 - 23
kernel/model/attribute_view.go

@@ -1981,15 +1981,15 @@ func sortAttributeViewRow(operation *Operation) (err error) {
 }
 
 func (tx *Transaction) doSortAttrViewColumn(operation *Operation) (ret *TxErr) {
-	err := sortAttributeViewColumn(operation)
+	err := SortAttributeViewKey(operation.AvID, operation.ID, operation.PreviousID)
 	if nil != err {
 		return &TxErr{code: TxErrWriteAttributeView, id: operation.AvID, msg: err.Error()}
 	}
 	return
 }
 
-func sortAttributeViewColumn(operation *Operation) (err error) {
-	attrView, err := av.ParseAttributeView(operation.AvID)
+func SortAttributeViewKey(avID, keyID, previousKeyID string) (err error) {
+	attrView, err := av.ParseAttributeView(avID)
 	if nil != err {
 		return
 	}
@@ -2004,7 +2004,7 @@ func sortAttributeViewColumn(operation *Operation) (err error) {
 		var col *av.ViewTableColumn
 		var index, previousIndex int
 		for i, column := range view.Table.Columns {
-			if column.ID == operation.ID {
+			if column.ID == keyID {
 				col = column
 				index = i
 				break
@@ -2016,7 +2016,7 @@ func sortAttributeViewColumn(operation *Operation) (err error) {
 
 		view.Table.Columns = append(view.Table.Columns[:index], view.Table.Columns[index+1:]...)
 		for i, column := range view.Table.Columns {
-			if column.ID == operation.PreviousID {
+			if column.ID == previousKeyID {
 				previousIndex = i + 1
 				break
 			}
@@ -2029,30 +2029,32 @@ func sortAttributeViewColumn(operation *Operation) (err error) {
 }
 
 func (tx *Transaction) doAddAttrViewColumn(operation *Operation) (ret *TxErr) {
-	err := addAttributeViewColumn(operation)
+	var icon string
+	if nil != operation.Data {
+		icon = operation.Data.(string)
+	}
+	err := AddAttributeViewKey(operation.AvID, operation.ID, operation.Name, operation.Typ, icon, operation.PreviousID)
+
 	if nil != err {
 		return &TxErr{code: TxErrWriteAttributeView, id: operation.AvID, msg: err.Error()}
 	}
 	return
 }
 
-func addAttributeViewColumn(operation *Operation) (err error) {
-	attrView, err := av.ParseAttributeView(operation.AvID)
+func AddAttributeViewKey(avID, keyID, keyName, keyType, keyIcon, previousKeyID string) (err error) {
+	attrView, err := av.ParseAttributeView(avID)
 	if nil != err {
 		return
 	}
 
-	keyType := av.KeyType(operation.Typ)
-	switch keyType {
+	keyTyp := av.KeyType(keyType)
+	switch keyTyp {
 	case av.KeyTypeText, av.KeyTypeNumber, av.KeyTypeDate, av.KeyTypeSelect, av.KeyTypeMSelect, av.KeyTypeURL, av.KeyTypeEmail,
 		av.KeyTypePhone, av.KeyTypeMAsset, av.KeyTypeTemplate, av.KeyTypeCreated, av.KeyTypeUpdated, av.KeyTypeCheckbox,
 		av.KeyTypeRelation, av.KeyTypeRollup:
-		var icon string
-		if nil != operation.Data {
-			icon = operation.Data.(string)
-		}
-		key := av.NewKey(operation.ID, operation.Name, icon, keyType)
-		if av.KeyTypeRollup == keyType {
+
+		key := av.NewKey(keyID, keyName, keyIcon, keyTyp)
+		if av.KeyTypeRollup == keyTyp {
 			key.Rollup = &av.Rollup{Calc: &av.RollupCalc{Operator: av.CalcOperatorNone}}
 		}
 
@@ -2061,14 +2063,14 @@ func addAttributeViewColumn(operation *Operation) (err error) {
 		for _, view := range attrView.Views {
 			switch view.LayoutType {
 			case av.LayoutTypeTable:
-				if "" == operation.PreviousID {
+				if "" == previousKeyID {
 					view.Table.Columns = append([]*av.ViewTableColumn{{ID: key.ID}}, view.Table.Columns...)
 					break
 				}
 
 				added := false
 				for i, column := range view.Table.Columns {
-					if column.ID == operation.PreviousID {
+					if column.ID == previousKeyID {
 						view.Table.Columns = append(view.Table.Columns[:i+1], append([]*av.ViewTableColumn{{ID: key.ID}}, view.Table.Columns[i+1:]...)...)
 						added = true
 						break
@@ -2176,22 +2178,22 @@ func updateAttributeViewColumn(operation *Operation) (err error) {
 }
 
 func (tx *Transaction) doRemoveAttrViewColumn(operation *Operation) (ret *TxErr) {
-	err := removeAttributeViewColumn(operation)
+	err := RemoveAttributeViewKey(operation.AvID, operation.ID)
 	if nil != err {
 		return &TxErr{code: TxErrWriteAttributeView, id: operation.AvID, msg: err.Error()}
 	}
 	return
 }
 
-func removeAttributeViewColumn(operation *Operation) (err error) {
-	attrView, err := av.ParseAttributeView(operation.AvID)
+func RemoveAttributeViewKey(avID, keyID string) (err error) {
+	attrView, err := av.ParseAttributeView(avID)
 	if nil != err {
 		return
 	}
 
 	var removedKey *av.Key
 	for i, keyValues := range attrView.KeyValues {
-		if keyValues.Key.ID == operation.ID {
+		if keyValues.Key.ID == keyID {
 			attrView.KeyValues = append(attrView.KeyValues[:i], attrView.KeyValues[i+1:]...)
 			removedKey = keyValues.Key
 			break
@@ -2252,7 +2254,7 @@ func removeAttributeViewColumn(operation *Operation) (err error) {
 		switch view.LayoutType {
 		case av.LayoutTypeTable:
 			for i, column := range view.Table.Columns {
-				if column.ID == operation.ID {
+				if column.ID == keyID {
 					view.Table.Columns = append(view.Table.Columns[:i], view.Table.Columns[i+1:]...)
 					break
 				}