1. Anuncie Aqui ! Entre em contato fdantas@4each.com.br

Queue of process at back end api

Discussão em 'Outras Linguagens' iniciado por PSDEVS, Outubro 10, 2024 às 00:32.

  1. PSDEVS

    PSDEVS Guest

    i need some help. i did the code above, this is a function who external back end call and we need manage some informations and return they back. the problem is, they send MULTIPLES requests at same time (second) and our code process all at same time and that's wrong, because this manage balance of customers. so if they send for example 3 requests at same time it decrease funds of customer on first request, but accept second and last request without have but on balance. so i need receive all requests, queue that, process, and return for their back end. how i can do that? i'm using laravel.

    public function bmake(Request $request)
    {
    try {
    $data = json_decode(json_encode($request->all()), true);
    $decoded = $this->decodeJwt($data['payload']);
    $request = $decoded['payload']->payload;

    if ($request->currency != "BRL") {
    return response()->json(["code" => 2002, "message" => "Invalid currency"], 400);
    }

    \DB::table('debug')->insert(['text' => 'bmake > ' . json_encode($request)]);

    $Corte = explode('-', $request->player_id);
    $UserID = $Corte[2];

    $User = null;
    $User = User::Where('id', $UserID)->lockForUpdate()->first();

    if (!$User)
    {
    return response()->json(["code" => 1007, "message" => "Session is expired"], 400);
    }

    if ($User->banned == 1){
    return response()->json(["code" => 1005, "message" => "Player is blocked"], 400);
    }

    if ($User->wallet->balance < $rsamount){
    return response()->json(["code" => 2001, "message" => "Not enough money"], 400);
    }else{
    $User->wallet->balance -= $rsamount;
    $User->wallet->save();
    }

    try {
    $centsamount = $request->amount;
    $rsamount = Helper::convertToRealAmount($centsamount);

    DB::transaction(function () use ($User, $rsamount) {
    $wallet = DB::table('wallets')->where('user_id', $User->id)->lockForUpdate()->first();

    if (floatval($wallet->balance) < floatval($rsamount)) {
    throw new Exception("Saldo insuficiente.");
    } else {
    $wallet->balance -= $rsamount;
    DB::table('wallets')->where('user_id', $User->id)->update(['balance' => $wallet->balance]);
    }
    });
    } catch (Exception $e) {
    return response()->json(["code" => 2001, "message" => "Not enough money"], 400);
    }

    if (!isset($request->transaction)) {
    return response()->json(["code" => 2004, "message" => "Bad request"], 400);
    }

    $player_id = $request->player_id;
    $session_id = $request->session_id;
    $transaction = $request->transaction;

    $CheckDiscard = SportBetDiscards::Where('transaction_id', $transaction->id)->first();

    if ($CheckDiscard){
    return response()->json(["code" => 2004, "message" => "Bad request"], 400);
    }

    $InfSum = SportBetSummary::create([
    'user_id' => (String)$User->id,
    'transactionId' => $transaction->id,
    'operation' => 'make',
    'status' => 'Pending',
    'statusel' => 'Nil',
    'reason' => 'Nil',
    'amount' => $centsamount,
    'transaction' => json_encode($transaction),
    'betslip' => json_encode($request->betslip->bets),
    ]);

    $balance = $User->wallet->balance;
    $balanceLong = (int)($balance * 100);

    $IDX = $InfSum->id . "-" . time();

    SportBetParents::Create([
    'tId' => $User->id,
    'transaction_id' => $transaction->id,
    'parent' => $IDX,
    ]);

    return response()->json([
    "id" => $IDX,
    "ext_transaction_id" => (string)$transaction->id,
    "parent_transaction_id" => null,
    "user_id" => 'user-id-'.$User->id,//(String)$User->id,
    "operation" => "bet",
    "amount" => $centsamount,
    "currency" => "BRL",
    "balance" => $balanceLong,
    ], 200);
    } catch (Exception $e) {
    return response()->json(["code" => 2004, "message" => "Bad request"], 400);
    }
    }

    Continue reading...

Compartilhe esta Página