From d5c9df78cb8f2e7eb31e71c25293f3f3726fec30 Mon Sep 17 00:00:00 2001 From: Fergal Moran Date: Fri, 11 May 2018 20:24:11 +0100 Subject: [PATCH] Refactor to guid uid --- server/Controllers/AudioUploadController.cs | 2 +- server/Controllers/ChatController.cs | 2 +- server/Controllers/EntryController.cs | 2 +- server/Controllers/ImageUploadController.cs | 16 +- server/Controllers/PlaylistController.cs | 2 +- server/Controllers/PodcastController.cs | 2 +- server/Controllers/RssController.cs | 2 +- .../20180511181725_RemoveIdToBase.Designer.cs | 410 ++++++++++++++++++ .../20180511181725_RemoveIdToBase.cs | 17 + server/Models/BaseModel.cs | 12 + server/Models/Podcast.cs | 5 +- server/Models/PodcastEntry.cs | 1 - .../ViewModels/Resources/EntryViewModel.cs | 1 - .../ViewModels/Resources/PodcastViewModel.cs | 1 - .../RssViewModels/PodcastRssViewModel.cs | 11 +- ...{PodnomsContext.cs => PodNomsDbContext.cs} | 2 +- .../Repositories/EntryRepository.cs | 2 +- .../Persistence/Repositories/IRepository.cs | 24 +- .../Repositories/old/ChatRepository.cs | 64 --- .../Repositories/old/EntryRepository.cs | 65 --- .../Repositories/old/IChatRepository.cs | 14 - .../Repositories/old/IEntryRepository.cs | 15 - .../Repositories/old/IPlaylistRepository.cs | 13 - .../Repositories/old/IPodcastRepository.cs | 13 - .../Repositories/old/PlaylistRepository.cs | 50 --- .../Repositories/old/PodcastRepository.cs | 76 ---- server/Persistence/UnitOfWork.cs | 1 + .../Services/Jobs/ProcessPlaylistItemJob.cs | 1 - .../Processor/AudioUploadProcessService.cs | 2 +- server/Services/Processor/ProcessService.cs | 2 +- .../Services/Processor/UrlProcessService.cs | 4 +- 31 files changed, 476 insertions(+), 358 deletions(-) create mode 100644 server/Migrations/20180511181725_RemoveIdToBase.Designer.cs create mode 100644 server/Migrations/20180511181725_RemoveIdToBase.cs rename server/Persistence/{PodnomsContext.cs => PodNomsDbContext.cs} (99%) delete mode 100644 server/Persistence/Repositories/old/ChatRepository.cs delete mode 100644 server/Persistence/Repositories/old/EntryRepository.cs delete mode 100644 server/Persistence/Repositories/old/IChatRepository.cs delete mode 100644 server/Persistence/Repositories/old/IEntryRepository.cs delete mode 100644 server/Persistence/Repositories/old/IPlaylistRepository.cs delete mode 100644 server/Persistence/Repositories/old/IPodcastRepository.cs delete mode 100644 server/Persistence/Repositories/old/PlaylistRepository.cs delete mode 100644 server/Persistence/Repositories/old/PodcastRepository.cs diff --git a/server/Controllers/AudioUploadController.cs b/server/Controllers/AudioUploadController.cs index c8c88a9..cff50bd 100644 --- a/server/Controllers/AudioUploadController.cs +++ b/server/Controllers/AudioUploadController.cs @@ -69,7 +69,7 @@ namespace PodNoms.Api.Controllers { }; var localFile = await CachedFormFileStorage.CacheItem(file); - await _entryRepository.AddOrUpdateAsync(entry); + _entryRepository.AddOrUpdate(entry); await _unitOfWork.CompleteAsync(); BackgroundJob.Enqueue(service => service.UploadAudio(entry.Id, localFile)); diff --git a/server/Controllers/ChatController.cs b/server/Controllers/ChatController.cs index ee0b885..411b059 100644 --- a/server/Controllers/ChatController.cs +++ b/server/Controllers/ChatController.cs @@ -47,7 +47,7 @@ namespace PodNoms.Api.Controllers { message.FromUserName = _applicationUser.FullName; message.FromUserId = _applicationUser.Id; var chat = _mapper.Map(message); - await _chatRepository.AddOrUpdateAsync(chat); + _chatRepository.AddOrUpdate(chat); await this._unitOfWork.CompleteAsync(); if (await _supportChatService.InitiateSupportRequest(_userId, message)) { diff --git a/server/Controllers/EntryController.cs b/server/Controllers/EntryController.cs index 18d2b29..1ccf0d3 100644 --- a/server/Controllers/EntryController.cs +++ b/server/Controllers/EntryController.cs @@ -112,7 +112,7 @@ namespace PodNoms.Api.Controllers { } entry.Podcast = podcast; entry.Processed = false; - await _repository.AddOrUpdateAsync(entry); + _repository.AddOrUpdate(entry); await _unitOfWork.CompleteAsync(); _processEntry(entry); var result = _mapper.Map(entry); diff --git a/server/Controllers/ImageUploadController.cs b/server/Controllers/ImageUploadController.cs index 5333365..bacaf44 100644 --- a/server/Controllers/ImageUploadController.cs +++ b/server/Controllers/ImageUploadController.cs @@ -28,7 +28,7 @@ namespace PodNoms.Api.Controllers { [Authorize] [Route("/podcast/{slug}/imageupload")] public class ImageUploadController : BaseAuthController { - private readonly IPodcastRepository _repository; + private readonly IPodcastRepository _podcastRepository; private readonly IUnitOfWork _unitOfWork; private readonly IMapper _mapper; private readonly ImageFileStorageSettings _imageFileStorageSettings; @@ -42,7 +42,7 @@ namespace PodNoms.Api.Controllers { this._fileUploader = fileUploader; this._imageFileStorageSettings = imageFileStorageSettings.Value; - this._repository = repository; + this._podcastRepository = repository; //this._repository = repository; this._unitOfWork = unitOfWork; this._mapper = mapper; @@ -55,16 +55,16 @@ namespace PodNoms.Api.Controllers { if (file.Length > _imageFileStorageSettings.MaxUploadFileSize) return BadRequest("Maximum file size exceeded"); if (!_imageFileStorageSettings.IsSupported(file.FileName)) return BadRequest("Invalid file type"); - var podcast = await _repository.GetAsync(_applicationUser.Id, slug); + var podcast = await _podcastRepository.GetAsync(_applicationUser.Id, slug); if (podcast == null) return NotFound(); var cacheFile = await CachedFormFileStorage.CacheItem(file); - (var finishedFile, var extension) = __todo_convert_cache_file(cacheFile, podcast.Uid); - var thumbnailFile = __todo_create_thumbnail(cacheFile, podcast.Uid); + (var finishedFile, var extension) = __todo_convert_cache_file(cacheFile, podcast.ExposedUid); + var thumbnailFile = __todo_create_thumbnail(cacheFile, podcast.ExposedUid); - var destinationFile = $"{podcast.Uid}.{extension}"; - var destinationFileThumbnail = $"{podcast.Uid}-32x32.{extension}"; + var destinationFile = $"{podcast.ExposedUid}.{extension}"; + var destinationFileThumbnail = $"{podcast.ExposedUid}-32x32.{extension}"; await _fileUploader.UploadFile(finishedFile, _imageFileStorageSettings.ContainerName, destinationFile, "image/png", (p, t) => _logger.LogDebug($"Uploading image: {p} - {t}")); @@ -72,7 +72,7 @@ namespace PodNoms.Api.Controllers { await _fileUploader.UploadFile(thumbnailFile, _imageFileStorageSettings.ContainerName, destinationFileThumbnail, "image/png", (p, t) => _logger.LogDebug($"Uploading image: {p} - {t}")); - await _repository.AddOrUpdateAsync(podcast); + _podcastRepository.AddOrUpdate(podcast); podcast.TemporaryImageUrl = string.Empty; await this._unitOfWork.CompleteAsync(); diff --git a/server/Controllers/PlaylistController.cs b/server/Controllers/PlaylistController.cs index 67e3f39..6332c13 100644 --- a/server/Controllers/PlaylistController.cs +++ b/server/Controllers/PlaylistController.cs @@ -32,7 +32,7 @@ namespace PodNoms.Api.Controllers { PodcastId = entry.PodcastId, SourceUrl = entry.SourceUrl }; - await _playlistRepository.AddOrUpdateAsync(playlist); + _playlistRepository.AddOrUpdate(playlist); await _unitOfWork.CompleteAsync(); return Ok(playlist); } diff --git a/server/Controllers/PodcastController.cs b/server/Controllers/PodcastController.cs index ad0fcc1..29c7f9a 100644 --- a/server/Controllers/PodcastController.cs +++ b/server/Controllers/PodcastController.cs @@ -58,7 +58,7 @@ namespace PodNoms.Api.Controllers { if (ModelState.IsValid) { var item = _mapper.Map(vm); item.AppUser = _applicationUser; - var ret = await _repository.AddOrUpdateAsync(item); + var ret = _repository.AddOrUpdate(item); await _uow.CompleteAsync(); return new OkObjectResult(_mapper.Map(ret)); } diff --git a/server/Controllers/RssController.cs b/server/Controllers/RssController.cs index 71d895b..8a8f397 100644 --- a/server/Controllers/RssController.cs +++ b/server/Controllers/RssController.cs @@ -70,7 +70,7 @@ namespace PodNoms.Api.Controllers { from e in podcast.PodcastEntries select new PodcastEnclosureItemViewModel { Title = e.Title.StripNonXMLChars(), - Uid = e.Uid, + Uid = e.ExposedUid, Description = e.Description.StripNonXMLChars(), Author = e.Author.StripNonXMLChars(), UpdateDate = e.CreateDate.ToRFC822String(), diff --git a/server/Migrations/20180511181725_RemoveIdToBase.Designer.cs b/server/Migrations/20180511181725_RemoveIdToBase.Designer.cs new file mode 100644 index 0000000..b027ee4 --- /dev/null +++ b/server/Migrations/20180511181725_RemoveIdToBase.Designer.cs @@ -0,0 +1,410 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using PodNoms.Api.Persistence; + +namespace PodNoms.Api.Migrations { + [DbContext(typeof(PodNomsDbContext))] + [Migration("20180511181725_RemoveIdToBase")] + partial class RemoveIdToBase { + protected override void BuildTargetModel(ModelBuilder modelBuilder) { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.1.0-rc1-32029") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Name") + .HasMaxLength(256); + + b.Property("NormalizedName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasName("RoleNameIndex") + .HasFilter("[NormalizedName] IS NOT NULL"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("RoleId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => { + b.Property("LoginProvider"); + + b.Property("ProviderKey"); + + b.Property("ProviderDisplayName"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => { + b.Property("UserId"); + + b.Property("RoleId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => { + b.Property("UserId"); + + b.Property("LoginProvider"); + + b.Property("Name"); + + b.Property("Value"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("PodNoms.Api.Models.ChatMessage", b => { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreateDate"); + + b.Property("FromUserId"); + + b.Property("MessageSeen"); + + b.Property("ToUserId"); + + b.Property("UpdateDate"); + + b.HasKey("Id"); + + b.HasIndex("FromUserId"); + + b.HasIndex("ToUserId"); + + b.ToTable("ChatMessages"); + }); + + modelBuilder.Entity("PodNoms.Api.Models.ParsedPlaylistItem", b => { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreateDate"); + + b.Property("IsProcessed"); + + b.Property("PlaylistId"); + + b.Property("UpdateDate"); + + b.Property("VideoId"); + + b.Property("VideoType"); + + b.HasKey("Id"); + + b.HasIndex("PlaylistId"); + + b.ToTable("ParsedPlaylistItems"); + }); + + modelBuilder.Entity("PodNoms.Api.Models.Playlist", b => { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreateDate"); + + b.Property("PodcastId"); + + b.Property("SourceUrl"); + + b.Property("UpdateDate"); + + b.HasKey("Id"); + + b.HasIndex("PodcastId"); + + b.ToTable("Playlists"); + }); + + modelBuilder.Entity("PodNoms.Api.Models.Podcast", b => { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AppUserId"); + + b.Property("CreateDate"); + + b.Property("Description"); + + b.Property("Slug"); + + b.Property("TemporaryImageUrl"); + + b.Property("Title"); + + b.Property("Uid"); + + b.Property("UpdateDate"); + + b.HasKey("Id"); + + b.HasIndex("AppUserId"); + + b.ToTable("Podcasts"); + }); + + modelBuilder.Entity("PodNoms.Api.Models.PodcastEntry", b => { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AudioFileSize"); + + b.Property("AudioLength"); + + b.Property("AudioUrl"); + + b.Property("Author"); + + b.Property("CreateDate"); + + b.Property("Description"); + + b.Property("ImageUrl"); + + b.Property("PlaylistId"); + + b.Property("PodcastId"); + + b.Property("Processed"); + + b.Property("ProcessingPayload"); + + b.Property("ProcessingStatus"); + + b.Property("SourceUrl"); + + b.Property("Title"); + + b.Property("Uid"); + + b.Property("UpdateDate"); + + b.HasKey("Id"); + + b.HasIndex("PlaylistId"); + + b.HasIndex("PodcastId"); + + b.ToTable("PodcastEntries"); + }); + + modelBuilder.Entity("PodNoms.Api.Services.Auth.ApplicationUser", b => { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Email") + .HasMaxLength(256); + + b.Property("EmailConfirmed"); + + b.Property("FacebookId"); + + b.Property("FirstName"); + + b.Property("LastName"); + + b.Property("LockoutEnabled"); + + b.Property("LockoutEnd"); + + b.Property("NormalizedEmail") + .HasMaxLength(256); + + b.Property("NormalizedUserName") + .HasMaxLength(256); + + b.Property("PasswordHash"); + + b.Property("PhoneNumber"); + + b.Property("PhoneNumberConfirmed"); + + b.Property("PictureUrl"); + + b.Property("SecurityStamp"); + + b.Property("Slug"); + + b.Property("TwoFactorEnabled"); + + b.Property("UserName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasName("UserNameIndex") + .HasFilter("[NormalizedUserName] IS NOT NULL"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => { + b.HasOne("PodNoms.Api.Services.Auth.ApplicationUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => { + b.HasOne("PodNoms.Api.Services.Auth.ApplicationUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("PodNoms.Api.Services.Auth.ApplicationUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => { + b.HasOne("PodNoms.Api.Services.Auth.ApplicationUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("PodNoms.Api.Models.ChatMessage", b => { + b.HasOne("PodNoms.Api.Services.Auth.ApplicationUser", "FromUser") + .WithMany() + .HasForeignKey("FromUserId"); + + b.HasOne("PodNoms.Api.Services.Auth.ApplicationUser", "ToUser") + .WithMany() + .HasForeignKey("ToUserId"); + }); + + modelBuilder.Entity("PodNoms.Api.Models.ParsedPlaylistItem", b => { + b.HasOne("PodNoms.Api.Models.Playlist", "Playlist") + .WithMany("ParsedPlaylistItems") + .HasForeignKey("PlaylistId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("PodNoms.Api.Models.Playlist", b => { + b.HasOne("PodNoms.Api.Models.Podcast", "Podcast") + .WithMany() + .HasForeignKey("PodcastId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("PodNoms.Api.Models.Podcast", b => { + b.HasOne("PodNoms.Api.Services.Auth.ApplicationUser", "AppUser") + .WithMany() + .HasForeignKey("AppUserId"); + }); + + modelBuilder.Entity("PodNoms.Api.Models.PodcastEntry", b => { + b.HasOne("PodNoms.Api.Models.Playlist") + .WithMany("PodcastEntries") + .HasForeignKey("PlaylistId"); + + b.HasOne("PodNoms.Api.Models.Podcast", "Podcast") + .WithMany("PodcastEntries") + .HasForeignKey("PodcastId") + .OnDelete(DeleteBehavior.Cascade); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/server/Migrations/20180511181725_RemoveIdToBase.cs b/server/Migrations/20180511181725_RemoveIdToBase.cs new file mode 100644 index 0000000..beb1a96 --- /dev/null +++ b/server/Migrations/20180511181725_RemoveIdToBase.cs @@ -0,0 +1,17 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace PodNoms.Api.Migrations +{ + public partial class RemoveIdToBase : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + + } + } +} diff --git a/server/Models/BaseModel.cs b/server/Models/BaseModel.cs index aacc6b5..62f88bb 100644 --- a/server/Models/BaseModel.cs +++ b/server/Models/BaseModel.cs @@ -1,10 +1,22 @@ using System; +using System.ComponentModel.DataAnnotations.Schema; namespace PodNoms.Api.Models { public class BaseModel : IEntity { + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } + + // TODO replace Id with below + [DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public Guid NewId { get; set; } + + [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime CreateDate { get; set; } + + [DatabaseGenerated(DatabaseGeneratedOption.Computed)] public DateTime UpdateDate { get; set; } + + public string ExposedUid { get => NewId.ToString(); } } public interface IEntity { diff --git a/server/Models/Podcast.cs b/server/Models/Podcast.cs index 02fc3f6..11f3001 100644 --- a/server/Models/Podcast.cs +++ b/server/Models/Podcast.cs @@ -5,7 +5,6 @@ using PodNoms.Api.Services.Auth; namespace PodNoms.Api.Models { public class Podcast : BaseModel { - public string Uid { get; set; } public ApplicationUser AppUser { get; set; } public string Title { get; set; } public string Description { get; set; } @@ -17,11 +16,11 @@ namespace PodNoms.Api.Models { } public string GetImageUrl(string cdnUrl, string containerName) { - return string.IsNullOrEmpty(TemporaryImageUrl) ? $"{cdnUrl}{containerName}/{this.Uid}.png" : + return string.IsNullOrEmpty(TemporaryImageUrl) ? $"{cdnUrl}{containerName}/{this.ExposedUid}.png" : $"{cdnUrl}static/images/{TemporaryImageUrl}"; } public string GetThumbnailUrl(string cdnUrl, string containerName) { - return string.IsNullOrEmpty(TemporaryImageUrl) ? $"{cdnUrl}{containerName}/{this.Uid}-32x32.png" : + return string.IsNullOrEmpty(TemporaryImageUrl) ? $"{cdnUrl}{containerName}/{this.ExposedUid}-32x32.png" : $"{cdnUrl}static/images/{TemporaryImageUrl}"; } } diff --git a/server/Models/PodcastEntry.cs b/server/Models/PodcastEntry.cs index 75344e2..b300064 100644 --- a/server/Models/PodcastEntry.cs +++ b/server/Models/PodcastEntry.cs @@ -12,7 +12,6 @@ namespace PodNoms.Api.Models { } public class PodcastEntry : BaseModel { - public string Uid { get; set; } public string Author { get; set; } public string Title { get; set; } public string Description { get; set; } diff --git a/server/Models/ViewModels/Resources/EntryViewModel.cs b/server/Models/ViewModels/Resources/EntryViewModel.cs index 9e5fef3..474a587 100644 --- a/server/Models/ViewModels/Resources/EntryViewModel.cs +++ b/server/Models/ViewModels/Resources/EntryViewModel.cs @@ -4,7 +4,6 @@ namespace PodNoms.Api.Models.ViewModels { public class PodcastEntryViewModel { public int Id { get; set; } public int PodcastId { get; set; } - public string Uid { get; set; } public DateTime CreateDate { get; set; } public string Author { get; set; } public string Title { get; set; } diff --git a/server/Models/ViewModels/Resources/PodcastViewModel.cs b/server/Models/ViewModels/Resources/PodcastViewModel.cs index 4e8e00a..3d800c1 100644 --- a/server/Models/ViewModels/Resources/PodcastViewModel.cs +++ b/server/Models/ViewModels/Resources/PodcastViewModel.cs @@ -4,7 +4,6 @@ using System.Collections.ObjectModel; namespace PodNoms.Api.Models.ViewModels { public class PodcastViewModel { public int Id { get; set; } - public string Uid { get; set; } public string Title { get; set; } public string Description { get; set; } public string Slug { get; set; } diff --git a/server/Models/ViewModels/RssViewModels/PodcastRssViewModel.cs b/server/Models/ViewModels/RssViewModels/PodcastRssViewModel.cs index 84e2c9f..c2d2821 100644 --- a/server/Models/ViewModels/RssViewModels/PodcastRssViewModel.cs +++ b/server/Models/ViewModels/RssViewModels/PodcastRssViewModel.cs @@ -1,9 +1,7 @@ using System.Collections.Generic; -namespace PodNoms.Api.Models.ViewModels.RssViewModels -{ - public class PodcastEnclosureViewModel - { +namespace PodNoms.Api.Models.ViewModels.RssViewModels { + public class PodcastEnclosureViewModel { public string Title { get; set; } public string Description { get; set; } public string Author { get; set; } @@ -17,10 +15,9 @@ namespace PodNoms.Api.Models.ViewModels.RssViewModels public string ShowUrl { get; set; } public List Items { get; set; } } - public class PodcastEnclosureItemViewModel - { - public string Title { get; set; } + public class PodcastEnclosureItemViewModel { public string Uid { get; set; } + public string Title { get; set; } public string Description { get; set; } public string Author { get; set; } diff --git a/server/Persistence/PodnomsContext.cs b/server/Persistence/PodNomsDbContext.cs similarity index 99% rename from server/Persistence/PodnomsContext.cs rename to server/Persistence/PodNomsDbContext.cs index e5562fd..3c21ec2 100644 --- a/server/Persistence/PodnomsContext.cs +++ b/server/Persistence/PodNomsDbContext.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.IO; using System.Linq; using System.Threading; diff --git a/server/Persistence/Repositories/EntryRepository.cs b/server/Persistence/Repositories/EntryRepository.cs index f4f3bda..095268d 100644 --- a/server/Persistence/Repositories/EntryRepository.cs +++ b/server/Persistence/Repositories/EntryRepository.cs @@ -29,7 +29,7 @@ namespace PodNoms.Api.Persistence { public async Task GetByUidAsync(string uid) { var entry = await GetAll() - .SingleOrDefaultAsync(e => e.Uid == uid); + .SingleOrDefaultAsync(e => e.NewId.ToString().Equals(uid)); return entry; } } diff --git a/server/Persistence/Repositories/IRepository.cs b/server/Persistence/Repositories/IRepository.cs index c5a2d3f..96ad846 100644 --- a/server/Persistence/Repositories/IRepository.cs +++ b/server/Persistence/Repositories/IRepository.cs @@ -10,9 +10,9 @@ namespace PodNoms.Api.Persistence { public interface IRepository where TEntity : class, IEntity { IQueryable GetAll(); Task GetAsync(int id); - Task CreateAsync(TEntity entity); - Task UpdateAsync(TEntity entity); - Task AddOrUpdateAsync(TEntity entity); + TEntity Create(TEntity entity); + TEntity Update(TEntity entity); + TEntity AddOrUpdate(TEntity entity); Task DeleteAsync(int id); } @@ -28,35 +28,31 @@ namespace PodNoms.Api.Persistence { } public IQueryable GetAll() { - return _context.Set().AsNoTracking(); + return _context.Set(); } public async Task GetAsync(int id) { return await _context.Set() - .AsNoTracking() .FirstOrDefaultAsync(e => e.Id == id); } - public async Task CreateAsync(TEntity entity) { - var ret = await _context.Set().AddAsync(entity); - await _context.SaveChangesAsync(); + public TEntity Create(TEntity entity) { + var ret = _context.Set().Add(entity); return ret as TEntity; } - public async Task UpdateAsync(TEntity entity) { + public TEntity Update(TEntity entity) { var ret = _context.Set().Update(entity); - await _context.SaveChangesAsync(); return ret as TEntity; } - public async Task AddOrUpdateAsync(TEntity entity) { + public TEntity AddOrUpdate(TEntity entity) { var ret = entity; if (entity.Id != 0) { // _context.Entry(entry).State = EntityState.Modified - ret = await UpdateAsync(entity); + ret = Update(entity); } else { - ret = await CreateAsync(entity); + ret = Create(entity); } - await _context.SaveChangesAsync(); return ret; } diff --git a/server/Persistence/Repositories/old/ChatRepository.cs b/server/Persistence/Repositories/old/ChatRepository.cs deleted file mode 100644 index 1bde7ee..0000000 --- a/server/Persistence/Repositories/old/ChatRepository.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore; -using PodNoms.Api.Models; - -namespace PodNoms.Api.Persistence.Old { - public class ChatRepository : IChatRepository { - private readonly PodNomsDbContext _context; - - public ChatRepository(PodNomsDbContext context) { - this._context = context; - } - public async Task AddOrUpdateChat(ChatMessage chat) { - if (chat.Id != 0) { - // _context.Entry(entry).State = EntityState.Modified - _context.ChatMessages.Attach(chat); - _context.Entry(chat).State = EntityState.Modified; - } else { - await _context.ChatMessages.AddAsync(chat); - } - return chat; - } - - public async Task> GetAllChats(string userId) { - var chats = await _context.ChatMessages - .Where(c => c.FromUser.Id == userId || c.ToUser.Id == userId) - .Include(c => c.FromUser) - .Include(c => c.ToUser) - .ToListAsync(); - - return chats; - } - public async Task> GetChats(string fromUserId, string toUserId) { - var chats = await _context.ChatMessages - .Where(c => c.FromUser.Id == fromUserId && c.ToUser.Id == toUserId) - .Include(c => c.FromUser) - .Include(c => c.ToUser) - .ToListAsync(); - - return chats; - } - - public async Task> GetReceivedChats(string toUserId) { - var chats = await _context.ChatMessages - .Where(c => c.ToUser.Id == toUserId) - .Include(c => c.FromUser) - .Include(c => c.ToUser) - .ToListAsync(); - - return chats; - } - - public async Task> GetSentChats(string fromUserId) { - var chats = await _context.ChatMessages - .Where(c => c.FromUser.Id == fromUserId) - .Include(c => c.FromUser) - .Include(c => c.ToUser) - .ToListAsync(); - - return chats; - } - } -} \ No newline at end of file diff --git a/server/Persistence/Repositories/old/EntryRepository.cs b/server/Persistence/Repositories/old/EntryRepository.cs deleted file mode 100644 index 992901f..0000000 --- a/server/Persistence/Repositories/old/EntryRepository.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore; -using PodNoms.Api.Models; - -namespace PodNoms.Api.Persistence.Old { - public class EntryRepository : IEntryRepository { - private readonly PodNomsDbContext _context; - - public EntryRepository(PodNomsDbContext context) { - this._context = context; - } - public async Task GetAsync(int id) { - var entry = await _context.PodcastEntries - .Include(e => e.Podcast) - .Include(e => e.Podcast.AppUser) - .SingleOrDefaultAsync(e => e.Id == id); - return entry; - } - public async Task GetByUidAsync(string uid) { - var entry = await _context.PodcastEntries - .SingleOrDefaultAsync(e => e.Uid == uid); - return entry; - } - public async Task> GetAllAsync(int podcastId) { - var entries = await _context.PodcastEntries - .AsNoTracking() - .Where(e => e.PodcastId == podcastId) - .ToListAsync(); - return entries; - } - public async Task> GetAllAsync(string podcastSlug) { - var entries = await _context.PodcastEntries - .Where(e => e.Podcast.Slug == podcastSlug) - .ToListAsync(); - return entries; - } - public async Task> GetAllForUserAsync(string userId) { - var entries = await _context.PodcastEntries - .Where(e => e.Podcast.AppUser.Id == userId) - .Include(e => e.Podcast) - .ToListAsync(); - return entries; - } - - public async Task AddOrUpdateAsync(PodcastEntry entry) { - if (entry.Id != 0) { - // _context.Entry(entry).State = EntityState.Modified - _context.PodcastEntries.Attach(entry); - _context.Entry(entry).State = EntityState.Modified; - } else { - if (string.IsNullOrEmpty(entry.Uid)) - entry.Uid = System.Guid.NewGuid().ToString(); - await _context.PodcastEntries.AddAsync(entry); - } - return entry; - } - public async Task DeleteAsync(int id) { - var entry = await GetAsync(id); - _context.Remove(entry); - } - } -} \ No newline at end of file diff --git a/server/Persistence/Repositories/old/IChatRepository.cs b/server/Persistence/Repositories/old/IChatRepository.cs deleted file mode 100644 index 90de252..0000000 --- a/server/Persistence/Repositories/old/IChatRepository.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using PodNoms.Api.Models; - -namespace PodNoms.Api.Persistence.Old { - public interface IChatRepository { - Task> GetSentChats(string fromUserId); - Task> GetReceivedChats(string fromUserId); - Task> GetChats(string fromUserId, string toUserId); - Task> GetAllChats(string userId); - Task AddOrUpdateChat(ChatMessage message); - } - -} \ No newline at end of file diff --git a/server/Persistence/Repositories/old/IEntryRepository.cs b/server/Persistence/Repositories/old/IEntryRepository.cs deleted file mode 100644 index 5e18df2..0000000 --- a/server/Persistence/Repositories/old/IEntryRepository.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using PodNoms.Api.Models; - -namespace PodNoms.Api.Persistence.Old { - public interface IEntryRepository { - Task GetAsync(int id); - Task GetByUidAsync(string uid); - Task> GetAllAsync(int podcastId); - Task> GetAllAsync(string podcastSlug); - Task> GetAllForUserAsync(string userId); - Task AddOrUpdateAsync(PodcastEntry entry); - Task DeleteAsync(int id); - } -} \ No newline at end of file diff --git a/server/Persistence/Repositories/old/IPlaylistRepository.cs b/server/Persistence/Repositories/old/IPlaylistRepository.cs deleted file mode 100644 index eeb4884..0000000 --- a/server/Persistence/Repositories/old/IPlaylistRepository.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using PodNoms.Api.Models; - -namespace PodNoms.Api.Persistence.Old { - public interface IPlaylistRepository { - Task GetAsync(int id); - Task> GetAllAsync(); - Task AddOrUpdateAsync(Playlist playlist); - Task GetParsedItem(string itemId, int playlistId); - Task> GetUnprocessedItems(); - } -} \ No newline at end of file diff --git a/server/Persistence/Repositories/old/IPodcastRepository.cs b/server/Persistence/Repositories/old/IPodcastRepository.cs deleted file mode 100644 index 513a86c..0000000 --- a/server/Persistence/Repositories/old/IPodcastRepository.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Collections.Generic; -using System.Threading.Tasks; -using PodNoms.Api.Models; - -namespace PodNoms.Api.Persistence.Old { - public interface IPodcastRepository { - Task GetAsync(int id); - Task GetAsync(string id, string slug); - Task> GetAllAsync(string id); - Task AddOrUpdateAsync(Podcast item); - Task DeleteAsync(int id); - } -} \ No newline at end of file diff --git a/server/Persistence/Repositories/old/PlaylistRepository.cs b/server/Persistence/Repositories/old/PlaylistRepository.cs deleted file mode 100644 index 99eed8e..0000000 --- a/server/Persistence/Repositories/old/PlaylistRepository.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore; -using PodNoms.Api.Models; - -namespace PodNoms.Api.Persistence.Old { - public class PlaylistRepository : IPlaylistRepository { - private readonly PodNomsDbContext _context; - - public PlaylistRepository(PodNomsDbContext context) { - this._context = context; - } - public async Task GetAsync(int id) { - var entry = await _context.Playlists - .Include(e => e.Podcast) - .Include(e => e.Podcast.AppUser) - .SingleOrDefaultAsync(e => e.Id == id); - return entry; - } - public async Task> GetAllAsync() { - return await _context.Playlists.Include(p => p.ParsedPlaylistItems).ToListAsync(); - } - public async Task AddOrUpdateAsync(Playlist playlist) { - if (playlist.Id != 0) { - // _context.Entry(entry).State = EntityState.Modified - _context.Playlists.Attach(playlist); - _context.Entry(playlist).State = EntityState.Modified; - } else { - await _context.Playlists.AddAsync(playlist); - } - return playlist; - } - public async Task GetParsedItem(string itemId, int playlistId) { - return await _context.ParsedPlaylistItems - .Include(i => i.Playlist) - .Include(i => i.Playlist.Podcast) - .Include(i => i.Playlist.Podcast.AppUser) - .SingleOrDefaultAsync(i => i.VideoId == itemId && i.PlaylistId == playlistId); - } - public async Task> GetUnprocessedItems() { - return await _context.ParsedPlaylistItems - .Where(p => p.IsProcessed == false) - .Include(i => i.Playlist) - .Include(i => i.Playlist.Podcast) - .Include(i => i.Playlist.Podcast.AppUser) - .ToListAsync(); - } - } -} \ No newline at end of file diff --git a/server/Persistence/Repositories/old/PodcastRepository.cs b/server/Persistence/Repositories/old/PodcastRepository.cs deleted file mode 100644 index aba7b66..0000000 --- a/server/Persistence/Repositories/old/PodcastRepository.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Options; -using PodNoms.Api.Models; -using PodNoms.Api.Models.Settings; -using PodNoms.Api.Persistence.Old; -using PodNoms.Api.Services.Storage; -using PodNoms.Api.Utils; -using PodNoms.Api.Utils.Extensions; - -namespace PodNoms.Api.Persistence.Old { - public class PodcastRepository : IPodcastRepository { - private readonly PodNomsDbContext _context; - public IFileUploader _fileUploader { get; } - public ImageFileStorageSettings _imageStorageSettings { get; } - public PodcastRepository(PodNomsDbContext context, IFileUploader fileUploader, IOptions imageStorageSettings) { - this._imageStorageSettings = imageStorageSettings.Value; - this._fileUploader = fileUploader; - this._context = context; - } - public async Task GetAsync(int id) { - var ret = await _context.Podcasts - .Where(p => p.Id == id) - .Include(p => p.AppUser) - .FirstOrDefaultAsync(); - - return ret; - } - public async Task GetAsync(string id, string slug) { - var ret = await _context.Podcasts - .Where(p => p.Slug == slug && p.AppUser.Id == id) - .Include(p => p.PodcastEntries) - .Include(p => p.AppUser) - .FirstOrDefaultAsync(); - - return ret; - } - public async Task> GetAllAsync(string id) { - var ret = _context.Podcasts - .Where(u => u.AppUser.Id == id) - .Include(p => p.AppUser) - .OrderByDescending(p => p.Id); - return await ret.ToListAsync(); - } - public async Task AddOrUpdateAsync(Podcast item) { - if (item.Id != 0) { - _context.Entry(item).State = EntityState.Modified; - } else { - item.Uid = System.Guid.NewGuid().ToString(); - if (string.IsNullOrEmpty(item.Slug) && !string.IsNullOrEmpty(item.Title)) { - item.Slug = item.Title.Slugify( - from p in _context.Podcasts - select p.Slug); - } - item.TemporaryImageUrl = $"standard/podcast-image-{Randomisers.RandomInteger(1, 16)}.png"; - await _context.Podcasts.AddAsync(item); - } - return item; - } - public async Task DeleteAsync(int id) { - var podcast = await _context.Podcasts.SingleAsync(p => p.Id == id); - if (podcast != null) { - if (podcast.PodcastEntries != null) { - foreach (var entry in podcast.PodcastEntries) { - _context.Remove(entry); - } - } - _context.Remove(podcast); - } - return -1; - } - } -} \ No newline at end of file diff --git a/server/Persistence/UnitOfWork.cs b/server/Persistence/UnitOfWork.cs index 5ee5e07..0cd3f76 100644 --- a/server/Persistence/UnitOfWork.cs +++ b/server/Persistence/UnitOfWork.cs @@ -13,6 +13,7 @@ namespace PodNoms.Api.Persistence { } public async Task CompleteAsync() { try { + await Task.FromResult(null); await _context.SaveChangesAsync(); } catch (DbUpdateException dbe) { this._logger.LogError($"Error completing unit of work: {dbe.Message}\n{dbe.InnerException.Message}"); diff --git a/server/Services/Jobs/ProcessPlaylistItemJob.cs b/server/Services/Jobs/ProcessPlaylistItemJob.cs index 58de727..baac3bc 100644 --- a/server/Services/Jobs/ProcessPlaylistItemJob.cs +++ b/server/Services/Jobs/ProcessPlaylistItemJob.cs @@ -53,7 +53,6 @@ namespace PodNoms.Api.Services.Jobs { //we have the file so lets create the entry and ship to CDN var entry = new PodcastEntry { Title = downloader.Properties?.Title, - Uid = uid, Description = downloader.Properties?.Description, ProcessingStatus = ProcessingStatus.Uploading, ImageUrl = downloader.Properties?.Thumbnail diff --git a/server/Services/Processor/AudioUploadProcessService.cs b/server/Services/Processor/AudioUploadProcessService.cs index f117b27..7f465f4 100644 --- a/server/Services/Processor/AudioUploadProcessService.cs +++ b/server/Services/Processor/AudioUploadProcessService.cs @@ -49,7 +49,7 @@ namespace PodNoms.Api.Services.Processor { if (p % 1 == 0) { await _sendProgressUpdate( entry.Podcast.AppUser.Id, - entry.Uid, + entry.ExposedUid, new ProcessProgressEvent { Percentage = p, CurrentSpeed = string.Empty, diff --git a/server/Services/Processor/ProcessService.cs b/server/Services/Processor/ProcessService.cs index cbdc06e..419c664 100644 --- a/server/Services/Processor/ProcessService.cs +++ b/server/Services/Processor/ProcessService.cs @@ -27,7 +27,7 @@ namespace PodNoms.Api.Services.Processor { protected async Task _sendProcessCompleteMessage(PodcastEntry entry) { var result = _mapper.Map(entry); - return await _sendProcessUpdate(entry.Podcast.AppUser.Id, entry.Uid, "info_processed", result); + return await _sendProcessUpdate(entry.Podcast.AppUser.Id, entry.ExposedUid, "info_processed", result); } protected async Task _sendProgressUpdate(string userId, string itemUid, ProcessProgressEvent data) { return await _realtime.SendProcessUpdate(userId, itemUid, "progress_update", data); diff --git a/server/Services/Processor/UrlProcessService.cs b/server/Services/Processor/UrlProcessService.cs index 11161b6..83ca4e0 100644 --- a/server/Services/Processor/UrlProcessService.cs +++ b/server/Services/Processor/UrlProcessService.cs @@ -86,12 +86,12 @@ namespace PodNoms.Api.Services.Processor { var outputFile = Path.Combine(System.IO.Path.GetTempPath(), $"{System.Guid.NewGuid().ToString()}.mp3"); - downloader.DownloadProgress += async (s, e) => await __downloader_progress(entry.Podcast.AppUser.Id, entry.Uid, e); + downloader.DownloadProgress += async (s, e) => await __downloader_progress(entry.Podcast.AppUser.Id, entry.ExposedUid, e); downloader.PostProcessing += (s, e) => { Console.WriteLine(e); }; - var sourceFile = downloader.DownloadAudio(entry.Uid); + var sourceFile = downloader.DownloadAudio(entry.ExposedUid); if (!string.IsNullOrEmpty(sourceFile)) { entry.ProcessingStatus = ProcessingStatus.Uploading; entry.AudioUrl = sourceFile;