From 57ade5470f37a95c806bd36a43804c8bf78a1529 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Thu, 11 Jun 2020 23:02:09 +0200 Subject: [PATCH] Implementing duplicate exceptions for every repository --- .../Repositories/CollectionRepository.cs | 5 +++-- .../Controllers/Repositories/EpisodeRepository.cs | 13 ++++++++++++- Kyoo/Controllers/Repositories/GenreRepository.cs | 13 ++++++++++++- Kyoo/Controllers/Repositories/Helper.cs | 14 ++++++++++++++ .../Controllers/Repositories/LibraryRepository.cs | 13 ++++++++++++- Kyoo/Controllers/Repositories/PeopleRepository.cs | 13 ++++++++++++- .../Repositories/ProviderRepository.cs | 15 +++++++++++++-- Kyoo/Controllers/Repositories/SeasonRepository.cs | 13 ++++++++++++- Kyoo/Controllers/Repositories/ShowRepository.cs | 13 ++++++++++++- Kyoo/Controllers/Repositories/StudioRepository.cs | 14 ++++++++++++-- Kyoo/Controllers/Repositories/TrackRepository.cs | 14 ++++++++++++-- 11 files changed, 126 insertions(+), 14 deletions(-) create mode 100644 Kyoo/Controllers/Repositories/Helper.cs diff --git a/Kyoo/Controllers/Repositories/CollectionRepository.cs b/Kyoo/Controllers/Repositories/CollectionRepository.cs index 091c2143..6a30f2ab 100644 --- a/Kyoo/Controllers/Repositories/CollectionRepository.cs +++ b/Kyoo/Controllers/Repositories/CollectionRepository.cs @@ -57,14 +57,15 @@ namespace Kyoo.Controllers if (obj == null) throw new ArgumentNullException(nameof(obj)); + _database.Entry(obj).State = EntityState.Added; + try { - await _database.Collections.AddAsync(obj); await _database.SaveChangesAsync(); } catch (DbUpdateException ex) { - if (ex.InnerException is PostgresException inner && inner.SqlState == PostgresErrorCodes.UniqueViolation) + if (Helper.IsDuplicateException(ex)) throw new DuplicatedItemException($"Trying to insert a duplicated collection (slug {obj.Slug} already exists)."); throw; } diff --git a/Kyoo/Controllers/Repositories/EpisodeRepository.cs b/Kyoo/Controllers/Repositories/EpisodeRepository.cs index 56114ae3..81650aaa 100644 --- a/Kyoo/Controllers/Repositories/EpisodeRepository.cs +++ b/Kyoo/Controllers/Repositories/EpisodeRepository.cs @@ -6,6 +6,7 @@ using Kyoo.Models; using Kyoo.Models.Exceptions; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; +using Npgsql; namespace Kyoo.Controllers { @@ -83,7 +84,17 @@ namespace Kyoo.Controllers if (obj.Tracks != null) foreach (Track entry in obj.Tracks) _database.Entry(entry).State = EntityState.Added; - await _database.SaveChangesAsync(); + + try + { + await _database.SaveChangesAsync(); + } + catch (DbUpdateException ex) + { + if (Helper.IsDuplicateException(ex)) + throw new DuplicatedItemException($"Trying to insert a duplicated episode (slug {obj.Slug} already exists)."); + throw; + } return obj.ID; } diff --git a/Kyoo/Controllers/Repositories/GenreRepository.cs b/Kyoo/Controllers/Repositories/GenreRepository.cs index d9299465..74442a54 100644 --- a/Kyoo/Controllers/Repositories/GenreRepository.cs +++ b/Kyoo/Controllers/Repositories/GenreRepository.cs @@ -57,7 +57,18 @@ namespace Kyoo.Controllers throw new ArgumentNullException(nameof(obj)); await _database.Genres.AddAsync(obj); - await _database.SaveChangesAsync(); + + try + { + await _database.SaveChangesAsync(); + } + catch (DbUpdateException ex) + { + if (Helper.IsDuplicateException(ex)) + throw new DuplicatedItemException($"Trying to insert a duplicated genre (slug {obj.Slug} already exists)."); + throw; + } + return obj.ID; } diff --git a/Kyoo/Controllers/Repositories/Helper.cs b/Kyoo/Controllers/Repositories/Helper.cs new file mode 100644 index 00000000..2881fe77 --- /dev/null +++ b/Kyoo/Controllers/Repositories/Helper.cs @@ -0,0 +1,14 @@ +using Microsoft.EntityFrameworkCore; +using Npgsql; + +namespace Kyoo.Controllers +{ + public static class Helper + { + public static bool IsDuplicateException(DbUpdateException ex) + { + return ex.InnerException is PostgresException inner + && inner.SqlState == PostgresErrorCodes.UniqueViolation; + } + } +} \ No newline at end of file diff --git a/Kyoo/Controllers/Repositories/LibraryRepository.cs b/Kyoo/Controllers/Repositories/LibraryRepository.cs index 4c0f0e17..8f665922 100644 --- a/Kyoo/Controllers/Repositories/LibraryRepository.cs +++ b/Kyoo/Controllers/Repositories/LibraryRepository.cs @@ -64,7 +64,18 @@ namespace Kyoo.Controllers if (obj.ProviderLinks != null) foreach (ProviderLink entry in obj.ProviderLinks) _database.Entry(entry).State = EntityState.Added; - await _database.SaveChangesAsync(); + + try + { + await _database.SaveChangesAsync(); + } + catch (DbUpdateException ex) + { + if (Helper.IsDuplicateException(ex)) + throw new DuplicatedItemException($"Trying to insert a duplicated library (slug {obj.Slug} already exists)."); + throw; + } + return obj.ID; } diff --git a/Kyoo/Controllers/Repositories/PeopleRepository.cs b/Kyoo/Controllers/Repositories/PeopleRepository.cs index 5dd5de09..444d2836 100644 --- a/Kyoo/Controllers/Repositories/PeopleRepository.cs +++ b/Kyoo/Controllers/Repositories/PeopleRepository.cs @@ -63,7 +63,18 @@ namespace Kyoo.Controllers if (obj.ExternalIDs != null) foreach (MetadataID entry in obj.ExternalIDs) _database.Entry(entry).State = EntityState.Added; - await _database.SaveChangesAsync(); + + try + { + await _database.SaveChangesAsync(); + } + catch (DbUpdateException ex) + { + if (Helper.IsDuplicateException(ex)) + throw new DuplicatedItemException($"Trying to insert a duplicated people (slug {obj.Slug} already exists)."); + throw; + } + return obj.ID; } diff --git a/Kyoo/Controllers/Repositories/ProviderRepository.cs b/Kyoo/Controllers/Repositories/ProviderRepository.cs index 1cee1d2a..fd4c56eb 100644 --- a/Kyoo/Controllers/Repositories/ProviderRepository.cs +++ b/Kyoo/Controllers/Repositories/ProviderRepository.cs @@ -56,8 +56,19 @@ namespace Kyoo.Controllers if (obj == null) throw new ArgumentNullException(nameof(obj)); - await _database.Providers.AddAsync(obj); - await _database.SaveChangesAsync(); + _database.Entry(obj).State = EntityState.Added; + + try + { + await _database.SaveChangesAsync(); + } + catch (DbUpdateException ex) + { + if (Helper.IsDuplicateException(ex)) + throw new DuplicatedItemException($"Trying to insert a duplicated provider (name {obj.Name} already exists)."); + throw; + } + return obj.ID; } diff --git a/Kyoo/Controllers/Repositories/SeasonRepository.cs b/Kyoo/Controllers/Repositories/SeasonRepository.cs index 4751b08d..e7a56faa 100644 --- a/Kyoo/Controllers/Repositories/SeasonRepository.cs +++ b/Kyoo/Controllers/Repositories/SeasonRepository.cs @@ -76,7 +76,18 @@ namespace Kyoo.Controllers if (obj.ExternalIDs != null) foreach (MetadataID entry in obj.ExternalIDs) _database.Entry(entry).State = EntityState.Added; - await _database.SaveChangesAsync(); + + try + { + await _database.SaveChangesAsync(); + } + catch (DbUpdateException ex) + { + if (Helper.IsDuplicateException(ex)) + throw new DuplicatedItemException($"Trying to insert a duplicated season (slug {obj.Slug} already exists)."); + throw; + } + return obj.ID; } diff --git a/Kyoo/Controllers/Repositories/ShowRepository.cs b/Kyoo/Controllers/Repositories/ShowRepository.cs index bea40425..e0973f6b 100644 --- a/Kyoo/Controllers/Repositories/ShowRepository.cs +++ b/Kyoo/Controllers/Repositories/ShowRepository.cs @@ -80,7 +80,18 @@ namespace Kyoo.Controllers if (obj.ExternalIDs != null) foreach (MetadataID entry in obj.ExternalIDs) _database.Entry(entry).State = EntityState.Added; - await _database.SaveChangesAsync(); + + try + { + await _database.SaveChangesAsync(); + } + catch (DbUpdateException ex) + { + if (Helper.IsDuplicateException(ex)) + throw new DuplicatedItemException($"Trying to insert a duplicated show (slug {obj.Slug} already exists)."); + throw; + } + return obj.ID; } diff --git a/Kyoo/Controllers/Repositories/StudioRepository.cs b/Kyoo/Controllers/Repositories/StudioRepository.cs index d8cb7b1c..59731717 100644 --- a/Kyoo/Controllers/Repositories/StudioRepository.cs +++ b/Kyoo/Controllers/Repositories/StudioRepository.cs @@ -56,8 +56,18 @@ namespace Kyoo.Controllers if (obj == null) throw new ArgumentNullException(nameof(obj)); - await _database.Studios.AddAsync(obj); - await _database.SaveChangesAsync(); + _database.Entry(obj).State = EntityState.Added; + + try + { + await _database.SaveChangesAsync(); + } + catch (DbUpdateException ex) + { + if (Helper.IsDuplicateException(ex)) + throw new DuplicatedItemException($"Trying to insert a duplicated studio (slug {obj.Slug} already exists)."); + throw; + } return obj.ID; } diff --git a/Kyoo/Controllers/Repositories/TrackRepository.cs b/Kyoo/Controllers/Repositories/TrackRepository.cs index 199a452b..550cee01 100644 --- a/Kyoo/Controllers/Repositories/TrackRepository.cs +++ b/Kyoo/Controllers/Repositories/TrackRepository.cs @@ -61,9 +61,19 @@ namespace Kyoo.Controllers if (obj.EpisodeID <= 0) throw new InvalidOperationException($"Can't store a track not related to any episode (episodeID: {obj.EpisodeID})."); + + _database.Entry(obj).State = EntityState.Added; - await _database.Tracks.AddAsync(obj); - await _database.SaveChangesAsync(); + try + { + await _database.SaveChangesAsync(); + } + catch (DbUpdateException ex) + { + if (Helper.IsDuplicateException(ex)) + throw new DuplicatedItemException($"Trying to insert a duplicated track (slug {obj.Slug} already exists)."); + throw; + } return obj.ID; }