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

     1  package serverService
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/easysoft/zendata/internal/pkg/domain"
     7  
     8  	consts "github.com/easysoft/zendata/internal/pkg/const"
     9  	"github.com/easysoft/zendata/internal/pkg/helper"
    10  	"github.com/easysoft/zendata/internal/pkg/model"
    11  	serverRepo "github.com/easysoft/zendata/internal/server/repo"
    12  	serverUtils "github.com/easysoft/zendata/internal/server/utils"
    13  	fileUtils "github.com/easysoft/zendata/pkg/utils/file"
    14  	"github.com/easysoft/zendata/pkg/utils/vari"
    15  	"gorm.io/gorm"
    16  )
    17  
    18  type TextService struct {
    19  	TextRepo   *serverRepo.TextRepo `inject:""`
    20  	ResService *ResService          `inject:""`
    21  }
    22  
    23  func (s *TextService) List(keywords string, page int) (list []*model.ZdText, total int) {
    24  	list, total, _ = s.TextRepo.List(strings.TrimSpace(keywords), page)
    25  
    26  	return
    27  }
    28  
    29  func (s *TextService) Get(id int) (text model.ZdText, dirs []domain.Dir) {
    30  	text, _ = s.TextRepo.Get(uint(id))
    31  
    32  	serverUtils.GetDirs(consts.ResDirYaml, &dirs)
    33  
    34  	return
    35  }
    36  
    37  func (s *TextService) Save(text *model.ZdText) (err error) {
    38  	text.Folder = serverUtils.DealWithPathSepRight(text.Folder)
    39  	text.Path = vari.WorkDir + text.Folder + serverUtils.AddExt(text.FileName, ".txt")
    40  	text.ReferName = helper.PathToName(text.Path, consts.ResDirYaml, consts.ResTypeText)
    41  
    42  	if text.ID == 0 {
    43  		err = s.Create(text)
    44  	} else {
    45  		err = s.Update(text)
    46  	}
    47  
    48  	return
    49  }
    50  func (s *TextService) Create(text *model.ZdText) (err error) {
    51  	err = s.TextRepo.Create(text)
    52  
    53  	return
    54  }
    55  func (s *TextService) Update(text *model.ZdText) (err error) {
    56  	var old model.ZdText
    57  	old, err = s.TextRepo.Get(text.ID)
    58  	if err == gorm.ErrRecordNotFound {
    59  		return
    60  	}
    61  	if text.Path != old.Path {
    62  		fileUtils.RemoveExist(old.Path)
    63  	}
    64  
    65  	err = s.TextRepo.Update(text)
    66  
    67  	return
    68  }
    69  
    70  func (s *TextService) Remove(id int) (err error) {
    71  	var old model.ZdText
    72  	old, err = s.TextRepo.Get(uint(id))
    73  	if err == gorm.ErrRecordNotFound {
    74  		return
    75  	}
    76  
    77  	fileUtils.RemoveExist(old.Path)
    78  	err = s.TextRepo.Remove(uint(id))
    79  
    80  	return
    81  }
    82  
    83  func (s *TextService) Sync(files []domain.ResFile) (err error) {
    84  	list := s.TextRepo.ListAll()
    85  
    86  	mp := map[string]*model.ZdText{}
    87  	for _, item := range list {
    88  		mp[item.Path] = item
    89  	}
    90  
    91  	for _, fi := range files {
    92  		_, found := mp[fi.Path]
    93  		//logUtils.PrintTo(fi.UpdatedAt.OpenApiDataTypeString() + ", " + mp[fi.Path].UpdatedAt.OpenApiDataTypeString())
    94  		if !found { // no record
    95  			s.SyncToDB(fi)
    96  		} else if fi.UpdatedAt.Unix() > mp[fi.Path].UpdatedAt.Unix() { // db is old
    97  			s.TextRepo.Remove(mp[fi.Path].ID)
    98  			s.SyncToDB(fi)
    99  		} else { // db is new
   100  
   101  		}
   102  	}
   103  
   104  	return
   105  }
   106  
   107  func (s *TextService) SyncToDB(file domain.ResFile) (err error) {
   108  	text := model.ZdText{
   109  		Title:    file.Title,
   110  		Path:     file.Path,
   111  		Folder:   serverUtils.GetRelativePath(file.Path),
   112  		FileName: fileUtils.GetFileName(file.Path),
   113  	}
   114  	if strings.Index(text.Path, consts.ResDirYaml) > -1 {
   115  		text.ReferName = helper.PathToName(text.Path, consts.ResDirYaml, consts.ResTypeText)
   116  	} else {
   117  		text.ReferName = helper.PathToName(text.Path, consts.ResDirUsers, consts.ResTypeText)
   118  	}
   119  	text.Content = fileUtils.ReadFile(file.Path)
   120  
   121  	s.TextRepo.Create(&text)
   122  
   123  	return
   124  }
   125  
   126  func NewTextService(textRepo *serverRepo.TextRepo) *TextService {
   127  	return &TextService{TextRepo: textRepo}
   128  }