downloader/api/internal/core/services/downloader/downloader.go
2021-12-22 01:22:33 +01:00

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
}