File "ArticleGroupController.php"

Full Path: /var/www/html/back/app/Http/Controllers/Api/V1/ArticleGroupController.php
File size: 5.02 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\Article\Enums\ArticleTypeEnum;
use App\Domain\Article\Requests\CreateArticleGroupRequest;
use App\Domain\Article\Requests\UpdateArticleGroupRequest;
use App\Domain\Article\Services\ArticleGroupService;
use App\Http\Controllers\Api\ApiController;
use App\Models\Article;
use App\Models\ArticleGroup;
use App\Models\Payment;
use App\Responses\ResponseDto;
use Illuminate\Http\Request;
use Knuckles\Scribe\Attributes\Group;

/**
 * Контроллер для управления группами.
 */
class ArticleGroupController extends ApiController
{
    protected ArticleGroupService $articleGroupService;

    public function __construct(ArticleGroupService $articleService)
    {
        $this->articleGroupService = $articleService;
    }

    /**
     * Получить список групп статей.
     */
    #[Group('articles')]
    #[OpenApiResponse(ArticleGroup::class)]
    public function index(int $modelID): ResponseDto
    {
        return new ResponseDto(
            data: $this->articleGroupService->getAll($modelID),
            status: true
        );
    }

    /**
     * Получить группу по ID.
     *
     * @queryParam sorting array сортировка (date, payments) , пример sort=date&sort_direction=ASC
     */
    #[Group('articles')]
    #[OpenApiResponse(ArticleGroup::class)]
    public function show(int $modelID, int $id, Request $request): ResponseDto
    {
        $group = $this->articleGroupService->findById($id);
        $income_limits = $outcome_limits = 0;
        $result = $group->toArray();
        $result['articles'] = [];
        foreach ($group->articles as $i => $article) {
            $out_payments = 0;
            $min_date = now()->unix();
            $max_date = 0;

            /** @var Article $article */
            if ($article->article_type === ArticleTypeEnum::ARTICLE_TYPE_DEBIT->value) {
                $income_limits += $article->income_limit;
            } else {
                $outcome_limits += $article->outcome_limit;
            }
            foreach ($article->payments as $payment) {
                /** @var Payment $payment */
                if ($article->article_type === ArticleTypeEnum::ARTICLE_TYPE_DEBIT->value) {
                    $out_payments += $payment->amount;
                }
                $min_date = min($min_date, $payment->payment_date->unix());
                $max_date = min($max_date, $payment->payment_date->unix());
            }

            $article->forceFill([
                'min_date' => $min_date,
                'max_date' => $max_date,
                'outcome_limits' => $outcome_limits,
                'income_limits' => $income_limits,
                'out_payments' => $out_payments,
            ]);
            $result['articles'][] = $article->toArray();
        }
        $sort = $request->get('sort');
        $direction = $request->get('sort_direction', 'ASC');
        if ($sort) {
            $r = ($direction == 'DESC') ? -1 : 1;
            usort($result['articles'], function ($a, $b) use ($sort, $r) {
                //сортировка по дате должна быть не такая, надо сортировать платежи а не статьи
                $param = ($sort == 'payments') ? 'out_payments' : 'max_date';
                if ($a[$param] == $b[$param]) {
                    return 0;
                }

                return ($a[$param] < $b[$param]) ? -$r : $r;
            });
        }
        $result['income_limits'] = $income_limits;
        $result['outcome_limits'] = $outcome_limits;

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

    /**
     * Создать новую группу.
     */
    #[Group('articles')]
    #[OpenApiResponse(Article::class)]
    public function store(int $modelID, CreateArticleGroupRequest $request): ResponseDto
    {
        return new ResponseDto(
            data: $this->articleGroupService->create($modelID, $request),
            status: true
        );
    }

    /**
     * Обновить существующую группу.
     */
    #[Group('articles')]
    #[OpenApiResponse(Article::class)]
    public function update(int $modelID, int $articleGroupID, UpdateArticleGroupRequest $request): ResponseDto
    {
        return new ResponseDto(
            status: (bool)$this->articleGroupService->update($articleGroupID, $request)
        );
    }

    /**
     * Удалить группу.
     */
    #[Group('articles')]
    #[OpenApiResponse(ResponseDto::class)]
    public function destroy(int $modelID, int $id): ResponseDto
    {
        return new ResponseDto(
            status: (bool)$this->articleGroupService->delete($id)
        );
    }

    public function deleteArticleGroup($modelId, $articleGroupId, Request $request)
    {
        $articles = $request->input('articles');
        return $this->articleGroupService->deleteArticleGroup($articleGroupId,$articles);
    }


}