diff --git a/lib/Core/EpisodeAction/EpisodeActionReader.php b/lib/Core/EpisodeAction/EpisodeActionReader.php index eb2ae18..5bbcc30 100644 --- a/lib/Core/EpisodeAction/EpisodeActionReader.php +++ b/lib/Core/EpisodeAction/EpisodeActionReader.php @@ -53,4 +53,28 @@ class EpisodeActionReader } return $episodeActions; } + + /** + * @param $episodeActionsArray[] + * @return EpisodeAction[] + */ + public function fromArray(array $episodeActionsArray): array + { + $episodeActions = []; + + foreach($episodeActionsArray as $episodeAction) { + $episodeActions[] = new EpisodeAction( + $episodeAction["podcast"], + $episodeAction["episode"], + $episodeAction["action"], + $episodeAction["timestamp"], + $episodeAction["started"], + $episodeAction["position"], + $episodeAction["total"], + $episodeAction["guid"] ?? null, + ); + } + + return $episodeActions; + } } diff --git a/lib/Core/EpisodeAction/EpisodeActionSaver.php b/lib/Core/EpisodeAction/EpisodeActionSaver.php index a796b2d..733bc45 100644 --- a/lib/Core/EpisodeAction/EpisodeActionSaver.php +++ b/lib/Core/EpisodeAction/EpisodeActionSaver.php @@ -29,15 +29,17 @@ class EpisodeActionSaver } /** - * @param string $data + * @param string|array $data * * @return EpisodeActionEntity[] */ - public function saveEpisodeActions(string $data, string $userId): array + public function saveEpisodeActions($data, string $userId): array { $episodeActionEntities = []; - $episodeActions = $this->episodeActionReader->fromString($data); + $episodeActions = is_array($data) + ? $this->episodeActionReader->fromArray($data) + : $this->episodeActionReader->fromString($data); foreach ($episodeActions as $episodeAction) { $episodeActionEntity = $this->hydrateEpisodeActionEntity($episodeAction, $userId); diff --git a/tests/Unit/Core/EpisodeAction/EpisodeActionReaderTest.php b/tests/Unit/Core/EpisodeAction/EpisodeActionReaderTest.php index 29911a1..d3e1a6e 100644 --- a/tests/Unit/Core/EpisodeAction/EpisodeActionReaderTest.php +++ b/tests/Unit/Core/EpisodeAction/EpisodeActionReaderTest.php @@ -64,4 +64,66 @@ class EpisodeActionReaderTest extends TestCase { $this->assertSame(3121, $episodeActions[2]->getTotal()); } + public function testCreateFromMultipleEpisodesArray(): void { + $reader = new EpisodeActionReader(); + $episodeActions = $reader->fromArray([[ + "podcast" => "https://example.org/feed.xml", + "episode" => "https://example.org/episode1.mp3", + "guid" => "episode1", + "action" => "PLAY", + "timestamp" => "Sun Oct 03 14:03:17 GMT+02:00 2021", + "started" => 0, + "position" => 50, + "total"=> 3422 + ], + [ + "podcast" => "https://example.org/feed.xml", + "episode" => "https://example.org/episode2.mp3", + "guid" => "episode2", + "action" => "DOWNLOAD", + "timestamp" => "Sat Oct 02 11:06:28 GMT+02:00 2021", + "started" => -1, + "position" => -1, + "total"=> -1 + ], + [ + "podcast" => "https://example.com/feed.xml", + "episode" => "https://chrt.fm/track/47G541/injector.simplecastaudio.com/f16c3da7-cf46-4a42-99b7-8467255c6086/episodes/e8e24c01-6157-40e8-9b5a-45d539aeb7e6/audio/128/default.mp3?aid=rss_feed&awCollectionId=f16c3da7-cf46-4a42-99b7-8467255c6086&awEpisodeId=e8e24c01-6157-40e8-9b5a-45d539aeb7e6&feed=wEl4UUJZ", + "guid" => "EPISODE-001-EXAMPLE-COM", + "action" => "PLAY", + "timestamp" => "Sun Oct 03 14:07:15 GMT+02:00 2021", + "started" => 50, + "position" => 221, + "total"=> 450 + ] + ]); + + $this->assertSame("https://example.org/feed.xml", $episodeActions[0]->getPodcast()); + $this->assertSame("https://example.org/episode1.mp3", $episodeActions[0]->getEpisode()); + $this->assertSame("episode1", $episodeActions[0]->getGuid()); + $this->assertSame("PLAY", $episodeActions[0]->getAction()); + $this->assertSame("Sun Oct 03 14:03:17 GMT+02:00 2021", $episodeActions[0]->getTimestamp()); + $this->assertSame(0, $episodeActions[0]->getStarted()); + $this->assertSame(50, $episodeActions[0]->getPosition()); + $this->assertSame(3422, $episodeActions[0]->getTotal()); + + $this->assertSame("https://example.org/feed.xml", $episodeActions[1]->getPodcast()); + $this->assertSame("https://example.org/episode2.mp3", $episodeActions[1]->getEpisode()); + $this->assertSame("episode2", $episodeActions[1]->getGuid()); + $this->assertSame("DOWNLOAD", $episodeActions[1]->getAction()); + $this->assertSame("Sat Oct 02 11:06:28 GMT+02:00 2021", $episodeActions[1]->getTimestamp()); + $this->assertSame(-1, $episodeActions[1]->getStarted()); + $this->assertSame(-1, $episodeActions[1]->getPosition()); + $this->assertSame(-1, $episodeActions[1]->getTotal()); + + $this->assertSame("https://example.com/feed.xml", $episodeActions[2]->getPodcast()); + $this->assertSame("https://chrt.fm/track/47G541/injector.simplecastaudio.com/f16c3da7-cf46-4a42-99b7-8467255c6086/episodes/e8e24c01-6157-40e8-9b5a-45d539aeb7e6/audio/128/default.mp3?aid=rss_feed&awCollectionId=f16c3da7-cf46-4a42-99b7-8467255c6086&awEpisodeId=e8e24c01-6157-40e8-9b5a-45d539aeb7e6&feed=wEl4UUJZ", $episodeActions[2]->getEpisode()); + $this->assertSame("EPISODE-001-EXAMPLE-COM", $episodeActions[2]->getGuid()); + $this->assertSame("PLAY", $episodeActions[2]->getAction()); + $this->assertSame("Sun Oct 03 14:07:15 GMT+02:00 2021", $episodeActions[2]->getTimestamp()); + $this->assertSame(50, $episodeActions[2]->getStarted()); + $this->assertSame(221, $episodeActions[2]->getPosition()); + $this->assertSame(450, $episodeActions[2]->getTotal()); + } + }