Refactored downloader
This commit is contained in:
@@ -3,9 +3,8 @@ package _default
|
||||
import (
|
||||
"downloader/internal/core/entities"
|
||||
"downloader/internal/core/ports/download_request"
|
||||
"downloader/internal/core/ports/downloader"
|
||||
"downloader/internal/core/services/download"
|
||||
"fmt"
|
||||
"downloader/internal/core/services/downloader"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
@@ -26,10 +25,7 @@ func (l localBackgroundService) Run(download *entities.Download) error {
|
||||
download.Status = "started"
|
||||
_ = l.repository.Update(download)
|
||||
|
||||
err := l.downloader.Download(download.Link, func(progress string) {
|
||||
download.Status = fmt.Sprintf("in-progress: %s", progress)
|
||||
_ = l.repository.Update(download)
|
||||
})
|
||||
err := l.downloader.Download(download.Link, download.ID)
|
||||
download.Status = "done"
|
||||
|
||||
if err != nil {
|
||||
|
@@ -0,0 +1,32 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"downloader/internal/core/ports/download_request"
|
||||
"downloader/internal/core/ports/downloadhandler"
|
||||
"fmt"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
type onDownloadEventHandler struct {
|
||||
repository download_request.Repository
|
||||
logger *zap.SugaredLogger
|
||||
}
|
||||
|
||||
func New(repository download_request.Repository, logger *zap.SugaredLogger) downloadhandler.OnDownloadEventHandler {
|
||||
return &onDownloadEventHandler{
|
||||
repository: repository,
|
||||
logger: logger,
|
||||
}
|
||||
}
|
||||
|
||||
func (o *onDownloadEventHandler) OnTickEvent(downloadId string, progress string) {
|
||||
download, err := o.repository.GetById(downloadId)
|
||||
if err != nil {
|
||||
o.logger.Warnw("could not finish updating progress as not download id available",
|
||||
"downloadId", downloadId,
|
||||
"progress", progress)
|
||||
return
|
||||
}
|
||||
download.Status = fmt.Sprintf("in-progress: %s", progress)
|
||||
_ = o.repository.Update(download)
|
||||
}
|
54
api/internal/core/services/downloader/downloader.go
Normal file
54
api/internal/core/services/downloader/downloader.go
Normal file
@@ -0,0 +1,54 @@
|
||||
package downloader
|
||||
|
||||
import (
|
||||
"downloader/internal/core/ports/downloadhandler"
|
||||
"downloader/internal/core/ports/fileorchestrator"
|
||||
"errors"
|
||||
"go.uber.org/zap"
|
||||
)
|
||||
|
||||
type Downloader interface {
|
||||
Download(link string, downloadId string) error
|
||||
}
|
||||
|
||||
type downloader struct {
|
||||
logger *zap.SugaredLogger
|
||||
downloadHandler downloadhandler.DownloadHandler
|
||||
fileOrchestrator *fileorchestrator.FileOrchestrator
|
||||
ondownloadhandler downloadhandler.OnDownloadEventHandler
|
||||
}
|
||||
|
||||
func New(
|
||||
logger *zap.SugaredLogger,
|
||||
orchestrator *fileorchestrator.FileOrchestrator,
|
||||
downloadHandler downloadhandler.DownloadHandler,
|
||||
downloadEventHandler downloadhandler.OnDownloadEventHandler,
|
||||
) Downloader {
|
||||
return &downloader{
|
||||
logger: logger,
|
||||
downloadHandler: downloadHandler,
|
||||
fileOrchestrator: orchestrator,
|
||||
ondownloadhandler: downloadEventHandler,
|
||||
}
|
||||
}
|
||||
|
||||
func (y *downloader) Download(link string, downloadId string) error {
|
||||
basePath, err := y.fileOrchestrator.Begin(link)
|
||||
if err != nil {
|
||||
return errors.New("could not prepare for this link")
|
||||
}
|
||||
defer y.fileOrchestrator.CleanUp(basePath)
|
||||
|
||||
y.downloadHandler.OnProgress(y.ondownloadhandler)
|
||||
err = y.downloadHandler.Download(link, basePath, downloadId)
|
||||
if err != nil {
|
||||
return errors.New("could not download file")
|
||||
}
|
||||
|
||||
err = y.fileOrchestrator.Move(basePath)
|
||||
if err != nil {
|
||||
return errors.New("could not move to final destination")
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user