File "OrganizationController.php"

Full Path: /var/www/html/back/app/Http/Controllers/Api/V1/OrganizationController.php
File size: 4 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\Domain\Organizations\OrganizationService;
use App\Domain\Organizations\Requests\CreateNewOrganizationRequest;
use App\Domain\Organizations\Requests\UpdateOrganizationRequest;
use App\Http\Controllers\Api\ApiController;
use App\Requests\SearchRequest;
use App\Responses\ResponseDto;
use Illuminate\Http\Request;
use Knuckles\Scribe\Attributes\Group;

/**
 * Контроллер для управления счетами
 */
class OrganizationController extends ApiController
{
    protected OrganizationService $organizationService;

    public function __construct(OrganizationService $organizationService)
    {
        $this->organizationService = $organizationService;
    }

    /**
     * Получение списка
     *
     * @queryParam search string Поисковый запрос для фильтрации. Пример: "Laravel"
     */
    #[Group('organizations')]
    #[OpenApiResponse(ResponseDto::class)]
    public function index(int $modelID, SearchRequest $request): ResponseDto
    {
        $accounts = $this->organizationService->getAll($modelID, $request);

        return new ResponseDto(
            data: $accounts,
            status: true
        );
    }

    /**
     * Получение по ID
     *
     * @param int $modelID
     * @param int $id
     * @return ResponseDto
     */
    #[Group('organizations')]
    #[OpenApiResponse(ResponseDto::class)]
    public function show(int $modelID, int $id): ResponseDto
    {
        $account = $this->organizationService->getById($id);

        return new ResponseDto(
            data: $account,
            status: true
        );
    }

    /**
     * Создание
     *
     * @param int $modelID
     * @param CreateNewOrganizationRequest $request
     * @return ResponseDto
     */
    #[Group('organizations')]
    #[OpenApiResponse(ResponseDto::class)]
    public function store(int $modelID, CreateNewOrganizationRequest $request): ResponseDto
    {
        $account = $this->organizationService->addNew($modelID, $request);

        return new ResponseDto(
            data: $account,
            status: true
        );
    }

    /**
     * Обновление
     *
     * @param int $modelID
     * @param int $id

     * @return ResponseDto
     */
    #[Group('organizations')]
    #[OpenApiResponse(ResponseDto::class)]
    public function update(int $modelID, int $id, Request $request): ResponseDto
    {
        $account = $this->organizationService->update($id,$request);

        return new ResponseDto(
            data: $account,
            status: true
        );
    }

    /**
     * Удаление
     *
     * @param int $modelID
     * @param int $id
     * @return ResponseDto
     */
    #[Group('organizations')]
    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('Нельзя перенести данные в удаляемую организацию');
        }

        $transferOrg = $this->organizationService->getById($transferId);
        if(!$transferOrg) {
            return $this->error('Организация для переноса не найдена');
        }

        if(!$this->organizationService->transferPayments($id, $transferId)) {
            return $this->error('Не удалось перенести платежи');
        }

        if(!$this->organizationService->transferAccounts($id, $transferId)) {
            return $this->error('Не удалось перенести счета');
        }

        $this->organizationService->delete($id);

        return new ResponseDto(
            status: true
        );
    }
}