WorldCupActivityController.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. <?php
  2. namespace App\Http\Controllers\Game;
  3. use App\Http\Controllers\Controller;
  4. use App\Services\WorldCup\WorldCupBetService;
  5. use App\Services\WorldCup\WorldCupMatchFavoriteService;
  6. use App\Services\WorldCup\WorldCupOddsService;
  7. use App\Services\WorldCup\WorldCupReferralRewardService;
  8. use App\Services\WorldCup\WorldCupReferralService;
  9. use Illuminate\Http\Request;
  10. use Illuminate\Support\Facades\DB;
  11. class WorldCupActivityController extends Controller
  12. {
  13. private $betService;
  14. private $favoriteService;
  15. private $referralService;
  16. private $referralRewardService;
  17. private $oddsService;
  18. public function __construct(
  19. WorldCupBetService $betService,
  20. WorldCupReferralService $referralService,
  21. WorldCupMatchFavoriteService $favoriteService,
  22. WorldCupReferralRewardService $referralRewardService,
  23. WorldCupOddsService $oddsService
  24. ) {
  25. $this->betService = $betService;
  26. $this->referralService = $referralService;
  27. $this->favoriteService = $favoriteService;
  28. $this->referralRewardService = $referralRewardService;
  29. $this->oddsService = $oddsService;
  30. }
  31. public function info(Request $request)
  32. {
  33. $user = $request->user();
  34. if (!$user) {
  35. return apiReturnFail(['web.activity.login_required', 'Please login first']);
  36. }
  37. $balance = $this->getUserBalance((int)$user->UserID);
  38. $firstBetUsed = $this->isFirstBetUsed((int)$user->UserID);
  39. $inviteState = $this->referralRewardService->getInviteState((int)$user->UserID);
  40. return apiReturnSuc([
  41. 'invite_code' => $inviteState['invite_code'],
  42. 'referral_bound' => $inviteState['referral_bound'],
  43. 'referred_by_user_id' => $inviteState['referred_by_user_id'],
  44. 'invite_copy' => $this->referralService->getInviteCopy(),
  45. 'bet_panel' => $this->betService->buildBetPanelState($balance, $firstBetUsed),
  46. 'first_bet_used' => $firstBetUsed,
  47. 'limits' => [
  48. 'min_stake' => WorldCupBetService::MIN_STAKE,
  49. 'first_stake_cap' => WorldCupBetService::FIRST_STAKE_CAP,
  50. 'max_stake' => WorldCupBetService::MAX_STAKE,
  51. 'referral_cap_each' => WorldCupReferralService::REFERRAL_CAP,
  52. ],
  53. 'register_timestmap' => strtotime($user->RegisterDate),
  54. 'server_time' => time(),
  55. ]);
  56. }
  57. public function bindInvite(Request $request)
  58. {
  59. $user = $request->user();
  60. if (!$user) {
  61. return apiReturnFail(['web.activity.login_required', 'Please login first']);
  62. }
  63. $result = $this->referralRewardService->bindInvite(
  64. (int)$user->UserID,
  65. (string)$request->input('invite_code', ''),
  66. (string)$request->input('bind_type', 'manual')
  67. );
  68. if (!$result['success']) {
  69. return apiReturnFail($result['message']);
  70. }
  71. return apiReturnSuc([
  72. 'status' => $result['status'],
  73. 'referral' => $result['data'],
  74. ]);
  75. }
  76. public function inviteLog(Request $request)
  77. {
  78. $user = $request->user();
  79. if (!$user) {
  80. return apiReturnFail(['web.activity.login_required', 'Please login first']);
  81. }
  82. return apiReturnSuc($this->referralRewardService->inviteLog(
  83. (int)$user->UserID,
  84. (string)$request->input('type', 'invited'),
  85. (int)$request->input('limit', 20)
  86. ));
  87. }
  88. public function rewardLog(Request $request)
  89. {
  90. $user = $request->user();
  91. if (!$user) {
  92. return apiReturnFail(['web.activity.login_required', 'Please login first']);
  93. }
  94. return apiReturnSuc($this->referralRewardService->rewardLog(
  95. (int)$user->UserID,
  96. (int)$request->input('limit', 20)
  97. ));
  98. }
  99. public function matches(Request $request)
  100. {
  101. $user = $request->user();
  102. if (!$user) {
  103. return apiReturnFail(['web.activity.login_required', 'Please login first']);
  104. }
  105. $favoriteOnly = (int)$request->input('favorite', 0) === 1;
  106. return apiReturnSuc([
  107. 'matches' => $this->favoriteService->listMatches((int)$user->UserID, $favoriteOnly),
  108. ]);
  109. }
  110. public function toggleFavorite(Request $request, $matchId)
  111. {
  112. $user = $request->user();
  113. if (!$user) {
  114. return apiReturnFail(['web.activity.login_required', 'Please login first']);
  115. }
  116. $result = $this->favoriteService->toggleFavorite((int)$user->UserID, (int)$matchId);
  117. if (!$result['success']) {
  118. return apiReturnFail($result['message']);
  119. }
  120. return apiReturnSuc([
  121. 'match_id' => (int)$matchId,
  122. 'is_favorite' => $result['is_favorite'],
  123. ]);
  124. }
  125. public function betPanelState(Request $request)
  126. {
  127. $user = $request->user();
  128. if (!$user) {
  129. return apiReturnFail(['web.activity.login_required', 'Please login first']);
  130. }
  131. $balance = $this->getUserBalance((int)$user->UserID);
  132. $firstBetUsed = $this->isFirstBetUsed((int)$user->UserID);
  133. return apiReturnSuc($this->betService->buildBetPanelState($balance, $firstBetUsed));
  134. }
  135. public function betLog(Request $request)
  136. {
  137. $user = $request->user();
  138. if (!$user) {
  139. return apiReturnFail(['web.activity.login_required', 'Please login first']);
  140. }
  141. return apiReturnSuc($this->betService->betLog(
  142. (int)$user->UserID,
  143. (string)$request->input('status', 'all'),
  144. (int)$request->input('limit', 20)
  145. ));
  146. }
  147. public function placeBet(Request $request)
  148. {
  149. $user = $request->user();
  150. if (!$user) {
  151. return apiReturnFail(['web.activity.login_required', 'Please login first']);
  152. }
  153. $result = $this->betService->placeBet([
  154. 'user_id' => (int)$user->UserID,
  155. 'game_id' => (int)($user->GameID ?? 0),
  156. 'market' => (string)$request->input('market', '1x2'),
  157. 'match_id' => $request->input('match_id'),
  158. 'selection' => (string)$request->input('selection', ''),
  159. 'stake' => (int)$request->input('stake', 0),
  160. 'idempotency_key' => (string)$request->input('idempotency_key', ''),
  161. ]);
  162. if (!$result['success']) {
  163. return apiReturnFail($result['message']);
  164. }
  165. return apiReturnSuc([
  166. 'status' => $result['status'],
  167. 'bet' => $result['data'],
  168. ]);
  169. }
  170. public function winnerMarkets(Request $request)
  171. {
  172. $user = $request->user();
  173. if (!$user) {
  174. return apiReturnFail(['web.activity.login_required', 'Please login first']);
  175. }
  176. return apiReturnSuc([
  177. 'markets' => $this->oddsService->winnerOdds(),
  178. ]);
  179. }
  180. private function getUserBalance(int $userId): int
  181. {
  182. return (int)DB::connection('read')->table('QPTreasureDB.dbo.GameScoreInfo')
  183. ->where('UserID', $userId)
  184. ->value('Score');
  185. }
  186. private function isFirstBetUsed(int $userId): bool
  187. {
  188. return DB::connection('read')->table('agent.dbo.world_cup_user_state')
  189. ->where('user_id', $userId)
  190. ->where('first_bet_used', 1)
  191. ->exists();
  192. }
  193. }