From 4c167c5ba76ceb3fa71887d2eeee0c8408195657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Sun, 1 Feb 2026 12:27:45 +0500 Subject: [PATCH] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/db/db.go | 100 ++++++++++++++++++++++++++++++++++++++++++++ internal/rss/rss.go | 27 ++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 internal/db/db.go create mode 100644 internal/rss/rss.go 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 +}