From 965fb7ed5b2c988b7d43681da7dc5e692c76931d Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Wed, 3 Jun 2020 03:52:27 +0200 Subject: [PATCH] Creating the season repository --- Kyoo.Common/Controllers/IRepository.cs | 4 +- Kyoo.Common/Models/Season.cs | 2 +- .../Repositories/SeasonRepository.cs | 114 ++++++++++++++++++ 3 files changed, 117 insertions(+), 3 deletions(-) create mode 100644 Kyoo/Controllers/Repositories/SeasonRepository.cs diff --git a/Kyoo.Common/Controllers/IRepository.cs b/Kyoo.Common/Controllers/IRepository.cs index 4a691ee9..baf7e1cc 100644 --- a/Kyoo.Common/Controllers/IRepository.cs +++ b/Kyoo.Common/Controllers/IRepository.cs @@ -21,12 +21,12 @@ namespace Kyoo.Controllers public interface ISeasonRepository : IRepository { - Season Get(string showSlug, long seasonNumber); + Task Get(string showSlug, long seasonNumber); } public interface IEpisodeRepository : IRepository { - Episode Get(string showSlug, long seasonNumber, long episodeNumber); + Task Get(string showSlug, long seasonNumber, long episodeNumber); } public interface ITrackRepository : IRepository {} diff --git a/Kyoo.Common/Models/Season.cs b/Kyoo.Common/Models/Season.cs index 0f306349..99bbd5cf 100644 --- a/Kyoo.Common/Models/Season.cs +++ b/Kyoo.Common/Models/Season.cs @@ -10,7 +10,7 @@ namespace Kyoo.Models public long SeasonNumber { get; set; } = -1; - public string Slug => $"{Show.Title}-s{SeasonNumber}"; + public string Slug => $"{Show.Slug}-s{SeasonNumber}"; public string Title { get; set; } public string Overview { get; set; } public long? Year { get; set; } diff --git a/Kyoo/Controllers/Repositories/SeasonRepository.cs b/Kyoo/Controllers/Repositories/SeasonRepository.cs new file mode 100644 index 00000000..067e44b0 --- /dev/null +++ b/Kyoo/Controllers/Repositories/SeasonRepository.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Kyoo.Models; +using Kyoo.Models.Exceptions; +using Microsoft.EntityFrameworkCore; + +namespace Kyoo.Controllers +{ + public class SeasonRepository : ISeasonRepository + { + private readonly DatabaseContext _database; + private readonly IProviderRepository _providers; + + + public SeasonRepository(DatabaseContext database, IProviderRepository providers) + { + _database = database; + _providers = providers; + } + + public async Task Get(long id) + { + return await _database.Seasons.FirstOrDefaultAsync(x => x.ID == id); + } + + public Task Get(string slug) + { + int index = slug.IndexOf('-'); + if (index == -1) + throw new InvalidOperationException("Invalid season slug. Format: showSlug-seasonNumber"); + string showSlug = slug.Substring(0, index); + if (!long.TryParse(slug.Substring(index + 1), out long seasonNumber)) + throw new InvalidOperationException("Invalid season slug. Format: showSlug-seasonNumber"); + return Get(showSlug, seasonNumber); + } + + public async Task Get(string showSlug, long seasonNumber) + { + return await _database.Seasons.FirstOrDefaultAsync(x => x.Show.Slug == showSlug + && x.SeasonNumber == seasonNumber); + } + + public async Task> Search(string query) + { + return await _database.Seasons + .Where(x => EF.Functions.Like(x.Title, $"%{query}%")) + .Take(20) + .ToListAsync(); + } + + public async Task> GetAll() + { + return await _database.Seasons.ToListAsync(); + } + + public async Task Create(Season obj) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + + obj.Show = null; + obj.Episodes = null; + await Validate(obj); + + await _database.Seasons.AddAsync(obj); + await _database.SaveChangesAsync(); + return obj.ID; + } + + public async Task CreateIfNotExists(Season obj) + { + if (obj == null) + throw new ArgumentNullException(nameof(obj)); + + Season old = await Get(obj.Slug); + if (old != null) + return old.ID; + return await Create(obj); + } + + public async Task Edit(Season edited, bool resetOld) + { + if (edited == null) + throw new ArgumentNullException(nameof(edited)); + + Season old = await Get(edited.Slug); + + if (old == null) + throw new ItemNotFound($"No season found with the slug {edited.Slug}."); + + if (resetOld) + Utility.Nullify(old); + Utility.Merge(old, edited); + await _database.SaveChangesAsync(); + } + + private async Task Validate(Season obj) + { + obj.ExternalIDs = (await Task.WhenAll(obj.ExternalIDs.Select(async x => + { + x.ProviderID = await _providers.CreateIfNotExists(x.Provider); + return x; + }))).ToList(); + } + + public async Task Delete(Season obj) + { + _database.Seasons.Remove(obj); + await _database.SaveChangesAsync(); + } + } +} \ No newline at end of file