chore: splits out article into db specific entity and generic struct

This commit is contained in:
Dennis Schoepf 2025-08-29 14:12:21 +02:00
parent 5a4a4d387a
commit 2322b9170d
3 changed files with 41 additions and 20 deletions

View file

@ -2,29 +2,50 @@ package internal
import (
"fmt"
"time"
"freed/internal/database"
)
func GetArticleUrlForToday() (string, error) {
type Article struct {
ID string
Name string
Url string
ReadAt *time.Time
FeedId int64
}
func GetArticleUrlForToday() (*Article, error) {
count, err := database.CountArticlesReadToday()
if err != nil {
return "", err
return nil, err
}
if count > 0 {
return "", fmt.Errorf("Already reached maximum number of articles for the day. Come back tomorrow!")
return nil, fmt.Errorf("Already reached maximum number of articles for the day. Come back tomorrow!")
}
article, err := database.FindOneUnreadArticle()
articleEntity, err := database.FindOneUnreadArticle()
if err != nil {
return "", err
return nil, err
}
if err := article.MarkAsRead(); err != nil {
return "", err
// For now doing it at this point is enough
// In the future it might be better to gather user input
// on if the article was read
if err := articleEntity.MarkAsRead(); err != nil {
return nil, err
}
return article.Url, nil
article := &Article{
ID: articleEntity.ID,
Name: articleEntity.Name,
Url: articleEntity.Url,
ReadAt: articleEntity.ReadAt,
FeedId: articleEntity.FeedId,
}
return article, nil
}

View file

@ -4,7 +4,7 @@ import (
"time"
)
type Article struct {
type ArticleEntity struct {
ID string
Name string
Url string
@ -16,7 +16,7 @@ type InsertMultipleOptions struct {
IgnoreDuplicates bool
}
func (a Article) Insert() (int64, error) {
func (a ArticleEntity) 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 {
@ -32,7 +32,7 @@ func (a Article) Insert() (int64, error) {
return id, nil
}
func (a Article) MarkAsRead() error {
func (a ArticleEntity) MarkAsRead() error {
result, err := db.Exec("UPDATE article SET readAt = datetime() WHERE id = ?;", a.ID)
if err != nil {
@ -46,15 +46,15 @@ func (a Article) MarkAsRead() error {
return nil
}
func InsertMultipleArticles(articles []Article) error {
func InsertMultipleArticles(articles []ArticleEntity) error {
return insertMultipleArticlesWithOpts(articles, InsertMultipleOptions{IgnoreDuplicates: false})
}
func InsertIgnoreMultipleArticles(articles []Article) error {
func InsertIgnoreMultipleArticles(articles []ArticleEntity) error {
return insertMultipleArticlesWithOpts(articles, InsertMultipleOptions{IgnoreDuplicates: true})
}
func insertMultipleArticlesWithOpts(articles []Article, opts InsertMultipleOptions) error {
func insertMultipleArticlesWithOpts(articles []ArticleEntity, opts InsertMultipleOptions) error {
if len(articles) == 0 {
return nil
}
@ -93,8 +93,8 @@ func insertMultipleArticlesWithOpts(articles []Article, opts InsertMultipleOptio
return tx.Commit()
}
func FindOneUnreadArticle() (*Article, error) {
var article Article
func FindOneUnreadArticle() (*ArticleEntity, error) {
var article ArticleEntity
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)

View file

@ -34,14 +34,14 @@ func AddFeed(feedUrl string) (string, int, error) {
}
// TODO: Make the amount of articles configurable
articles := make([]database.Article, 0, 10)
articles := make([]database.ArticleEntity, 0, 10)
for i, v := range feed.Items {
if i > 10 {
continue
}
a := database.Article{
a := database.ArticleEntity{
Name: v.Title,
Url: v.Link,
FeedId: feedId,
@ -143,14 +143,14 @@ func syncFeed(
return
}
var articles []database.Article
var articles []database.ArticleEntity
for _, item := range gFeed.Items {
if item.PublishedParsed.Before(*feed.LastSyncedAt) {
continue
}
article := database.Article{
article := database.ArticleEntity{
Name: item.Title,
Url: item.Link,
FeedId: feed.ID,