File "AccountController.php"
Full Path: /var/www/html/back/app/Http/Controllers/Api/V1/AccountController.php
File size: 4.43 KB
MIME-type: text/x-php
Charset: utf-8
<?php
declare(strict_types=1);
namespace App\Http\Controllers\Api\V1;
use App\Attributes\OpenApiResponse;
use App\Collections\AccountCollection;
use App\Domain\Account\AccountService;
use App\Domain\Account\Requests\CreateAccountRequest;
use App\Domain\Account\Requests\UpdateAccountRequest;
use App\Http\Controllers\Api\ApiController;
use App\Http\Resources\AccountResource;
use App\Http\Resources\ExtendedShowAccountResource;
use App\Imports\AccountImport;
use App\Requests\SearchRequest;
use App\Responses\ResponseDto;
use App\Services\BankService;
use Illuminate\Http\Request;
use Knuckles\Scribe\Attributes\Group;
use Maatwebsite\Excel\Facades\Excel;
/**
* Контроллер для управления счетами
*/
class AccountController extends ApiController
{
protected AccountService $accountService;
public function __construct(AccountService $accountService, protected BankService $bankService)
{
$this->accountService = $accountService;
}
/**
* Получение списка счетов
*
* @queryParam search string Поисковый запрос для фильтрации. Пример: "Laravel"
*/
#[Group('accounts')]
public function index(int $modelID, SearchRequest $request): ResponseDto
{
$accounts = $this->accountService->getAllAccounts($modelID, $request);
return new ResponseDto(
data: (new AccountCollection($accounts)),
status: true,
);
}
/**
* Получение счета по ID
*
* @param int $modelID
* @param int $id
* @return ResponseDto
*/
#[Group('accounts')]
public function show(int $modelID, int $id): ResponseDto
{
$account = $this->accountService->getAccountById($id);
return new ResponseDto(
data: $account,
status: true
);
}
/**
* Создание нового счета
*
* @param int $modelID
* @param CreateAccountRequest $request
* @return ResponseDto
*/
#[Group('accounts')]
#[OpenApiResponse(CreateAccountRequest::class)]
public function store(int $modelID, CreateAccountRequest $request): ResponseDto
{
$account = $this->accountService->createAccount($modelID, $request);
return new ResponseDto(
data: $account,
status: true
);
}
/**
* Обновление счета
*
* @param int $modelID
* @param int $id
* @param UpdateAccountRequest $request
* @return ResponseDto
*/
#[Group('accounts')]
#[OpenApiResponse(UpdateAccountRequest::class)]
public function update(int $modelID, int $id, UpdateAccountRequest $request): ResponseDto
{
$account = $this->accountService->updateAccount($id, $request);
return new ResponseDto(
data: $account,
status: true
);
}
/**
* Удаление счета
*
* @param int $modelID
* @param int $id
* @queryParam transfer_id required ID счета, куда перекочуют платежи
* @return ResponseDto
*/
#[Group('accounts')]
public function destroy(int $modelID, int $id, Request $request): ResponseDto
{
if(!$request->has('transfer_id') || !(int) $request->get('transfer_id')) {
return $this->error('Не передан счет, для переноса платежей');
}
$transferId = (int) $request->get('transfer_id');
if($id == $transferId) {
return $this->error('Нельзя перенести данные в удаляемый счет');
}
$this->accountService->getAccountById($id);
if(!$this->accountService->transferPayments($id, $transferId)) {
return $this->error('Не удалось перенести платежи');
}
$this->accountService->deleteAccount($id);
return new ResponseDto(
status: true
);
}
public function extendedShow(int $modelId, int $id)
{
return new ExtendedShowAccountResource($this->accountService->getAccountById($id));
}
public function extendedUpdate(int $modelId, int $id, Request $request)
{
$updatedAccount = $this->accountService->extendedUpdate($id, $request);
}
public function import(Request $request)
{
Excel::import(new AccountImport(), $request->file('file'));
}
}