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() } } }