diff --git a/back/src/Kyoo.Abstractions/Controllers/IRepository.cs b/back/src/Kyoo.Abstractions/Controllers/IRepository.cs index 229fc4ce..56e91cd7 100644 --- a/back/src/Kyoo.Abstractions/Controllers/IRepository.cs +++ b/back/src/Kyoo.Abstractions/Controllers/IRepository.cs @@ -33,6 +33,12 @@ namespace Kyoo.Abstractions.Controllers public interface IRepository : IBaseRepository where T : class, IResource { + /// + /// The event handler type for all events of this repository. + /// + /// The resource created/modified/deleted + public delegate void ResourceEventHandler(T resource); + /// /// Get a resource from it's ID. /// @@ -128,6 +134,11 @@ namespace Kyoo.Abstractions.Controllers [ItemNotNull] Task CreateIfNotExists([NotNull] T obj); + /// + /// Called when a resource has been created. + /// + event ResourceEventHandler OnCreated; + /// /// Edit a resource /// @@ -138,6 +149,11 @@ namespace Kyoo.Abstractions.Controllers [ItemNotNull] Task Edit([NotNull] T edited, bool resetOld); + /// + /// Called when a resource has been edited. + /// + event ResourceEventHandler OnEdited; + /// /// Delete a resource by it's ID /// @@ -168,6 +184,11 @@ namespace Kyoo.Abstractions.Controllers /// A predicate to filter resources to delete. Every resource that match this will be deleted. /// A representing the asynchronous operation. Task DeleteAll([NotNull] Expression> where); + + /// + /// Called when a resource has been edited. + /// + event ResourceEventHandler OnDeleted; } /// diff --git a/back/src/Kyoo.Core/Controllers/Repositories/CollectionRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/CollectionRepository.cs index 840fbffd..53f8df1b 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/CollectionRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/CollectionRepository.cs @@ -73,6 +73,7 @@ namespace Kyoo.Core.Controllers await base.Create(obj); _database.Entry(obj).State = EntityState.Added; await _database.SaveChangesAsync(() => Get(obj.Slug)); + OnResourceCreated(obj); return obj; } @@ -118,6 +119,7 @@ namespace Kyoo.Core.Controllers _database.Entry(obj).State = EntityState.Deleted; await _database.SaveChangesAsync(); + await base.Delete(obj); } } } diff --git a/back/src/Kyoo.Core/Controllers/Repositories/EpisodeRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/EpisodeRepository.cs index b3ab970e..be329f3c 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/EpisodeRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/EpisodeRepository.cs @@ -146,6 +146,7 @@ namespace Kyoo.Core.Controllers obj.SeasonNumber != null && obj.EpisodeNumber != null ? Get(obj.ShowID, obj.SeasonNumber.Value, obj.EpisodeNumber.Value) : GetAbsolute(obj.ShowID, obj.AbsoluteNumber.Value)); + OnResourceCreated(obj); return await _ValidateTracks(obj); } @@ -223,6 +224,7 @@ namespace Kyoo.Core.Controllers await obj.Tracks.ForEachAsync(x => _tracks.Delete(x)); obj.ExternalIDs.ForEach(x => _database.Entry(x).State = EntityState.Deleted); await _database.SaveChangesAsync(); + await base.Delete(obj); } } } diff --git a/back/src/Kyoo.Core/Controllers/Repositories/GenreRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/GenreRepository.cs index 9b9a2843..73c05a68 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/GenreRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/GenreRepository.cs @@ -75,6 +75,7 @@ namespace Kyoo.Core.Controllers await base.Create(obj); _database.Entry(obj).State = EntityState.Added; await _database.SaveChangesAsync(() => Get(obj.Slug)); + OnResourceCreated(obj); return obj; } @@ -86,6 +87,7 @@ namespace Kyoo.Core.Controllers _database.Entry(obj).State = EntityState.Deleted; await _database.SaveChangesAsync(); + await base.Delete(obj); } } } diff --git a/back/src/Kyoo.Core/Controllers/Repositories/LibraryRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/LibraryRepository.cs index 76a7a8bb..dfc76442 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/LibraryRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/LibraryRepository.cs @@ -75,6 +75,7 @@ namespace Kyoo.Core.Controllers await base.Create(obj); _database.Entry(obj).State = EntityState.Added; await _database.SaveChangesAsync(() => Get(obj.Slug)); + OnResourceCreated(obj); return obj; } @@ -122,6 +123,7 @@ namespace Kyoo.Core.Controllers _database.Entry(obj).State = EntityState.Deleted; await _database.SaveChangesAsync(); + await base.Delete(obj); } } } diff --git a/back/src/Kyoo.Core/Controllers/Repositories/LocalRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/LocalRepository.cs index 4f67fb0c..cb2f5fc8 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/LocalRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/LocalRepository.cs @@ -62,6 +62,15 @@ namespace Kyoo.Core.Controllers /// public Type RepositoryType => typeof(T); + /// + public event IRepository.ResourceEventHandler OnCreated; + + /// + public event IRepository.ResourceEventHandler OnEdited; + + /// + public event IRepository.ResourceEventHandler OnDeleted; + /// /// Sort the given query. /// @@ -335,6 +344,15 @@ namespace Kyoo.Core.Controllers return obj; } + /// + /// Callback that should be called after a resource has been created. + /// + /// The resource newly created. + protected void OnResourceCreated(T obj) + { + OnCreated.Invoke(obj); + } + /// public virtual async Task CreateIfNotExists(T obj) { @@ -372,6 +390,7 @@ namespace Kyoo.Core.Controllers Merger.Complete(old, edited, x => x.GetCustomAttribute() == null); await EditRelations(old, edited, resetOld); await Database.SaveChangesAsync(); + OnEdited.Invoke(old); return old; } finally @@ -448,7 +467,11 @@ namespace Kyoo.Core.Controllers } /// - public abstract Task Delete(T obj); + public virtual Task Delete(T obj) + { + OnDeleted.Invoke(obj); + return Task.CompletedTask; + } /// public async Task DeleteAll(Expression> where) diff --git a/back/src/Kyoo.Core/Controllers/Repositories/PeopleRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/PeopleRepository.cs index d6089ab6..bd631ed1 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/PeopleRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/PeopleRepository.cs @@ -85,6 +85,7 @@ namespace Kyoo.Core.Controllers await base.Create(obj); _database.Entry(obj).State = EntityState.Added; await _database.SaveChangesAsync(() => Get(obj.Slug)); + OnResourceCreated(obj); return obj; } @@ -144,6 +145,7 @@ namespace Kyoo.Core.Controllers obj.ExternalIDs.ForEach(x => _database.Entry(x).State = EntityState.Deleted); obj.Roles.ForEach(x => _database.Entry(x).State = EntityState.Deleted); await _database.SaveChangesAsync(); + await base.Delete(obj); } /// diff --git a/back/src/Kyoo.Core/Controllers/Repositories/ProviderRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/ProviderRepository.cs index 5aa2d0be..7435e0fa 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/ProviderRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/ProviderRepository.cs @@ -68,6 +68,7 @@ namespace Kyoo.Core.Controllers await base.Create(obj); _database.Entry(obj).State = EntityState.Added; await _database.SaveChangesAsync(() => Get(obj.Slug)); + OnResourceCreated(obj); return obj; } @@ -79,6 +80,7 @@ namespace Kyoo.Core.Controllers _database.Entry(obj).State = EntityState.Deleted; await _database.SaveChangesAsync(); + await base.Delete(obj); } /// diff --git a/back/src/Kyoo.Core/Controllers/Repositories/SeasonRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/SeasonRepository.cs index 3d20216e..a512fa6a 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/SeasonRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/SeasonRepository.cs @@ -108,6 +108,7 @@ namespace Kyoo.Core.Controllers await base.Create(obj); _database.Entry(obj).State = EntityState.Added; await _database.SaveChangesAsync(() => Get(obj.ShowID, obj.SeasonNumber)); + OnResourceCreated(obj); return obj; } @@ -157,6 +158,7 @@ namespace Kyoo.Core.Controllers _database.Remove(obj); await _database.SaveChangesAsync(); + await base.Delete(obj); } } } diff --git a/back/src/Kyoo.Core/Controllers/Repositories/ShowRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/ShowRepository.cs index d12105f6..e9ea389e 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/ShowRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/ShowRepository.cs @@ -100,6 +100,7 @@ namespace Kyoo.Core.Controllers await base.Create(obj); _database.Entry(obj).State = EntityState.Added; await _database.SaveChangesAsync(() => Get(obj.Slug)); + OnResourceCreated(obj); return obj; } @@ -213,6 +214,7 @@ namespace Kyoo.Core.Controllers { _database.Remove(obj); await _database.SaveChangesAsync(); + await base.Delete(obj); } } } diff --git a/back/src/Kyoo.Core/Controllers/Repositories/StudioRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/StudioRepository.cs index 213d9545..138c7ae1 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/StudioRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/StudioRepository.cs @@ -75,6 +75,7 @@ namespace Kyoo.Core.Controllers await base.Create(obj); _database.Entry(obj).State = EntityState.Added; await _database.SaveChangesAsync(() => Get(obj.Slug)); + OnResourceCreated(obj); return obj; } @@ -116,6 +117,7 @@ namespace Kyoo.Core.Controllers _database.Entry(obj).State = EntityState.Deleted; await _database.SaveChangesAsync(); + await base.Delete(obj); } } } diff --git a/back/src/Kyoo.Core/Controllers/Repositories/TrackRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/TrackRepository.cs index 4c55cc47..c416e6e3 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/TrackRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/TrackRepository.cs @@ -79,6 +79,7 @@ namespace Kyoo.Core.Controllers await base.Create(obj); _database.Entry(obj).State = EntityState.Added; await _database.SaveChangesAsync(); + OnResourceCreated(obj); return obj; } @@ -90,6 +91,7 @@ namespace Kyoo.Core.Controllers _database.Entry(obj).State = EntityState.Deleted; await _database.SaveChangesAsync(); + await base.Delete(obj); } } } diff --git a/back/src/Kyoo.Core/Controllers/Repositories/UserRepository.cs b/back/src/Kyoo.Core/Controllers/Repositories/UserRepository.cs index 0ff386e5..89c00fdd 100644 --- a/back/src/Kyoo.Core/Controllers/Repositories/UserRepository.cs +++ b/back/src/Kyoo.Core/Controllers/Repositories/UserRepository.cs @@ -67,6 +67,7 @@ namespace Kyoo.Core.Controllers await base.Create(obj); _database.Entry(obj).State = EntityState.Added; await _database.SaveChangesAsync(() => Get(obj.Slug)); + OnResourceCreated(obj); return obj; } @@ -78,6 +79,7 @@ namespace Kyoo.Core.Controllers _database.Entry(obj).State = EntityState.Deleted; await _database.SaveChangesAsync(); + await base.Delete(obj); } } }