github.com/easysoft/zendata@v0.0.0-20240513203326-705bd5a7fd67/internal/server/service/field.go (about)

     1  package serverService
     2  
     3  import (
     4  	consts "github.com/easysoft/zendata/internal/pkg/const"
     5  	"github.com/easysoft/zendata/internal/pkg/model"
     6  	serverRepo "github.com/easysoft/zendata/internal/server/repo"
     7  )
     8  
     9  type FieldService struct {
    10  	DefRepo   *serverRepo.DefRepo   `inject:""`
    11  	FieldRepo *serverRepo.FieldRepo `inject:""`
    12  	ReferRepo *serverRepo.ReferRepo `inject:""`
    13  
    14  	DefService *DefService `inject:""`
    15  }
    16  
    17  func (s *FieldService) GetTree(defId uint) (root *model.ZdField, err error) {
    18  	root, err = s.FieldRepo.GetDefFieldTree(defId)
    19  	return
    20  }
    21  
    22  func (s *FieldService) Get(fieldId int) (field model.ZdField, err error) {
    23  	field, err = s.FieldRepo.Get(uint(fieldId))
    24  
    25  	return
    26  }
    27  
    28  func (s *FieldService) Save(field *model.ZdField) (err error) {
    29  	err = s.FieldRepo.Save(field)
    30  	s.DefService.updateYaml(field.DefID)
    31  
    32  	return
    33  }
    34  func (s *FieldService) Create(defId, targetId uint, name string, mode string) (field *model.ZdField, err error) {
    35  	field = &model.ZdField{DefID: defId}
    36  	field.Field = name
    37  	if mode == "root" {
    38  		field.DefID = defId
    39  		field.ParentID = 0
    40  	} else {
    41  		var target model.ZdField
    42  
    43  		target, err = s.FieldRepo.Get(targetId)
    44  		field.DefID = target.DefID
    45  
    46  		if mode == "child" {
    47  			field.ParentID = target.ID
    48  		} else {
    49  			field.ParentID = target.ParentID
    50  		}
    51  		field.Ord = s.FieldRepo.GetMaxOrder(field.ParentID)
    52  	}
    53  
    54  	err = s.FieldRepo.Save(field)
    55  	s.ReferRepo.CreateDefault(field.ID, consts.ResTypeDef)
    56  
    57  	s.DefService.updateYaml(field.DefID)
    58  
    59  	return
    60  }
    61  
    62  func (s *FieldService) Remove(id int) (defId int, err error) {
    63  	field, _ := s.FieldRepo.Get(uint(id))
    64  	defId = int(field.DefID)
    65  
    66  	err = s.deleteFieldAndChildren(field.DefID, field.ID)
    67  
    68  	s.DefService.updateYaml(field.DefID)
    69  
    70  	return
    71  }
    72  
    73  func (s *FieldService) Move(srcId, targetId uint, mode string) (defId uint, srcField model.ZdField, err error) {
    74  	srcField, err = s.FieldRepo.Get(srcId)
    75  	targetField, err := s.FieldRepo.Get(targetId)
    76  	defId = srcField.DefID
    77  
    78  	if "0" == mode {
    79  		srcField.ParentID = targetId
    80  		srcField.Ord = s.FieldRepo.GetMaxOrder(srcField.ParentID)
    81  	} else if "-1" == mode {
    82  		err = s.FieldRepo.AddOrderForTargetAndNextCases(srcField.ID, targetField.Ord, targetField.ParentID)
    83  		if err != nil {
    84  			return
    85  		}
    86  
    87  		srcField.ParentID = targetField.ParentID
    88  		srcField.Ord = targetField.Ord
    89  	} else if "1" == mode {
    90  		err = s.FieldRepo.AddOrderForNextCases(srcField.ID, targetField.Ord, targetField.ParentID)
    91  		if err != nil {
    92  			return
    93  		}
    94  
    95  		srcField.ParentID = targetField.ParentID
    96  		srcField.Ord = targetField.Ord + 1
    97  	}
    98  
    99  	err = s.FieldRepo.UpdateOrdAndParent(srcField)
   100  
   101  	s.DefService.updateYaml(defId)
   102  
   103  	return
   104  }
   105  
   106  func (s *FieldService) deleteFieldAndChildren(defId, fieldId uint) (err error) {
   107  	err = s.FieldRepo.Remove(fieldId)
   108  	if err == nil {
   109  		children, _ := s.FieldRepo.GetChildren(defId, fieldId)
   110  		for _, child := range children {
   111  			s.deleteFieldAndChildren(child.DefID, child.ID)
   112  		}
   113  	}
   114  
   115  	return
   116  }
   117  
   118  func NewFieldService(defRepo *serverRepo.DefRepo, fieldRepo *serverRepo.FieldRepo,
   119  	referRepo *serverRepo.ReferRepo,
   120  	defService *DefService) *FieldService {
   121  	return &FieldService{DefRepo: defRepo, FieldRepo: fieldRepo, ReferRepo: referRepo,
   122  		DefService: defService}
   123  }