ldc-gen-game-web/app/Policies/ParticipationPolicy.php
2026-09-28 16:17:07 +02:00

140 lines
4.4 KiB
PHP

<?php
namespace App\Policies;
use App\Enums\Users\RoleEnum;
use App\Models\BannedIp;
use App\Models\Customer;
use App\Models\Participation;
use App\Models\Settings;
use App\Models\User;
use App\Policies\Rules\UserStaticRules;
use Illuminate\Database\Eloquent\Builder;
class ParticipationPolicy
{
/**
* Determine whether the user can view any models.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function viewWinnerList(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::marketing);
}
/**
* Wether a customer can participate
*
* @param \App\Models\Customer $authUser
* @return boolean
*/
public function participate(Customer $authUser): bool
{
/** @var \App\Models\Settings */
$settings = app(Settings::class);
// * Participation par compte
$playerCanParticipate = true;
// ? Différent de illimité (0) ?
if ($settings->nb_participation_player) {
$playerCanParticipateAccount = (Participation::query()->whereHas(
'customer',
fn (Builder $q) => $q->where('customer_id', $authUser->id)
)->count() < $settings->nb_participation_player);
}
// * Participation par IP
// ? Différent de illimité (0) ?
if ($settings->nb_participation_ip) {
$playerCanParticipateIp = (Participation::query()->whereHas(
'customer',
fn (Builder $q) => $q->where('ip', app('clientIp'))
)->count() < $settings->nb_participation_ip);
}
$playerCanParticipate = (!empty($playerCanParticipateAccount) && !empty($playerCanParticipateIp)) ?
true :
false;
// * Deny banned IP, Check did not participate too much
return !(bool) BannedIp::getCached()
->where('ip', app('clientIp'))->count() and
$playerCanParticipate;
}
/**
* Wether a customer can access to won list page
*
* @param \App\Models\Customer|\App\Models\User $authUser
* @return boolean
*/
public function viewWonList(Customer|User $authUser): bool
{
if ($authUser instanceof User) {
// * Recettage
return true;
}
return (bool) $authUser->participations()->where(function (Builder $q) {
$q->whereNotNull('discount_code')->orWhereHas('instantWin');
})->count();
}
/**
* Can a customer submit winning proof ?
*
* @param \App\Models\Customer $authUser
* @param \App\Models\Participation $model
* @return boolean
*/
public function submitProof(Customer $authUser, Participation $model): bool
{
/** @var \App\Models\Settings */
$settings = app(Settings::class);
// Columns of the winning proofs enabled in the config.
$enabledProofs = array_keys(array_filter(config('proofs')));
// Winning proofs are disabled globally or no proof is enabled in the config.
if (! $settings->winning_proof || empty($enabledProofs)) {
return false;
}
return Participation::query()
->where('prize_sent', false)
->whereHas(
'customer',
fn (Builder $q) => $q->where('id', $authUser->id)
)
->where('id', $model->id)
->whereHas('instantWin')
// At least one enabled proof has not been submitted yet.
->where(fn (Builder $q) => $q->whereNull($enabledProofs, 'or'))
->exists();
}
/**
* Can a user change comment ?
*
* @param \App\Models\User $authUser
* @param \App\Models\Participation $model
* @return boolean
* @phpcs:disable Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed
*/
public function setComment(User $authUser, Participation $model): bool
{
// phpcs:enable
return UserStaticRules::atLeastRole($authUser, RoleEnum::marketing);
}
/**
* Can a user change prize_sent ?
*
* @param \App\Models\User $authUser
* @param \App\Models\Participation $model
* @return boolean
*/
public function changePrizeSent(User $authUser, Participation $model): bool
{
return !$model->prize_sent and UserStaticRules::atLeastRole($authUser, RoleEnum::marketing);
}
}