diff --git a/internal/db/db.go b/internal/db/db.go new file mode 100644 index 0000000..3bf6685 --- /dev/null +++ b/internal/db/db.go @@ -0,0 +1,100 @@ +package db + +import ( + "encoding/json" + "log" + "ssender/internal/models" + + "github.com/boltdb/bolt" +) + +func InitDb(rss models.Rss2, dbpath string) error { + log.Println("Initialize DB") + db, err := bolt.Open(dbpath, 0600, nil) + if err != nil { + log.Fatal(err) + } + defer db.Close() + + err = db.Update(func(tx *bolt.Tx) error { + b, err := tx.CreateBucketIfNotExists([]byte("rss")) + if err != nil { + return err + } + for _, v := range rss.ItemList { + encoded, err := json.Marshal(v) + if err != nil { + return err + } + err = b.Put([]byte(v.Link), encoded) + if err != nil { + return err + } + } + return nil + }) + if err != nil { + return err + } + return nil +} + +func FindItems(rss models.Rss2, dbpath string) (*models.SendItems, error) { + var sendItems models.SendItems + db, err := bolt.Open(dbpath, 0600, nil) + if err != nil { + return nil, err + } + defer db.Close() + + for _, v := range rss.ItemList { + err = db.View(func(tx *bolt.Tx) error { + // Assume bucket exists and has keys + b := tx.Bucket([]byte("rss")) + c := b.Cursor() + flag := false + for key, _ := c.First(); key != nil; key, _ = c.Next() { + if v.Link == string(key) { + flag = true + break + } + } + if flag { + sendItems.ItemList = append(sendItems.ItemList, v) + } + return nil + }) + if err != nil { + return nil, err + } + } + return &sendItems, nil +} + +func UpdateDb(dbpath string, senditems *models.SendItems) error { + log.Println("Update DB") + db, err := bolt.Open(dbpath, 0600, nil) + if err != nil { + log.Fatal(err) + } + defer db.Close() + + err = db.Update(func(tx *bolt.Tx) error { + b := tx.Bucket([]byte("rss")) + for _, v := range senditems.ItemList { + encoded, err := json.Marshal(v) + if err != nil { + return err + } + err = b.Put([]byte(v.Link), encoded) + if err != nil { + return err + } + } + return nil + }) + if err != nil { + return err + } + return nil +} diff --git a/internal/rss/rss.go b/internal/rss/rss.go new file mode 100644 index 0000000..11e00ab --- /dev/null +++ b/internal/rss/rss.go @@ -0,0 +1,27 @@ +package rss + +import ( + "encoding/xml" + "os" + "ssender/internal/models" +) + +func NewRSS(rssPath string) (*models.Rss2, error) { + rss := &models.Rss2{} + + // Open rss2 file + file, err := os.Open(rssPath) + if err != nil { + return nil, err + } + defer file.Close() + + d := xml.NewDecoder(file) + + // Start RSS decoding from file + if err := d.Decode(&rss); err != nil { + return nil, err + } + + return rss, nil +}