Files
wehub-resource-sync a21fa4e11b
Go / Build (push) Failing after 1s
chore: import upstream snapshot with attribution
2026-07-13 12:30:21 +08:00

215 lines
4.9 KiB
Go

package utils
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"sync"
)
var Document = NewDocument("./data", "./data/markdowns")
const (
Document_Default_FileName = "README"
Document_Page_Suffix = ".md"
)
const (
Document_Type_Page = 1
Document_Type_Dir = 2
)
func NewDocument(documentAbsDir string, markdownAbsDir string) *document {
return &document{
DocumentAbsDir: documentAbsDir,
MarkdownAbsDir: markdownAbsDir,
}
}
type document struct {
DocumentAbsDir string
MarkdownAbsDir string
lock sync.Mutex
}
// get document page file by parentPath
func (d *document) GetPageFileByParentPath(name string, docType int, parentPath string) (pageFile string) {
if docType == Document_Type_Page {
pageFile = fmt.Sprintf("%s/%s%s", parentPath, name, Document_Page_Suffix)
} else {
pageFile = fmt.Sprintf("%s/%s/%s%s", parentPath, name, Document_Default_FileName, Document_Page_Suffix)
}
return
}
//get document path by spaceName
func (d *document) GetDefaultPageFileBySpaceName(name string) string {
return fmt.Sprintf("%s/%s%s", name, Document_Default_FileName, Document_Page_Suffix)
}
// get document abs pageFile
func (d *document) GetAbsPageFileByPageFile(pageFile string) string {
return d.MarkdownAbsDir + "/" + pageFile
}
// get document content by pageFile
func (d *document) GetContentByPageFile(pageFile string) (content string, err error) {
return File.GetFileContents(d.GetAbsPageFileByPageFile(pageFile))
}
// create document
func (d *document) Create(pageFile string) error {
if pageFile == "" {
return nil
}
d.lock.Lock()
absFilePath := d.GetAbsPageFileByPageFile(pageFile)
absDir := filepath.Dir(absFilePath)
err := os.MkdirAll(absDir, 0777)
if err != nil {
d.lock.Unlock()
return err
}
d.lock.Unlock()
return File.CreateFile(absFilePath)
}
// create and write document
func (d *document) CreateAndWrite(pageFile string, content string) error {
if pageFile == "" {
return nil
}
d.lock.Lock()
absFilePath := d.GetAbsPageFileByPageFile(pageFile)
absDir := filepath.Dir(absFilePath)
err := os.MkdirAll(absDir, 0777)
if err != nil {
d.lock.Unlock()
return err
}
d.lock.Unlock()
return File.WriteFile(absFilePath, content)
}
// replace document content
func (d *document) Replace(pageFile string, content string) error {
if pageFile == "" {
return nil
}
d.lock.Lock()
absFilePath := d.GetAbsPageFileByPageFile(pageFile)
absDir := filepath.Dir(absFilePath)
err := os.MkdirAll(absDir, 0777)
if err != nil {
d.lock.Unlock()
return err
}
d.lock.Unlock()
return ioutil.WriteFile(absFilePath, []byte(content), os.ModePerm)
}
// update document
func (d *document) Update(oldPageFile string, name string, content string, docType int, nameIsChange bool) (err error) {
d.lock.Lock()
defer d.lock.Unlock()
absOldPageFile := d.GetAbsPageFileByPageFile(oldPageFile)
err = ioutil.WriteFile(absOldPageFile, []byte(content), os.ModePerm)
if err != nil {
return
}
if nameIsChange {
filePath := filepath.Dir(absOldPageFile)
if docType == Document_Type_Page {
err = os.Rename(absOldPageFile, filePath+"/"+name+Document_Page_Suffix)
} else {
err = os.Rename(filePath, filepath.Dir(filePath)+"/"+name)
}
if err != nil {
return
}
}
return nil
}
func (d *document) UpdateSpaceName(oldSpaceName string, newName string) error {
d.lock.Lock()
defer d.lock.Unlock()
spaceOldDir := d.GetAbsPageFileByPageFile(oldSpaceName)
spaceNewDir := d.GetAbsPageFileByPageFile(newName)
if spaceNewDir == spaceOldDir {
return nil
}
err := os.Rename(spaceOldDir, spaceNewDir)
return err
}
// delete document
func (d *document) Delete(path string, docType int) error {
d.lock.Lock()
defer d.lock.Unlock()
absPageFile := d.GetAbsPageFileByPageFile(path)
ok, _ := File.PathIsExists(absPageFile)
if !ok {
return nil
}
if docType == Document_Type_Page {
return os.Remove(absPageFile)
}
return os.RemoveAll(filepath.Dir(absPageFile))
}
func (d *document) DeleteSpace(name string) error {
d.lock.Lock()
defer d.lock.Unlock()
absSpaceDir := d.GetAbsPageFileByPageFile(name)
ok, _ := File.PathIsExists(absSpaceDir)
if !ok {
return nil
}
return os.RemoveAll(absSpaceDir)
}
func (d *document) Move(movePath string, targetPath string, docType int) error {
d.lock.Lock()
defer d.lock.Unlock()
absOldPageFile := d.GetAbsPageFileByPageFile(movePath)
absTargetPageFile := d.GetAbsPageFileByPageFile(targetPath)
if docType == Document_Type_Page {
return os.Rename(absOldPageFile, absTargetPageFile)
}
return os.Rename(filepath.Dir(absOldPageFile), filepath.Dir(absTargetPageFile))
}
// delete document attachment
func (d *document) DeleteAttachment(attachments []map[string]string) error {
d.lock.Lock()
defer d.lock.Unlock()
if len(attachments) == 0 {
return nil
}
// delete attachment file
for _, attachment := range attachments {
if len(attachment) == 0 || attachment["path"] == "" {
continue
}
file := filepath.Join(d.DocumentAbsDir, attachment["path"])
_ = os.Remove(file)
}
return nil
}