You've already forked Atomcms-edit
Initial commit
This commit is contained in:
Executable
+104
@@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use App\Actions\SendCurrency;
|
||||
use App\Actions\SendFurniture;
|
||||
use App\Models\Shop\WebsiteShopArticle;
|
||||
use App\Models\User;
|
||||
|
||||
class PurchaseService
|
||||
{
|
||||
public function __construct(
|
||||
private readonly RconService $rconService,
|
||||
private readonly SendCurrency $sendCurrency,
|
||||
) {}
|
||||
|
||||
public function processPurchase(User $currentUser, WebsiteShopArticle $package, ?User $recipient = null): string
|
||||
{
|
||||
$user = $recipient ?? $currentUser;
|
||||
|
||||
$this->deductBalance($currentUser, $package);
|
||||
$this->deliverCurrencies($user, $package);
|
||||
$this->deliverRank($user, $package);
|
||||
$this->deliverBadges($user, $package);
|
||||
$this->deliverFurniture($currentUser, $package);
|
||||
|
||||
return $this->buildSuccessMessage($currentUser, $user, $package);
|
||||
}
|
||||
|
||||
private function deductBalance(User $user, WebsiteShopArticle $package): void
|
||||
{
|
||||
$user->decrement('website_balance', $package->price());
|
||||
}
|
||||
|
||||
private function deliverCurrencies(User $user, WebsiteShopArticle $package): void
|
||||
{
|
||||
$this->sendCurrency->execute($user, 'credits', $package->credits);
|
||||
$this->sendCurrency->execute($user, 'duckets', $package->duckets);
|
||||
$this->sendCurrency->execute($user, 'diamonds', $package->diamonds);
|
||||
}
|
||||
|
||||
private function deliverRank(User $user, WebsiteShopArticle $package): void
|
||||
{
|
||||
if (! $package->give_rank) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->rconService->isConnected) {
|
||||
$this->rconService->setRank($user, $package->give_rank);
|
||||
$this->rconService->disconnectUser($user);
|
||||
} else {
|
||||
$user->update(['rank' => $package->give_rank]);
|
||||
}
|
||||
}
|
||||
|
||||
private function deliverBadges(User $user, WebsiteShopArticle $package): void
|
||||
{
|
||||
if (! $package->badges) {
|
||||
return;
|
||||
}
|
||||
|
||||
$badgeList = explode(';', $package->badges);
|
||||
$ownedBadges = $user->badges()->pluck('badge_code')->toArray();
|
||||
|
||||
foreach ($badgeList as $badge) {
|
||||
if (in_array($badge, $ownedBadges)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($this->rconService->isConnected) {
|
||||
$this->rconService->giveBadge($user, $badge);
|
||||
} else {
|
||||
$user->badges()->updateOrCreate([
|
||||
'user_id' => $user->id,
|
||||
'badge_code' => $badge,
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function deliverFurniture(User $currentUser, WebsiteShopArticle $package): void
|
||||
{
|
||||
if (! $package->furniture) {
|
||||
return;
|
||||
}
|
||||
|
||||
$sendFurniture = app(SendFurniture::class);
|
||||
$sendFurniture->execute($currentUser, json_decode($package->furniture, true));
|
||||
}
|
||||
|
||||
private function buildSuccessMessage(User $currentUser, User $recipient, WebsiteShopArticle $package): string
|
||||
{
|
||||
$message = __('You have successfully purchased the package :name', ['name' => $package->name]);
|
||||
|
||||
if ($recipient->username !== $currentUser->username) {
|
||||
$message = __('You have successfully purchased the package :name for :username', [
|
||||
'name' => $package->name,
|
||||
'username' => $recipient->username,
|
||||
]);
|
||||
}
|
||||
|
||||
return $message;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user