Company Gateway API

This commit is contained in:
David Bomba 2019-10-03 13:21:24 +10:00
parent b41966d41e
commit fd58aeb856
11 changed files with 405 additions and 196 deletions

View File

@ -0,0 +1,30 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com)
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2019. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Factory;
use App\Models\CompanyGateway;
class CompanyGatewayFactory
{
use MakesHash;
public static function create(int $company_id, int $user_id) :CompanyGateway
{
$company_gateway = new CompanyGateway;
$company_gateway->company_id = $company_id;
$company_gateway->user_id = $user_id;
return $company_gateway;
}
}

View File

@ -1,195 +0,0 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com)
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2019. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Http\Controllers;
use App\Models\CompanyGateway;
use App\Repositories\CompanyRepository;
use App\Utils\Traits\MakesHash;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Http\Request;
/**
* Class CompanyGatewayController
* @package App\Http\Controllers
*/
class CompanyGatewayController extends BaseController
{
use DispatchesJobs;
use MakesHash;
protected $entity_type = CompanyGateway::class;
protected $entity_transformer = CompanyGatewayTransformer::class;
protected $company_repo;
public $forced_includes = [];
/**
* CompanyGatewayController constructor.
*/
public function __construct(CompanyRepository $company_repo)
{
parent::__construct();
$this->company_repo = $company_repo;
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$company_gateways = CompanyGateway::whereCompanyId(auth()->user()->company()->id);
return $this->listResponse($company_gateways);
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create(CreateCompanyRequest $request)
{
$company = CompanyFactory::create(auth()->user()->company()->account->id);
return $this->itemResponse($company);
}
/**
* Store a newly created resource in storage.
*
* @param \App\Http\Requests\SignupRequest $request
* @return \Illuminate\Http\Response
*/
public function store(StoreCompanyRequest $request)
{
$this->forced_includes = ['company_user'];
$company = CreateCompany::dispatchNow($request->all(), auth()->user()->company()->account);
if($request->file('logo'))
{
\Log::error('logo exists');
$path = UploadAvatar::dispatchNow($request->file('logo'), $company->company_key);
if($path){
$company->logo = $path;
$company->save();
}
}
auth()->user()->companies()->attach($company->id, [
'account_id' => $company->account->id,
'is_owner' => 1,
'is_admin' => 1,
'is_locked' => 0,
'permissions' => json_encode([]),
'settings' => json_encode(DefaultSettings::userSettings()),
]);
/*
* Required dependencies
*/
auth()->user()->setCompany($company);
/*
* Create token
*/
$company_token = CreateCompanyToken::dispatchNow($company, auth()->user());
//todo Need to discuss this with Hillel which is the best representation to return
//when a company is created. Do we send the entire account? Do we only send back the created CompanyUser?
$this->entity_transformer = CompanyUserTransformer::class;
$this->entity_type = CompanyUser::class;
//return $this->itemResponse($company);
$ct = CompanyUser::whereUserId(auth()->user()->id);
return $this->listResponse($ct);
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show(ShowCompanyRequest $request, Company $company)
{
return $this->itemResponse($company);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit(EditCompanyRequest $request, Company $company)
{
return $this->itemResponse($company);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(UpdateCompanyRequest $request, Company $company)
{
$company = $this->company_repo->save($request->all(), $company);
if($request->file('logo'))
{
\Log::error('logo exists');
$path = UploadAvatar::dispatchNow($request->file('logo'), $company->company_key);
if($path){
$company->logo = $path;
$company->save();
}
}
return $this->itemResponse($company);
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy(DestroyCompanyRequest $request, Company $company)
{
$company->delete();
return response()->json([], 200);
}
}

View File

@ -0,0 +1,32 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com)
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2019. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Http\Requests\CompanyGateway;
use App\Http\Requests\Request;
use App\Models\Company;
class CreateCompanyGatewayRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize() : bool
{
return auth()->user()->isAdmin();
}
}

View File

@ -0,0 +1,49 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com)
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2019. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Http\Requests\CompanyGateway;
use App\Http\Requests\Request;
use App\Models\Company;
class DestroyCompanyGatewayRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return auth()->user()->can('edit', $this->company_gateway);
}
public function rules()
{
$rules = [];
return $rules;
}
public function sanitize()
{
$input = $this->all();
//$input['id'] = $this->encodePrimaryKey($input['id']);
//$this->replace($input);
return $this->all();
}
}

