@@ -0,0 +1,246 @@
3+ * Created by PhpStorm.
9+namespace TANIOS\Airtable;
12+class Response implements \ArrayAccess
16+ * @var Airtable Instance of Airtable
21+ * @var Request Instance or Request
26+ * @var string Response content
28+ private $content = "";
31+ * @var bool|\stdClass Response
33+ private $parsedContent = false;
36+ * Response constructor.
37+ * @param Airtable $airtable Instance of Airtable
38+ * @param Request $request Instance of Request
39+ * @param string $content Content string
41+ public function __construct( $airtable, $request, $content, $relations = false )
44+ $this->airtable = $airtable;
46+ $this->request = $request;
48+ $this->content = $content;
52+ $this->parsedContent = json_decode( $content );
54+ catch ( \Exception $e )
56+ $this->parsedContent = false;
59+ if( is_array( $relations ) && count( $relations ) > 0 )
62+ if( array_keys( $relations ) !== range( 0, count( $relations ) - 1 ) )
64+ foreach ( $relations as $related_field => $related_table )
66+ $this->processRelatedField( $related_field, $related_table );
71+ foreach ( $relations as $related_field )
73+ $this->processRelatedField( $related_field );
81+ private function processRelatedField( $related_field, $related_table = false )
84+ if( isset( $this->parsedContent->records ) && is_array( $this->parsedContent->records ) && count( $this->parsedContent->records ) > 0 )
86+ foreach ( $this->parsedContent->records as $record_key => $record )
88+ $this->parsedContent->records[ $record_key ] = $this->loadRelatedField( $related_field, $related_table, $record );
93+ $this->parsedContent = $this->loadRelatedField( $related_field, $related_table, $this->parsedContent );
98+ private function loadRelatedField( $related_field, $related_table, $record )
102+ if( ! isset( $record->fields ) || ! isset( $record->fields->$related_field ) )
107+ if( empty( $related_table ) )
109+ $related_table = $related_field;
112+ $relation_ids = $record->fields->$related_field;
114+ if( ! is_array( $relation_ids ) )
116+ $relation_ids = [ $relation_ids ];
119+ $relation_formula = "OR(";
120+ $relation_formula .= implode( ', ', array_map( function( $id ) { return "RECORD_ID() = '$id'"; }, $relation_ids ) );
121+ $relation_formula .= ")";
123+ if( ! is_array( $related_table ) )
125+ $relation_request = $this->airtable->getContent( "$related_table", [
126+ 'filterByFormula' => $relation_formula
131+ $related_table_relations = isset( $related_table[ 'relations' ] ) && is_array( $related_table[ 'relations' ] )
132+ ? $related_table[ 'relations' ]
135+ $related_table_name = ! empty( $related_table[ 'table' ] ) ? $related_table[ 'table' ] : $related_field;
137+ $relation_request = $this->airtable->getContent( "$related_table_name", [
138+ 'filterByFormula' => $relation_formula
139+ ], $related_table_relations );
143+ $related_records = [];
147+ $relation_response = $relation_request->getResponse();
149+ if( ! is_array( $relation_response->records ) || count( $relation_response->records ) < 0 )
154+ foreach ( $relation_response->records as $related_record )
156+ $formatted_record = $related_record->fields;
157+ $formatted_record->id = $related_record->id;
159+ $related_records[] = $formatted_record;
162+ while( $relation_request = $relation_response->next() );
164+ if( is_array( $record->fields->$related_field ) )
166+ $record->fields->$related_field = $related_records;
170+ $record->fields->$related_field = count( $related_records ) > 0
171+ ? $related_records[ 0 ]
179+ public function next()
182+ if( ! $this->parsedContent )
188+ if( ! isset( $this[ 'offset' ] ) )
193+ $this->request->offset = $this[ 'offset' ];
195+ return $this->request;
199+ public function __get( $key )
201+ if( ! $this->parsedContent || ! isset( $this->parsedContent->$key ) )
206+ return $this->parsedContent->$key;
209+ public function __toString()
211+ return $this->content;
214+ public function __isset( $key )
216+ return $this->parsedContent && isset( $this->parsedContent->$key );
219+ public function offsetExists($offset)
221+ return $this->parsedContent && isset( $this->parsedContent->$offset );
224+ public function offsetGet($offset)
226+ return $this->parsedContent && isset( $this->parsedContent->$offset )
227+ ? $this->parsedContent->$offset
231+ public function offsetSet($offset, $value)
233+ if( $this->parsedContent )
235+ $this->parsedContent->$offset = $value;
239+ public function offsetUnset($offset)
241+ if( $this->parsedContent && isset( $this->parsedContent->$offset ) )
243+ unset( $this->parsedContent->$offset );