#865 rework the backend data. Actually use real models rather than a JSON store.

This commit is contained in:
Jamie.Rees 2017-06-26 16:32:23 +01:00
parent 08e389f590
commit 2bc916998c
55 changed files with 1277 additions and 702 deletions

View file

@ -5,6 +5,7 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Ombi.Store.Entities;
using Ombi.Store.Entities.Requests;
namespace Ombi.Store.Context
{
@ -22,5 +23,11 @@ namespace Ombi.Store.Context
EntityEntry<TEntity> Attach<TEntity>(TEntity entity) where TEntity : class;
DbSet<TEntity> Set<TEntity>() where TEntity : class;
DbSet<NotificationTemplates> NotificationTemplates { get; set; }
DbSet<MovieRequests> MovieRequests { get; set; }
DbSet<TvRequests> TvRequests { get; set; }
DbSet<ChildRequests> ChildRequests { get; set; }
DbSet<MovieIssues> MovieIssues { get; set; }
DbSet<TvIssues> TvIssues { get; set; }
}
}

View file

@ -4,6 +4,7 @@ using System.Linq;
using Microsoft.EntityFrameworkCore;
using Ombi.Helpers;
using Ombi.Store.Entities;
using Ombi.Store.Entities.Requests;
namespace Ombi.Store.Context
{
@ -40,6 +41,13 @@ namespace Ombi.Store.Context
public DbSet<PlexContent> PlexContent { get; set; }
public DbSet<RadarrCache> RadarrCache { get; set; }
public DbSet<NotificationTemplates> NotificationTemplates { get; set; }
public DbSet<MovieRequests> MovieRequests { get; set; }
public DbSet<TvRequests> TvRequests { get; set; }
public DbSet<ChildRequests> ChildRequests { get; set; }
public DbSet<MovieIssues> MovieIssues { get; set; }
public DbSet<TvIssues> TvIssues { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{

View file

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace Ombi.Store.Entities.Requests
{
public class BaseRequest : Entity
{
public bool Approved { get; set; }
public DateTime RequestedDate { get; set; }
public bool Available { get; set; }
public int RequestedUserId { get; set; }
public bool? Denied { get; set; }
public string DeniedReason { get; set; }
public RequestType RequestType { get; set; }
[ForeignKey(nameof(RequestedUserId))]
public User RequestedUser { get; set; }
[NotMapped]
public bool CanApprove => !Approved && !Available;
}
}

View file

@ -0,0 +1,19 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using Ombi.Store.Repository.Requests;
namespace Ombi.Store.Entities.Requests
{
[Table("ChildRequests")]
public class ChildRequests : BaseRequest
{
[ForeignKey(nameof(ParentRequestId))]
public TvRequests ParentRequest { get; set; }
public int ParentRequestId { get; set; }
public int? IssueId { get; set; }
[ForeignKey(nameof(IssueId))]
public List<TvIssues> Issues { get; set; }
public List<SeasonRequests> SeasonRequests { get; set; }
}
}

View file

@ -0,0 +1,20 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace Ombi.Store.Entities.Requests
{
public class FullBaseRequest : BaseRequest
{
public string ImdbId { get; set; }
public string Overview { get; set; }
public string Title { get; set; }
public string PosterPath { get; set; }
public DateTime ReleaseDate { get; set; }
public string Status { get; set; }
[NotMapped]
public bool Released => DateTime.UtcNow > ReleaseDate;
}
}

View file

@ -0,0 +1,9 @@
namespace Ombi.Store.Entities.Requests
{
public class IssuesBase : Entity
{
public string Subect { get; set; }
public string Description { get; set; }
}
}

View file

@ -0,0 +1,12 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace Ombi.Store.Entities.Requests
{
[Table("MovieIssues")]
public class MovieIssues : IssuesBase
{
public int MovieId { get; set; }
[ForeignKey(nameof(MovieId))]
public MovieRequests Movie { get; set; }
}
}

View file

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
namespace Ombi.Store.Entities.Requests
{
[Table("MovieRequests")]
public class MovieRequests : FullBaseRequest
{
public int TheMovieDbId { get; set; }
public int? IssueId { get; set; }
[ForeignKey(nameof(IssueId))]
public List<MovieIssues> Issues { get; set; }
}
}

View file

@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using Ombi.Store.Entities;
using Ombi.Store.Entities.Requests;
namespace Ombi.Store.Repository.Requests
{
public class SeasonRequests : Entity
{
public int SeasonNumber { get; set; }
public List<EpisodeRequests> Episodes { get; set; }
public int ChildRequestId { get; set; }
[ForeignKey(nameof(ChildRequestId))]
public ChildRequests ChildRequest { get; set; }
}
public class EpisodeRequests : Entity
{
public int EpisodeNumber { get; set; }
public string Title { get; set; }
public DateTime AirDate { get; set; }
public string Url { get; set; }
public bool Available { get; set; }
public int SeasonId { get; set; }
[ForeignKey(nameof(SeasonId))]
public SeasonRequests Season { get; set; }
}
}

View file

@ -0,0 +1,12 @@
using System.ComponentModel.DataAnnotations.Schema;
namespace Ombi.Store.Entities.Requests
{
[Table("TvIssues")]
public class TvIssues : IssuesBase
{
public int TvId { get; set; }
[ForeignKey(nameof(TvId))]
public ChildRequests Child { get; set; }
}
}

View file

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
namespace Ombi.Store.Entities.Requests
{
public class TvRequests : Entity
{
public int TvDbId { get; set; }
public string ImdbId { get; set; }
public int? RootFolder { get; set; }
public string Overview { get; set; }
public string Title { get; set; }
public string PosterPath { get; set; }
public DateTime ReleaseDate { get; set; }
public string Status { get; set; }
public List<ChildRequests> ChildRequests { get; set; }
}
}

View file

@ -0,0 +1,15 @@
using System.Linq;
using System.Threading.Tasks;
using Ombi.Store.Entities.Requests;
namespace Ombi.Store.Repository
{
public interface IMovieRequestRepository
{
Task<MovieRequests> Add(MovieRequests request);
Task Delete(MovieRequests request);
IQueryable<MovieRequests> Get();
Task<MovieRequests> GetRequest(int theMovieDbId);
Task Update(MovieRequests request);
}
}

View file

@ -0,0 +1,19 @@
using System.Linq;
using System.Threading.Tasks;
using Ombi.Store.Entities.Requests;
namespace Ombi.Store.Repository.Requests
{
public interface ITvRequestRepository
{
Task<TvRequests> Add(TvRequests request);
Task<ChildRequests> AddChild(ChildRequests request);
Task Delete(TvRequests request);
Task DeleteChild(ChildRequests request);
IQueryable<TvRequests> Get();
Task<TvRequests> GetRequest(int tvDbId);
Task Update(TvRequests request);
Task UpdateChild(ChildRequests request);
IQueryable<ChildRequests> GetChild();
}
}

View file

@ -0,0 +1,50 @@
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Ombi.Store.Context;
using Ombi.Store.Entities.Requests;
namespace Ombi.Store.Repository.Requests
{
public class MovieRequestRepository : IMovieRequestRepository
{
public MovieRequestRepository(IOmbiContext ctx)
{
Db = ctx;
}
private IOmbiContext Db { get; }
public async Task<MovieRequests> GetRequest(int theMovieDbId)
{
return await Db.MovieRequests.Where(x => x.TheMovieDbId == theMovieDbId)
.Include(x => x.RequestedUser)
.FirstOrDefaultAsync();
}
public IQueryable<MovieRequests> Get()
{
return Db.MovieRequests
.Include(x => x.RequestedUser)
.AsQueryable();
}
public async Task<MovieRequests> Add(MovieRequests request)
{
await Db.MovieRequests.AddAsync(request);
await Db.SaveChangesAsync();
return request;
}
public async Task Delete(MovieRequests request)
{
Db.MovieRequests.Remove(request);
await Db.SaveChangesAsync();
}
public async Task Update(MovieRequests request)
{
await Db.SaveChangesAsync();
}
}
}

View file

@ -0,0 +1,82 @@
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Ombi.Store.Context;
using Ombi.Store.Entities.Requests;
namespace Ombi.Store.Repository.Requests
{
public class TvRequestRepository : ITvRequestRepository
{
public TvRequestRepository(IOmbiContext ctx)
{
Db = ctx;
}
private IOmbiContext Db { get; }
public async Task<TvRequests> GetRequest(int tvDbId)
{
return await Db.TvRequests.Where(x => x.TvDbId == tvDbId)
.Include(x => x.ChildRequests)
.ThenInclude(x => x.Issues)
.Include(x => x.ChildRequests)
.ThenInclude(x => x.RequestedUser)
.FirstOrDefaultAsync();
}
public IQueryable<TvRequests> Get()
{
return Db.TvRequests
.Include(x => x.ChildRequests)
.ThenInclude(x => x.Issues)
.Include(x => x.ChildRequests)
.ThenInclude(x => x.RequestedUser)
.AsQueryable();
}
public IQueryable<ChildRequests> GetChild()
{
return Db.ChildRequests
.Include(x => x.Issues)
.Include(x => x.RequestedUser)
.AsQueryable();
}
public async Task<TvRequests> Add(TvRequests request)
{
await Db.TvRequests.AddAsync(request);
await Db.SaveChangesAsync();
return request;
}
public async Task<ChildRequests> AddChild(ChildRequests request)
{
await Db.ChildRequests.AddAsync(request);
await Db.SaveChangesAsync();
return request;
}
public async Task Delete(TvRequests request)
{
Db.TvRequests.Remove(request);
await Db.SaveChangesAsync();
}
public async Task DeleteChild(ChildRequests request)
{
Db.ChildRequests.Remove(request);
await Db.SaveChangesAsync();
}
public async Task Update(TvRequests request)
{
await Db.SaveChangesAsync();
}
public async Task UpdateChild(ChildRequests request)
{
await Db.SaveChangesAsync();
}
}
}

View file

@ -75,4 +75,99 @@ CREATE TABLE IF NOT EXISTS NotificationTemplates
Message BLOB NULL,
Enabled INTEGER NOT NULL
);
);
CREATE TABLE IF NOT EXISTS MovieIssues
(
Id INTEGER PRIMARY KEY AUTOINCREMENT,
Subject INTEGER NOT NULL,
Description INTEGER NOT NULL,
MovieId INTEGER NOT NULL,
FOREIGN KEY (MovieId) REFERENCES MovieRequests(Id)
);
CREATE TABLE IF NOT EXISTS TvIssues
(
Id INTEGER PRIMARY KEY AUTOINCREMENT,
Subject INTEGER NOT NULL,
Description INTEGER NOT NULL,
ChildId INTEGER NOT NULL,
FOREIGN KEY (ChildId) REFERENCES TvChildRequests(ChildId)
);
CREATE TABLE IF NOT EXISTS MovieRequests (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
ImdbId VARCHAR(20) NOT NULL,
TheMovieDbId INTEGER NOT NULL,
Overview VARCHAR(100) NOT NULL,
Title VARCHAR(50) NOT NULL,
PosterPath VARCHAR(100) NOT NULL,
ReleaseDate VARCHAR(100) NOT NULL,
Status VARCHAR(100) NOT NULL,
Approved INTEGER NOT NULL,
Available INTEGER NOT NULL,
RequestedDate VARCHAR(100) NOT NULL,
RequestedUserId INTEGER NOT NULL,
IssueId INTEGER NULL,
Denied INTEGER NULL,
DeniedReason VARCHAR(100) NULL,
RequestType INTEGER NOT NULL,
FOREIGN KEY (IssueId) REFERENCES MovieIssues(Id),
FOREIGN KEY (RequestedUserId) REFERENCES Users(Id)
);
CREATE TABLE IF NOT EXISTS TvRequests (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
ImdbId VARCHAR(20) NOT NULL,
TvDbId INTEGER NOT NULL,
Overview VARCHAR(100) NOT NULL,
Title VARCHAR(50) NOT NULL,
PosterPath VARCHAR(100) NOT NULL,
ReleaseDate VARCHAR(100) NOT NULL,
Status VARCHAR(100) NULL,
RootFolder INTEGER NULL
);
CREATE TABLE IF NOT EXISTS ChildRequests (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
Approved INTEGER NOT NULL,
Available INTEGER NOT NULL,
RequestedDate VARCHAR(100) NOT NULL,
RequestedUserId INTEGER NOT NULL,
IssueId INTEGER NULL,
Denied INTEGER NULL,
DeniedReason VARCHAR(100) NULL,
ParentRequestId INTEGER NOT NULL,
RequestType INTEGER NOT NULL,
FOREIGN KEY (IssueId) REFERENCES TvIssues(Id),
FOREIGN KEY (ParentRequestId) REFERENCES TvRequests(Id),
FOREIGN KEY (RequestedUserId) REFERENCES Users(Id)
);
CREATE TABLE IF NOT EXISTS SeasonRequests (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
SeasonNumber INTEGER NOT NULL,
ChildRequestId INTEGER NOT NULL,
FOREIGN KEY (ChildRequestId) REFERENCES ChildRequests(Id)
);
CREATE TABLE IF NOT EXISTS EpisodeRequests (
Id INTEGER PRIMARY KEY AUTOINCREMENT,
EpisodeNumber INTEGER NOT NULL,
Title VARCHAR(100) NOT NULL,
AirDate VARCHAR(100) NOT NULL,
Url VARCHAR(100) NOT NULL,
SeasonId INTEGER NOT NULL,
Available INTEGER NOT NULL,
FOREIGN KEY (SeasonId) REFERENCES SeasonRequests(Id)
);