Create New Item
Item Type
File
Folder
Item Name
Search file in folder and subfolders...
Are you sure want to rename?
peripherad
/
back
/
app
/
Http
/
Controllers
/
Api
/
V1
:
ArticleGroupController.php
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?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); } }