client = new Client([ 'http_errors' => false, 'base_uri' => $this->baseUri ]); } public function getType(): string { return 'facebook'; } public function posts(): array { return $this->get( "{$this->page->remote_id}/published_posts", ['fields' => 'id,created_time,full_picture,message,attachments'], 'data', ); } public function saveAttachments(Post $post, $data) { foreach($data as $i => $attachment) { $fid = null; switch($attachment['type']) { case 'photo': case 'video_inline': $payload = [ 'href' => $this->saveUrl(data_get($attachment, 'media.image.src')) ]; break; case 'share': case 'event': $fid = $post->id.'-attachment-'.$i; if (!data_get($attachment, 'media.image.src')) { continue 2; } $payload = [ 'href' => $this->saveUrl(data_get($attachment, 'media.image.src'), $fid.'.jpg') ]; break; case 'album': $payload = [ 'href' => $this->saveUrl(data_get($attachment, 'subattachments.data.0.media.image.src')) ]; break; case 'multi_share': $payload = [ 'href' => $this->saveUrl(data_get($attachment, 'subattachments.data.0.media.image.src')) ]; break; case 'native_templates': continue 2; default: throw new \Exception('I dont know how to parse attachment of type '.$attachment['type']); } $fid = $fid ?: data_get($attachment, 'target.id', ''); $post->attachments()->updateOrCreate(['remote_id' => $fid], array_merge($payload, [ 'remote_id' => $fid, 'type' => $attachment['type'], ])); } } public function sync(): void { foreach ($this->posts() as $post) { if (!data_get($post, 'message')) { continue; } if (!data_get($post, 'attachments')) { continue; } $payload = [ 'message' => $post['message'], 'remote_id' => $post['id'], 'href' => data_get($post, 'attachments.data.0.target.url'), 'created_at' => Carbon::parse($post['created_time']), ]; $existing = $this->page->posts()->where('remote_id', $post['id'])->first(); if ($existing) { $existing->update($payload); } else { $existing = $this->page->posts()->create($payload); } $this->saveAttachments($existing, data_get($post, 'attachments.data')); } $this->cleanOutdated(); } private function get(string $url, array $query = [], ?string $return = null): array { $response = $this->client->get("/{$this->version}/$url", [ 'query' => array_merge($query, ['access_token' => $this->page->access_token]), ]); $data = json_decode((string) $response->getBody(), true); return $return === null ? $data : data_get($data, $return); } }