55 lines
1.4 KiB
Go
55 lines
1.4 KiB
Go
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
|
|
}
|