6
0
Fork 0
jiqu-library-server/app/Endpoint/Api/Http/Controllers/DrawActivityController.php

82 lines
2.4 KiB
PHP

<?php
namespace App\Endpoint\Api\Http\Controllers;
use App\Endpoint\Api\Http\Resources\DrawActivityResource;
use App\Endpoint\Api\Http\Resources\DrawLogResource;
use App\Enums\DrawPrizeType;
use App\Exceptions\BizException;
use App\Models\DrawActivity;
use App\Models\DrawLog;
use App\Models\DrawTicket;
use App\Services\DrawActivityService;
use Illuminate\Contracts\Cache\LockTimeoutException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Throwable;
class DrawActivityController extends Controller
{
public function show($id, Request $request)
{
$drawActivity = DrawActivity::with(['prizes' => function ($builder) {
$builder->latest('sort');
}])->onlyPublished()->findOrFail($id);
$drawTicket = null;
$drawLog = null;
if ($user = $request->user()) {
// 当前用户的抽奖机会
$drawTicket = DrawTicket::where('draw_activity_id', $drawActivity->id)
->where('user_id', $user->id)
->first();
// 当前用户未填写收货地址的实物奖品
$drawLog = DrawLog::whereRelation('prize', 'type', DrawPrizeType::Goods->value)
->where('draw_activity_id', $drawActivity->id)
->where('user_id', $user->id)
->whereNull('consignee_name')
->first();
}
return response()->json([
'draw_activity' => DrawActivityResource::make($drawActivity),
'draw_log_id' => $drawLog?->id,
'draw_tickets_number' => (int) $drawTicket?->number,
]);
}
public function draw($id, Request $request, DrawActivityService $drawActivityService)
{
$drawActivity = DrawActivity::onlyPublished()->findOrFail($id);
$lock = Cache::lock("draw_activity_{$drawActivity->id}", 5);
$user = $request->user();
try {
$lock->block(3);
DB::beginTransaction();
$drawLog = $drawActivityService->draw($drawActivity, $user);
DB::commit();
} catch (Throwable $e) {
DB::rollBack();
if ($e instanceof LockTimeoutException) {
$e = new BizException('抽奖人数较多,请稍后');
}
throw $e;
} finally {
$lock?->release();
}
return DrawLogResource::make($drawLog);
}
}