Added Fractal

This commit is contained in:
Hillel Coren 2015-11-02 00:10:20 +02:00
parent 9b840a24dd
commit 3b6a4a6100
13 changed files with 198 additions and 8 deletions

View File

@ -0,0 +1,40 @@
<?php namespace App\Http\Controllers;
use Auth;
use Utils;
use Response;
use Input;
use App\Models\Client;
use App\Models\Account;
use App\Ninja\Repositories\AccountRepository;
use League\Fractal;
use League\Fractal\Resource\Item;
use League\Fractal\Manager;
use App\Ninja\Serializers\ArraySerializer;
use App\Ninja\Transformers\AccountTransformer;
class AccountApiController extends Controller
{
protected $accountRepo;
public function __construct(AccountRepository $accountRepo)
{
$this->accountRepo = $accountRepo;
}
public function index()
{
$manager = new Manager();
$manager->setSerializer(new ArraySerializer());
$account = Auth::user()->account->load('users');
$resource = new Item($account, new AccountTransformer, 'account');
$response = $manager->createData($resource)->toArray();
$response = json_encode($response, JSON_PRETTY_PRINT);
$headers = Utils::getApiHeaders();
return Response::make($response, 200, $headers);
}
}

View File

@ -97,8 +97,14 @@ class AuthController extends Controller {
} else { } else {
$users = $this->accountRepo->loadAccounts(Auth::user()->id); $users = $this->accountRepo->loadAccounts(Auth::user()->id);
} }
Session::put(SESSION_USER_ACCOUNTS, $users); Session::put(SESSION_USER_ACCOUNTS, $users);
if ($request->create_token) {
if ( ! env(API_SECRET) || $request->api_secret !== env(API_SECRET)) {
return 'Invalid secret';
}
return $this->accountRepo->createToken($request->token_name);
}
} elseif ($user) { } elseif ($user) {
$user->failed_logins = $user->failed_logins + 1; $user->failed_logins = $user->failed_logins + 1;
$user->save(); $user->save();

View File

@ -145,13 +145,9 @@ class TokenController extends BaseController
if ($tokenPublicId) { if ($tokenPublicId) {
$token->name = trim(Input::get('name')); $token->name = trim(Input::get('name'));
} else { } else {
$lastToken = AccountToken::withTrashed()->where('account_id', '=', Auth::user()->account_id)
->orderBy('public_id', 'DESC')->first();
$token = AccountToken::createNew(); $token = AccountToken::createNew();
$token->name = trim(Input::get('name')); $token->name = trim(Input::get('name'));
$token->token = str_random(RANDOM_KEY_LENGTH); $token->token = str_random(RANDOM_KEY_LENGTH);
$token->public_id = $lastToken ? $lastToken->public_id + 1 : 1;
} }
$token->save(); $token->save();

View File

@ -34,6 +34,12 @@ class VerifyCsrfToken extends BaseVerifier {
} }
} }
if ($request->is('login')) {
if (env(API_SECRET) && $request->api_secret === env(API_SECRET)) {
return $next($request);
}
}
return parent::handle($request, $next); return parent::handle($request, $next);
} }

View File

