321 lines
11 KiB
PHP
321 lines
11 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Class for Timely API communication related to Discover Events and Feeds.
|
|
*
|
|
* @author Time.ly Network, Inc.
|
|
* @since 2.4
|
|
* @package Ai1EC
|
|
* @subpackage Ai1EC.Model
|
|
*/
|
|
class Ai1ec_Api_Feeds extends Ai1ec_Api_Abstract {
|
|
|
|
// Feed status
|
|
// c = Feed not migrated yet to API
|
|
// a = Feed migrated to API (all events)
|
|
// b = Feed migrated to API (individual events were selected)
|
|
public static $FEED_NOT_MIGRATED_CODE = 'c';
|
|
public static $FEED_API_ALL_EVENTS_CODE = 'a';
|
|
public static $FEED_API_SOME_EVENTS_CODE = 'b';
|
|
|
|
/**
|
|
* Post construction routine.
|
|
*
|
|
* Override this method to perform post-construction tasks.
|
|
*
|
|
* @return void Return from this method is ignored.
|
|
*/
|
|
protected function _initialize() {
|
|
parent::_initialize();
|
|
}
|
|
|
|
/**
|
|
* Get static var (for PHP 5.2 compatibility)
|
|
*
|
|
* @param String $var
|
|
*/
|
|
public function getStaticVar($var) {
|
|
return self::$$var;
|
|
}
|
|
|
|
/**
|
|
* Getting a suggested events list.
|
|
* @return stClass Response using the following format:
|
|
* [total] => 10
|
|
* [per_page] => 8
|
|
* [current_page] => 1
|
|
* [last_page] => 2
|
|
* [next_page_url] =>
|
|
* [prev_page_url] =>
|
|
* [from] => 1
|
|
* [to] => 8
|
|
* [data] => Array list of suggested events
|
|
*/
|
|
public function get_suggested_events() {
|
|
$calendar_id = $this->_get_ticket_calendar();
|
|
if ( 0 >= $calendar_id ) {
|
|
throw new Exception( 'Calendar ID not found' );
|
|
}
|
|
|
|
$body = null;
|
|
if (
|
|
isset( $_POST[ 'lat' ] ) &&
|
|
isset( $_POST[ 'lng' ] ) &&
|
|
isset( $_POST[ 'radius' ] )
|
|
) {
|
|
$body = array(
|
|
'lat' => $_POST[ 'lat' ],
|
|
'lng' => $_POST[ 'lng' ],
|
|
'radius' => $_POST[ 'radius' ]
|
|
);
|
|
}
|
|
|
|
$page = isset( $_POST[ 'page' ] ) ? $_POST[ 'page' ] : 1;
|
|
$max = isset( $_POST[ 'max' ] ) ? $_POST[ 'max' ] : 8;
|
|
$term = isset( $_POST[ 'term' ] ) && $_POST[ 'term' ]
|
|
? urlencode( $_POST[ 'term' ] )
|
|
: '*';
|
|
$location = isset( $_POST[ 'location' ] ) && $_POST[ 'location' ]
|
|
? '&location=' . urlencode( $_POST[ 'location' ] )
|
|
: '';
|
|
|
|
$url = AI1EC_API_URL .
|
|
"calendars/$calendar_id/discover/events?page=$page&max=$max&term=$term" .
|
|
$location;
|
|
|
|
$response = $this->request_api( 'GET', $url,
|
|
$body,
|
|
true //decode body response
|
|
);
|
|
|
|
if ( $this->is_response_success( $response ) ) {
|
|
return $response->body;
|
|
} else {
|
|
$this->save_error_notification(
|
|
$response,
|
|
__( 'We were unable to get the Suggested Events from Time.ly Network', AI1EC_PLUGIN_NAME )
|
|
);
|
|
throw new Exception( 'We were unable to get the Suggested Events from Time.ly Network' );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Call the API to Process and Import the Feed
|
|
*/
|
|
public function import_feed( $entry ) {
|
|
$calendar_id = $this->_get_ticket_calendar();
|
|
if ( 0 >= $calendar_id ) {
|
|
throw new Exception( 'Calendar ID not found' );
|
|
}
|
|
$response = $this->request_api( 'POST', AI1EC_API_URL . 'calendars/' . $calendar_id . '/feeds/import',
|
|
array(
|
|
'url' => $entry['feed_url'],
|
|
'categories' => $entry['feed_category'],
|
|
'tags' => $entry['feed_tags'],
|
|
'allow_comments' => $entry['comments_enabled'],
|
|
'show_maps' => $entry['map_display_enabled'],
|
|
'import_any_tag_and_categories' => $entry['keep_tags_categories'],
|
|
'preserve_imported_events' => $entry['keep_old_events'],
|
|
'assign_default_utc' => $entry['import_timezone']
|
|
)
|
|
);
|
|
|
|
if ( $this->is_response_success( $response ) ) {
|
|
// Refresh list of subscriptions and limits
|
|
$this->get_subscriptions( true );
|
|
|
|
return $response->body;
|
|
} else {
|
|
$this->save_error_notification(
|
|
$response,
|
|
__( 'We were unable to import feed', AI1EC_PLUGIN_NAME )
|
|
);
|
|
throw new Exception( $this->get_api_error_msg( $response->raw ) );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Call the API to get the feed
|
|
*/
|
|
public function get_feed( $feed_id ) {
|
|
$calendar_id = $this->_get_ticket_calendar();
|
|
if ( 0 >= $calendar_id ) {
|
|
throw new Exception( 'Calendar ID not found' );
|
|
}
|
|
$response = $this->request_api( 'GET', AI1EC_API_URL . 'calendars/' . $calendar_id . '/feeds/get/' . $feed_id,
|
|
array( 'max' => '9999' )
|
|
);
|
|
|
|
if ( $this->is_response_success( $response ) ) {
|
|
return $response->body;
|
|
} else {
|
|
$this->save_error_notification(
|
|
$response,
|
|
__( 'We were unable to get feed data', AI1EC_PLUGIN_NAME )
|
|
);
|
|
throw new Exception( $this->get_api_error_msg( $response->raw ) );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Call the API to get list of feed subscriptions
|
|
*/
|
|
public function get_feed_subscriptions( $force_refresh = false ) {
|
|
$feeds_subscriptions = get_transient( 'ai1ec_api_feeds_subscriptions' );
|
|
|
|
if ( $force_refresh || false === $feeds_subscriptions ) {
|
|
$response = $this->request_api( 'GET', AI1EC_API_URL . 'calendars/' . $this->_get_ticket_calendar() . '/feeds/list',
|
|
null,
|
|
true
|
|
);
|
|
|
|
if ( $this->is_response_success( $response ) ) {
|
|
$feeds_subscriptions = (array) $response->body;
|
|
} else {
|
|
$feeds_subscriptions = array();
|
|
}
|
|
|
|
// Save for 5 minutes
|
|
$minutes = 5;
|
|
set_transient( 'ai1ec_api_feeds_subscriptions', $feeds_subscriptions, $minutes * 60 );
|
|
}
|
|
|
|
return $feeds_subscriptions;
|
|
}
|
|
|
|
/**
|
|
* Sync feed subscriptions
|
|
*/
|
|
public function get_and_sync_feed_subscriptions() {
|
|
$feeds_subscriptions = $this->get_feed_subscriptions();
|
|
|
|
$db = $this->_registry->get( 'dbi.dbi' );
|
|
$table_name = $db->get_table_name( 'ai1ec_event_feeds' );
|
|
|
|
// Select all feeds
|
|
$rows = $db->select(
|
|
$table_name,
|
|
array(
|
|
'feed_id',
|
|
'feed_url',
|
|
'feed_name',
|
|
'feed_category',
|
|
'feed_tags',
|
|
'comments_enabled',
|
|
'map_display_enabled',
|
|
'keep_tags_categories',
|
|
'keep_old_events',
|
|
'import_timezone'
|
|
)
|
|
);
|
|
|
|
// Iterate over API response
|
|
foreach( $feeds_subscriptions as $api_feed ) {
|
|
$found = false;
|
|
|
|
foreach ( $rows as $row ) {
|
|
// Check if URL is the same
|
|
if ( trim( $row->feed_url ) === trim( $api_feed->url ) ) {
|
|
$found = true;
|
|
|
|
// Update feed
|
|
$db->update(
|
|
$table_name,
|
|
array(
|
|
'comments_enabled' => $api_feed->allow_comments,
|
|
'map_display_enabled' => $api_feed->show_maps,
|
|
'keep_tags_categories' => $api_feed->import_any_tag_and_categories,
|
|
'keep_old_events' => $api_feed->preserve_imported_events,
|
|
'import_timezone' => $api_feed->assign_default_utc,
|
|
'feed_name' => $api_feed->feed_id
|
|
),
|
|
array(
|
|
'feed_id' => $row->feed_id
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
// Not found in local database.. Insert
|
|
if ( ! $found ) {
|
|
$entry = array(
|
|
'feed_url' => $api_feed->url,
|
|
'feed_name' => $api_feed->feed_id,
|
|
'feed_category' => $api_feed->categories,
|
|
'feed_tags' => $api_feed->tags,
|
|
'comments_enabled' => $api_feed->allow_comments,
|
|
'map_display_enabled' => $api_feed->show_maps,
|
|
'keep_tags_categories' => $api_feed->import_any_tag_and_categories,
|
|
'keep_old_events' => $api_feed->preserve_imported_events,
|
|
'import_timezone' => $api_feed->assign_default_utc
|
|
);
|
|
$format = array( '%s', '%s', '%s', '%s', '%d', '%d', '%d', '%d', '%d' );
|
|
$db->insert(
|
|
$table_name,
|
|
$entry,
|
|
$format
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Call the API to subscribe feed
|
|
*/
|
|
public function subscribe_feed( $feed_id, $feed_event_uid = '' ) {
|
|
$calendar_id = $this->_get_ticket_calendar();
|
|
if ( 0 >= $calendar_id ) {
|
|
throw new Exception( 'Calendar ID not found' );
|
|
}
|
|
|
|
$response = $this->request_api( 'POST', AI1EC_API_URL . 'calendars/' . $calendar_id . '/feeds/subscribe',
|
|
array(
|
|
'feed_id' => $feed_id,
|
|
'feed_event_uid' => $feed_event_uid
|
|
)
|
|
);
|
|
|
|
// Refresh list of subscriptions and limits
|
|
$this->get_subscriptions( true );
|
|
|
|
if ( $this->is_response_success( $response ) ) {
|
|
return $response->body;
|
|
} else {
|
|
$this->save_error_notification(
|
|
$response,
|
|
__( 'We were unable to subscribe feed', AI1EC_PLUGIN_NAME )
|
|
);
|
|
throw new Exception( $this->get_api_error_msg( $response->raw ) );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Call the API to unsubscribe feed
|
|
*/
|
|
public function unsubscribe_feed( $feed_id, $feed_event_uid = '' ) {
|
|
$calendar_id = $this->_get_ticket_calendar();
|
|
if ( 0 >= $calendar_id ) {
|
|
throw new Exception( 'Calendar ID not found' );
|
|
}
|
|
|
|
$response = $this->request_api( 'POST', AI1EC_API_URL . 'calendars/' . $calendar_id . '/feeds/unsubscribe',
|
|
array(
|
|
'feed_id' => $feed_id,
|
|
'feed_event_uid' => $feed_event_uid
|
|
)
|
|
);
|
|
|
|
// Refresh list of subscriptions and limits
|
|
$this->get_subscriptions( true );
|
|
|
|
if ( $this->is_response_success( $response ) ) {
|
|
return $response->body;
|
|
} else {
|
|
$this->save_error_notification(
|
|
$response,
|
|
__( 'We were unable to unsubscribe feed', AI1EC_PLUGIN_NAME )
|
|
);
|
|
throw new Exception( $this->get_api_error_msg( $response->raw ) );
|
|
}
|
|
}
|
|
}
|