Social sender
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

112 lines
2.1 KiB

package db
import (
"encoding/json"
"fmt"
"log"
"os"
"ssender/internal/models"
"github.com/boltdb/bolt"
)
func InitDb(rss models.Rss2, dbpath string) error {
db, err := openDB(dbpath)
if err != nil {
return err
}
log.Println("Initialize DB")
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
// Check if DB file exists
if _, err := os.Stat(dbpath); os.IsNotExist(err) {
return nil, fmt.Errorf("database file does not exist: %s", dbpath)
}
// Open database
db, err := openDB(dbpath)
if err != nil {
return nil, err
}
defer db.Close()
log.Println("Finding new items in DB")
err = db.View(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte("rss"))
if b == nil {
return fmt.Errorf("bucket 'rss' not found in database")
}
for _, v := range rss.ItemList {
if b.Get([]byte(v.Link)) != nil {
sendItems.ItemList = append(sendItems.ItemList, v)
}
}
return nil
})
if err != nil {
return nil, err
}
log.Printf("Found %d new items", len(sendItems.ItemList))
return &sendItems, nil
}
func UpdateDb(dbpath string, senditems *models.SendItems) error {
db, err := openDB(dbpath)
if err != nil {
return err
}
log.Println("Update DB")
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
}
func openDB(dbpath string) (*bolt.DB, error) {
return bolt.Open(dbpath, 0600, nil)
}