1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-09-21 08:51:34 +02:00
invoiceninja/app/Http/Controllers/CompanyGatewayController.php

515 lines
20 KiB
PHP
Raw Normal View History

2019-10-03 05:23:00 +02:00
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
2019-10-03 05:23:00 +02:00
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
2023-01-28 23:21:40 +01:00
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
2019-10-03 05:23:00 +02:00
*
2021-06-16 08:58:16 +02:00
* @license https://www.elastic.co/licensing/elastic-license
2019-10-03 05:23:00 +02:00
*/
namespace App\Http\Controllers;
use App\DataMapper\FeesAndLimits;
2019-10-03 05:23:00 +02:00
use App\Factory\CompanyGatewayFactory;
2022-01-03 02:35:31 +01:00
use App\Filters\CompanyGatewayFilters;
use App\Http\Requests\CompanyGateway\BulkCompanyGatewayRequest;
2019-10-03 05:23:00 +02:00
use App\Http\Requests\CompanyGateway\CreateCompanyGatewayRequest;
use App\Http\Requests\CompanyGateway\DestroyCompanyGatewayRequest;
use App\Http\Requests\CompanyGateway\EditCompanyGatewayRequest;
use App\Http\Requests\CompanyGateway\ShowCompanyGatewayRequest;
use App\Http\Requests\CompanyGateway\StoreCompanyGatewayRequest;
use App\Http\Requests\CompanyGateway\UpdateCompanyGatewayRequest;
2022-01-06 01:19:29 +01:00
use App\Jobs\Util\ApplePayDomain;
use App\Models\Client;
2019-10-03 05:23:00 +02:00
use App\Models\CompanyGateway;
2022-05-30 12:08:12 +02:00
use App\PaymentDrivers\Stripe\Jobs\StripeWebhook;
2019-10-03 05:23:00 +02:00
use App\Repositories\CompanyRepository;
use App\Transformers\CompanyGatewayTransformer;
use App\Utils\Traits\MakesHash;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Http\Request;
2020-10-28 11:10:49 +01:00
use Illuminate\Http\Response;
2019-10-03 05:23:00 +02:00
/**
* Class CompanyGatewayController.
2019-10-03 05:23:00 +02:00
*/
class CompanyGatewayController extends BaseController
{
use DispatchesJobs;
use MakesHash;
protected $entity_type = CompanyGateway::class;
protected $entity_transformer = CompanyGatewayTransformer::class;
protected $company_repo;
public $forced_includes = [];
2022-01-06 01:19:29 +01:00
private array $stripe_keys = ['d14dd26a47cecc30fdd65700bfb67b34', 'd14dd26a37cecc30fdd65700bfb55b23'];
2019-10-03 05:23:00 +02:00
/**
* CompanyGatewayController constructor.
2020-10-28 11:10:49 +01:00
* @param CompanyRepository $company_repo
2019-10-03 05:23:00 +02:00
*/
public function __construct(CompanyRepository $company_repo)
{
parent::__construct();
$this->company_repo = $company_repo;
}
/**
* Display a listing of the resource.
*
2020-10-28 11:10:49 +01:00
* @return Response
2019-10-07 06:09:04 +02:00
*
*
*
2019-10-07 06:09:04 +02:00
* @OA\Get(
* path="/api/v1/company_gateways",
* operationId="getCompanyGateways",
* tags={"company_gateways"},
* summary="Gets a list of company_gateways",
* description="Lists company_gateways, search and filters allow fine grained lists to be generated.
Query parameters can be added to performed more fine grained filtering of the company_gateways, these are handled by the CompanyGatewayFilters class which defines the methods available",
2023-02-10 10:21:10 +01:00
* @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"),
2019-10-07 06:09:04 +02:00
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
* @OA\Parameter(ref="#/components/parameters/include"),
* @OA\Response(
* response=200,
* description="A list of company_gateways",
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
2019-10-07 06:09:04 +02:00
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
* @OA\JsonContent(ref="#/components/schemas/CompanyGateway"),
* ),
* @OA\Response(
* response=422,
* description="Validation error",
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
* ),
* @OA\Response(
* response="default",
2019-10-07 06:09:04 +02:00
* description="Unexpected Error",
* @OA\JsonContent(ref="#/components/schemas/Error"),
* ),
* )
2019-10-03 05:23:00 +02:00
*/
2022-01-03 02:35:31 +01:00
public function index(CompanyGatewayFilters $filters)
2019-10-03 05:23:00 +02:00
{
2022-01-03 02:35:31 +01:00
$company_gateways = CompanyGateway::filter($filters);
2019-10-03 05:23:00 +02:00
return $this->listResponse($company_gateways);
}
/**
* Show the form for creating a new resource.
*
2020-10-28 11:10:49 +01:00
* @param CreateCompanyGatewayRequest $request
* @return Response
2019-10-07 06:09:04 +02:00
*
*
*
2019-10-07 06:09:04 +02:00
* @OA\Get(
* path="/api/v1/company_gateways/create",
* operationId="getCompanyGatewaysCreate",
* tags={"company_gateways"},
* summary="Gets a new blank CompanyGateway object",
* description="Returns a blank object with default values",
2023-02-10 10:21:10 +01:00
* @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"),
2019-10-07 06:09:04 +02:00
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
* @OA\Parameter(ref="#/components/parameters/include"),
* @OA\Response(
* response=200,
* description="A blank CompanyGateway object",
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
2019-10-07 06:09:04 +02:00
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
* @OA\JsonContent(ref="#/components/schemas/CompanyGateway"),
* ),
* @OA\Response(
* response=422,
* description="Validation error",
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
*
* ),
* @OA\Response(
* response="default",
2019-10-07 06:09:04 +02:00
* description="Unexpected Error",
* @OA\JsonContent(ref="#/components/schemas/Error"),
* ),
* )
2019-10-03 05:23:00 +02:00
*/
public function create(CreateCompanyGatewayRequest $request)
{
$company_gateway = CompanyGatewayFactory::create(auth()->user()->company()->id, auth()->user()->id);
2019-10-03 05:23:00 +02:00
return $this->itemResponse($company_gateway);
}
/**
* Store a newly created resource in storage.
*
2020-10-28 11:10:49 +01:00
* @param StoreCompanyGatewayRequest $request
* @return Response
2019-10-07 06:09:04 +02:00
*
*
*
* @OA\Post(
* path="/api/v1/company_gateways",
* operationId="storeCompanyGateway",
* tags={"company_gateways"},
* summary="Adds a CompanyGateway",
* description="Adds an CompanyGateway to the system",
2023-02-10 10:21:10 +01:00
* @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"),
2019-10-07 06:09:04 +02:00
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
* @OA\Parameter(ref="#/components/parameters/include"),
* @OA\Response(
* response=200,
* description="Returns the saved CompanyGateway object",
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
2019-10-07 06:09:04 +02:00
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
* @OA\JsonContent(ref="#/components/schemas/CompanyGateway"),
* ),
* @OA\Response(
* response=422,
* description="Validation error",
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
*
* ),
* @OA\Response(
* response="default",
2019-10-07 06:09:04 +02:00
* description="Unexpected Error",
* @OA\JsonContent(ref="#/components/schemas/Error"),
* ),
* )
2019-10-03 05:23:00 +02:00
*/
public function store(StoreCompanyGatewayRequest $request)
{
$company_gateway = CompanyGatewayFactory::create(auth()->user()->company()->id, auth()->user()->id);
$company_gateway->fill($request->all());
$company_gateway->save();
/*Always ensure at least one fees and limits object is set per gateway*/
if (! isset($company_gateway->fees_and_limits)) {
$gateway_types = $company_gateway->driver(new Client)->gatewayTypes();
$fees_and_limits = new \stdClass;
$fees_and_limits->{$gateway_types[0]} = new FeesAndLimits;
$company_gateway->fees_and_limits = $fees_and_limits;
$company_gateway->save();
}
2022-01-06 01:52:24 +01:00
ApplePayDomain::dispatch($company_gateway, $company_gateway->company->db);
if (in_array($company_gateway->gateway_key, $this->stripe_keys)) {
2022-05-30 12:08:12 +02:00
StripeWebhook::dispatch($company_gateway->company->company_key, $company_gateway->id);
}
2019-10-03 05:23:00 +02:00
return $this->itemResponse($company_gateway);
}
/**
* Display the specified resource.
*
2020-10-28 11:10:49 +01:00
* @param ShowCompanyGatewayRequest $request
* @param CompanyGateway $company_gateway
* @return Response
2019-10-07 06:09:04 +02:00
*
*
* @OA\Get(
* path="/api/v1/company_gateways/{id}",
* operationId="showCompanyGateway",
* tags={"company_gateways"},
* summary="Shows an CompanyGateway",
* description="Displays an CompanyGateway by id",
2023-02-10 10:21:10 +01:00
* @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"),
2019-10-07 06:09:04 +02:00
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
* @OA\Parameter(ref="#/components/parameters/include"),
* @OA\Parameter(
* name="id",
* in="path",
* description="The CompanyGateway Hashed ID",
* example="D2J234DFA",
* required=true,
* @OA\Schema(
* type="string",
* format="string",
* ),
* ),
* @OA\Response(
* response=200,
* description="Returns the CompanyGateway object",
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
2019-10-07 06:09:04 +02:00
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
* @OA\JsonContent(ref="#/components/schemas/CompanyGateway"),
* ),
* @OA\Response(
* response=422,
* description="Validation error",
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
*
* ),
* @OA\Response(
* response="default",
2019-10-07 06:09:04 +02:00
* description="Unexpected Error",
* @OA\JsonContent(ref="#/components/schemas/Error"),
* ),
* )
*/
2019-10-03 05:23:00 +02:00
public function show(ShowCompanyGatewayRequest $request, CompanyGateway $company_gateway)
{
return $this->itemResponse($company_gateway);
}
/**
* Show the form for editing the specified resource.
*
2020-10-28 11:10:49 +01:00
* @param EditCompanyGatewayRequest $request
* @param CompanyGateway $company_gateway
* @return Response
2019-10-07 06:09:04 +02:00
*
*
2019-10-07 06:09:04 +02:00
* @OA\Get(
* path="/api/v1/company_gateways/{id}/edit",
* operationId="editCompanyGateway",
* tags={"company_gateways"},
* summary="Shows an CompanyGateway for editting",
* description="Displays an CompanyGateway by id",
2023-02-10 10:21:10 +01:00
* @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"),
2019-10-07 06:09:04 +02:00
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
* @OA\Parameter(ref="#/components/parameters/include"),
* @OA\Parameter(
* name="id",
* in="path",
* description="The CompanyGateway Hashed ID",
* example="D2J234DFA",
* required=true,
* @OA\Schema(
* type="string",
* format="string",
* ),
* ),
* @OA\Response(
* response=200,
* description="Returns the CompanyGateway object",
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
2019-10-07 06:09:04 +02:00
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
* @OA\JsonContent(ref="#/components/schemas/CompanyGateway"),
* ),
* @OA\Response(
* response=422,
* description="Validation error",
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
*
* ),
* @OA\Response(
* response="default",
2019-10-07 06:09:04 +02:00
* description="Unexpected Error",
* @OA\JsonContent(ref="#/components/schemas/Error"),
* ),
* )
2019-10-03 05:23:00 +02:00
*/
public function edit(EditCompanyGatewayRequest $request, CompanyGateway $company_gateway)
{
return $this->itemResponse($company_gateway);
2019-10-03 05:23:00 +02:00
}
/**
* Update the specified resource in storage.
*
2020-10-28 11:10:49 +01:00
* @param UpdateCompanyGatewayRequest $request
* @param CompanyGateway $company_gateway
* @return Response
2019-10-07 06:09:04 +02:00
*
*
2019-10-07 06:09:04 +02:00
* @OA\Put(
* path="/api/v1/company_gateways/{id}",
* operationId="updateCompanyGateway",
* tags={"company_gateways"},
* summary="Updates an CompanyGateway",
* description="Handles the updating of an CompanyGateway by id",
2023-02-10 10:21:10 +01:00
* @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"),
2019-10-07 06:09:04 +02:00
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
* @OA\Parameter(ref="#/components/parameters/include"),
* @OA\Parameter(
* name="id",
* in="path",
* description="The CompanyGateway Hashed ID",
* example="D2J234DFA",
* required=true,
* @OA\Schema(
* type="string",
* format="string",
* ),
* ),
* @OA\Response(
* response=200,
* description="Returns the CompanyGateway object",
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
2019-10-07 06:09:04 +02:00
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
* @OA\JsonContent(ref="#/components/schemas/CompanyGateway"),
* ),
* @OA\Response(
* response=422,
* description="Validation error",
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
*
* ),
* @OA\Response(
* response="default",
2019-10-07 06:09:04 +02:00
* description="Unexpected Error",
* @OA\JsonContent(ref="#/components/schemas/Error"),
* ),
* )
*/
2019-10-03 05:23:00 +02:00
public function update(UpdateCompanyGatewayRequest $request, CompanyGateway $company_gateway)
{
$company_gateway->fill($request->all());
if (! $request->has('fees_and_limits')) {
$company_gateway->fees_and_limits = '';
}
2019-10-03 05:23:00 +02:00
$company_gateway->save();
// ApplePayDomain::dispatch($company_gateway, $company_gateway->company->db);
2022-01-06 01:19:29 +01:00
2019-10-03 05:23:00 +02:00
return $this->itemResponse($company_gateway);
}
/**
* Remove the specified resource from storage.
*
2020-10-28 11:10:49 +01:00
* @param DestroyCompanyGatewayRequest $request
* @param CompanyGateway $company_gateway
* @return Response
2019-10-07 06:09:04 +02:00
*
*
2020-10-28 11:10:49 +01:00
* @throws \Exception
2019-10-07 06:09:04 +02:00
* @OA\Delete(
* path="/api/v1/company_gateways/{id}",
* operationId="deleteCompanyGateway",
* tags={"company_gateways"},
* summary="Deletes a CompanyGateway",
* description="Handles the deletion of an CompanyGateway by id",
2023-02-10 10:21:10 +01:00
* @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"),
2019-10-07 06:09:04 +02:00
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
* @OA\Parameter(ref="#/components/parameters/include"),
* @OA\Parameter(
* name="id",
* in="path",
* description="The CompanyGateway Hashed ID",
* example="D2J234DFA",
* required=true,
* @OA\Schema(
* type="string",
* format="string",
* ),
* ),
* @OA\Response(
* response=200,
* description="Returns a HTTP status",
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
2019-10-07 06:09:04 +02:00
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
* ),
* @OA\Response(
* response=422,
* description="Validation error",
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
*
* ),
* @OA\Response(
* response="default",
2019-10-07 06:09:04 +02:00
* description="Unexpected Error",
* @OA\JsonContent(ref="#/components/schemas/Error"),
* ),
* )
2019-10-03 05:23:00 +02:00
*/
public function destroy(DestroyCompanyGatewayRequest $request, CompanyGateway $company_gateway)
{
2021-08-17 06:01:11 +02:00
$company_gateway->driver(new Client)
->disconnect();
2019-10-03 05:23:00 +02:00
$company_gateway->delete();
return $this->itemResponse($company_gateway->fresh());
2019-10-03 05:23:00 +02:00
}
2020-06-04 00:18:27 +02:00
/**
* Perform bulk actions on the list view.
2020-06-04 00:18:27 +02:00
*
2020-10-28 11:10:49 +01:00
* @return Response
2020-06-04 00:18:27 +02:00
*
*
* @OA\Post(
* path="/api/v1/company_gateways/bulk",
* operationId="bulkCompanyGateways",
* tags={"company_gateways"},
* summary="Performs bulk actions on an array of company_gateways",
* description="",
2023-02-10 10:21:10 +01:00
* @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"),
2020-06-04 00:18:27 +02:00
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
* @OA\Parameter(ref="#/components/parameters/index"),
* @OA\RequestBody(
* description="Array of company gateway IDs",
* required=true,
* @OA\MediaType(
* mediaType="application/json",
* @OA\Schema(
* type="array",
* @OA\Items(
* type="integer",
* description="Array of hashed IDs to be bulk 'actioned",
* example="[0,1,2,3]",
* ),
* )
* )
* ),
* @OA\Response(
* response=200,
* description="The Company Gateways response",
* @OA\Header(header="X-MINIMUM-CLIENT-VERSION", ref="#/components/headers/X-MINIMUM-CLIENT-VERSION"),
2020-06-04 00:18:27 +02:00
* @OA\Header(header="X-RateLimit-Remaining", ref="#/components/headers/X-RateLimit-Remaining"),
* @OA\Header(header="X-RateLimit-Limit", ref="#/components/headers/X-RateLimit-Limit"),
* @OA\JsonContent(ref="#/components/schemas/CompanyGateway"),
* ),
* @OA\Response(
* response=422,
* description="Validation error",
* @OA\JsonContent(ref="#/components/schemas/ValidationError"),
* ),
* @OA\Response(
* response="default",
* description="Unexpected Error",
* @OA\JsonContent(ref="#/components/schemas/Error"),
* ),
* )
*/
public function bulk(BulkCompanyGatewayRequest $request)
2020-06-04 00:18:27 +02:00
{
$action = $request->input('action');
$company_gateways = CompanyGateway::withTrashed()
2023-01-22 06:40:02 +01:00
->whereIn('id', $request->ids)
->company()
->cursor()
->each(function ($company_gateway, $key) use ($action) {
$this->company_repo->{$action}($company_gateway);
});
2023-01-22 06:40:02 +01:00
return $this->listResponse(CompanyGateway::withTrashed()->company()->whereIn('id', $request->ids));
2020-06-04 00:18:27 +02:00
}
2019-10-03 05:23:00 +02:00
}