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