// Kyoo - A portable and vast media library solution. // Copyright (c) Kyoo. // // See AUTHORS.md and LICENSE file in the project root for full license information. // // Kyoo is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // any later version. // // Kyoo is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Kyoo. If not, see . using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using Kyoo.Abstractions.Controllers; using Kyoo.Abstractions.Models; using Kyoo.Database; using Kyoo.Utils; using Microsoft.EntityFrameworkCore; namespace Kyoo.Core.Controllers { /// /// A local repository to handle shows /// public class ShowRepository : LocalRepository, IShowRepository { /// /// The database handle /// private readonly DatabaseContext _database; /// /// A studio repository to handle creation/validation of related studios. /// private readonly IStudioRepository _studios; /// /// A people repository to handle creation/validation of related people. /// private readonly IPeopleRepository _people; /// /// A genres repository to handle creation/validation of related genres. /// private readonly IGenreRepository _genres; /// /// A provider repository to handle externalID creation and deletion /// private readonly IProviderRepository _providers; /// protected override Expression> DefaultSort => x => x.Title; /// /// Create a new . /// /// The database handle to use /// A studio repository /// A people repository /// A genres repository /// A provider repository public ShowRepository(DatabaseContext database, IStudioRepository studios, IPeopleRepository people, IGenreRepository genres, IProviderRepository providers) : base(database) { _database = database; _studios = studios; _people = people; _genres = genres; _providers = providers; } /// public override async Task> Search(string query) { query = $"%{query}%"; return await _database.Shows .Where(_database.Like(x => x.Title + " " + x.Slug, query)) .OrderBy(DefaultSort) .Take(20) .ToListAsync(); } /// public override async Task Create(Show obj) { await base.Create(obj); _database.Entry(obj).State = EntityState.Added; await _database.SaveChangesAsync($"Trying to insert a duplicated show (slug {obj.Slug} already exists)."); return obj; } /// protected override async Task Validate(Show resource) { await base.Validate(resource); if (resource.Studio != null) { resource.Studio = await _studios.CreateIfNotExists(resource.Studio); resource.StudioID = resource.Studio.ID; } if (resource.Genres != null) { resource.Genres = await resource.Genres .SelectAsync(x => _genres.CreateIfNotExists(x)) .ToListAsync(); _database.AttachRange(resource.Genres); } if (resource.ExternalIDs != null) { foreach (MetadataID id in resource.ExternalIDs) { id.Provider = _database.LocalEntity(id.Provider.Slug) ?? await _providers.CreateIfNotExists(id.Provider); id.ProviderID = id.Provider.ID; } _database.MetadataIds().AttachRange(resource.ExternalIDs); } if (resource.People != null) { foreach (PeopleRole role in resource.People) { role.People = _database.LocalEntity(role.People.Slug) ?? await _people.CreateIfNotExists(role.People); role.PeopleID = role.People.ID; _database.Entry(role).State = EntityState.Added; } } } /// protected override async Task EditRelations(Show resource, Show changed, bool resetOld) { await Validate(changed); if (changed.Aliases != null || resetOld) resource.Aliases = changed.Aliases; if (changed.Studio != null || resetOld) { await Database.Entry(resource).Reference(x => x.Studio).LoadAsync(); resource.Studio = changed.Studio; } if (changed.Genres != null || resetOld) { await Database.Entry(resource).Collection(x => x.Genres).LoadAsync(); resource.Genres = changed.Genres; } if (changed.People != null || resetOld) { await Database.Entry(resource).Collection(x => x.People).LoadAsync(); resource.People = changed.People; } if (changed.ExternalIDs != null || resetOld) { await Database.Entry(resource).Collection(x => x.ExternalIDs).LoadAsync(); resource.ExternalIDs = changed.ExternalIDs; } } /// public async Task AddShowLink(int showID, int? libraryID, int? collectionID) { if (collectionID != null) { await _database.AddLinks(collectionID.Value, showID); await _database.SaveIfNoDuplicates(); if (libraryID != null) { await _database.AddLinks(libraryID.Value, collectionID.Value); await _database.SaveIfNoDuplicates(); } } if (libraryID != null) { await _database.AddLinks(libraryID.Value, showID); await _database.SaveIfNoDuplicates(); } } /// public Task GetSlug(int showID) { return _database.Shows.Where(x => x.ID == showID) .Select(x => x.Slug) .FirstOrDefaultAsync(); } /// public override async Task Delete(Show obj) { _database.Remove(obj); await _database.SaveChangesAsync(); } } }