108 lines
2.2 KiB
Go
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
|
|
}
|