RewardCodeController.php 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. <?php
  2. namespace App\Http\Controllers\Game;
  3. use App\Game\GlobalUserInfo;
  4. use App\Http\Controllers\Controller;
  5. use App\Services\RewardCodeService;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Support\Facades\Log;
  8. class RewardCodeController extends Controller
  9. {
  10. /**
  11. * Redeem reward code (4 chars).
  12. */
  13. public function redeem(Request $request)
  14. {
  15. $code = strtoupper(trim($request->input('code', '')));
  16. if (strlen($code) !== 4 || !preg_match('/^[A-Z0-9]{4}$/', $code)) {
  17. return apiReturnFail('invalid_code');
  18. }
  19. // only allow logged-in users
  20. $user = $request->user();
  21. if (!$user) {
  22. return apiReturnFail('login_required');
  23. }
  24. $UserID = $user->UserID;
  25. $GlobalUID = $user->GlobalUID;
  26. $lockKey = 'reward_code_redeem_' . $UserID;
  27. $locked = \App\Utility\SetNXLock::getExclusiveLock($lockKey, 5);
  28. if (!$locked) {
  29. return apiReturnFail('try_again_later');
  30. }
  31. try {
  32. $data = RewardCodeService::redeem($code, $GlobalUID, $request->ip(), $UserID);
  33. return apiReturnSuc($data, '', 'success');
  34. } catch (\InvalidArgumentException $e) {
  35. $msg = $e->getMessage();
  36. return apiReturnFail($msg);
  37. } catch (\Throwable $e) {
  38. Log::error('Reward code redeem error: ' . $e->getMessage(), ['trace' => $e->getTraceAsString()]);
  39. return apiReturnFail('system_error');
  40. } finally {
  41. \App\Utility\SetNXLock::release($lockKey);
  42. }
  43. }
  44. }