This commit is contained in:
tidusjar 2016-04-03 21:35:13 +01:00
commit 9d9fc3daf8
5 changed files with 287 additions and 257 deletions

View file

@ -25,11 +25,20 @@
// ************************************************************************/ // ************************************************************************/
#endregion #endregion
using System.Text.RegularExpressions;
namespace PlexRequests.Core.Models namespace PlexRequests.Core.Models
{ {
public class StatusModel public class StatusModel
{ {
public string Version { get; set; } public string Version { get; set; }
public int DBVersion {
get
{
string trimStatus = new Regex("[^0-9]", RegexOptions.Compiled).Replace(Version, string.Empty).PadRight(4, '0');
return int.Parse(trimStatus);
}
}
public bool UpdateAvailable { get; set; } public bool UpdateAvailable { get; set; }
public string UpdateUri { get; set; } public string UpdateUri { get; set; }
public string DownloadUri { get; set; } public string DownloadUri { get; set; }

View file

@ -36,13 +36,12 @@ using PlexRequests.Core.SettingModels;
using PlexRequests.Helpers; using PlexRequests.Helpers;
using PlexRequests.Store; using PlexRequests.Store;
using PlexRequests.Store.Repository; using PlexRequests.Store.Repository;
using System.Text.RegularExpressions;
namespace PlexRequests.Core namespace PlexRequests.Core
{ {
public class Setup public class Setup
{ {
public const int SchemaVersion = 1;
private static Logger Log = LogManager.GetCurrentClassLogger(); private static Logger Log = LogManager.GetCurrentClassLogger();
private static DbConfiguration Db { get; set; } private static DbConfiguration Db { get; set; }
public string SetupDb() public string SetupDb()
@ -55,29 +54,39 @@ namespace PlexRequests.Core
{ {
CreateDefaultSettingsPage(); CreateDefaultSettingsPage();
} }
var version = CheckSchema();
if (version > 0)
{
if (version > 1300 && version <= 1699)
{
MigrateDbFrom1300();
}
}
MigrateDb();
CheckSchema();
return Db.DbConnection().ConnectionString; return Db.DbConnection().ConnectionString;
} }
public static string ConnectionString => Db.DbConnection().ConnectionString; public static string ConnectionString => Db.DbConnection().ConnectionString;
private void CheckSchema() private int CheckSchema()
{ {
var checker = new StatusChecker();
var status = checker.GetStatus();
var connection = Db.DbConnection(); var connection = Db.DbConnection();
var schema = connection.GetSchemaVersion(); var schema = connection.GetSchemaVersion();
if (schema == null) if (schema == null)
{ {
connection.CreateSchema(); // Set the default. connection.CreateSchema(status.DBVersion); // Set the default.
schema = connection.GetSchemaVersion(); schema = connection.GetSchemaVersion();
} }
var version = schema.SchemaVersion; var version = schema.SchemaVersion;
if (version == 0) if (version == 0)
{ {
connection.UpdateSchemaVersion(SchemaVersion); connection.UpdateSchemaVersion(status.DBVersion);
try try
{ {
TableCreation.AlterTable(Db.DbConnection(), "RequestBlobs", "ADD COLUMN", "MusicId", false, "TEXT"); TableCreation.AlterTable(Db.DbConnection(), "RequestBlobs", "ADD COLUMN", "MusicId", false, "TEXT");
@ -86,9 +95,10 @@ namespace PlexRequests.Core
{ {
Log.Error("Tried updating the schema to version 1"); Log.Error("Tried updating the schema to version 1");
Log.Error(e); Log.Error(e);
return -1;
} }
return;
} }
return version;
} }
private void CreateDefaultSettingsPage() private void CreateDefaultSettingsPage()
@ -105,7 +115,7 @@ namespace PlexRequests.Core
s.SaveSettings(defaultSettings); s.SaveSettings(defaultSettings);
} }
private void MigrateDb() // TODO: Remove in v1.7 private void MigrateDbFrom1300() // TODO: Remove in v1.7
{ {
var result = new List<long>(); var result = new List<long>();
@ -147,7 +157,7 @@ namespace PlexRequests.Core
Issues = r.Issues, Issues = r.Issues,
OtherMessage = r.OtherMessage, OtherMessage = r.OtherMessage,
Overview = show.summary.RemoveHtml(), Overview = show.summary.RemoveHtml(),
RequestedBy = r.RequestedBy, RequestedUsers = r.AllUsers, // should pull in the RequestedBy property and merge with RequestedUsers
RequestedDate = r.ReleaseDate, RequestedDate = r.ReleaseDate,
Status = show.status Status = show.status
}; };

View file

@ -80,10 +80,10 @@ namespace PlexRequests.Store
con.Close(); con.Close();
} }
public static void CreateSchema(this IDbConnection con) public static void CreateSchema(this IDbConnection con, int version)
{ {
con.Open(); con.Open();
con.Query("INSERT INTO DBInfo (SchemaVersion) values (0)"); con.Query(string.Format("INSERT INTO DBInfo (SchemaVersion) values ({0})", version));
con.Close(); con.Close();
} }

View file

@ -5,283 +5,294 @@
return opts.inverse(this); return opts.inverse(this);
}); });
var searchSource = $("#search-template").html(); $(function () {
var musicSource = $("#music-template").html();
var searchTemplate = Handlebars.compile(searchSource);
var musicTemplate = Handlebars.compile(musicSource);
var searchTimer = 0; var searchSource = $("#search-template").html();
var musicSource = $("#music-template").html();
var searchTemplate = Handlebars.compile(searchSource);
var musicTemplate = Handlebars.compile(musicSource);
// Type in movie search var searchTimer = 0;
$("#movieSearchContent").on("input", function () {
if (searchTimer) {
clearTimeout(searchTimer);
}
$('#movieSearchButton').attr("class","fa fa-spinner fa-spin");
searchTimer = setTimeout(movieSearch, 400);
}); // fix for selecting a default tab
var $tabs = $('#nav-tabs').children('li');
$('#moviesComingSoon').on('click', function (e) { if ($tabs.filter(function (li) { return $(li).hasClass('active') }).length <= 0) {
e.preventDefault(); $tabs.first().children('a:first-child').tab('show');
moviesComingSoon();
});
$('#moviesInTheaters').on('click', function (e) {
e.preventDefault();
moviesInTheaters();
});
// Type in TV search
$("#tvSearchContent").on("input", function () {
if (searchTimer) {
clearTimeout(searchTimer);
}
$('#tvSearchButton').attr("class", "fa fa-spinner fa-spin");
searchTimer = setTimeout(tvSearch, 400);
});
// Click TV dropdown option
$(document).on("click", ".dropdownTv", function (e) {
e.preventDefault();
var buttonId = e.target.id;
if ($("#" + buttonId).attr('disabled')) {
return;
} }
$("#" + buttonId).prop("disabled", true);
loadingButton(buttonId, "primary"); // Type in movie search
$("#movieSearchContent").on("input", function () {
if (searchTimer) {
clearTimeout(searchTimer);
}
$('#movieSearchButton').attr("class", "fa fa-spinner fa-spin");
searchTimer = setTimeout(movieSearch, 400);
});
$('#moviesComingSoon').on('click', function (e) {
e.preventDefault();
moviesComingSoon();
});
$('#moviesInTheaters').on('click', function (e) {
e.preventDefault();
moviesInTheaters();
});
// Type in TV search
$("#tvSearchContent").on("input", function () {
if (searchTimer) {
clearTimeout(searchTimer);
}
$('#tvSearchButton').attr("class", "fa fa-spinner fa-spin");
searchTimer = setTimeout(tvSearch, 400);
});
// Click TV dropdown option
$(document).on("click", ".dropdownTv", function (e) {
e.preventDefault();
var buttonId = e.target.id;
if ($("#" + buttonId).attr('disabled')) {
return;
}
$("#" + buttonId).prop("disabled", true);
loadingButton(buttonId, "primary");
var $form = $('#form' + buttonId); var $form = $('#form' + buttonId);
var data = $form.serialize(); var data = $form.serialize();
var seasons = $(this).attr("season-select"); var seasons = $(this).attr("season-select");
if (seasons === "2") { if (seasons === "2") {
// Send over the latest // Send over the latest
data = data + "&seasons=latest"; data = data + "&seasons=latest";
} }
if (seasons === "1") { if (seasons === "1") {
// Send over the first season // Send over the first season
data = data + "&seasons=first"; data = data + "&seasons=first";
} }
var type = $form.prop('method'); var type = $form.prop('method');
var url = $form.prop('action'); var url = $form.prop('action');
sendRequestAjax(data, type, url, buttonId); sendRequestAjax(data, type, url, buttonId);
}); });
// Search Music // Search Music
$("#musicSearchContent").on("input", function () { $("#musicSearchContent").on("input", function () {
if (searchTimer) { if (searchTimer) {
clearTimeout(searchTimer); clearTimeout(searchTimer);
} }
$('#musicSearchButton').attr("class", "fa fa-spinner fa-spin"); $('#musicSearchButton').attr("class", "fa fa-spinner fa-spin");
searchTimer = setTimeout(musicSearch, 400); searchTimer = setTimeout(musicSearch, 400);
}); });
// Click Request for movie // Click Request for movie
$(document).on("click", ".requestMovie", function (e) { $(document).on("click", ".requestMovie", function (e) {
e.preventDefault(); e.preventDefault();
var buttonId = e.target.id; var buttonId = e.target.id;
if ($("#" + buttonId).attr('disabled')) { if ($("#" + buttonId).attr('disabled')) {
return; return;
} }
$("#" + buttonId).prop("disabled", true); $("#" + buttonId).prop("disabled", true);
loadingButton(buttonId, "primary"); loadingButton(buttonId, "primary");
var $form = $('#form' + buttonId); var $form = $('#form' + buttonId);
var type = $form.prop('method'); var type = $form.prop('method');
var url = $form.prop('action'); var url = $form.prop('action');
var data = $form.serialize(); var data = $form.serialize();
sendRequestAjax(data, type, url, buttonId); sendRequestAjax(data, type, url, buttonId);
});
// Click Request for album });
$(document).on("click", ".requestAlbum", function (e) {
e.preventDefault();
var buttonId = e.target.id;
if ($("#" + buttonId).attr('disabled')) {
return;
}
$("#" + buttonId).prop("disabled", true); // Click Request for album
loadingButton(buttonId, "primary"); $(document).on("click", ".requestAlbum", function (e) {
e.preventDefault();
var buttonId = e.target.id;
if ($("#" + buttonId).attr('disabled')) {
return;
}
$("#" + buttonId).prop("disabled", true);
loadingButton(buttonId, "primary");
var $form = $('#form' + buttonId); var $form = $('#form' + buttonId);
var type = $form.prop('method'); var type = $form.prop('method');
var url = $form.prop('action'); var url = $form.prop('action');
var data = $form.serialize(); var data = $form.serialize();
sendRequestAjax(data, type, url, buttonId); sendRequestAjax(data, type, url, buttonId);
}); });
function sendRequestAjax(data, type, url, buttonId) { function sendRequestAjax(data, type, url, buttonId) {
$.ajax({ $.ajax({
type: type, type: type,
url: url, url: url,
data: data, data: data,
dataType: "json", dataType: "json",
success: function (response) { success: function (response) {
console.log(response); console.log(response);
if (response.result === true) { if (response.result === true) {
generateNotify(response.message || "Success!", "success"); generateNotify(response.message || "Success!", "success");
$('#' + buttonId).html("<i class='fa fa-check'></i> Requested"); $('#' + buttonId).html("<i class='fa fa-check'></i> Requested");
$('#' + buttonId).removeClass("btn-primary-outline"); $('#' + buttonId).removeClass("btn-primary-outline");
$('#' + buttonId).removeAttr("data-toggle"); $('#' + buttonId).removeAttr("data-toggle");
$('#' + buttonId).addClass("btn-success-outline"); $('#' + buttonId).addClass("btn-success-outline");
} else { } else {
generateNotify(response.message, "warning"); generateNotify(response.message, "warning");
$('#' + buttonId).html("<i class='fa fa-plus'></i> Request"); $('#' + buttonId).html("<i class='fa fa-plus'></i> Request");
$('#' + buttonId).attr("data-toggle", "dropdown"); $('#' + buttonId).attr("data-toggle", "dropdown");
$("#" + buttonId).removeAttr("disabled"); $("#" + buttonId).removeAttr("disabled");
}
},
error: function (e) {
console.log(e);
generateNotify("Something went wrong!", "danger");
} }
}, });
error: function (e) { }
console.log(e);
generateNotify("Something went wrong!", "danger");
}
});
}
function movieSearch() { function movieSearch() {
var query = $("#movieSearchContent").val(); var query = $("#movieSearchContent").val();
getMovies("/search/movie/" + query); getMovies("/search/movie/" + query);
} }
function moviesComingSoon() { function moviesComingSoon() {
getMovies("/search/movie/upcoming"); getMovies("/search/movie/upcoming");
} }
function moviesInTheaters() { function moviesInTheaters() {
getMovies("/search/movie/playing"); getMovies("/search/movie/playing");
} }
function getMovies(url) { function getMovies(url) {
$("#movieList").html(""); $("#movieList").html("");
$.ajax(url).success(function (results) {
if (results.length > 0) {
results.forEach(function(result) {
var context = buildMovieContext(result);
var html = searchTemplate(context); $.ajax(url).success(function (results) {
$("#movieList").append(html); if (results.length > 0) {
}); results.forEach(function (result) {
} var context = buildMovieContext(result);
else {
$("#movieList").html(noResultsHtml);
}
$('#movieSearchButton').attr("class","fa fa-search");
});
};
function tvSearch() { var html = searchTemplate(context);
var query = $("#tvSearchContent").val(); $("#movieList").append(html);
getTvShows("/search/tv/" + query); });
} }
else {
function getTvShows(url) { $("#movieList").html(noResultsHtml);
$("#tvList").html(""); }
$('#movieSearchButton').attr("class", "fa fa-search");
$.ajax(url).success(function (results) { });
if (results.length > 0) {
results.forEach(function(result) {
var context = buildTvShowContext(result);
var html = searchTemplate(context);
$("#tvList").append(html);
});
}
else {
$("#tvList").html(noResultsHtml);
}
$('#tvSearchButton').attr("class", "fa fa-search");
});
};
function musicSearch() {
var query = $("#musicSearchContent").val();
getMusic("/search/music/" + query);
}
function getMusic(url) {
$("#musicList").html("");
$.ajax(url).success(function (results) {
if (results.length > 0) {
results.forEach(function (result) {
var context = buildMusicContext(result);
var html = musicTemplate(context);
$("#musicList").append(html);
});
}
else {
$("#musicList").html(noResultsMusic);
}
$('#musicSearchButton').attr("class", "fa fa-search");
});
};
function buildMovieContext(result) {
var date = new Date(result.releaseDate);
var year = date.getFullYear();
var context = {
posterPath: result.posterPath,
id: result.id,
title: result.title,
overview: result.overview,
voteCount: result.voteCount,
voteAverage: result.voteAverage,
year: year,
type: "movie",
imdb: result.imdbId
}; };
return context; function tvSearch() {
} var query = $("#tvSearchContent").val();
getTvShows("/search/tv/" + query);
}
function buildTvShowContext(result) { function getTvShows(url) {
var date = new Date(result.firstAired); $("#tvList").html("");
var year = date.getFullYear();
var context = {
posterPath: result.banner,
id: result.id,
title: result.seriesName,
overview: result.overview,
year: year,
type: "tv",
imdb: result.imdbId
};
return context;
}
function buildMusicContext(result) { $.ajax(url).success(function (results) {
if (results.length > 0) {
var context = { results.forEach(function (result) {
id: result.id, var context = buildTvShowContext(result);
title: result.title, var html = searchTemplate(context);
overview: result.overview, $("#tvList").append(html);
year: result.releaseDate, });
type: "album", }
trackCount: result.trackCount, else {
coverArtUrl: result.coverArtUrl, $("#tvList").html(noResultsHtml);
artist: result.artist, }
releaseType: result.releaseType, $('#tvSearchButton').attr("class", "fa fa-search");
country: result.country });
}; };
return context; function musicSearch() {
} var query = $("#musicSearchContent").val();
getMusic("/search/music/" + query);
}
function getMusic(url) {
$("#musicList").html("");
$.ajax(url).success(function (results) {
if (results.length > 0) {
results.forEach(function (result) {
var context = buildMusicContext(result);
var html = musicTemplate(context);
$("#musicList").append(html);
});
}
else {
$("#musicList").html(noResultsMusic);
}
$('#musicSearchButton').attr("class", "fa fa-search");
});
};
function buildMovieContext(result) {
var date = new Date(result.releaseDate);
var year = date.getFullYear();
var context = {
posterPath: result.posterPath,
id: result.id,
title: result.title,
overview: result.overview,
voteCount: result.voteCount,
voteAverage: result.voteAverage,
year: year,
type: "movie",
imdb: result.imdbId
};
return context;
}
function buildTvShowContext(result) {
var date = new Date(result.firstAired);
var year = date.getFullYear();
var context = {
posterPath: result.banner,
id: result.id,
title: result.seriesName,
overview: result.overview,
year: year,
type: "tv",
imdb: result.imdbId
};
return context;
}
function buildMusicContext(result) {
var context = {
id: result.id,
title: result.title,
overview: result.overview,
year: result.releaseDate,
type: "album",
trackCount: result.trackCount,
coverArtUrl: result.coverArtUrl,
artist: result.artist,
releaseType: result.releaseType,
country: result.country
};
return context;
}
});

View file

@ -282,7 +282,7 @@ namespace PlexRequests.UI.Modules
var notificationModel = new NotificationModel var notificationModel = new NotificationModel
{ {
Title = model.Title, Title = model.Title,
User = model.RequestedBy, User = Username,
DateTime = DateTime.Now, DateTime = DateTime.Now,
NotificationType = NotificationType.NewRequest NotificationType = NotificationType.NewRequest
}; };
@ -307,7 +307,7 @@ namespace PlexRequests.UI.Modules
var notificationModel = new NotificationModel var notificationModel = new NotificationModel
{ {
Title = model.Title, Title = model.Title,
User = model.RequestedBy, User = Username,
DateTime = DateTime.Now, DateTime = DateTime.Now,
NotificationType = NotificationType.NewRequest NotificationType = NotificationType.NewRequest
}; };
@ -322,7 +322,7 @@ namespace PlexRequests.UI.Modules
Log.Debug("Adding movie to database requests"); Log.Debug("Adding movie to database requests");
var id = RequestService.AddRequest(model); var id = RequestService.AddRequest(model);
var notificationModel = new NotificationModel { Title = model.Title, User = model.RequestedBy, DateTime = DateTime.Now, NotificationType = NotificationType.NewRequest }; var notificationModel = new NotificationModel { Title = model.Title, User = Username, DateTime = DateTime.Now, NotificationType = NotificationType.NewRequest };
NotificationService.Publish(notificationModel); NotificationService.Publish(notificationModel);
return Response.AsJson(new JsonResponseModel { Result = true, Message = $"{fullMovieName} was successfully added!" }); return Response.AsJson(new JsonResponseModel { Result = true, Message = $"{fullMovieName} was successfully added!" });
@ -427,7 +427,7 @@ namespace PlexRequests.UI.Modules
model.Approved = true; model.Approved = true;
Log.Debug("Adding tv to database requests (No approval required & Sonarr)"); Log.Debug("Adding tv to database requests (No approval required & Sonarr)");
RequestService.AddRequest(model); RequestService.AddRequest(model);
var notify1 = new NotificationModel { Title = model.Title, User = model.RequestedBy, DateTime = DateTime.Now, NotificationType = NotificationType.NewRequest }; var notify1 = new NotificationModel { Title = model.Title, User = Username, DateTime = DateTime.Now, NotificationType = NotificationType.NewRequest };
NotificationService.Publish(notify1); NotificationService.Publish(notify1);
return Response.AsJson(new JsonResponseModel { Result = true, Message = $"{fullShowName} was successfully added!" }); return Response.AsJson(new JsonResponseModel { Result = true, Message = $"{fullShowName} was successfully added!" });
@ -448,7 +448,7 @@ namespace PlexRequests.UI.Modules
Log.Debug("Adding tv to database requests (No approval required & SickRage)"); Log.Debug("Adding tv to database requests (No approval required & SickRage)");
RequestService.AddRequest(model); RequestService.AddRequest(model);
var notify2 = new NotificationModel { Title = model.Title, User = model.RequestedBy, DateTime = DateTime.Now, NotificationType = NotificationType.NewRequest }; var notify2 = new NotificationModel { Title = model.Title, User = Username, DateTime = DateTime.Now, NotificationType = NotificationType.NewRequest };
NotificationService.Publish(notify2); NotificationService.Publish(notify2);
return Response.AsJson(new JsonResponseModel { Result = true, Message = $"{fullShowName} was successfully added!" }); return Response.AsJson(new JsonResponseModel { Result = true, Message = $"{fullShowName} was successfully added!" });
@ -462,7 +462,7 @@ namespace PlexRequests.UI.Modules
RequestService.AddRequest(model); RequestService.AddRequest(model);
var notificationModel = new NotificationModel { Title = model.Title, User = model.RequestedBy, DateTime = DateTime.Now, NotificationType = NotificationType.NewRequest }; var notificationModel = new NotificationModel { Title = model.Title, User = Username, DateTime = DateTime.Now, NotificationType = NotificationType.NewRequest };
NotificationService.Publish(notificationModel); NotificationService.Publish(notificationModel);
return Response.AsJson(new JsonResponseModel { Result = true, Message = $"{fullShowName} was successfully added!" }); return Response.AsJson(new JsonResponseModel { Result = true, Message = $"{fullShowName} was successfully added!" });