Files
scrap/internal/article/service.go
2025-10-04 23:14:41 +02:00

108 lines
2.2 KiB
Go

package article
import (
"log"
"scrap/internal/db"
"scrap/internal/wikipediadl"
"github.com/google/uuid"
)
type ArticleService struct {
txRepo db.ITxRepository
articleRepo IArticleRepository
}
func NewArticleService(
txRepo db.ITxRepository,
articleRepo IArticleRepository,
) IArticleService {
return &ArticleService{
txRepo: txRepo,
articleRepo: articleRepo,
}
}
func (a ArticleService) QueryArticles(data ArticleQueryDTO) ([]ArticleDTO, error) {
tx, err := a.txRepo.Begin()
if err != nil {
log.Println(err.Error())
return nil, err
}
defer a.txRepo.RollbackOnError(tx, &err)
articleTitleLength := len(data.Title)
if articleTitleLength < 1 || articleTitleLength > 255 {
return nil, ErrArticleTitleInvalidLength
}
articles, err := a.articleRepo.GetArticlesByTitle(tx, data.Title)
if err != nil {
log.Println(err.Error())
return nil, ErrArticleQueryFailed
}
articlesOut := make([]ArticleDTO, 0, len(articles))
for _, am := range articles {
a := ArticleDTO{
Uuid: am.Uuid,
Title: am.Title,
Content: am.Content,
}
articlesOut = append(articlesOut, a)
}
return articlesOut, nil
}
func (a ArticleService) DownloadArticles() error {
tx, err := a.txRepo.Begin()
if err != nil {
log.Println(err.Error())
return db.ErrTxBeginFailed
}
defer a.txRepo.RollbackOnError(tx, &err)
if err = a.articleRepo.DeleteAllArticles(tx); err != nil {
log.Println(err.Error())
return ErrArticleDeleteAllFailed
}
articleBundles, err := wikipediadl.FetchArticleBundles()
if err != nil {
log.Println(err.Error())
return ErrArticleDownloadFailed
}
for _, ab := range articleBundles {
articles, err := wikipediadl.ExtractArticles(ab)
if err != nil {
log.Println(err.Error())
return ErrArticleDownloadFailed
}
for _, article := range articles {
articleData := ArticleCreateModel{
Uuid: uuid.NewString(),
Title: article.Title,
Content: article.Revision.Text,
}
if err = a.articleRepo.CreateArticle(tx, articleData); err != nil {
log.Println(err.Error(), "tutaj ---------")
continue
}
}
}
if err = a.txRepo.Commit(tx); err != nil {
log.Println(err.Error())
return db.ErrTxCommitFailed
}
return nil
}