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 {
|
||||
$users = $this->accountRepo->loadAccounts(Auth::user()->id);
|
||||
}
|
||||
|
||||
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) {
|
||||
$user->failed_logins = $user->failed_logins + 1;
|
||||
$user->save();
|
||||
|
@ -145,13 +145,9 @@ class TokenController extends BaseController
|
||||
if ($tokenPublicId) {
|
||||
$token->name = trim(Input::get('name'));
|
||||
} else {
|
||||
$lastToken = AccountToken::withTrashed()->where('account_id', '=', Auth::user()->account_id)
|
||||
->orderBy('public_id', 'DESC')->first();
|
||||
|
||||
$token = AccountToken::createNew();
|
||||
$token->name = trim(Input::get('name'));
|
||||
$token->token = str_random(RANDOM_KEY_LENGTH);
|
||||
$token->public_id = $lastToken ? $lastToken->public_id + 1 : 1;
|
||||
}
|
||||
|
||||
$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);
|
||||
}
|
||||
|
||||
|
@ -190,6 +190,7 @@ Route::group(['middleware' => 'auth'], function() {
|
||||
Route::group(['middleware' => 'api', 'prefix' => 'api/v1'], function()
|
||||
{
|
||||
Route::resource('ping', 'ClientApiController@ping');
|
||||
Route::get('accounts', 'AccountApiController@index');
|
||||
Route::resource('clients', 'ClientApiController');
|
||||
Route::get('quotes/{client_id?}', 'QuoteApiController@index');
|
||||
Route::resource('quotes', 'QuoteApiController');
|
||||
@ -437,6 +438,7 @@ if (!defined('CONTACT_EMAIL')) {
|
||||
|
||||
define('TEST_USERNAME', 'user@example.com');
|
||||
define('TEST_PASSWORD', 'password');
|
||||
define('API_SECRET', 'API_SECRET');
|
||||
|
||||
define('TOKEN_BILLING_DISABLED', 1);
|
||||
define('TOKEN_BILLING_OPT_IN', 2);
|
||||
|
@ -24,7 +24,10 @@ class EntityModel extends Eloquent
|
||||
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) {
|
||||
$entity->public_id = $lastEntity->public_id + 1;
|
||||
|
@ -18,6 +18,7 @@ use App\Models\Contact;
|
||||
use App\Models\Account;
|
||||
use App\Models\User;
|
||||
use App\Models\UserAccount;
|
||||
use App\Models\AccountToken;
|
||||
|
||||
class AccountRepository
|
||||
{
|
||||
@ -455,4 +456,14 @@ class AccountRepository
|
||||
|
||||
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",
|
||||
"Dwolla/omnipay-dwolla": "dev-master",
|
||||
"laravel/socialite": "~2.0",
|
||||
"simshaun/recurr": "dev-master"
|
||||
"simshaun/recurr": "dev-master",
|
||||
"league/fractal": "0.13.*"
|
||||
},
|
||||
"require-dev": {
|
||||
"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",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"hash": "c6273849605c03edf4f72bc6b1033658",
|
||||
"hash": "70ef9e09bca60a19c396c138d8a01d50",
|
||||
"packages": [
|
||||
{
|
||||
"name": "alfaproject/omnipay-neteller",
|
||||
@ -2243,6 +2243,69 @@
|
||||
],
|
||||
"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",
|
||||
"version": "1.6.1",
|
||||
|
@ -150,6 +150,7 @@ return [
|
||||
'Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider',
|
||||
'Illuminate\Html\HtmlServiceProvider',
|
||||
'Laravel\Socialite\SocialiteServiceProvider',
|
||||
|
||||
|
||||
/*
|
||||
* Application Service Providers...
|
||||
|
Loading…
x
Reference in New Issue
Block a user