ldc-legaulois/app/Http/Controllers/Club/DepartaimantController.php

241 lines
8.7 KiB
PHP
Raw Permalink Normal View History

2024-07-05 10:35:26 +02:00
<?php
namespace App\Http\Controllers\Club;
2024-07-11 15:46:43 +02:00
use App\Casts\NiceDate;
use App\Enums\Departaimants\DepartaimantCollectionType;
use App\Enums\Departaimants\DepartaimantStatus;
2024-07-05 10:35:26 +02:00
use App\Http\Controllers\Controller;
2024-07-11 15:46:43 +02:00
use App\Http\Requests\Club\Bourse\SaveCustomerCollectionRequest;
use App\Http\Requests\Club\Bourse\SearchCustomerCollectionRequest;
use App\Lib\Utils;
use App\Models\BlockList;
use App\Models\DepartaimantsCollection;
2026-09-25 16:25:31 +02:00
use Illuminate\Container\Container;
use Illuminate\Contracts\View\View;
use Illuminate\Database\Eloquent\Builder;
2026-09-25 16:25:31 +02:00
use Illuminate\Http\JsonResponse;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Pagination\Paginator;
2024-07-11 15:46:43 +02:00
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth;
2024-07-05 10:35:26 +02:00
class DepartaimantController extends Controller
{
/**
* Show index page
*/
2026-09-25 16:25:31 +02:00
public function index(): View
2024-07-05 10:35:26 +02:00
{
2024-07-11 15:46:43 +02:00
/** @var \App\Models\Customer */
$customer = Auth::guard('club')->user();
$depCollections = $customer->getOrCreateAllDepartaimentsCollections();
$departaimants = $this->getUserDepartaimantsMaps($depCollections);
return view('club.pages.departaimants.index', compact('departaimants'));
}
/**
* Save Customer collection state
*
* @throws \RuntimeException If a collection type is missing.
*/
2024-07-30 16:05:27 +02:00
public function bourseSaveState(
SaveCustomerCollectionRequest $request,
DepartaimantCollectionType $collectiontype
2026-09-25 16:25:31 +02:00
): JsonResponse {
2024-07-11 15:46:43 +02:00
/** @var \App\Models\Customer */
$customer = Auth::guard('club')->user();
/** @var \App\Models\DepartaimantsCollection $departaimantCollection */
$departaimantCollection = $customer->departaimantsCollections()
->where('type', $collectiontype->value())->firstOrFail();
$depStatus = DepartaimantStatus::make($request->integer('state'));
/** @var string|null */
$depEnumClass = Arr::get($request->maps, $collectiontype->value(), null);
2026-09-25 16:25:31 +02:00
if (! $depEnumClass) {
throw new \RuntimeException('Missing ' . $collectiontype->value() . 'from request');
2024-07-11 15:46:43 +02:00
}
/** @var \App\Enums\Departaimants\IDepartaimant */
$departaimant = forward_static_call(
[$depEnumClass, 'make'],
$request->input('id')
);
$departaimantCollection->set($departaimant, $depStatus);
$departaimantCollection->saveOrFail();
$depCollections = $customer->getOrCreateAllDepartaimentsCollections();
return response()->json([
'status' => 'OK',
2026-09-25 16:25:31 +02:00
'map' => $this->getUserDepartaimantsMaps($depCollections),
2024-07-11 15:46:43 +02:00
]);
}
/**
* Summary of bourseSearch
*
* @return \Illuminate\Http\JsonResponse
2026-09-25 16:25:31 +02:00
* phpcs:disable Generic.Metrics.CyclomaticComplexity
2024-07-11 15:46:43 +02:00
*/
2024-07-30 16:05:27 +02:00
public function bourseSearch(
SearchCustomerCollectionRequest $request,
DepartaimantCollectionType $collectiontype
2026-09-25 16:25:31 +02:00
): JsonResponse {
2024-09-06 14:50:39 +02:00
// @phpcs:enable
$itemsPerPage = 15;
2024-07-11 15:46:43 +02:00
$output = collect();
$state = DepartaimantStatus::make((int) $request->input('state'));
2024-07-18 16:25:46 +02:00
$pseudo = $request->string('pseudo', '');
$departaimant = Utils::replaceSpecChar(
str_replace(['-', ' ', '\''], '', strtolower($request->string('departaimant', '')))
);
2024-07-11 15:46:43 +02:00
if ($state->equals(DepartaimantStatus::gives)) {
$status = DepartaimantStatus::wants;
} elseif ($state->equals(DepartaimantStatus::wants)) {
$status = DepartaimantStatus::gives;
} else {
return response()->json([
'status' => 'KO',
2026-09-25 16:25:31 +02:00
'message' => 'Message cannot search with other status than wants or gives',
2024-07-11 15:46:43 +02:00
]);
}
/** @var \App\Models\Customer */
$customer = Auth::guard('club')->user();
$ids = collect(BlockList::query()->select('customer_id', 'blocked_id')
2026-09-25 16:25:31 +02:00
->whereHas('customer', fn (Builder $q) => $q->where('id', $customer->getKey()))
->orWhereHas('blocked', fn (Builder $q) => $q->where('id', $customer->getKey()))
2024-07-18 16:25:46 +02:00
->get()->toArray());
$ids = $ids->flatten()->unique();
2024-07-11 15:46:43 +02:00
$userDep = $customer->departaimantsCollections()->where('type', $collectiontype->value)->first();
$userDepStatus = [];
foreach ($userDep->getAllDepartaimants() as $dep) {
if ($dep->status->value === $state->value) {
// * hack to prevent php to cast array key to int
$userDepStatus['.' . $dep->departaimant->value] = $dep->departaimant;
}
}
$req = DepartaimantsCollection::getDepartaimantsCollectionWithStatus($userDepStatus, $status, $collectiontype)
->with('customer');
2024-07-18 16:25:46 +02:00
$req->whereHas('customer', function (Builder $query) use ($pseudo, $ids) {
// * Handle blocked ids
2024-07-18 16:25:46 +02:00
if ($ids->count()) {
$query->whereNotIn('id', $ids);
2024-07-11 15:46:43 +02:00
}
// * Filter with Pseudo
2024-07-18 16:25:46 +02:00
if (strlen($pseudo)) {
$query->where('username', 'LIKE', "%{$pseudo}%");
2024-07-11 15:46:43 +02:00
}
});
$totalCount = $req->count();
2024-07-11 15:46:43 +02:00
$req->orderBy('updated_at', 'DESC');
$req->offset($itemsPerPage * ($request->input('page') - 1))->limit($itemsPerPage);
2024-07-11 15:46:43 +02:00
/** @var \App\Models\DepartaimantsCollection $depCollection */
foreach ($req->get() as $depCollection) {
2024-07-11 15:46:43 +02:00
foreach ($depCollection->getAllDepartaimantsWithStatus($collectiontype, $status) as $dep) {
if (
$dep->status->equals($status)
// * Filter results with Departaimant
and (strlen($departaimant) ? strpos(
strtolower(Utils::replaceSpecChar(
str_replace(['-', ' ', '\''], '', $dep->departaimant->value() . $dep->departaimant->label())
)),
$departaimant
) !== false : true)
// * Filter results with customer Departaimants
and array_key_exists('.' . $dep->departaimant->value(), $userDepStatus)
) {
$output->add([
'departaimantCode' => $dep->departaimant->value(),
'departaimant' => $dep->departaimant->label(),
'username' => $depCollection->customer->username,
'hashcode' => $depCollection->customer->hashcode,
2026-09-25 16:25:31 +02:00
'date' => (new NiceDate())->get(null, '', $depCollection->updated_at, []),
2024-07-11 15:46:43 +02:00
]);
}
2026-09-25 16:25:31 +02:00
} // end foreach
} // end foreach
2024-07-11 15:46:43 +02:00
2024-09-06 14:50:39 +02:00
// Paginate.
$depCollectionPaginate = $this->paginateManually(
$totalCount,
2024-09-06 14:50:39 +02:00
$output->sortBy('date')->values(),
$itemsPerPage,
2024-09-06 14:50:39 +02:00
$request->input('page')
);
2024-07-11 15:46:43 +02:00
return response()->json([
'status' => 'OK',
'data' => $depCollectionPaginate,
]);
2024-07-11 15:46:43 +02:00
}
/**
* Undocumented function
*/
private function getUserDepartaimantsMaps(Collection $departaimantsCollection): array
{
$datas = $departaimantsCollection->mapWithKeys(function ($collection) {
$datas = [];
foreach ($collection->getAllDepartaimants() as $departaimantItem) {
$datas[$collection->type->value][] = [
2024-07-30 16:05:27 +02:00
'id' => $departaimantItem->departaimant->value(),
'name' => $departaimantItem->departaimant->label(),
2024-07-11 15:46:43 +02:00
'state' => $departaimantItem->status->value(),
];
}
2026-09-25 16:25:31 +02:00
2024-07-11 15:46:43 +02:00
return $datas;
})->toArray();
return $datas;
2024-07-05 10:35:26 +02:00
}
/**
* Paginate a collection.
*/
private function paginateManually(
int $totalCount,
Collection $results,
int $pageSize,
int $page = 1
2026-09-25 16:25:31 +02:00
): LengthAwarePaginator {
return $this->paginator($results, $totalCount, $pageSize, $page, [
2026-09-25 16:25:31 +02:00
'path' => Paginator::resolveCurrentPath(),
'pageName' => 'page',
]);
}
/**
* Create a new length-aware paginator instance.
*/
protected function paginator(
Collection $items,
int $total,
int $perPage,
int $currentPage,
array $options
2026-09-25 16:25:31 +02:00
): LengthAwarePaginator {
return Container::getInstance()->makeWith(LengthAwarePaginator::class, [
'items' => $items,
'total' => $total,
'perPage' => $perPage,
'currentPage' => $currentPage,
2026-09-25 16:25:31 +02:00
'options' => $options,
]);
}
2024-07-05 10:35:26 +02:00
}