82 lines
2.4 KiB
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);
|
|
}
|
|
}
|