From 99430d929225644a074fb53033887bf03fa1f1ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20H=C3=A4felfinger?= Date: Fri, 25 Jan 2019 00:21:28 +0100 Subject: [PATCH] Made first schema work, made first sync work and display from db --- ... 20190124231927_InitialCreate.Designer.cs} | 4 ++- ...ate.cs => 20190124231927_InitialCreate.cs} | 1 + .../PlaylistContextModelSnapshot.cs | 2 ++ Tv7Playlist.Data/PlaylistEntry.cs | 1 + Tv7Playlist/Controllers/HomeController.cs | 14 ++++++--- .../Controllers/PlaylistApiController.cs | 31 ++++++++++++------- Tv7Playlist/Models/HomeModel.cs | 10 +++--- Tv7Playlist/Views/Home/Index.cshtml | 12 ++++--- 8 files changed, 48 insertions(+), 27 deletions(-) rename Tv7Playlist.Data/Migrations/{20190124230424_InitialCreate.Designer.cs => 20190124231927_InitialCreate.Designer.cs} (93%) rename Tv7Playlist.Data/Migrations/{20190124230424_InitialCreate.cs => 20190124231927_InitialCreate.cs} (95%) diff --git a/Tv7Playlist.Data/Migrations/20190124230424_InitialCreate.Designer.cs b/Tv7Playlist.Data/Migrations/20190124231927_InitialCreate.Designer.cs similarity index 93% rename from Tv7Playlist.Data/Migrations/20190124230424_InitialCreate.Designer.cs rename to Tv7Playlist.Data/Migrations/20190124231927_InitialCreate.Designer.cs index 3ac3c53..b72fb3f 100644 --- a/Tv7Playlist.Data/Migrations/20190124230424_InitialCreate.Designer.cs +++ b/Tv7Playlist.Data/Migrations/20190124231927_InitialCreate.Designer.cs @@ -9,7 +9,7 @@ using Tv7Playlist.Data; namespace Tv7Playlist.Data.Migrations { [DbContext(typeof(PlaylistContext))] - [Migration("20190124230424_InitialCreate")] + [Migration("20190124231927_InitialCreate")] partial class InitialCreate { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -31,6 +31,8 @@ namespace Tv7Playlist.Data.Migrations b.Property("NameOverride"); + b.Property("Position"); + b.Property("TrackNumber"); b.Property("Url"); diff --git a/Tv7Playlist.Data/Migrations/20190124230424_InitialCreate.cs b/Tv7Playlist.Data/Migrations/20190124231927_InitialCreate.cs similarity index 95% rename from Tv7Playlist.Data/Migrations/20190124230424_InitialCreate.cs rename to Tv7Playlist.Data/Migrations/20190124231927_InitialCreate.cs index b4d4a2d..f2baea1 100644 --- a/Tv7Playlist.Data/Migrations/20190124230424_InitialCreate.cs +++ b/Tv7Playlist.Data/Migrations/20190124231927_InitialCreate.cs @@ -12,6 +12,7 @@ namespace Tv7Playlist.Data.Migrations columns: table => new { Id = table.Column(nullable: false), + Position = table.Column(nullable: false), TrackNumber = table.Column(nullable: false), Name = table.Column(nullable: true), NameOverride = table.Column(nullable: true), diff --git a/Tv7Playlist.Data/Migrations/PlaylistContextModelSnapshot.cs b/Tv7Playlist.Data/Migrations/PlaylistContextModelSnapshot.cs index d434f9a..79850b5 100644 --- a/Tv7Playlist.Data/Migrations/PlaylistContextModelSnapshot.cs +++ b/Tv7Playlist.Data/Migrations/PlaylistContextModelSnapshot.cs @@ -29,6 +29,8 @@ namespace Tv7Playlist.Data.Migrations b.Property("NameOverride"); + b.Property("Position"); + b.Property("TrackNumber"); b.Property("Url"); diff --git a/Tv7Playlist.Data/PlaylistEntry.cs b/Tv7Playlist.Data/PlaylistEntry.cs index f6728fd..807a8ea 100644 --- a/Tv7Playlist.Data/PlaylistEntry.cs +++ b/Tv7Playlist.Data/PlaylistEntry.cs @@ -6,6 +6,7 @@ namespace Tv7Playlist.Data { public Guid Id { get; set; } + public int Position { get; set; } public int TrackNumber { get; set; } public string Name { get; set; } diff --git a/Tv7Playlist/Controllers/HomeController.cs b/Tv7Playlist/Controllers/HomeController.cs index 8c6e23a..d2083ea 100644 --- a/Tv7Playlist/Controllers/HomeController.cs +++ b/Tv7Playlist/Controllers/HomeController.cs @@ -1,11 +1,15 @@ using System; +using System.Collections.Immutable; using System.Diagnostics; +using System.Linq; using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; using Tv7Playlist.Core; +using Tv7Playlist.Data; using Tv7Playlist.Models; namespace Tv7Playlist.Controllers @@ -14,19 +18,19 @@ namespace Tv7Playlist.Controllers { private readonly ILogger _logger; private readonly IAppConfig _appConfig; - private readonly IPlaylistLoader _playlistLoader; + private readonly PlaylistContext _playlistContext; - public HomeController(ILogger logger, IAppConfig appConfig, IPlaylistLoader playlistLoader) + public HomeController(ILogger logger, IAppConfig appConfig, PlaylistContext playlistContext) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _appConfig = appConfig ?? throw new ArgumentNullException(nameof(appConfig)); - _playlistLoader = playlistLoader ?? throw new ArgumentNullException(nameof(playlistLoader)); + _playlistContext = playlistContext ?? throw new ArgumentNullException(nameof(playlistContext)); } public async Task Index() { - var tracks = await _playlistLoader.LoadPlaylistFromUrl(_appConfig.TV7Url); - var model = new HomeModel(tracks); + var playlistEntries = await _playlistContext.PlaylistEntries.AsNoTracking().OrderBy(e => e.TrackNumber).ToListAsync(); + var model = new HomeModel(playlistEntries); return View(model); } diff --git a/Tv7Playlist/Controllers/PlaylistApiController.cs b/Tv7Playlist/Controllers/PlaylistApiController.cs index e23533a..7eb7991 100644 --- a/Tv7Playlist/Controllers/PlaylistApiController.cs +++ b/Tv7Playlist/Controllers/PlaylistApiController.cs @@ -20,8 +20,8 @@ namespace Tv7Playlist.Controllers private readonly PlaylistContext _playlistContext; private readonly IPlaylistLoader _playlistLoader; - public PlaylistApiController(ILogger logger, PlaylistContext playlistContext, - IPlaylistLoader playlistLoader, IAppConfig appConfig) + public PlaylistApiController(ILogger logger, PlaylistContext playlistContext, IPlaylistLoader playlistLoader, + IAppConfig appConfig) { _logger = logger ?? throw new ArgumentNullException(nameof(logger)); _playlistContext = playlistContext ?? throw new ArgumentNullException(nameof(playlistContext)); @@ -36,9 +36,12 @@ namespace Tv7Playlist.Controllers //TODO: Refactor to post method _logger.LogDebug("Synchronizing playlist from server..."); + var existingEntries = await _playlistContext.PlaylistEntries.ToDictionaryAsync(e => e.TrackNumber); var tracks = await _playlistLoader.LoadPlaylistFromUrl(_appConfig.TV7Url); - await MarkNotAvailableEntriesAsync(tracks); - await AddOrUpdateEntriesAsync(tracks); + + MarkNotAvailableEntries(existingEntries, tracks); + AddOrUpdateEntries(existingEntries, tracks); + _logger.LogDebug("Synchronizing playlist completed saving changes..."); await _playlistContext.SaveChangesAsync(); @@ -47,17 +50,23 @@ namespace Tv7Playlist.Controllers return Ok(); } - private async Task AddOrUpdateEntriesAsync(IEnumerable tracks) + private void AddOrUpdateEntries(Dictionary existingEntries, IEnumerable tracks) { foreach (var track in tracks) { - var entry = await _playlistContext.PlaylistEntries.Where(e => e.TrackNumber == track.Id).FirstOrDefaultAsync(); - if (entry == null) + if (!existingEntries.TryGetValue(track.Id, out var entry)) { _logger.LogInformation($"Adding playlist entry {track.Id} - {track.Name}"); - entry = new PlaylistEntry {Id = Guid.NewGuid(), TrackNumber = track.Id, IsEnabled = true}; + entry = new PlaylistEntry + { + Id = Guid.NewGuid(), Position = track.Id, TrackNumber = track.Id, IsEnabled = true + }; _playlistContext.PlaylistEntries.Add(entry); } + else + { + _logger.LogInformation($"Updating playlist entry {track.Id} - {track.Name}"); + } entry.IsAvailable = true; entry.Name = track.Name; @@ -65,10 +74,10 @@ namespace Tv7Playlist.Controllers } } - private async Task MarkNotAvailableEntriesAsync(IReadOnlyCollection tracks) + private void MarkNotAvailableEntries(Dictionary existingEntries, + IReadOnlyCollection tracks) { - var unavailableEntries = - await _playlistContext.PlaylistEntries.Where(e => tracks.All(t => t.Id != e.TrackNumber)).ToListAsync(); + var unavailableEntries = existingEntries.Where(e => tracks.All(t => t.Id != e.Key)).Select(e => e.Value); foreach (var entry in unavailableEntries) { _logger.LogInformation($"Channel {entry.TrackNumber} - {entry.Name} is no longer available."); diff --git a/Tv7Playlist/Models/HomeModel.cs b/Tv7Playlist/Models/HomeModel.cs index 7a96690..49003c7 100644 --- a/Tv7Playlist/Models/HomeModel.cs +++ b/Tv7Playlist/Models/HomeModel.cs @@ -1,16 +1,16 @@ using System; using System.Collections.Generic; -using Tv7Playlist.Core.Parsers; +using Tv7Playlist.Data; namespace Tv7Playlist.Models { public class HomeModel { - public IReadOnlyCollection Tracks { get; } - - public HomeModel(IReadOnlyCollection tracks) + public HomeModel(List playlistEntries) { - Tracks = tracks ?? throw new ArgumentNullException(nameof(tracks)); + PlaylistEntries = playlistEntries ?? throw new ArgumentNullException(nameof(playlistEntries)); } + + public List PlaylistEntries { get; } } } \ No newline at end of file diff --git a/Tv7Playlist/Views/Home/Index.cshtml b/Tv7Playlist/Views/Home/Index.cshtml index 224b4d8..fe21cf8 100644 --- a/Tv7Playlist/Views/Home/Index.cshtml +++ b/Tv7Playlist/Views/Home/Index.cshtml @@ -10,18 +10,20 @@ Name Name override Enabled + Available URL @{ - foreach (var track in Model.Tracks) + foreach (var track in Model.PlaylistEntries) { - - @track.Id + @track.Position + @track.TrackNumber @track.Name - - + @track.NameOverride + @track.IsEnabled + @track.IsAvailable @track.Url }