Skip to content

Commit 5b11817

Browse files
authored
Merge pull request #2 from kaliop-uk/advance_stub
Add ADvance stub
2 parents d779624 + 180ce7c commit 5b11817

File tree

16 files changed

+782
-5
lines changed

16 files changed

+782
-5
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
namespace Abacus\AdvanceBundle\Controller\AdvanceStub;
4+
5+
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
6+
use Symfony\Component\HttpFoundation\Request;
7+
use Symfony\Component\HttpFoundation\JsonResponse;
8+
use Abacus\AdvanceBundle\Core\Response\AdvanceResponse;
9+
10+
abstract class BaseController extends Controller
11+
{
12+
const RESPONSE_FORMAT_HEADER = 'ADAPI_RESPONSE_FORMAT';
13+
14+
protected $adapiResponseFormat = 'xml'; // xml is the default as per the spec
15+
protected $dataProviderServiceId;
16+
17+
protected function beginAction($request, $site, $version)
18+
{
19+
$this->processRequestHeaders($request, $site, $version);
20+
21+
$dataProvider = $this->get($this->dataProviderServiceId);
22+
$dataProvider->processRequestHeaders($request, $site, $version);
23+
return $dataProvider;
24+
}
25+
26+
protected function processRequestHeaders(Request $request, $site, $version)
27+
{
28+
$this->adapiResponseFormat = $request->headers->get(self::RESPONSE_FORMAT_HEADER, 'json');
29+
}
30+
31+
protected function encodeResponse(AdvanceResponse $response, $httpStatus = 200, $headers = array())
32+
{
33+
$data = [
34+
'response' => [
35+
'version' => $response->getVersion(),
36+
'status' => [
37+
'code' => $response->getStatusCode(),
38+
'messages' => $response->getStatusMessages()
39+
],
40+
'data' => $response->getData(),
41+
]
42+
];
43+
44+
switch ($this->adapiResponseFormat) {
45+
case 'json':
46+
return new JsonResponse($data, $httpStatus, $headers);
47+
default:
48+
throw new \Exception("Unsupported response format '{$this->adapiResponseFormat}'");
49+
}
50+
}
51+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace Abacus\AdvanceBundle\Controller\AdvanceStub;
4+
5+
use Symfony\Component\HttpFoundation\Request;
6+
7+
class GateKeeperController extends BaseController
8+
{
9+
protected $dataProviderServiceId = 'abacus.advance.stub_data_provider.gatekeeper';
10+
11+
function accessAllowedAction(Request $request, $site, $version)
12+
{
13+
$dataProvider = $this->beginAction($request, $site, $version);
14+
$data = $dataProvider->accessAllowed(
15+
$request->request->get('userToken'),
16+
$request->request->get('CookieID'),
17+
$request->request->get('Url'),
18+
$request->request->get('MetaId'),
19+
$request->request->get('MetaType'),
20+
$request->request->get('ModifiedDate'),
21+
$request->request->get('StoryPublishDate'),
22+
$request->request->get('BrandId'),
23+
$request->request->get('SourceId'),
24+
$request->request->get('ipAddress')
25+
);
26+
return $this->encodeResponse($data);
27+
}
28+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
3+
namespace Abacus\AdvanceBundle\Controller\AdvanceStub;
4+
5+
use Symfony\Component\HttpFoundation\Request;
6+
7+
class LoginController extends BaseController
8+
{
9+
protected $dataProviderServiceId = 'abacus.advance.stub_data_provider.login';
10+
11+
function loginAction(Request $request, $site, $version)
12+
{
13+
$dataProvider = $this->beginAction($request, $site, $version);
14+
$data = $dataProvider->login(
15+
$request->request->get('Username'),
16+
$request->request->get('Password'),
17+
$request->request->get('concurrencyCookie'),
18+
$request->request->get('ipAddress')
19+
);
20+
return $this->encodeResponse($data);
21+
}
22+
23+
function autoLoginAction(Request $request, $site, $version)
24+
{
25+
$dataProvider = $this->beginAction($request, $site, $version);
26+
$data = $dataProvider->autoLogin(
27+
$request->request->get('frontendCookie'),
28+
$request->request->get('concurrencyCookie'),
29+
$request->request->get('ipAddress')
30+
);
31+
return $this->encodeResponse($data);
32+
}
33+
34+
function passwordlessLogin(Request $request, $site, $version)
35+
{
36+
$data = $dataProvider->passwordlessLogin(
37+
$request->request->get('partyId')
38+
);
39+
return $this->encodeResponse($data);
40+
}
41+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace Abacus\AdvanceBundle\Controller\AdvanceStub;
4+
5+
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
6+
use Symfony\Component\HttpFoundation\Request;
7+
use Symfony\Component\HttpFoundation\RedirectResponse;
8+
9+
class SiteController
10+
{
11+
public function adfeTokenAuthAction(Request $request)
12+
{
13+
return new RedirectResponse($request->query->get('returnUrl'));
14+
}
15+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<?php
2+
3+
namespace Abacus\AdvanceBundle\Controller\AdvanceStub;
4+
5+
use Symfony\Component\HttpFoundation\Request;
6+
7+
class UserController extends BaseController
8+
{
9+
protected $dataProviderServiceId = 'abacus.advance.stub_data_provider.user';
10+
11+
function detailsAction(Request $request, $site, $version)
12+
{
13+
$dataProvider = $this->beginAction($request, $site, $version);
14+
$data = $dataProvider->details(
15+
$request->request->get('userToken')
16+
);
17+
return $this->encodeResponse($data);
18+
}
19+
20+
function getUserSubscriptionsAction(Request $request, $site, $version)
21+
{
22+
$dataProvider = $this->beginAction($request, $site, $version);
23+
$data = $dataProvider->getUserSubscriptions(
24+
$request->request->get('userToken'),
25+
$request->request->get('ipAddress')
26+
);
27+
return $this->encodeResponse($data);
28+
}
29+
30+
function getListOfAvailableProductsAction(Request $request, $site, $version)
31+
{
32+
$dataProvider = $this->beginAction($request, $site, $version);
33+
$data = $dataProvider->getUserSubscriptions(
34+
$request->request->get('userToken'),
35+
$request->request->get('partyId'),
36+
$request->request->get('brandId'),
37+
$request->request->get('ipAddress')
38+
);
39+
return $this->encodeResponse($data);
40+
}
41+
42+
function doesPartyBelongToBIAction(Request $request, $site, $version)
43+
{
44+
$dataProvider = $this->beginAction($request, $site, $version);
45+
$data = $dataProvider->doesPartyBelongToBI(
46+
$request->request->get('userToken'),
47+
$request->request->get('formId')
48+
);
49+
return $this->encodeResponse($data);
50+
}
51+
52+
function logWebActivityAction(Request $request, $site, $version)
53+
{
54+
$dataProvider = $this->beginAction($request, $site, $version);
55+
$data = $dataProvider->logWebActivity(
56+
$request->request->get('userToken'),
57+
$request->request->get('partyId'),
58+
$request->request->get('metaId'),
59+
$request->request->get('metaType'),
60+
$request->request->get('metaTitle'),
61+
$request->request->get('actionName'),
62+
$request->request->get('numberOfMetaCategories'),
63+
$request->request->get('metaDataSourceId'),
64+
$request->request->get('actionDate'),
65+
$request->request->get('itemType'),
66+
$request->request->get('ipAddress')
67+
);
68+
return $this->encodeResponse($data);
69+
}
70+
}

Core/Response/GenericResponse.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace Abacus\AdvanceBundle\Core\Response;
4+
5+
/**
6+
* A class that does no validation of data nor exposes it in some semantic/decoded way.
7+
*/
8+
class GenericResponse extends AdvanceResponse
9+
{
10+
protected function validateResponseFormat()
11+
{
12+
}
13+
}
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
<?php
2+
3+
namespace Abacus\AdvanceBundle\Core\Service\StubDataProvider;
4+
5+
use Symfony\Component\HttpFoundation\Request;
6+
use Abacus\AdvanceBundle\Core\Response\GenericResponse;
7+
8+
abstract class Base
9+
{
10+
const ACCESS_HASH_HEADER = 'ADAPI_ACCESS_HASH';
11+
const ACCESS_TOKEN_HEADER = 'ADAPI_ACCESS_TOKEN';
12+
13+
protected $adapiAccessHash;
14+
protected $adapiAccessToken;
15+
protected $version;
16+
17+
protected $config;
18+
19+
public function __construct($config)
20+
{
21+
$this->config = $config;
22+
}
23+
24+
public function processRequestHeaders(Request $request, $site, $version)
25+
{
26+
$this->adapiAccessHash = $request->headers->get(self::ACCESS_HASH_HEADER, null);
27+
$this->adapiAccessToken = $request->headers->get(self::ACCESS_TOKEN_HEADER, null);
28+
$this->version = $version;
29+
30+
return $this; // allow fluent interfaces
31+
}
32+
33+
// just a helper for subclasses, to avoid code repetition
34+
protected function buildResponseArray(array $data, $code = 'OK', array $messages = [])
35+
{
36+
return [
37+
'response' => [
38+
'version' => $this->version,
39+
'status' => [
40+
'code' => $code,
41+
'messages' => $messages
42+
],
43+
'data' => $data
44+
]
45+
];
46+
}
47+
48+
/**
49+
* @param string $username
50+
* @param string $password
51+
* @return array|null
52+
*/
53+
protected function getUserProfile($username, $password)
54+
{
55+
foreach($this->config['users'] as $userData) {
56+
if (preg_match($userData['LoginRegexp'], $username) && preg_match($userData['PasswordRegexp'], $password)) {
57+
return $userData;
58+
}
59+
}
60+
61+
return null;
62+
}
63+
64+
/**
65+
* @param string $token
66+
* @return array|null
67+
*/
68+
protected function getUserProfileFromToken($token)
69+
{
70+
$md5 = explode('_', $token, 2);
71+
$md5 = $md5[0];
72+
73+
foreach($this->config['users'] as $userData) {
74+
if (md5($userData['LoginRegexp']) === $md5) {
75+
return $userData;
76+
}
77+
}
78+
79+
return null;
80+
}
81+
82+
/**
83+
* @param string $partyId
84+
* @return array|null
85+
*/
86+
protected function getUserProfileByPartyId($partyId)
87+
{
88+
foreach($this->config['users'] as $userData) {
89+
if ($userData['PartyId'] === $partyId) {
90+
return $userData;
91+
}
92+
}
93+
94+
return null;
95+
}
96+
97+
/**
98+
* Creates a unique "session" token that can be used to tface back to a user, without a db/storage :-)
99+
* @param array $profile
100+
* @return string
101+
*/
102+
protected function generateTokenFromUserProfile(array $profile)
103+
{
104+
return md5($profile['LoginRegexp']) . '_' . microtime(true);
105+
}
106+
107+
/**
108+
* Generates a generic response for error conditions (which has an empty `data` member)
109+
* @param int $errCode
110+
* @param string $message
111+
* @return GenericResponse
112+
*/
113+
protected function failedResponse($errCode = 1, $message = 'Invalid token.')
114+
{
115+
return new GenericResponse($this->buildResponseArray(
116+
[],
117+
'ERROR',
118+
[
119+
[
120+
'type' => 'error',
121+
'code' => $errCode,
122+
'msg' => $message
123+
]
124+
125+
]
126+
));
127+
}
128+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
namespace Abacus\AdvanceBundle\Core\Service\StubDataProvider;
4+
5+
use Symfony\Component\HttpFoundation\Request;
6+
use Abacus\AdvanceBundle\Core\Response\GateKeeperResponse;
7+
use Abacus\AdvanceBundle\Core\Service\GateKeeper as GateKeeperSvc;
8+
9+
class GateKeeper extends Base
10+
{
11+
public function accessAllowed(
12+
$userToken = null,
13+
$CookieID = null,
14+
$Url = null,
15+
$MetaId = null,
16+
$MetaType = null,
17+
$ModifiedDate = null,
18+
$StoryPublishDate = null,
19+
$BrandId = null,
20+
$SourceId = null,
21+
$ipAddress = null
22+
)
23+
{
24+
$profile = $this->getUserProfileFromToken($userToken);
25+
26+
if (!$profile) {
27+
return $this->failedResponse();
28+
}
29+
30+
/// @todo implement check based on data from profile
31+
return new GateKeeperResponse($this->buildResponseArray([
32+
'GKResult' => [
33+
'Status' => GateKeeperSvc::ACCESS_GRANTED,
34+
'DataGatheringUrl' => null
35+
]
36+
]));
37+
}
38+
}

0 commit comments

Comments
 (0)