diff --git a/server/RdtClient.Data/Data/DataContext.cs b/server/RdtClient.Data/Data/DataContext.cs index eada789..b79e210 100644 --- a/server/RdtClient.Data/Data/DataContext.cs +++ b/server/RdtClient.Data/Data/DataContext.cs @@ -129,6 +129,12 @@ namespace RdtClient.Data.Data SettingId = "LogLevel", Type = "String", Value = "Warning" + }, + new Setting + { + SettingId = "Categories", + Type = "String", + Value = "" } }; diff --git a/server/RdtClient.Data/Data/SettingData.cs b/server/RdtClient.Data/Data/SettingData.cs index 61612b5..a96dcc1 100644 --- a/server/RdtClient.Data/Data/SettingData.cs +++ b/server/RdtClient.Data/Data/SettingData.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -11,6 +12,7 @@ namespace RdtClient.Data.Data { Task> GetAll(); Task Update(IList settings); + Task UpdateString(String key, String value); } public class SettingData : ISettingData @@ -68,5 +70,30 @@ namespace RdtClient.Data.Data _settingCacheLock.Release(); } } + + public async Task UpdateString(String key, String value) + { + await _settingCacheLock.WaitAsync(); + + try + { + var dbSetting = await _dataContext.Settings.FirstOrDefaultAsync(m => m.SettingId == key); + + if (dbSetting == null) + { + throw new Exception($"Cannot find setting with key {key}"); + } + + dbSetting.Value = value; + + await _dataContext.SaveChangesAsync(); + + _settingCache = null; + } + finally + { + _settingCacheLock.Release(); + } + } } } diff --git a/server/RdtClient.Service/Services/QBittorrent.cs b/server/RdtClient.Service/Services/QBittorrent.cs index 30c67e8..1af7223 100644 --- a/server/RdtClient.Service/Services/QBittorrent.cs +++ b/server/RdtClient.Service/Services/QBittorrent.cs @@ -23,6 +23,8 @@ namespace RdtClient.Service.Services Task TorrentsAddFile(Byte[] fileBytes, String category, Boolean autoDelete); Task TorrentsSetCategory(String hash, String category); Task> TorrentsCategories(); + Task CategoryCreate(String category); + Task CategoryRemove(String category); } public class QBittorrent : IQBittorrent @@ -454,6 +456,12 @@ namespace RdtClient.Service.Services .Distinct() .ToList(); + var categorySetting = await _settings.GetString("Categories"); + + var categories = categorySetting.Split(",", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + + torrentsToGroup.AddRange(categories); + var results = new Dictionary(); if (torrentsToGroup.Count > 0) @@ -468,5 +476,46 @@ namespace RdtClient.Service.Services return results; } + + public async Task CategoryCreate(String category) + { + var categoriesSetting = await _settings.GetString("Categories"); + + if (String.IsNullOrWhiteSpace(categoriesSetting)) + { + categoriesSetting = category; + } + else + { + var categoryList = categoriesSetting.Split(",", StringSplitOptions.RemoveEmptyEntries).ToList(); + + if (!categoryList.Contains(category)) + { + categoryList.Add(category); + } + + categoriesSetting = String.Join(",", categoryList); + } + + await _settings.UpdateString("Categories", categoriesSetting); + } + + public async Task CategoryRemove(String category) + { + var categoriesSetting = await _settings.GetString("Categories"); + + if (String.IsNullOrWhiteSpace(categoriesSetting)) + { + return; + } + + var categoryList = categoriesSetting.Split(",", StringSplitOptions.RemoveEmptyEntries).ToList(); + + categoryList = categoryList.Where(m => m != category).ToList(); + + categoriesSetting = String.Join(",", categoryList); + + await _settings.UpdateString("Categories", categoriesSetting); + } } } \ No newline at end of file diff --git a/server/RdtClient.Service/Services/Settings.cs b/server/RdtClient.Service/Services/Settings.cs index 9f58cef..b706bfe 100644 --- a/server/RdtClient.Service/Services/Settings.cs +++ b/server/RdtClient.Service/Services/Settings.cs @@ -14,6 +14,7 @@ namespace RdtClient.Service.Services { Task> GetAll(); Task Update(IList settings); + Task UpdateString(String key, String value); Task GetString(String key); Task GetNumber(String key); Task TestPath(String path); @@ -41,6 +42,11 @@ namespace RdtClient.Service.Services await _settingData.Update(settings); } + public async Task UpdateString(String key, String value) + { + await _settingData.UpdateString(key, value); + } + public async Task GetString(String key) { var settings = await GetAll(); diff --git a/server/RdtClient.Web/Controllers/QBittorrentController.cs b/server/RdtClient.Web/Controllers/QBittorrentController.cs index 4a15de6..86261dd 100644 --- a/server/RdtClient.Web/Controllers/QBittorrentController.cs +++ b/server/RdtClient.Web/Controllers/QBittorrentController.cs @@ -322,24 +322,6 @@ namespace RdtClient.Web.Controllers { var categories = await _qBittorrent.TorrentsCategories(); - if (!categories.ContainsKey("radarr")) - { - categories.Add("radarr", new TorrentCategory - { - Name = "radarr", - SavePath = "" - }); - } - - if (!categories.ContainsKey("sonarr")) - { - categories.Add("sonarr", new TorrentCategory - { - Name = "sonarr", - SavePath = "" - }); - } - return Ok(categories); } @@ -347,26 +329,34 @@ namespace RdtClient.Web.Controllers [Route("torrents/createCategory")] [HttpGet] [HttpPost] - public ActionResult TorrentsCreateCategory() + public async Task TorrentsCreateCategory([FromForm] QBTorrentsCreateCategoryRequest request) { - return Ok(); - } + if (String.IsNullOrWhiteSpace(request.Category)) + { + return BadRequest("category name is empty"); + } - [Authorize] - [Route("torrents/editCategory")] - [HttpGet] - [HttpPost] - public ActionResult TorrentsEditCategory() - { - return Ok(); + await _qBittorrent.CategoryCreate(request.Category.Trim()); } [Authorize] [Route("torrents/removeCategories")] [HttpGet] [HttpPost] - public ActionResult TorrentsRemoveCategories() + public async Task TorrentsRemoveCategories([FromForm] QBTorrentsRemoveCategoryRequest request) { + if (String.IsNullOrWhiteSpace(request.Categories)) + { + return Ok(); + } + + var categories = request.Categories.Split('\n', StringSplitOptions.RemoveEmptyEntries); + + foreach (var category in categories) + { + await _qBittorrent.CategoryRemove(category.Trim()); + } + return Ok(); } @@ -408,4 +398,14 @@ namespace RdtClient.Web.Controllers public String Hashes { get; set; } public String Category { get; set; } } + + public class QBTorrentsCreateCategoryRequest + { + public String Category { get; set; } + } + + public class QBTorrentsRemoveCategoryRequest + { + public String Categories { get; set; } + } } \ No newline at end of file