2019-03-28 22:34:58 +01:00
|
|
|
<?php
|
2019-05-11 05:32:07 +02:00
|
|
|
/**
|
|
|
|
* Invoice Ninja (https://invoiceninja.com)
|
|
|
|
*
|
|
|
|
* @link https://github.com/invoiceninja/invoiceninja source repository
|
|
|
|
*
|
2020-01-07 01:13:47 +01:00
|
|
|
* @copyright Copyright (c) 2020. Invoice Ninja LLC (https://invoiceninja.com)
|
2019-05-11 05:32:07 +02:00
|
|
|
*
|
|
|
|
* @license https://opensource.org/licenses/AAL
|
|
|
|
*/
|
2019-03-28 22:34:58 +01:00
|
|
|
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
|
2020-03-30 08:40:21 +02:00
|
|
|
use App\Models\Account;
|
2019-09-29 10:46:53 +02:00
|
|
|
use App\Models\Company;
|
2020-03-04 00:51:50 +01:00
|
|
|
use App\Models\Design;
|
2019-09-27 06:31:13 +02:00
|
|
|
use App\Models\User;
|
2019-03-28 22:34:58 +01:00
|
|
|
use App\Transformers\ArraySerializer;
|
|
|
|
use App\Transformers\EntityTransformer;
|
2020-03-25 09:36:47 +01:00
|
|
|
use App\Utils\Ninja;
|
2019-09-11 02:37:53 +02:00
|
|
|
use App\Utils\Statics;
|
2020-03-18 10:40:15 +01:00
|
|
|
use App\Utils\Traits\AppSetup;
|
2019-03-28 22:34:58 +01:00
|
|
|
use Illuminate\Http\Request;
|
|
|
|
use Illuminate\Support\Facades\Log;
|
2019-09-27 06:31:13 +02:00
|
|
|
use Illuminate\Support\Facades\Request as Input;
|
2019-03-28 22:34:58 +01:00
|
|
|
use League\Fractal\Manager;
|
|
|
|
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
|
|
|
|
use League\Fractal\Resource\Collection;
|
|
|
|
use League\Fractal\Resource\Item;
|
|
|
|
use League\Fractal\Serializer\JsonApiSerializer;
|
|
|
|
|
2019-06-24 02:13:53 +02:00
|
|
|
/**
|
2019-09-11 02:37:53 +02:00
|
|
|
* Class BaseController
|
2019-06-24 02:13:53 +02:00
|
|
|
*/
|
2019-03-28 22:34:58 +01:00
|
|
|
class BaseController extends Controller
|
|
|
|
{
|
2020-03-21 06:37:30 +01:00
|
|
|
use AppSetup;
|
2019-06-24 02:13:53 +02:00
|
|
|
/**
|
|
|
|
* Passed from the parent when we need to force
|
2019-12-30 22:59:12 +01:00
|
|
|
* includes internally rather than externally via
|
2019-09-11 02:37:53 +02:00
|
|
|
* the $_REQUEST 'include' variable.
|
2019-12-30 22:59:12 +01:00
|
|
|
*
|
2019-06-24 02:13:53 +02:00
|
|
|
* @var array
|
|
|
|
*/
|
|
|
|
public $forced_includes;
|
|
|
|
|
2019-06-25 07:08:07 +02:00
|
|
|
/**
|
|
|
|
* Passed from the parent when we need to force
|
|
|
|
* the key of the response object
|
|
|
|
* @var string
|
|
|
|
*/
|
|
|
|
public $forced_index;
|
|
|
|
|
2019-06-24 02:13:53 +02:00
|
|
|
/**
|
|
|
|
* Fractal manager
|
|
|
|
* @var object
|
|
|
|
*/
|
|
|
|
protected $manager;
|
|
|
|
|
2019-03-28 22:34:58 +01:00
|
|
|
|
2019-12-30 22:59:12 +01:00
|
|
|
public function __construct()
|
2019-03-28 22:34:58 +01:00
|
|
|
{
|
|
|
|
$this->manager = new Manager();
|
|
|
|
|
2019-06-24 02:13:53 +02:00
|
|
|
$this->forced_includes = [];
|
|
|
|
|
2019-06-25 07:08:07 +02:00
|
|
|
$this->forced_index = 'data';
|
2019-06-24 02:13:53 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
private function buildManager()
|
|
|
|
{
|
2019-06-24 13:05:47 +02:00
|
|
|
$include = '';
|
2019-06-24 02:13:53 +02:00
|
|
|
|
2020-03-21 06:37:30 +01:00
|
|
|
if (request()->has('first_load') && request()->input('first_load') == 'true') {
|
|
|
|
$include = implode(",", array_merge($this->forced_includes, $this->getRequestIncludes([])));
|
|
|
|
} elseif (request()->input('include') !== null) {
|
2020-02-10 10:53:02 +01:00
|
|
|
$include = array_merge($this->forced_includes, explode(",", request()->input('include')));
|
2019-06-24 02:13:53 +02:00
|
|
|
|
|
|
|
$include = implode(",", $include);
|
2019-12-30 22:59:12 +01:00
|
|
|
} elseif (count($this->forced_includes) >= 1) {
|
2019-06-24 13:05:47 +02:00
|
|
|
$include = implode(",", $this->forced_includes);
|
|
|
|
}
|
2019-06-24 02:13:53 +02:00
|
|
|
|
|
|
|
$this->manager->parseIncludes($include);
|
2020-02-06 13:00:22 +01:00
|
|
|
|
2019-03-28 22:34:58 +01:00
|
|
|
$this->serializer = request()->input('serializer') ?: EntityTransformer::API_SERIALIZER_ARRAY;
|
|
|
|
|
2019-12-30 22:59:12 +01:00
|
|
|
if ($this->serializer === EntityTransformer::API_SERIALIZER_JSON) {
|
2019-03-28 22:34:58 +01:00
|
|
|
$this->manager->setSerializer(new JsonApiSerializer());
|
2019-12-30 22:59:12 +01:00
|
|
|
} else {
|
2019-03-28 22:34:58 +01:00
|
|
|
$this->manager->setSerializer(new ArraySerializer());
|
2019-06-24 02:13:53 +02:00
|
|
|
}
|
2019-03-28 22:34:58 +01:00
|
|
|
}
|
|
|
|
|
2019-03-30 10:30:41 +01:00
|
|
|
/**
|
2019-12-30 22:59:12 +01:00
|
|
|
* Catch all fallback route
|
2019-03-30 10:30:41 +01:00
|
|
|
* for non-existant route
|
|
|
|
*/
|
|
|
|
public function notFound()
|
|
|
|
{
|
2019-09-11 02:37:53 +02:00
|
|
|
return response()->json(['message' => '404 | Nothing to see here!'], 404)
|
2019-12-29 23:06:42 +01:00
|
|
|
->header('X-API-VERSION', config('ninja.api_version'))
|
|
|
|
->header('X-APP-VERSION', config('ninja.app_version'));
|
2019-03-30 10:30:41 +01:00
|
|
|
}
|
|
|
|
|
2020-04-04 12:32:42 +02:00
|
|
|
/**
|
|
|
|
* 404 for the client portal
|
|
|
|
* @return Response 404 response
|
|
|
|
*/
|
2019-07-17 00:59:09 +02:00
|
|
|
public function notFoundClient()
|
|
|
|
{
|
|
|
|
return abort(404);
|
|
|
|
}
|
|
|
|
|
2020-04-04 12:32:42 +02:00
|
|
|
/**
|
|
|
|
* API Error response
|
|
|
|
* @param string $message The return error message
|
|
|
|
* @param integer $httpErrorCode 404/401/403 etc
|
|
|
|
* @return Response The JSON response
|
|
|
|
*/
|
|
|
|
protected function errorResponse($message, $httpErrorCode = 400)
|
2019-03-28 22:34:58 +01:00
|
|
|
{
|
2020-04-04 12:32:42 +02:00
|
|
|
$error['error'] = $message;
|
2020-02-10 10:53:02 +01:00
|
|
|
|
2019-03-28 22:34:58 +01:00
|
|
|
$error = json_encode($error, JSON_PRETTY_PRINT);
|
2020-02-10 10:53:02 +01:00
|
|
|
|
2019-03-28 22:34:58 +01:00
|
|
|
$headers = self::getApiHeaders();
|
|
|
|
|
|
|
|
return response()->make($error, $httpErrorCode, $headers);
|
|
|
|
}
|
|
|
|
|
2019-12-30 22:59:12 +01:00
|
|
|
protected function listResponse($query)
|
2019-03-28 22:34:58 +01:00
|
|
|
{
|
2019-06-24 02:13:53 +02:00
|
|
|
$this->buildManager();
|
|
|
|
|
2019-04-03 04:34:28 +02:00
|
|
|
$transformer = new $this->entity_transformer(Input::get('serializer'));
|
2019-03-28 22:34:58 +01:00
|
|
|
|
|
|
|
$includes = $transformer->getDefaultIncludes();
|
2019-12-29 23:06:42 +01:00
|
|
|
|
2019-03-28 22:34:58 +01:00
|
|
|
$includes = $this->getRequestIncludes($includes);
|
|
|
|
|
|
|
|
$query->with($includes);
|
|
|
|
|
2020-04-01 14:34:50 +02:00
|
|
|
if (!auth()->user()->hasPermission('view_'.lcfirst(class_basename($this->entity_type)))) {
|
2020-04-04 12:32:42 +02:00
|
|
|
$query->where('user_id', '=', auth()->user()->id);
|
2019-09-27 06:31:13 +02:00
|
|
|
}
|
|
|
|
|
2020-02-28 13:11:56 +01:00
|
|
|
if (request()->has('updated_at') && request()->input('updated_at') > 0) {
|
2020-03-21 06:37:30 +01:00
|
|
|
$updated_at = intval(request()->input('updated_at'));
|
|
|
|
$query->where('updated_at', '>=', date('Y-m-d H:i:s', $updated_at));
|
2020-02-28 13:11:56 +01:00
|
|
|
}
|
|
|
|
|
2019-04-03 04:34:28 +02:00
|
|
|
$data = $this->createCollection($query, $transformer, $this->entity_type);
|
2019-03-28 22:34:58 +01:00
|
|
|
|
|
|
|
return $this->response($data);
|
|
|
|
}
|
|
|
|
|
2019-04-03 04:34:28 +02:00
|
|
|
protected function createCollection($query, $transformer, $entity_type)
|
2019-03-28 22:34:58 +01:00
|
|
|
{
|
2019-06-24 02:13:53 +02:00
|
|
|
$this->buildManager();
|
|
|
|
|
2020-03-21 06:37:30 +01:00
|
|
|
if ($this->serializer && $this->serializer != EntityTransformer::API_SERIALIZER_JSON) {
|
2019-04-03 04:34:28 +02:00
|
|
|
$entity_type = null;
|
2020-03-21 06:37:30 +01:00
|
|
|
}
|
2020-02-10 10:53:02 +01:00
|
|
|
|
2019-03-28 22:34:58 +01:00
|
|
|
|
|
|
|
if (is_a($query, "Illuminate\Database\Eloquent\Builder")) {
|
|
|
|
$limit = Input::get('per_page', 20);
|
|
|
|
|
|
|
|
$paginator = $query->paginate($limit);
|
|
|
|
$query = $paginator->getCollection();
|
2019-04-03 04:34:28 +02:00
|
|
|
$resource = new Collection($query, $transformer, $entity_type);
|
2019-03-28 22:34:58 +01:00
|
|
|
$resource->setPaginator(new IlluminatePaginatorAdapter($paginator));
|
|
|
|
} else {
|
2019-04-03 04:34:28 +02:00
|
|
|
$resource = new Collection($query, $transformer, $entity_type);
|
2019-03-28 22:34:58 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return $this->manager->createData($resource)->toArray();
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function response($response)
|
|
|
|
{
|
2019-06-25 07:08:07 +02:00
|
|
|
$index = request()->input('index') ?: $this->forced_index;
|
2019-03-28 22:34:58 +01:00
|
|
|
|
|
|
|
if ($index == 'none') {
|
|
|
|
unset($response['meta']);
|
|
|
|
} else {
|
|
|
|
$meta = isset($response['meta']) ? $response['meta'] : null;
|
|
|
|
$response = [
|
|
|
|
$index => $response,
|
|
|
|
];
|
|
|
|
|
|
|
|
if ($meta) {
|
|
|
|
$response['meta'] = $meta;
|
|
|
|
unset($response[$index]['meta']);
|
|
|
|
}
|
2019-09-18 08:02:05 +02:00
|
|
|
|
2019-12-30 22:59:12 +01:00
|
|
|
if (request()->include_static) {
|
2019-09-18 08:02:05 +02:00
|
|
|
$response['static'] = Statics::company(auth()->user()->getCompany()->getLocale());
|
2019-12-30 22:59:12 +01:00
|
|
|
}
|
2019-03-28 22:34:58 +01:00
|
|
|
}
|
2019-09-23 13:29:30 +02:00
|
|
|
|
|
|
|
ksort($response);
|
2019-03-28 22:34:58 +01:00
|
|
|
|
|
|
|
$response = json_encode($response, JSON_PRETTY_PRINT);
|
2020-02-10 10:53:02 +01:00
|
|
|
|
2019-03-28 22:34:58 +01:00
|
|
|
$headers = self::getApiHeaders();
|
2019-09-23 13:29:30 +02:00
|
|
|
|
2019-03-28 22:34:58 +01:00
|
|
|
return response()->make($response, 200, $headers);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function itemResponse($item)
|
|
|
|
{
|
2019-06-24 02:13:53 +02:00
|
|
|
$this->buildManager();
|
2019-03-28 22:34:58 +01:00
|
|
|
|
2019-04-03 04:34:28 +02:00
|
|
|
$transformer = new $this->entity_transformer(Input::get('serializer'));
|
2019-03-28 22:34:58 +01:00
|
|
|
|
2019-04-03 04:34:28 +02:00
|
|
|
$data = $this->createItem($item, $transformer, $this->entity_type);
|
2019-03-28 22:34:58 +01:00
|
|
|
|
2020-03-21 06:37:30 +01:00
|
|
|
if (request()->include_static) {
|
2019-09-11 02:37:53 +02:00
|
|
|
$data['static'] = Statics::company(auth()->user()->getCompany()->getLocale());
|
2020-03-21 06:37:30 +01:00
|
|
|
}
|
2019-09-12 03:28:41 +02:00
|
|
|
|
2019-03-28 22:34:58 +01:00
|
|
|
return $this->response($data);
|
|
|
|
}
|
|
|
|
|
2019-04-03 04:34:28 +02:00
|
|
|
protected function createItem($data, $transformer, $entity_type)
|
2019-03-28 22:34:58 +01:00
|
|
|
{
|
2020-03-21 06:37:30 +01:00
|
|
|
if ($this->serializer && $this->serializer != EntityTransformer::API_SERIALIZER_JSON) {
|
2020-02-10 10:53:02 +01:00
|
|
|
$entity_type = null;
|
2020-03-21 06:37:30 +01:00
|
|
|
}
|
2020-02-10 10:53:02 +01:00
|
|
|
|
2019-04-03 04:34:28 +02:00
|
|
|
$resource = new Item($data, $transformer, $entity_type);
|
2019-03-28 22:34:58 +01:00
|
|
|
|
|
|
|
return $this->manager->createData($resource)->toArray();
|
|
|
|
}
|
|
|
|
|
|
|
|
public static function getApiHeaders($count = 0)
|
|
|
|
{
|
|
|
|
return [
|
|
|
|
'Content-Type' => 'application/json',
|
2019-09-11 07:32:47 +02:00
|
|
|
'X-Api-Version' => config('ninja.api_version'),
|
|
|
|
'X-App-Version' => config('ninja.app_version'),
|
2019-03-28 22:34:58 +01:00
|
|
|
];
|
|
|
|
}
|
|
|
|
|
2020-02-06 13:00:22 +01:00
|
|
|
|
2019-03-28 22:34:58 +01:00
|
|
|
protected function getRequestIncludes($data)
|
|
|
|
{
|
2020-02-06 13:00:22 +01:00
|
|
|
$first_load = [
|
|
|
|
'account',
|
|
|
|
'user.company_user',
|
|
|
|
'token',
|
|
|
|
'company.activities',
|
|
|
|
'company.users.company_user',
|
|
|
|
'company.tax_rates',
|
|
|
|
'company.groups',
|
|
|
|
'company.company_gateways.gateway',
|
|
|
|
'company.clients.contacts',
|
|
|
|
'company.products',
|
2020-04-19 12:29:58 +02:00
|
|
|
'company.invoices.invitations.contact',
|
2020-04-02 11:02:39 +02:00
|
|
|
'company.invoices.invitations.company',
|
2020-04-19 12:29:58 +02:00
|
|
|
'company.invoices.documents',
|
2020-02-06 13:00:22 +01:00
|
|
|
'company.payments.paymentables',
|
2020-04-19 12:29:58 +02:00
|
|
|
'company.quotes.invitations.contact',
|
2020-04-02 11:02:39 +02:00
|
|
|
'company.quotes.invitations.company',
|
2020-05-14 11:08:49 +02:00
|
|
|
'company.credits',
|
2020-05-23 05:33:44 +02:00
|
|
|
'company.payment_terms',
|
2020-05-14 11:08:49 +02:00
|
|
|
//'company.credits.invitations.contact',
|
|
|
|
//'company.credits.invitations.company',
|
2020-02-06 13:00:22 +01:00
|
|
|
'company.vendors.contacts',
|
|
|
|
'company.expenses',
|
|
|
|
'company.tasks',
|
|
|
|
'company.projects',
|
2020-02-15 10:06:30 +01:00
|
|
|
'company.designs',
|
2020-02-06 13:00:22 +01:00
|
|
|
];
|
|
|
|
|
|
|
|
$mini_load = [
|
|
|
|
'account',
|
|
|
|
'user.company_user',
|
|
|
|
'token',
|
|
|
|
'company.activities',
|
|
|
|
'company.users.company_user',
|
|
|
|
'company.tax_rates',
|
|
|
|
'company.groups',
|
2020-05-23 05:33:44 +02:00
|
|
|
'company.payment_terms',
|
2020-02-06 13:00:22 +01:00
|
|
|
];
|
|
|
|
|
2020-02-10 10:53:02 +01:00
|
|
|
/**
|
|
|
|
* Thresholds for displaying large account on first load
|
|
|
|
*/
|
2020-03-21 06:37:30 +01:00
|
|
|
if (request()->has('first_load') && request()->input('first_load') == 'true') {
|
|
|
|
if (auth()->user()->getCompany()->invoices->count() > 1000) {
|
|
|
|
$data = $mini_load;
|
|
|
|
} else {
|
|
|
|
$data = $first_load;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
$included = request()->input('include');
|
|
|
|
$included = explode(',', $included);
|
|
|
|
|
|
|
|
foreach ($included as $include) {
|
|
|
|
if ($include == 'clients') {
|
|
|
|
$data[] = 'clients.contacts';
|
|
|
|
} elseif ($include) {
|
|
|
|
$data[] = $include;
|
|
|
|
}
|
|
|
|
}
|
2019-03-28 22:34:58 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
return $data;
|
|
|
|
}
|
2020-02-10 10:53:02 +01:00
|
|
|
|
2020-02-13 12:27:42 +01:00
|
|
|
public function flutterRoute()
|
|
|
|
{
|
2020-05-19 14:54:22 +02:00
|
|
|
|
|
|
|
// // Ensure all request are over HTTPS in production
|
|
|
|
// if (! request()->secure()) {
|
|
|
|
// return redirect()->secure(request()->path());
|
|
|
|
// }
|
|
|
|
|
2020-03-26 04:23:57 +01:00
|
|
|
if ((bool)$this->checkAppSetup() !== false) {
|
|
|
|
$data = [];
|
2020-03-18 10:40:15 +01:00
|
|
|
|
2020-03-30 08:40:21 +02:00
|
|
|
if (Ninja::isSelfHost() && $account = Account::all()->first()) {
|
2020-03-26 04:23:57 +01:00
|
|
|
$data['report_errors'] = $account->report_errors;
|
|
|
|
} else {
|
|
|
|
$data['report_errors'] = true;
|
|
|
|
}
|
2020-03-25 09:36:47 +01:00
|
|
|
|
2020-03-26 04:23:57 +01:00
|
|
|
return view('index.index', $data);
|
2020-03-25 09:36:47 +01:00
|
|
|
}
|
|
|
|
|
2020-03-26 04:23:57 +01:00
|
|
|
return redirect('/setup');
|
2020-02-13 12:27:42 +01:00
|
|
|
}
|
2019-12-30 22:59:12 +01:00
|
|
|
}
|