pathfinder-84 [Feature Request] added develop JS files

This commit is contained in:
Exodus4D
2016-04-10 11:23:03 +02:00
parent f326ff9200
commit c221d4d2a8
6 changed files with 122 additions and 57 deletions

View File

@@ -655,7 +655,8 @@ class Map extends Controller\AccessController {
// check if data for specific system is requested
$systemData = (array)$f3->get('POST.systemData');
// update current location
$activeCharacter = $activeCharacter->updateLog();
// -> suppress temporary timeout errors
$activeCharacter = $activeCharacter->updateLog(['suppressTimeoutErrors' => true]);
// if data is requested extend the cache key in order to get new data
$requestSystemData = (object) [];

View File

@@ -174,6 +174,9 @@ class Sso extends Api\User{
$user->save();
}
/**
* @var $userCharactersModel Model\UserCharacterModel
*/
if( is_null($userCharactersModel = $characterModel->userCharacter) ){
$userCharactersModel = Model\BasicModel::getNew('UserCharacterModel');
$userCharactersModel->characterId = $characterModel;
@@ -377,24 +380,25 @@ class Sso extends Api\User{
/**
* get all available Endpoints
* @param $accessToken
* @param array $additionalOptions
* @return mixed|null
*/
protected function getEndpoints($accessToken){
protected function getEndpoints($accessToken, $additionalOptions = []){
$crestUrl = self::getCrestEndpoint();
$contentType = 'application/vnd.ccp.eve.Api-v3+json';
$endpoint = $this->getEndpoint($accessToken, $crestUrl, $contentType);
$additionalOptions['contentType'] = 'application/vnd.ccp.eve.Api-v3+json';
$endpoint = $this->getEndpoint($accessToken, $crestUrl, $additionalOptions);
return $endpoint;
}
/**
* get a specific endpoint by its $resourceUrl
* @param $accessToken
* @param $resourceUrl
* @param string $contentType
* @param string $accessToken CREST access token
* @param string $resourceUrl endpoint API url
* @param array $additionalOptions optional request options (pathfinder specific)
* @return mixed|null
*/
protected function getEndpoint($accessToken, $resourceUrl, $contentType = ''){
protected function getEndpoint($accessToken, $resourceUrl, $additionalOptions = []){
$resourceUrlParts = parse_url($resourceUrl);
$endpoint = null;
@@ -412,13 +416,16 @@ class Sso extends Api\User{
// if specific contentType is required -> add it to request header
// CREST versioning can be done by calling different "Accept:" Headers
if( !empty($contentType) ){
$requestOptions['header'][] = 'Accept: ' . $contentType;
if( isset($additionalOptions['contentType']) ){
$requestOptions['header'][] = 'Accept: ' . $additionalOptions['contentType'];
}
$apiResponse = Lib\Web::instance()->request($resourceUrl, $requestOptions);
$apiResponse = Lib\Web::instance()->request($resourceUrl, $requestOptions, $additionalOptions);
if($apiResponse['headers']){
if(
$apiResponse['timeout'] === false &&
$apiResponse['headers']
){
// check headers for error
$this->checkResponseHeaders($apiResponse['headers'], $requestOptions);
@@ -441,9 +448,10 @@ class Sso extends Api\User{
* @param $accessToken
* @param $endpoint
* @param array $path
* @return null|string
* @param array $additionalOptions
* @return null
*/
protected function walkEndpoint($accessToken, $endpoint, $path = []){
protected function walkEndpoint($accessToken, $endpoint, $path = [], $additionalOptions = []){
$targetEndpoint = null;
if( !empty($path) ){
@@ -451,8 +459,8 @@ class Sso extends Api\User{
if(isset($endpoint[$newNode])){
$currentEndpoint = $endpoint[$newNode];
if(isset($currentEndpoint['href'])){
$newEndpoint = $this->getEndpoint($accessToken, $currentEndpoint['href']);
$targetEndpoint = $this->walkEndpoint($accessToken, $newEndpoint, $path);
$newEndpoint = $this->getEndpoint($accessToken, $currentEndpoint['href'], $additionalOptions);
$targetEndpoint = $this->walkEndpoint($accessToken, $newEndpoint, $path, $additionalOptions);
}else{
// leaf found
$targetEndpoint = $currentEndpoint;
@@ -471,16 +479,17 @@ class Sso extends Api\User{
/**
* get character data
* @param $accessToken
* @return array
* @param array $additionalOptions
* @return object
*/
protected function getCharacterData($accessToken){
$endpoints = $this->getEndpoints($accessToken);
protected function getCharacterData($accessToken, $additionalOptions = []){
$endpoints = $this->getEndpoints($accessToken, $additionalOptions);
$characterData = (object) [];
$endpoint = $this->walkEndpoint($accessToken, $endpoints, [
'decode',
'character'
]);
], $additionalOptions);
if( !empty($endpoint) ){
$characterData->character = (new Mapper\CrestCharacter($endpoint))->getData();
@@ -497,31 +506,45 @@ class Sso extends Api\User{
* -> solarSystem data where character is currently active
* @param $accessToken
* @param int $ttl
* @return array
* @param array $additionalOptions
* @return array|mixed
*/
public function getCharacterLocationData($accessToken, $ttl = 10){
$locationData = [];
public function getCharacterLocationData($accessToken, $ttl = 10, $additionalOptions = []){
// null == CREST call failed (e.g. timeout)
$locationData = [
'timeout' => false
];
// in addition to the cURL caching (based on cache-control headers,
// the final location data is cached additionally -> speed up
$cacheKey = sprintf(self::CACHE_KEY_LOCATION_DATA, 'TOKEN_' . hash('md5', $accessToken));
if( !$this->getF3()->exists($cacheKey) ){
$endpoints = $this->getEndpoints($accessToken);
$endpoints = $this->getEndpoints($accessToken, $additionalOptions);
$endpoint = $this->walkEndpoint($accessToken, $endpoints, [
'decode',
'character',
'location'
]);
], $additionalOptions);
if( !is_null($endpoint) ){
// request succeeded (e.g. no timeout)
if( !empty($endpoint) ){
if(isset($endpoint['solarSystem'])){
$locationData['system'] = (new Mapper\CrestSystem($endpoint['solarSystem']))->getData();
}
if(isset($endpoint['station'])){
$locationData['station'] = (new Mapper\CrestStation($endpoint['station']))->getData();
}
$this->getF3()->set($cacheKey, $locationData, $ttl);
}else{
// timeout
$locationData['timeout'] = true;
}
$this->getF3()->set($cacheKey, $locationData, $ttl);
}else{
$locationData = $this->getF3()->get($cacheKey);
}

View File

@@ -0,0 +1,18 @@
<?php
/**
* Created by PhpStorm.
* User: Exodus
* Date: 09.04.2016
* Time: 21:11
*/
namespace Data\Mapper;
class CrestStation extends AbstractIterator {
protected static $map = [
'id' => 'id',
'name' => 'name'
];
}

View File

@@ -94,13 +94,15 @@ class Web extends \Web {
* -> caches response by returned HTTP Cache header data
* @param string $url
* @param array|null $options
* @param array $additionalOptions
* @return array|FALSE|mixed
*/
public function request($url,array $options = null) {
public function request($url,array $options = null, $additionalOptions = []) {
$f3 = \Base::instance();
if( !$f3->exists( $hash = $this->getCacheKey($url, $options) ) ){
$result = parent::request($url, $options);
$result['timeout'] = false;
$statusCode = $this->getStatuscodeFromHeaders( $result['headers'] );
switch($statusCode){
@@ -119,7 +121,6 @@ class Web extends \Web {
case 501:
case 502:
case 503:
case 504:
case 505:
$f3->error($statusCode, $this->getErrorMessageFromJsonResponse(
$options['method'],
@@ -127,8 +128,20 @@ class Web extends \Web {
json_decode($result['body'])
));
break;
case 504:
case 0:
// timeout
// timeout -> response should not be cached
$result['timeout'] = true;
if($additionalOptions['suppressTimeoutErrors'] !== true){
// set error...
$f3->error(504, $this->getErrorMessageFromJsonResponse(
$options['method'],
$url
));
}
// log error
LogController::getLogger('error')->write(
sprintf(self::ERROR_TIMEOUT, $options['timeout'], $url)
);
@@ -149,12 +162,12 @@ class Web extends \Web {
/**
* get error message from response object
* @param string $method
* @param string $url
* @param \stdClass $responseBody
* @param $method
* @param $url
* @param null|\stdClass $responseBody
* @return string
*/
protected function getErrorMessageFromJsonResponse($method, $url, $responseBody){
protected function getErrorMessageFromJsonResponse($method, $url, $responseBody = null){
if( empty($responseBody->message) ){
$message = sprintf(self::ERROR_DEFAULT_MSG, $method, $url);
}else{

View File

@@ -334,10 +334,13 @@ class CharacterModel extends BasicModel {
* update character log (active system, ...)
* -> HTTP Header Data (if IGB)
* -> CREST API request for character log data (if not IGB)
* @return CharacterModel
* @param array $additionalOptions (optional) request options for cURL request
* @return $this
*/
public function updateLog(){
public function updateLog($additionalOptions = []){
// check if everything is OK
// -> do not update log in case of temporary CREST timeouts
$updateLogData = false;
$logData = [];
$headerData = Controller\Controller::getIGBHeaderData();
@@ -354,33 +357,40 @@ class CharacterModel extends BasicModel {
isset($formattedHeaderData['character']) &&
$formattedHeaderData['character']['id'] == $this->_id
){
$updateLogData = true;
$logData = $formattedHeaderData;
}
}else{
// get Location Data from CREST endpoint
// user is NOT with IGB online OR has not jet set "trusted" page
$ssoController = new Ccp\Sso();
$logData = $ssoController->getCharacterLocationData($this->getAccessToken());
$logData = $ssoController->getCharacterLocationData($this->getAccessToken(), 10, $additionalOptions);
if($logData['timeout'] === false){
$updateLogData = true;
}
}
if( empty($logData) ){
// character is not in-game
if(is_object($this->characterLog)){
// delete existing log
$this->characterLog->erase();
$this->save();
}
}else{
// character is currently in-game
if( !$characterLog = $this->getLog() ){
// create new log
$characterLog = $this->rel('characterLog');
$characterLog->characterId = $this->_id;
}
$characterLog->setData($logData);
$characterLog->save();
if($updateLogData == true){
if( empty($logData['system']) ){
// character is not in-game
if(is_object($this->characterLog)){
// delete existing log
$this->characterLog->erase();
$this->save();
}
}else{
// character is currently in-game
if( !$characterLog = $this->getLog() ){
// create new log
$characterLog = $this->rel('characterLog');
$characterLog->characterId = $this->_id;
}
$characterLog->setData($logData);
$characterLog->save();
$this->characterLog = $characterLog;
$this->characterLog = $characterLog;
}
}
return $this;

View File

@@ -35,13 +35,13 @@ class SystemSignatureModel extends BasicModel {
'groupId' => [
'type' => Schema::DT_INT,
'nullable' => false,
'default' => 1,
'default' => 0,
'index' => true,
],
'typeId' => [
'type' => Schema::DT_INT,
'nullable' => false,
'default' => 1,
'default' => 0,
'index' => true,
],
'name' => [