mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-07-12 16:22:55 -07:00
#865 rework the backend data. Actually use real models rather than a JSON store.
This commit is contained in:
parent
08e389f590
commit
2bc916998c
55 changed files with 1277 additions and 702 deletions
|
@ -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; }
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
{
|
||||
|
|
25
src/Ombi.Store/Entities/Requests/BaseRequest.cs
Normal file
25
src/Ombi.Store/Entities/Requests/BaseRequest.cs
Normal 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;
|
||||
}
|
||||
}
|
19
src/Ombi.Store/Entities/Requests/ChildRequests.cs
Normal file
19
src/Ombi.Store/Entities/Requests/ChildRequests.cs
Normal 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; }
|
||||
}
|
||||
}
|
20
src/Ombi.Store/Entities/Requests/FullBaseRequest.cs
Normal file
20
src/Ombi.Store/Entities/Requests/FullBaseRequest.cs
Normal 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;
|
||||
}
|
||||
}
|
9
src/Ombi.Store/Entities/Requests/IssuesBase.cs
Normal file
9
src/Ombi.Store/Entities/Requests/IssuesBase.cs
Normal file
|
@ -0,0 +1,9 @@
|
|||
namespace Ombi.Store.Entities.Requests
|
||||
{
|
||||
public class IssuesBase : Entity
|
||||
{
|
||||
public string Subect { get; set; }
|
||||
public string Description { get; set; }
|
||||
|
||||
}
|
||||
}
|
12
src/Ombi.Store/Entities/Requests/MovieIssues.cs
Normal file
12
src/Ombi.Store/Entities/Requests/MovieIssues.cs
Normal 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; }
|
||||
}
|
||||
}
|
15
src/Ombi.Store/Entities/Requests/MovieRequests.cs
Normal file
15
src/Ombi.Store/Entities/Requests/MovieRequests.cs
Normal 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; }
|
||||
}
|
||||
}
|
33
src/Ombi.Store/Entities/Requests/SeasonRequests.cs
Normal file
33
src/Ombi.Store/Entities/Requests/SeasonRequests.cs
Normal 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; }
|
||||
}
|
||||
}
|
12
src/Ombi.Store/Entities/Requests/TvIssues.cs
Normal file
12
src/Ombi.Store/Entities/Requests/TvIssues.cs
Normal 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; }
|
||||
}
|
||||
}
|
19
src/Ombi.Store/Entities/Requests/TvRequests.cs
Normal file
19
src/Ombi.Store/Entities/Requests/TvRequests.cs
Normal 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; }
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
19
src/Ombi.Store/Repository/Requests/ITvRequestRepository.cs
Normal file
19
src/Ombi.Store/Repository/Requests/ITvRequestRepository.cs
Normal 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();
|
||||
}
|
||||
}
|
50
src/Ombi.Store/Repository/Requests/MovieRequestRepository.cs
Normal file
50
src/Ombi.Store/Repository/Requests/MovieRequestRepository.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
82
src/Ombi.Store/Repository/Requests/TvRequestRepository.cs
Normal file
82
src/Ombi.Store/Repository/Requests/TvRequestRepository.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue