added new fields to the playlist entry, migrations and started with the api controller to manage the list

This commit is contained in:
2019-01-24 23:14:07 +01:00
parent 6920d410b5
commit 6c6d107550
8 changed files with 221 additions and 7 deletions

View File

@@ -0,0 +1,50 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Tv7Playlist.Data;
namespace Tv7Playlist.Data.Migrations
{
[DbContext(typeof(PlaylistContext))]
[Migration("20190124221302_AddedEnabledAvailableNameOverride")]
partial class AddedEnabledAvailableNameOverride
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "2.2.0-rtm-35687");
modelBuilder.Entity("Tv7Playlist.Data.PlaylistEntry", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd();
b.Property<bool>("IsAvailable");
b.Property<bool>("IsEnabled");
b.Property<string>("Name");
b.Property<string>("NameOverride");
b.Property<int>("TrackNumber");
b.Property<string>("Url");
b.HasKey("Id");
b.HasIndex("Name");
b.HasIndex("TrackNumber")
.IsUnique();
b.ToTable("PlaylistEntries");
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -0,0 +1,70 @@
using Microsoft.EntityFrameworkCore.Migrations;
namespace Tv7Playlist.Data.Migrations
{
public partial class AddedEnabledAvailableNameOverride : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropUniqueConstraint(
name: "AK_PlaylistEntries_TrackNumber",
table: "PlaylistEntries");
migrationBuilder.AddColumn<bool>(
name: "IsAvailable",
table: "PlaylistEntries",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "IsEnabled",
table: "PlaylistEntries",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<string>(
name: "NameOverride",
table: "PlaylistEntries",
nullable: true);
migrationBuilder.CreateIndex(
name: "IX_PlaylistEntries_Name",
table: "PlaylistEntries",
column: "Name");
migrationBuilder.CreateIndex(
name: "IX_PlaylistEntries_TrackNumber",
table: "PlaylistEntries",
column: "TrackNumber",
unique: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropIndex(
name: "IX_PlaylistEntries_Name",
table: "PlaylistEntries");
migrationBuilder.DropIndex(
name: "IX_PlaylistEntries_TrackNumber",
table: "PlaylistEntries");
migrationBuilder.DropColumn(
name: "IsAvailable",
table: "PlaylistEntries");
migrationBuilder.DropColumn(
name: "IsEnabled",
table: "PlaylistEntries");
migrationBuilder.DropColumn(
name: "NameOverride",
table: "PlaylistEntries");
migrationBuilder.AddUniqueConstraint(
name: "AK_PlaylistEntries_TrackNumber",
table: "PlaylistEntries",
column: "TrackNumber");
}
}
}

View File

@@ -21,15 +21,24 @@ namespace Tv7Playlist.Data.Migrations
b.Property<Guid>("Id") b.Property<Guid>("Id")
.ValueGeneratedOnAdd(); .ValueGeneratedOnAdd();
b.Property<bool>("IsAvailable");
b.Property<bool>("IsEnabled");
b.Property<string>("Name"); b.Property<string>("Name");
b.Property<string>("NameOverride");
b.Property<int>("TrackNumber"); b.Property<int>("TrackNumber");
b.Property<string>("Url"); b.Property<string>("Url");
b.HasKey("Id"); b.HasKey("Id");
b.HasAlternateKey("TrackNumber"); b.HasIndex("Name");
b.HasIndex("TrackNumber")
.IsUnique();
b.ToTable("PlaylistEntries"); b.ToTable("PlaylistEntries");
}); });

View File

@@ -17,7 +17,8 @@ namespace Tv7Playlist.Data
var entityTypeBuilder = modelBuilder.Entity<PlaylistEntry>(); var entityTypeBuilder = modelBuilder.Entity<PlaylistEntry>();
entityTypeBuilder.HasKey(e => e.Id); entityTypeBuilder.HasKey(e => e.Id);
entityTypeBuilder.HasAlternateKey(e => e.TrackNumber); entityTypeBuilder.HasIndex(e => e.TrackNumber).IsUnique();
entityTypeBuilder.HasIndex(e => e.Name);
} }
} }
} }

View File

@@ -10,6 +10,12 @@ namespace Tv7Playlist.Data
public string Name { get; set; } public string Name { get; set; }
public string NameOverride { get; set; }
public string Url { get; set; } public string Url { get; set; }
public bool IsAvailable { get; set; }
public bool IsEnabled { get; set; }
} }
} }

View File

@@ -1,7 +1,6 @@
using System; using System;
using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;

View File

@@ -10,7 +10,7 @@ using Tv7Playlist.Core;
namespace Tv7Playlist.Controllers namespace Tv7Playlist.Controllers
{ {
[Route("api/playlist")] [Route("api/playlist-old")]
[ApiController] [ApiController]
public class PlayListController : ControllerBase public class PlayListController : ControllerBase
{ {

View File

@@ -0,0 +1,79 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using Tv7Playlist.Core;
using Tv7Playlist.Core.Parsers;
using Tv7Playlist.Data;
namespace Tv7Playlist.Controllers
{
[Route("api/playlist")]
[ApiController]
public class PlaylistApiController : Controller
{
private readonly IAppConfig _appConfig;
private readonly ILogger<HomeController> _logger;
private readonly PlaylistContext _playlistContext;
private readonly IPlaylistLoader _playlistLoader;
public PlaylistApiController(ILogger<HomeController> logger, PlaylistContext playlistContext,
IPlaylistLoader playlistLoader, IAppConfig appConfig)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_playlistContext = playlistContext ?? throw new ArgumentNullException(nameof(playlistContext));
_playlistLoader = playlistLoader ?? throw new ArgumentNullException(nameof(playlistLoader));
_appConfig = appConfig ?? throw new ArgumentNullException(nameof(appConfig));
}
[HttpGet]
[Route("synchronize")]
public async Task<IActionResult> Synchronize()
{
//TODO: Refactor to post method
_logger.LogDebug("Synchronizing playlist from server...");
var tracks = await _playlistLoader.LoadPlaylistFromUrl(_appConfig.TV7Url);
await MarkNotAvailableEntriesAsync(tracks);
await AddOrUpdateEntriesAsync(tracks);
_logger.LogDebug("Synchronizing playlist completed saving changes...");
await _playlistContext.SaveChangesAsync();
_logger.LogDebug("Playlist changes saved successfully...");
return Ok();
}
private async Task AddOrUpdateEntriesAsync(IEnumerable<ParsedTrack> tracks)
{
foreach (var track in tracks)
{
var entry = await _playlistContext.PlaylistEntries.Where(e => e.TrackNumber == track.Id).FirstOrDefaultAsync();
if (entry == null)
{
_logger.LogInformation($"Adding playlist entry {track.Id} - {track.Name}");
entry = new PlaylistEntry {Id = Guid.NewGuid(), TrackNumber = track.Id, IsEnabled = true};
_playlistContext.PlaylistEntries.Add(entry);
}
entry.IsAvailable = true;
entry.Name = track.Name;
entry.Url = track.Url;
}
}
private async Task MarkNotAvailableEntriesAsync(IReadOnlyCollection<ParsedTrack> tracks)
{
var unavailableEntries =
await _playlistContext.PlaylistEntries.Where(e => tracks.All(t => t.Id != e.TrackNumber)).ToListAsync();
foreach (var entry in unavailableEntries)
{
_logger.LogInformation($"Channel {entry.TrackNumber} - {entry.Name} is no longer available.");
entry.IsAvailable = false;
}
}
}
}