@ -190,6 +190,7 @@ Route::group(['middleware' => 'auth'], function() {
Route::group(['middleware' => 'api', 'prefix' => 'api/v1'], function() Route::group(['middleware' => 'api', 'prefix' => 'api/v1'], function()
{ {
Route::resource('ping', 'ClientApiController@ping'); Route::resource('ping', 'ClientApiController@ping');
Route::get('accounts', 'AccountApiController@index');
Route::resource('clients', 'ClientApiController'); Route::resource('clients', 'ClientApiController');
Route::get('quotes/{client_id?}', 'QuoteApiController@index'); Route::get('quotes/{client_id?}', 'QuoteApiController@index');
Route::resource('quotes', 'QuoteApiController'); Route::resource('quotes', 'QuoteApiController');
@ -437,6 +438,7 @@ if (!defined('CONTACT_EMAIL')) {
define('TEST_USERNAME', 'user@example.com'); define('TEST_USERNAME', 'user@example.com');
define('TEST_PASSWORD', 'password'); define('TEST_PASSWORD', 'password');
define('API_SECRET', 'API_SECRET');
define('TOKEN_BILLING_DISABLED', 1); define('TOKEN_BILLING_DISABLED', 1);
define('TOKEN_BILLING_OPT_IN', 2); define('TOKEN_BILLING_OPT_IN', 2);

View File

@ -24,7 +24,10 @@ class EntityModel extends Eloquent
Utils::fatalError(); Utils::fatalError();
} }
$lastEntity = $className::withTrashed()->scope(false, $entity->account_id)->orderBy('public_id', 'DESC')->first(); $lastEntity = $className::withTrashed()
->scope(false, $entity->account_id)
->orderBy('public_id', 'DESC')
->first();
if ($lastEntity) { if ($lastEntity) {
$entity->public_id = $lastEntity->public_id + 1; $entity->public_id = $lastEntity->public_id + 1;

View File

@ -18,6 +18,7 @@ use App\Models\Contact;
use App\Models\Account; use App\Models\Account;
use App\Models\User; use App\Models\User;
use App\Models\UserAccount; use App\Models\UserAccount;
use App\Models\AccountToken;
class AccountRepository class AccountRepository
{ {
@ -455,4 +456,14 @@ class AccountRepository
return $code; return $code;
} }
public function createToken($name)
{
$token = AccountToken::createNew();
$token->name = trim($name) ?: 'TOKEN';
$token->token = str_random(RANDOM_KEY_LENGTH);
$token->save();
return $token->token;
}
} }

View File

@ -0,0 +1,16 @@
<?php namespace App\Ninja\Serializers;
use League\Fractal\Serializer\ArraySerializer as FractalArraySerializer;
class ArraySerializer extends FractalArraySerializer
{
public function collection($resourceKey, array $data)
{
return ($resourceKey && $resourceKey !== 'data') ? array($resourceKey => $data) : $data;
}
public function item($resourceKey, array $data)
{
return ($resourceKey && $resourceKey !== 'data') ? array($resourceKey => $data) : $data;
}
}

View File

@ -0,0 +1,27 @@
<?php namespace App\Ninja\Transformers;
use App\Models\Account;
use League\Fractal;
use League\Fractal\TransformerAbstract;
class AccountTransformer extends TransformerAbstract
{
protected $defaultIncludes = [
'users'
];
public function includeUsers($account)
{
$users = $account->users;
return $this->collection($users, new UserTransformer);
}
public function transform(Account $account)
{
return [
'id' => (int) $account->id,
'name' => $account->name,
];
}
}

View File

@ -0,0 +1,18 @@
<?php namespace App\Ninja\Transformers;
use App\Models\User;
use League\Fractal;
use League\Fractal\TransformerAbstract;
class UserTransformer extends TransformerAbstract
{
public function transform(User $user)
{
return [
'id' => (int) $user->id,
'first_name' => $user->first_name,
'last_name' => $user->last_name,
'email' => $user->email,
];
}
}

View File

@ -39,7 +39,8 @@
"wildbit/laravel-postmark-provider": "dev-master", "wildbit/laravel-postmark-provider": "dev-master",
"Dwolla/omnipay-dwolla": "dev-master", "Dwolla/omnipay-dwolla": "dev-master",
"laravel/socialite": "~2.0", "laravel/socialite": "~2.0",
"simshaun/recurr": "dev-master" "simshaun/recurr": "dev-master",
"league/fractal": "0.13.*"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "~4.0", "phpunit/phpunit": "~4.0",

65
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"hash": "c6273849605c03edf4f72bc6b1033658", "hash": "70ef9e09bca60a19c396c138d8a01d50",
"packages": [ "packages": [
{ {
"name": "alfaproject/omnipay-neteller", "name": "alfaproject/omnipay-neteller",
@ -2243,6 +2243,69 @@
], ],
"time": "2015-09-30 22:26:59" "time": "2015-09-30 22:26:59"
}, },
{
"name": "league/fractal",
"version": "0.13.0",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/fractal.git",
"reference": "3caeefbad51bce7a06947321938128512f42346c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/fractal/zipball/3caeefbad51bce7a06947321938128512f42346c",
"reference": "3caeefbad51bce7a06947321938128512f42346c",
"shasum": ""
},
"require": {
"php": ">=5.4"
},
"require-dev": {
"illuminate/contracts": "~5.0",
"mockery/mockery": "~0.9",
"pagerfanta/pagerfanta": "~1.0.0",
"phpunit/phpunit": "~4.0",
"squizlabs/php_codesniffer": "~1.5",
"zendframework/zend-paginator": "~2.3"
},
"suggest": {
"illuminate/pagination": "The Illuminate Pagination component.",
"pagerfanta/pagerfanta": "Pagerfanta Paginator",
"zendframework/zend-paginator": "Zend Framework Paginator"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "0.13-dev"
}
},
"autoload": {
"psr-4": {
"League\\Fractal\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Phil Sturgeon",
"email": "me@philsturgeon.uk",
"homepage": "http://philsturgeon.uk/",
"role": "Developer"
}
],
"description": "Handle the output of complex data structures ready for API output.",
"homepage": "http://fractal.thephpleague.com/",
"keywords": [
"api",
"json",
"league",
"rest"
],
"time": "2015-10-07 14:48:58"
},
{ {
"name": "league/oauth1-client", "name": "league/oauth1-client",
"version": "1.6.1", "version": "1.6.1",

View File

@ -150,6 +150,7 @@ return [
'Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider', 'Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider',
'Illuminate\Html\HtmlServiceProvider', 'Illuminate\Html\HtmlServiceProvider',
'Laravel\Socialite\SocialiteServiceProvider', 'Laravel\Socialite\SocialiteServiceProvider',
/* /*
* Application Service Providers... * Application Service Providers...