mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-09 03:14:30 -04:00
Added Fractal
This commit is contained in:
parent
9b840a24dd
commit
3b6a4a6100
40
app/Http/Controllers/AccountApiController.php
Normal file
40
app/Http/Controllers/AccountApiController.php
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
@ -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();
|
||||||
|
@ -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();
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
16
app/Ninja/Serializers/ArraySerializer.php
Normal file
16
app/Ninja/Serializers/ArraySerializer.php
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
27
app/Ninja/Transformers/AccountTransformer.php
Normal file
27
app/Ninja/Transformers/AccountTransformer.php
Normal 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,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
18
app/Ninja/Transformers/UserTransformer.php
Normal file
18
app/Ninja/Transformers/UserTransformer.php
Normal 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,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
@ -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
65
composer.lock
generated
@ -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",
|
||||||
|
@ -151,6 +151,7 @@ return [
|
|||||||
'Illuminate\Html\HtmlServiceProvider',
|
'Illuminate\Html\HtmlServiceProvider',
|
||||||
'Laravel\Socialite\SocialiteServiceProvider',
|
'Laravel\Socialite\SocialiteServiceProvider',
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Application Service Providers...
|
* Application Service Providers...
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user