View File

@ -0,0 +1,49 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com)
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2019. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Http\Requests\CompanyGateway;
use App\Http\Requests\Request;
use App\Models\Company;
class EditCompanyGatewayRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return auth()->user()->can('edit', $this->company_gateway);
}
public function rules()
{
$rules = [];
return $rules;
}
public function sanitize()
{
$input = $this->all();
//$input['id'] = $this->encodePrimaryKey($input['id']);
//$this->replace($input);
return $this->all();
}
}

View File

@ -0,0 +1,49 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com)
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2019. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Http\Requests\CompanyGateway;
use App\Http\Requests\Request;
use App\Models\Company;
class ShowCompanyGatewayRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return auth()->user()->can('view', $this->company_gateway);
}
public function rules()
{
$rules = [];
return $rules;
}
public function sanitize()
{
$input = $this->all();
//$input['id'] = $this->encodePrimaryKey($input['id']);
//$this->replace($input);
return $this->all();
}
}

View File

@ -0,0 +1,50 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com)
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2019. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Http\Requests\CompanyGateway;
use App\Http\Requests\Request;
class StoreCompanyGatewayRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize() : bool
{
return auth()->user()->isAdmin();
}
public function rules()
{
$this->sanitize();
$rules = [];
return $rules;
}
public function sanitize()
{
$input = $this->all();
$input['config'] = encrypt($input['config']);
$this->replace($input);
return $this->all();
}
}

View File

@ -0,0 +1,51 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com)
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2019. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Http\Requests\CompanyGateway;
use App\Http\Requests\Request;
use App\Models\Company;
class UpdateCompanyGatewayRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return auth()->user()->can('edit', $this->company_gateway);
}
public function rules()
{
$this->sanitize();
$rules = [];
return $rules;
}
public function sanitize()
{
$input = $this->all();
$input['config'] = encrypt($input['config']);
$this->replace($input);
return $this->all();
}
}

View File

@ -49,7 +49,7 @@ class CompanyGatewayTransformer extends EntityTransformer
'show_address' => (bool)$company_gateway->show_address,
'show_shipping_address' => (bool)$company_gateway->show_shipping_address,
'update_details' => (bool)$company_gateway->update_details,
'config' => (string)$company_gateway->config ?: '',
'config' => (string) decrypt($company_gateway->config) ?: '',
'priority_id' => (int)$company_gateway->priority_id,
'min_limit' => (float)$company_gateway->min_limit,
'max_limit' => (float)$company_gateway->max_limit,

View File

@ -74,6 +74,8 @@ Route::group(['middleware' => ['api_db','api_secret_check','token_auth'], 'prefi
Route::resource('companies', 'CompanyController'); // name = (companies. index / create / show / update / destroy / edit
Route::resource('company_gateways', 'CompanyGatewayController');
Route::post('refresh', 'Auth\LoginController@refresh');
/*
Route::resource('tasks', 'TaskController'); // name = (tasks. index / create / show / update / destroy / edit

View File

@ -0,0 +1,92 @@
<?php
namespace Tests\Feature;
use App\DataMapper\DefaultSettings;
use App\Models\Account;
use App\Models\Client;
use App\Models\ClientContact;
use App\Models\Company;
use App\Models\User;
use App\Utils\Traits\MakesHash;
use Faker\Factory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Session;
use Tests\MockAccountData;
use Tests\TestCase;
/**
* @test
*/
class ClientApiTest extends TestCase
{
use MakesHash;
use DatabaseTransactions;
use MockAccountData;
public function setUp() :void
{
parent::setUp();
$this->makeTestData();
Session::start();
$this->faker = \Faker\Factory::create();
Model::reguard();
}
public function testCompanyGatewayPost()
{
$data = [
'config' => 'random config',
];
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token
])->post('/api/v1/company_gateways', $data);
$response->assertStatus(200);
}
public function testCompanyGatewayPut()
{
$data = [
'config' => 'changed',
];
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token
])->put('/api/v1/company_gateways/'.$this->encodePrimaryKey($this->client->id), $data);
$response->assertStatus(200);
}
public function testCompanyGatewayGet()
{
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token
])->get('/api/v1/company_gateways/'.$this->encodePrimaryKey($this->client->id));
$response->assertStatus(200);
}
}