diff --git a/Source/Lib/Trakt.NET/Objects/Json/JsonFactoryContainer.cs b/Source/Lib/Trakt.NET/Objects/Json/JsonFactoryContainer.cs
index e571aea294..b9f1c59c31 100644
--- a/Source/Lib/Trakt.NET/Objects/Json/JsonFactoryContainer.cs
+++ b/Source/Lib/Trakt.NET/Objects/Json/JsonFactoryContainer.cs
@@ -293,6 +293,7 @@ static JsonFactoryContainer()
s_jsonIOFactories.Add(typeof(ITraktSyncCollectionPostShow), new SyncCollectionPostShowJsonIOFactory());
s_jsonIOFactories.Add(typeof(ITraktSyncCollectionPostShowEpisode), new SyncCollectionPostShowEpisodeJsonIOFactory());
s_jsonIOFactories.Add(typeof(ITraktSyncCollectionPostShowSeason), new SyncCollectionPostShowSeasonJsonIOFactory());
+ s_jsonIOFactories.Add(typeof(ITraktSyncCollectionRemovePost), new SyncCollectionRemovePostJsonIOFactory());
// sync collection post response objects
s_jsonIOFactories.Add(typeof(ITraktSyncCollectionPostResponse), new SyncCollectionPostResponseJsonIOFactory());
diff --git a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/ITraktSyncCollectionRemovePost.cs b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/ITraktSyncCollectionRemovePost.cs
new file mode 100644
index 0000000000..76ce6b5309
--- /dev/null
+++ b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/ITraktSyncCollectionRemovePost.cs
@@ -0,0 +1,10 @@
+namespace TraktNet.Objects.Post.Syncs.Collection
+{
+ ///
+ /// A Trakt collection remove post, containing all movies, shows and / or episodes,
+ /// which should be removed from the user's collection.
+ ///
+ public interface ITraktSyncCollectionRemovePost : ITraktSyncCollectionPost
+ {
+ }
+}
diff --git a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Implementations/TraktSyncCollectionRemovePost.cs b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Implementations/TraktSyncCollectionRemovePost.cs
new file mode 100644
index 0000000000..e10aa881bd
--- /dev/null
+++ b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Implementations/TraktSyncCollectionRemovePost.cs
@@ -0,0 +1,10 @@
+namespace TraktNet.Objects.Post.Syncs.Collection
+{
+ ///
+ /// A Trakt collection remove post, containing all movies, shows and / or episodes,
+ /// which should be removed from the user's collection.
+ ///
+ public class TraktSyncCollectionRemovePost : TraktSyncCollectionPost, ITraktSyncCollectionRemovePost
+ {
+ }
+}
diff --git a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Factories/SyncCollectionRemovePostJsonIOFactory.cs b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Factories/SyncCollectionRemovePostJsonIOFactory.cs
new file mode 100644
index 0000000000..6e9a74c18c
--- /dev/null
+++ b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Factories/SyncCollectionRemovePostJsonIOFactory.cs
@@ -0,0 +1,13 @@
+namespace TraktNet.Objects.Post.Syncs.Collection.Json.Factories
+{
+ using Objects.Json;
+ using Reader;
+ using Writer;
+
+ internal class SyncCollectionRemovePostJsonIOFactory : IJsonIOFactory
+ {
+ public IObjectJsonReader CreateObjectReader() => new SyncCollectionRemovePostObjectJsonReader();
+
+ public IObjectJsonWriter CreateObjectWriter() => new SyncCollectionRemovePostObjectJsonWriter();
+ }
+}
diff --git a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/ASyncCollectionPostObjectJsonReader.cs b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/ASyncCollectionPostObjectJsonReader.cs
new file mode 100644
index 0000000000..3612b068a2
--- /dev/null
+++ b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/ASyncCollectionPostObjectJsonReader.cs
@@ -0,0 +1,54 @@
+namespace TraktNet.Objects.Post.Syncs.Collection.Json.Reader
+{
+ using Newtonsoft.Json;
+ using System;
+ using System.Threading;
+ using System.Threading.Tasks;
+ using TraktNet.Objects.Json;
+
+ internal abstract class ASyncCollectionPostObjectJsonReader : AObjectJsonReader
+ where TSyncCollectionPost : ITraktSyncCollectionPost
+ {
+ public override async Task ReadObjectAsync(JsonTextReader jsonReader, CancellationToken cancellationToken = default)
+ {
+ CheckJsonTextReader(jsonReader);
+
+ if (await jsonReader.ReadAsync(cancellationToken) && jsonReader.TokenType == JsonToken.StartObject)
+ {
+ TSyncCollectionPost traktSyncCollectionPost = Activator.CreateInstance();
+ var syncCollectionPostMovieArrayJsonReader = new ArrayJsonReader();
+ var syncCollectionPostShowArrayJsonReader = new ArrayJsonReader();
+ var syncCollectionPostSeasonArrayJsonReader = new ArrayJsonReader();
+ var syncCollectionPostEpisodeArrayJsonReader = new ArrayJsonReader();
+
+ while (await jsonReader.ReadAsync(cancellationToken) && jsonReader.TokenType == JsonToken.PropertyName)
+ {
+ var propertyName = jsonReader.Value.ToString();
+
+ switch (propertyName)
+ {
+ case JsonProperties.PROPERTY_NAME_MOVIES:
+ traktSyncCollectionPost.Movies = await syncCollectionPostMovieArrayJsonReader.ReadArrayAsync(jsonReader, cancellationToken);
+ break;
+ case JsonProperties.PROPERTY_NAME_SHOWS:
+ traktSyncCollectionPost.Shows = await syncCollectionPostShowArrayJsonReader.ReadArrayAsync(jsonReader, cancellationToken);
+ break;
+ case JsonProperties.PROPERTY_NAME_SEASONS:
+ traktSyncCollectionPost.Seasons = await syncCollectionPostSeasonArrayJsonReader.ReadArrayAsync(jsonReader, cancellationToken);
+ break;
+ case JsonProperties.PROPERTY_NAME_EPISODES:
+ traktSyncCollectionPost.Episodes = await syncCollectionPostEpisodeArrayJsonReader.ReadArrayAsync(jsonReader, cancellationToken);
+ break;
+ default:
+ await JsonReaderHelper.ReadAndIgnoreInvalidContentAsync(jsonReader, cancellationToken);
+ break;
+ }
+ }
+
+ return traktSyncCollectionPost;
+ }
+
+ return await Task.FromResult(default(TSyncCollectionPost));
+ }
+ }
+}
diff --git a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/SyncCollectionPostObjectJsonReader.cs b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/SyncCollectionPostObjectJsonReader.cs
index d887f61a3f..62c828b35e 100644
--- a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/SyncCollectionPostObjectJsonReader.cs
+++ b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/SyncCollectionPostObjectJsonReader.cs
@@ -1,52 +1,6 @@
namespace TraktNet.Objects.Post.Syncs.Collection.Json.Reader
{
- using Newtonsoft.Json;
- using Objects.Json;
- using System.Threading;
- using System.Threading.Tasks;
-
- internal class SyncCollectionPostObjectJsonReader : AObjectJsonReader
+ internal class SyncCollectionPostObjectJsonReader : ASyncCollectionPostObjectJsonReader
{
- public override async Task ReadObjectAsync(JsonTextReader jsonReader, CancellationToken cancellationToken = default)
- {
- CheckJsonTextReader(jsonReader);
-
- if (await jsonReader.ReadAsync(cancellationToken) && jsonReader.TokenType == JsonToken.StartObject)
- {
- ITraktSyncCollectionPost traktSyncCollectionPost = new TraktSyncCollectionPost();
- var syncCollectionPostMovieArrayJsonReader = new ArrayJsonReader();
- var syncCollectionPostShowArrayJsonReader = new ArrayJsonReader();
- var syncCollectionPostSeasonArrayJsonReader = new ArrayJsonReader();
- var syncCollectionPostEpisodeArrayJsonReader = new ArrayJsonReader();
-
- while (await jsonReader.ReadAsync(cancellationToken) && jsonReader.TokenType == JsonToken.PropertyName)
- {
- var propertyName = jsonReader.Value.ToString();
-
- switch (propertyName)
- {
- case JsonProperties.PROPERTY_NAME_MOVIES:
- traktSyncCollectionPost.Movies = await syncCollectionPostMovieArrayJsonReader.ReadArrayAsync(jsonReader, cancellationToken);
- break;
- case JsonProperties.PROPERTY_NAME_SHOWS:
- traktSyncCollectionPost.Shows = await syncCollectionPostShowArrayJsonReader.ReadArrayAsync(jsonReader, cancellationToken);
- break;
- case JsonProperties.PROPERTY_NAME_SEASONS:
- traktSyncCollectionPost.Seasons = await syncCollectionPostSeasonArrayJsonReader.ReadArrayAsync(jsonReader, cancellationToken);
- break;
- case JsonProperties.PROPERTY_NAME_EPISODES:
- traktSyncCollectionPost.Episodes = await syncCollectionPostEpisodeArrayJsonReader.ReadArrayAsync(jsonReader, cancellationToken);
- break;
- default:
- await JsonReaderHelper.ReadAndIgnoreInvalidContentAsync(jsonReader, cancellationToken);
- break;
- }
- }
-
- return traktSyncCollectionPost;
- }
-
- return await Task.FromResult(default(ITraktSyncCollectionPost));
- }
}
}
diff --git a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/SyncCollectionRemovePostObjectJsonReader.cs b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/SyncCollectionRemovePostObjectJsonReader.cs
new file mode 100644
index 0000000000..e089ef412d
--- /dev/null
+++ b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/SyncCollectionRemovePostObjectJsonReader.cs
@@ -0,0 +1,6 @@
+namespace TraktNet.Objects.Post.Syncs.Collection.Json.Reader
+{
+ internal class SyncCollectionRemovePostObjectJsonReader : ASyncCollectionPostObjectJsonReader
+ {
+ }
+}
diff --git a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/ASyncCollectionPostObjectJsonWriter.cs b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/ASyncCollectionPostObjectJsonWriter.cs
new file mode 100644
index 0000000000..294dcb3d54
--- /dev/null
+++ b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/ASyncCollectionPostObjectJsonWriter.cs
@@ -0,0 +1,50 @@
+namespace TraktNet.Objects.Post.Syncs.Collection.Json.Writer
+{
+ using Newtonsoft.Json;
+ using System.Threading;
+ using System.Threading.Tasks;
+ using TraktNet.Objects.Json;
+
+ internal class ASyncCollectionPostObjectJsonWriter : AObjectJsonWriter
+ where TSyncCollectionPost : ITraktSyncCollectionPost
+ {
+ public override async Task WriteObjectAsync(JsonTextWriter jsonWriter, TSyncCollectionPost obj, CancellationToken cancellationToken = default)
+ {
+ CheckJsonTextWriter(jsonWriter);
+ await jsonWriter.WriteStartObjectAsync(cancellationToken).ConfigureAwait(false);
+ await WriteCollectionPostObjectAsync(jsonWriter, obj, cancellationToken).ConfigureAwait(false);
+ await jsonWriter.WriteEndObjectAsync(cancellationToken).ConfigureAwait(false);
+ }
+
+ protected virtual async Task WriteCollectionPostObjectAsync(JsonTextWriter jsonWriter, TSyncCollectionPost obj, CancellationToken cancellationToken = default)
+ {
+ if (obj.Movies != null)
+ {
+ var syncCollectionPostMovieArrayJsonWriter = new ArrayJsonWriter();
+ await jsonWriter.WritePropertyNameAsync(JsonProperties.PROPERTY_NAME_MOVIES, cancellationToken).ConfigureAwait(false);
+ await syncCollectionPostMovieArrayJsonWriter.WriteArrayAsync(jsonWriter, obj.Movies, cancellationToken).ConfigureAwait(false);
+ }
+
+ if (obj.Shows != null)
+ {
+ var syncCollectionPostShowArrayJsonWriter = new ArrayJsonWriter();
+ await jsonWriter.WritePropertyNameAsync(JsonProperties.PROPERTY_NAME_SHOWS, cancellationToken).ConfigureAwait(false);
+ await syncCollectionPostShowArrayJsonWriter.WriteArrayAsync(jsonWriter, obj.Shows, cancellationToken).ConfigureAwait(false);
+ }
+
+ if (obj.Seasons != null)
+ {
+ var syncCollectionPostSeasonArrayJsonWriter = new ArrayJsonWriter();
+ await jsonWriter.WritePropertyNameAsync(JsonProperties.PROPERTY_NAME_SEASONS, cancellationToken).ConfigureAwait(false);
+ await syncCollectionPostSeasonArrayJsonWriter.WriteArrayAsync(jsonWriter, obj.Seasons, cancellationToken).ConfigureAwait(false);
+ }
+
+ if (obj.Episodes != null)
+ {
+ var syncCollectionPostEpisodeArrayJsonWriter = new ArrayJsonWriter();
+ await jsonWriter.WritePropertyNameAsync(JsonProperties.PROPERTY_NAME_EPISODES, cancellationToken).ConfigureAwait(false);
+ await syncCollectionPostEpisodeArrayJsonWriter.WriteArrayAsync(jsonWriter, obj.Episodes, cancellationToken).ConfigureAwait(false);
+ }
+ }
+ }
+}
diff --git a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/SyncCollectionPostObjectJsonWriter.cs b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/SyncCollectionPostObjectJsonWriter.cs
index cf34238faa..076155da9e 100644
--- a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/SyncCollectionPostObjectJsonWriter.cs
+++ b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/SyncCollectionPostObjectJsonWriter.cs
@@ -1,46 +1,6 @@
namespace TraktNet.Objects.Post.Syncs.Collection.Json.Writer
{
- using Newtonsoft.Json;
- using Objects.Json;
- using System.Threading;
- using System.Threading.Tasks;
-
- internal class SyncCollectionPostObjectJsonWriter : AObjectJsonWriter
+ internal class SyncCollectionPostObjectJsonWriter : ASyncCollectionPostObjectJsonWriter
{
- public override async Task WriteObjectAsync(JsonTextWriter jsonWriter, ITraktSyncCollectionPost obj, CancellationToken cancellationToken = default)
- {
- CheckJsonTextWriter(jsonWriter);
- await jsonWriter.WriteStartObjectAsync(cancellationToken).ConfigureAwait(false);
-
- if (obj.Movies != null)
- {
- var syncCollectionPostMovieArrayJsonWriter = new ArrayJsonWriter();
- await jsonWriter.WritePropertyNameAsync(JsonProperties.PROPERTY_NAME_MOVIES, cancellationToken).ConfigureAwait(false);
- await syncCollectionPostMovieArrayJsonWriter.WriteArrayAsync(jsonWriter, obj.Movies, cancellationToken).ConfigureAwait(false);
- }
-
- if (obj.Shows != null)
- {
- var syncCollectionPostShowArrayJsonWriter = new ArrayJsonWriter();
- await jsonWriter.WritePropertyNameAsync(JsonProperties.PROPERTY_NAME_SHOWS, cancellationToken).ConfigureAwait(false);
- await syncCollectionPostShowArrayJsonWriter.WriteArrayAsync(jsonWriter, obj.Shows, cancellationToken).ConfigureAwait(false);
- }
-
- if (obj.Seasons != null)
- {
- var syncCollectionPostSeasonArrayJsonWriter = new ArrayJsonWriter();
- await jsonWriter.WritePropertyNameAsync(JsonProperties.PROPERTY_NAME_SEASONS, cancellationToken).ConfigureAwait(false);
- await syncCollectionPostSeasonArrayJsonWriter.WriteArrayAsync(jsonWriter, obj.Seasons, cancellationToken).ConfigureAwait(false);
- }
-
- if (obj.Episodes != null)
- {
- var syncCollectionPostEpisodeArrayJsonWriter = new ArrayJsonWriter();
- await jsonWriter.WritePropertyNameAsync(JsonProperties.PROPERTY_NAME_EPISODES, cancellationToken).ConfigureAwait(false);
- await syncCollectionPostEpisodeArrayJsonWriter.WriteArrayAsync(jsonWriter, obj.Episodes, cancellationToken).ConfigureAwait(false);
- }
-
- await jsonWriter.WriteEndObjectAsync(cancellationToken).ConfigureAwait(false);
- }
}
}
diff --git a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/SyncCollectionRemovePostObjectJsonWriter.cs b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/SyncCollectionRemovePostObjectJsonWriter.cs
new file mode 100644
index 0000000000..0d37c789bd
--- /dev/null
+++ b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/SyncCollectionRemovePostObjectJsonWriter.cs
@@ -0,0 +1,6 @@
+namespace TraktNet.Objects.Post.Syncs.Collection.Json.Writer
+{
+ internal class SyncCollectionRemovePostObjectJsonWriter : ASyncCollectionPostObjectJsonWriter
+ {
+ }
+}
diff --git a/Source/Tests/Trakt.NET.Objects.Post.Tests/Syncs/Collection/Implementations/TraktSyncCollectionRemovePost_Tests.cs b/Source/Tests/Trakt.NET.Objects.Post.Tests/Syncs/Collection/Implementations/TraktSyncCollectionRemovePost_Tests.cs
new file mode 100644
index 0000000000..192d6e9fb2
--- /dev/null
+++ b/Source/Tests/Trakt.NET.Objects.Post.Tests/Syncs/Collection/Implementations/TraktSyncCollectionRemovePost_Tests.cs
@@ -0,0 +1,58 @@
+namespace TraktNet.Objects.Post.Tests.Syncs.Collection.Implementations
+{
+ using FluentAssertions;
+ using System;
+ using System.Collections.Generic;
+ using Trakt.NET.Tests.Utility.Traits;
+ using TraktNet.Objects.Post.Syncs.Collection;
+ using Xunit;
+
+ [Category("Objects.Post.Syncs.Collection.Implementations")]
+ public class TraktSyncCollectionRemovePost_Tests
+ {
+ [Fact]
+ public void Test_TraktSyncCollectionRemovePost_Validate()
+ {
+ ITraktSyncCollectionRemovePost syncCollectionRemovePost = new TraktSyncCollectionRemovePost();
+
+ // movies = null, shows = null, seasons = null, episodes = null
+ Action act = () => syncCollectionRemovePost.Validate();
+ act.Should().Throw();
+
+ // movies = empty, shows = null, seasons = null, episodes = null
+ syncCollectionRemovePost.Movies = new List();
+ act.Should().Throw();
+
+ // movies = empty, shows = empty, seasons = null, episodes = null
+ syncCollectionRemovePost.Shows = new List();
+ act.Should().Throw();
+
+ // movies = empty, shows = empty, seasons = empty, episodes = null
+ syncCollectionRemovePost.Seasons = new List();
+ act.Should().Throw();
+
+ // movies = empty, shows = empty, seasons = empty, episodes = empty
+ syncCollectionRemovePost.Episodes = new List();
+ act.Should().Throw();
+
+ // movies with at least one item, shows = empty, seasons = empty, episodes = empty
+ (syncCollectionRemovePost.Movies as List).Add(new TraktSyncCollectionPostMovie());
+ act.Should().NotThrow();
+
+ // movies = empty, shows with at least one item, seasons = empty, episodes = empty
+ (syncCollectionRemovePost.Movies as List).Clear();
+ (syncCollectionRemovePost.Shows as List).Add(new TraktSyncCollectionPostShow());
+ act.Should().NotThrow();
+
+ // movies = empty, shows = empty, seasons with at least one item, episodes = empty
+ (syncCollectionRemovePost.Shows as List).Clear();
+ (syncCollectionRemovePost.Seasons as List).Add(new TraktSyncCollectionPostSeason());
+ act.Should().NotThrow();
+
+ // movies = empty, shows = empty, seasons = empty, episodes with at least one item
+ (syncCollectionRemovePost.Seasons as List).Clear();
+ (syncCollectionRemovePost.Episodes as List).Add(new TraktSyncCollectionPostEpisode());
+ act.Should().NotThrow();
+ }
+ }
+}