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'));
    }

}