* @license http://www.apache.org/licenses/LICENSE-2.0 * @package EPGService\Repositories */ final class ProgramRepository implements BaseRepository { /** * @var string */ private const METHOD = 'file/%s'; /** * @var string */ private string $channel_id; /** * @var \GuzzleHttp\Client */ private Client $client; /** * @var string */ private string $week; /** * @param \EPGService\Environments\ServiceEnvironment $environment * @param string $channel_id * @param string $week */ private function __construct(ServiceEnvironment $environment, string $channel_id, string $week) { $this->channel_id = $channel_id; $this->week = $week; $this->client = new Client([ 'base_uri' => $environment->getUrl(), ]); } /** * @param \EPGService\Environments\ServiceEnvironment $environment * @param string $channel_id * @param string $week * * @return \EPGService\Repositories\ProgramRepository */ public static function create(ServiceEnvironment $environment, string $channel_id, string $week): ProgramRepository { return new ProgramRepository($environment, $channel_id, $week); } /** * @param array $payload * * @return \EPGService\Entities\Program\CreditEntity[] * * @throws \RuntimeException */ private static function getCreditEntities(array $payload): array { return array_map(static function (array $value): CreditEntity { return CreditEntity::create($value); }, $payload); } /** * @param array $payload * * @return \EPGService\Entities\ProgramEntity * * @throws \RuntimeException * @throws \Exception */ private static function getProgramEntity(array $payload): ProgramEntity { $data = []; foreach ($payload as $name => $value) { switch ($name) { case 'category': $data['categories'] = $value; break; case 'channel': $data['channel_id'] = $value; break; case 'country': $data['countries'] = $value; break; case 'credits': $data['credits'] = self::getCreditEntities($value); break; case 'date': $data['date'] = new DateTime($value); break; case 'desc': $data['description'] = $value; break; case 'icon': $data['icons'] = $value; break; case 'pg': $data['parents_guide'] = $value; break; case 'production': $data['productions'] = $value; break; case 'start': $data['start'] = new DateTime($value); break; case 'stop': $data['stop'] = new DateTime($value); break; case 'sub_title': $data['sub_title'] = $value; break; case 'title': $data['title'] = $value; break; case 'year': $data['year'] = $value; break; default: trigger_error('blah-blah-blah', E_USER_WARNING); break; } } return ProgramEntity::create($data); } /** * @return array * * @throws \GuzzleHttp\Exception\GuzzleException * @throws \RuntimeException * @throws \Exception */ public function get(): array { $uri = sprintf(self::METHOD, $this->channel_id); $response = $this->client->get($uri, [ RequestOptions::QUERY => [ 'week' => $this->week, ], ]); $content = $response->getBody()->getContents(); $json = json_decode($content, true, 512, JSON_THROW_ON_ERROR); if (!is_array($json) || !is_array($json['programms'])) { throw new RuntimeException('blah-blah-blah'); } $result = []; foreach ($json['programms'] as $program) { $result[] = self::getProgramEntity($program); } return $result; } }