File "DictionaryController.php"

Full Path: /var/www/html/back/app/Http/Controllers/Api/V1/DictionaryController.php
File size: 2.64 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\Payment\Enums\PaymentStatusEnum;
use App\Domain\Payment\Enums\PaymentTypeEnum;
use App\Http\Controllers\Api\ApiController;
use App\Models\Payment;
use App\Models\User;
use App\Responses\ResponseDto;
use Illuminate\Http\Request;
use Knuckles\Scribe\Attributes\Group;

class DictionaryController extends ApiController
{
    /**
     * Список статусов платежей
     */
    #[Group('dict')]
    #[OpenApiResponse(ResponseDto::class)]
    public function paymentStatusList(): ResponseDto
    {
        $result = [];
        foreach (PaymentStatusEnum::cases() as $paymentStatusEnum) {
            $result[$paymentStatusEnum->value] = [
                'name' => $paymentStatusEnum->title(),
                'value' => $paymentStatusEnum->value
            ];
        }

        return new ResponseDto(
            data: $result
        );
    }

    /**
     * Список возможных статусов для определенного типа платежа в определенном статусе
     *
     * @queryParam payment_type
     * @queryParam payment_status
     */
    #[Group('dict')]
    #[OpenApiResponse(ResponseDto::class)]
    public function paymentStatusFrom(Request $request): ResponseDto
    {
        $payment = new Payment([
            'payment_type' => $request->get('payment_type'),
            'status' => $request->get('payment_status'),
        ]);

        return new ResponseDto(
            data: $payment->availableStatuses
        );
    }

    /**
     * Список типов платежей
     */
    #[Group('dict')]
    #[OpenApiResponse(ResponseDto::class)]
    public function paymentTypesList(): ResponseDto
    {
        return new ResponseDto(
            data: PaymentTypeEnum::getList()
        );
    }

    /**
     * Список пользователей
     *
     * @queryParam search
     */
    #[Group('dict')]
    #[OpenApiResponse(ResponseDto::class)]
    public function usersList(int $modelID, Request $request): ResponseDto
    {
        $query = User::query();
        if ($request->has('search')) {
            $searchTerm = mb_convert_case($request->get('search'), MB_CASE_LOWER);
            $query->where(function ($query) use ($searchTerm): void {
                $query->whereRaw('LOWER(first_name) LIKE ?', ['%' . $searchTerm . '%'])
                    ->orWhereRaw('LOWER(last_name) LIKE ?', ['%' . $searchTerm . '%']);
            });
        }

        return new ResponseDto(
            data: $query->select('id', 'first_name', 'last_name')->get()
        );
    }
}