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 }