feat: implements today command

This commit is contained in:
Dennis Schoepf 2025-08-28 17:59:31 +02:00
parent 09f4b2a838
commit a77d4f9604
5 changed files with 101 additions and 14 deletions

30
internal/article.go Normal file
View file

@ -0,0 +1,30 @@
package internal
import (
"fmt"
"freed/internal/database"
)
func GetArticleUrlForToday() (string, error) {
count, err := database.CountArticlesReadToday()
if err != nil {
return "", err
}
if count > 0 {
return "", fmt.Errorf("Already reached maximum number of articles for the day. Come back tomorrow!")
}
article, err := database.FindOneUnreadArticle()
if err != nil {
return "", err
}
if err := article.MarkAsRead(); err != nil {
return "", err
}
return article.Url, nil
}

View file

@ -5,6 +5,7 @@ import (
)
type Article struct {
ID string
Name string
Url string
ReadAt *time.Time
@ -27,6 +28,20 @@ func (a Article) Insert() (int64, error) {
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
@ -57,3 +72,29 @@ func InsertMultipleArticles(articles []Article) error {
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
}