Files
backend/article/notify.go
2021-12-16 10:08:34 +01:00

69 lines
1.5 KiB
Go

package article
import (
"TheAdversary/config"
"TheAdversary/database"
"database/sql"
"fmt"
"github.com/fsnotify/fsnotify"
"sync"
"time"
)
func Notify() error {
watcher, err := fsnotify.NewWatcher()
if err != nil {
return err
}
err = watcher.Add(config.ArticleRoot)
if err != nil {
return err
}
db := database.GetDB()
var lock sync.Mutex
for {
select {
case event, ok := <-watcher.Events:
lock.Lock()
if !ok {
return fmt.Errorf("failed to catch event")
}
if event.Op&fsnotify.Create == fsnotify.Create || event.Op&fsnotify.Write == fsnotify.Write {
_, err := db.GetArticleByName(ArticleName(event.Name))
if err != nil && err == sql.ErrNoRows {
article, err := LoadArticle(event.Name)
if err != nil {
return err
}
err = db.AddArticle(article)
if err != nil {
return err
}
} else if err != nil {
return err
} else {
article, err := LoadArticle(event.Name)
if err != nil {
return err
}
article.Modified = time.Now().Unix()
if err = db.UpdateArticle(ArticleName(event.Name), article); err != nil {
return err
}
}
} else if event.Op&fsnotify.Rename == fsnotify.Rename {
if err = db.DeleteArticlesByNames(ArticleName(event.Name)); err != nil {
return err
}
} else if event.Op&fsnotify.Remove == fsnotify.Remove {
if err = db.DeleteArticlesByNames(ArticleName(event.Name)); err != nil {
return err
}
}
lock.Unlock()
}
}
}