100 lines
1.7 KiB
Go
100 lines
1.7 KiB
Go
package database
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
type Article struct {
|
|
ID string
|
|
Name string
|
|
Url string
|
|
ReadAt *time.Time
|
|
FeedId int64
|
|
}
|
|
|
|
func (a Article) Insert() (int64, error) {
|
|
result, err := db.Exec("INSERT INTO article (name, url, readAt, feedId) VALUES (?, ?, ?, ?)", a.Name, a.Url, a.ReadAt, a.FeedId)
|
|
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
id, err := result.LastInsertId()
|
|
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
return id, nil
|
|
}
|
|
|
|
func (a Article) MarkAsRead() error {
|
|
result, err := db.Exec("UPDATE article SET readAt = datetime() WHERE id = ?;", a.ID)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if _, err := result.RowsAffected(); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func InsertMultipleArticles(articles []Article) error {
|
|
if len(articles) == 0 {
|
|
return nil
|
|
}
|
|
|
|
tx, err := db.Begin()
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
defer tx.Rollback()
|
|
|
|
stmt, err := tx.Prepare("INSERT INTO article (name, url, readAt, feedId) VALUES (?, ?, ?, ?)")
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
defer stmt.Close()
|
|
|
|
for _, article := range articles {
|
|
_, err := stmt.Exec(article.Name, article.Url, article.ReadAt, article.FeedId)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return tx.Commit()
|
|
}
|
|
|
|
func FindOneUnreadArticle() (*Article, error) {
|
|
var article Article
|
|
|
|
row := db.QueryRow("SELECT * FROM article WHERE readAt IS NULL ORDER BY RANDOM() LIMIT 1")
|
|
err := row.Scan(&article.ID, &article.Name, &article.Url, &article.ReadAt, &article.FeedId)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &article, nil
|
|
}
|
|
|
|
func CountArticlesReadToday() (int, error) {
|
|
var count int
|
|
|
|
result := db.QueryRow("SELECT COUNT(*) FROM article WHERE date(readAt) = date()")
|
|
err := result.Scan(&count)
|
|
|
|
if err != nil {
|
|
return -1, err
|
|
}
|
|
|
|
return count, nil
|
|
}
|