using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using PetaPoco.Business; using Sony.Filtr.Contracts.Definitions; using Sony.Filtr.Core.Factory; namespace Sony.Filtr.Tasks.Tasks.SonyReleases { public class SmejReleaseImport { private readonly StorageFactory _storageFactory; private readonly SonyReleaseParser _sonyReleaseParser; public SmejReleaseImport(StorageFactory storageFactory, SonyReleaseParser sonyReleaseParser) { _storageFactory = storageFactory; _sonyReleaseParser = sonyReleaseParser; } public async Task ExecuteAsync() { var settings = new ReleaseImportSettings() { Name = "SMEJ", UpcBucket = "filtr-new-releases-upc", IncomingFolder = "smej-incoming/", ProcessedFolder = "smej-processed/", SpotifyAnalyticsAccount = SpotifyAnalyticsAccount.SonyMusicEntertainmentJapan, }; var files = await GetUpcFilesToProcessAsync(settings); foreach (var file in files) { var fileContent = _storageFactory.GetObject(file, settings.UpcBucket); var fileAlbums = _sonyReleaseParser.ParseSmejUpcReleaseFile(fileContent); await SaveUpcAlbumsAsync(fileAlbums); await MarkUpcFileAsProcessedAsync(settings, file); } } private async Task MarkUpcFileAsProcessedAsync(ReleaseImportSettings releaseImportSetting, string filePath) { var destinationPath = Flurl.Url.Combine(releaseImportSetting.ProcessedFolder, filePath.Split('/').Last()); await _storageFactory.CopyObjectAsync(releaseImportSetting.UpcBucket, filePath, destinationPath); await _storageFactory.DeleteObjectAsync(releaseImportSetting.UpcBucket, filePath); } private async Task SaveUpcAlbumsAsync(IEnumerable fileAlbums) { var dbAlbums = fileAlbums.GroupBy(p => new { p.Upc, p.CountryCode, MusicService = MusicService.Spotify }).Select(upcGroup => new UpcAlbum() { UPC = upcGroup.Key.Upc, Region = upcGroup.Key.CountryCode, MusicServiceId = upcGroup.Key.MusicService, ReleaseTypeId = (int)SpotifyAnalyticsAccount.SonyMusicEntertainmentJapan }); await PetaPocoRepository.Instance.BulkInsertAsync(dbAlbums, ignoreExisting: true); } private async Task> GetUpcFilesToProcessAsync(ReleaseImportSettings settings) { var directory = settings.IncomingFolder; var files = await _storageFactory.GetObjectsAsync(settings.UpcBucket, directory); return files; } } }