Skip to content

Commit 85cb76f

Browse files
committed
refact
1 parent 1ffeba3 commit 85cb76f

File tree

5 files changed

+136
-126
lines changed

5 files changed

+136
-126
lines changed

app/Http/Controllers/Admin/TransactionController.php

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
namespace App\Http\Controllers\Admin;
44

55
use App\Http\Controllers\Controller;
6-
use function GuzzleHttp\json_encode;
6+
use App\UseCases\TransactionService;
77
use Illuminate\Http\Request;
8-
use App\Transaction;
98

109
class TransactionController extends Controller
1110
{
@@ -28,45 +27,26 @@ public function index()
2827
return view('admin.transactions.index');
2928
}
3029

31-
public function show($key)
30+
public function show($key, TransactionService $service)
3231
{
33-
$transactions = \App\Transaction::where('transaction_key', $key)->with('user')->get();
32+
$transaction = $service->getByKey($key);
3433

35-
if ($transactions->isEmpty()) {
34+
if (empty($transaction)) {
3635
abort(404);
3736
}
3837

39-
$transaction = [];
40-
41-
foreach ($transactions as $tr) {
42-
if ($tr->transaction_type == config('transaction.types.debit')) {
43-
$transaction['debit_user_name'] = $tr->user->name;
44-
$transaction['debit_user_balance'] = $tr->user_balance;
45-
} else {
46-
$transaction['crebit_user_name'] = $tr->user->name;
47-
$transaction['crebit_user_balance'] = $tr->user_balance;
48-
}
49-
$transaction['transaction_key'] = $tr->transaction_key;
50-
$transaction['amount'] = $tr->amount;
51-
$transaction['created_at'] = (string) $tr->created_at;
52-
}
53-
54-
if (request()->expectsJson()) {
55-
return json_encode($transaction);
56-
}
57-
5838
return view('admin.transactions.show', compact('transaction'));
5939
}
6040

61-
public function update($key, Transaction $transaction)
41+
public function update($key, TransactionService $service)
6242
{
6343
request()->validate([
64-
'amount' => ['required', 'numeric','min:1'],
44+
'amount' => ['required', 'numeric', 'min:1'],
6545
]);
6646

67-
$transaction->updateTransaction($key, request('amount'));
47+
$service->update($key, request('amount'));
6848

69-
return $this->show($key);
49+
return json_encode($service->getByKey($key));
7050
}
7151

7252
public function getTransactionListQuery()

app/Http/Controllers/TransactionController.php

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use App\Rules\MaxUserBalance;
66
use App\Transaction;
7+
use App\UseCases\TransactionService;
78
use Illuminate\Http\Request;
89

910
class TransactionController extends Controller
@@ -27,7 +28,7 @@ public function index()
2728

2829
$this->orderTransactionList($query);
2930

30-
return $query->paginate(10);;
31+
return $query->paginate(10);
3132
}
3233

3334
return view('transactions.index');
@@ -57,24 +58,20 @@ public function create()
5758
return view('transactions.create', compact('transaction'));
5859
}
5960

60-
public function store(Transaction $transaction, MaxUserBalance $maxBalance)
61+
public function store(TransactionService $service, MaxUserBalance $maxBalance)
6162
{
6263
request()->validate([
63-
'amount' => ['required', 'numeric', 'min:1', $maxBalance],
64+
'amount' => ['required', 'numeric', 'min:1', $maxBalance],
6465
'user_name' => 'required|exists:users,name',
6566
]);
6667

6768
$otherUser = \App\User::where('id', request('user_id'))
6869
->where('name', request('user_name'))
6970
->first();
7071

71-
try{
72-
$transaction->createTransaction(
73-
auth()->user(),
74-
$otherUser,
75-
request('amount'));
76-
}
77-
catch(\Exception $e){
72+
try {
73+
$service->create(auth()->user(), $otherUser, request('amount'));
74+
} catch (\Exception $e) {
7875
return redirect()->back()
7976
->with('error', 'Server error, please try again');
8077
}
@@ -110,7 +107,7 @@ public function filterTransactionList($query)
110107

111108
if (request('amount')) {
112109
$query
113-
->where('tr.amount', 'like', '%' . request('amount') . '%' );
110+
->where('tr.amount', 'like', '%' . request('amount') . '%');
114111
}
115112

116113
if (request('user_balance')) {
@@ -128,7 +125,7 @@ public function orderTransactionList($query)
128125

129126
} elseif (request('sort') == 'user_name') {
130127
$query->orderBy('u.name', $order);
131-
128+
132129
} elseif (request('sort') == 'amount') {
133130
$query->orderBy('tr.amount', $order);
134131

app/Transaction.php

Lines changed: 1 addition & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -13,87 +13,5 @@ public function user()
1313
return $this->belongsTo(User::class, 'user_id');
1414
}
1515

16-
public function createTransaction($debit_user, $credit_user, $amount)
17-
{
18-
\DB::transaction(function () use($debit_user, $credit_user, $amount) {
19-
20-
while ($transaction_key = str_random(32)) {
21-
if (!\App\Transaction::where('transaction_key', $transaction_key)->first()) {
22-
break;
23-
}
24-
}
25-
26-
$debit_user_balance = $debit_user->balance->fresh()->balance - $amount;
27-
$credit_user_balance = $credit_user->balance->fresh()->balance + $amount;
28-
29-
$tr1 = static::create([
30-
'user_id' => $credit_user->id,
31-
'transaction_key' => $transaction_key,
32-
'amount' => $amount,
33-
'user_balance' => $credit_user_balance,
34-
'transaction_type' => config('transaction.types.credit'),
35-
]);
36-
37-
$tr2 = static::create([
38-
'user_id' => $debit_user->id,
39-
'transaction_key' => $transaction_key,
40-
'amount' => $amount,
41-
'user_balance' => $debit_user_balance,
42-
'transaction_type' => config('transaction.types.debit'),
43-
]);
44-
45-
if ($success = $tr1 && $tr2) {
46-
$success &= $debit_user->balance()->update(['balance' => $debit_user_balance]);
47-
$success &= $credit_user->balance()->update(['balance' => $credit_user_balance]);
48-
}
49-
50-
if(!$success){
51-
throw new \Exception('Database error!');
52-
}
53-
});
54-
}
55-
56-
public function updateTransaction($key, $amount)
57-
{
58-
59-
$transactions = \App\Transaction::where('transaction_key', $key)->get();
60-
61-
if ($transactions->isEmpty()) {
62-
throw new \Exception('Not valid transaction key!');
63-
}
64-
65-
\DB::transaction(function () use($transactions, $amount) {
66-
67-
$success = true;
68-
$oldAmount = $transactions->first()->amount;
69-
70-
foreach($transactions as $tr){
71-
if($tr->transaction_type == config('transaction.types.debit')){
72-
$diffBalance = $oldAmount - $amount;
73-
$exceptionMessage = 'Too mutch amount!';
74-
}else{
75-
$diffBalance = $amount - $oldAmount;
76-
$exceptionMessage = 'Too small amount!';
77-
}
78-
79-
$oldBalance = $tr->user_balance + $diffBalance;
80-
$newBalanse = $tr->user->balance->balance + $diffBalance;
81-
82-
if($newBalanse < 0 || $oldBalance < 0){
83-
throw new \Exception($exceptionMessage);
84-
}
85-
86-
$success &= $tr->update([
87-
'amount' => $amount,
88-
'user_balance' => $oldBalance,
89-
]);
90-
91-
$success &= $tr->user->balance()->update(['balance' => $newBalanse]);
92-
}
93-
94-
if(!$success){
95-
throw new \Exception('Database error!');
96-
}
97-
});
98-
}
16+
9917
}
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
<?php
2+
3+
namespace App\UseCases;
4+
5+
use App\Transaction;
6+
7+
8+
class TransactionService
9+
{
10+
public function create($debit_user, $credit_user, $amount)
11+
{
12+
\DB::transaction(function () use($debit_user, $credit_user, $amount) {
13+
14+
while ($transaction_key = str_random(32)) {
15+
if (!\App\Transaction::where('transaction_key', $transaction_key)->first()) {
16+
break;
17+
}
18+
}
19+
20+
$debit_user_balance = $debit_user->balance->fresh()->balance - $amount;
21+
$credit_user_balance = $credit_user->balance->fresh()->balance + $amount;
22+
23+
$tr1 = Transaction::create([
24+
'user_id' => $credit_user->id,
25+
'transaction_key' => $transaction_key,
26+
'amount' => $amount,
27+
'user_balance' => $credit_user_balance,
28+
'transaction_type' => config('transaction.types.credit'),
29+
]);
30+
31+
$tr2 = Transaction::create([
32+
'user_id' => $debit_user->id,
33+
'transaction_key' => $transaction_key,
34+
'amount' => $amount,
35+
'user_balance' => $debit_user_balance,
36+
'transaction_type' => config('transaction.types.debit'),
37+
]);
38+
39+
if ($success = $tr1 && $tr2) {
40+
$success &= $debit_user->balance()->update(['balance' => $debit_user_balance]);
41+
$success &= $credit_user->balance()->update(['balance' => $credit_user_balance]);
42+
}
43+
44+
if(!$success){
45+
throw new \Exception('Database error!');
46+
}
47+
});
48+
}
49+
50+
public function update($key, $amount)
51+
{
52+
53+
$transactions = Transaction::where('transaction_key', $key)->get();
54+
55+
if ($transactions->isEmpty()) {
56+
throw new \Exception('Not valid transaction key!');
57+
}
58+
59+
\DB::transaction(function () use($transactions, $amount) {
60+
61+
$success = true;
62+
$oldAmount = $transactions->first()->amount;
63+
64+
foreach($transactions as $tr){
65+
if($tr->transaction_type == config('transaction.types.debit')){
66+
$diffBalance = $oldAmount - $amount;
67+
$exceptionMessage = 'Too mutch amount!';
68+
}else{
69+
$diffBalance = $amount - $oldAmount;
70+
$exceptionMessage = 'Too small amount!';
71+
}
72+
73+
$oldBalance = $tr->user_balance + $diffBalance;
74+
$newBalanse = $tr->user->balance->balance + $diffBalance;
75+
76+
if($newBalanse < 0 || $oldBalance < 0){
77+
throw new \Exception($exceptionMessage);
78+
}
79+
80+
$success &= $tr->update([
81+
'amount' => $amount,
82+
'user_balance' => $oldBalance,
83+
]);
84+
85+
$success &= $tr->user->balance()->update(['balance' => $newBalanse]);
86+
}
87+
88+
if(!$success){
89+
throw new \Exception('Database error!');
90+
}
91+
});
92+
}
93+
94+
public function getByKey($key)
95+
{
96+
$transactions = Transaction::where('transaction_key', $key)->with('user')->get();
97+
98+
$transaction = [];
99+
100+
foreach ($transactions as $tr) {
101+
if ($tr->transaction_type == config('transaction.types.debit')) {
102+
$transaction['debit_user_name'] = $tr->user->name;
103+
$transaction['debit_user_balance'] = $tr->user_balance;
104+
} else {
105+
$transaction['crebit_user_name'] = $tr->user->name;
106+
$transaction['crebit_user_balance'] = $tr->user_balance;
107+
}
108+
$transaction['transaction_key'] = $tr->transaction_key;
109+
$transaction['amount'] = $tr->amount;
110+
$transaction['created_at'] = (string) $tr->created_at;
111+
}
112+
113+
return $transaction;
114+
}
115+
}

database/seeds/DatabaseSeeder.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,17 @@ public function run()
2020
'email' => 'brath1@example.org',
2121
'password' => '$2y$10$SHOpPjq2SAlrZ.Uv1ljZjuYY1eSt2Df57E8tBTYh8fby65tCflnX.',
2222
]);
23-
$transaction = new \App\Transaction();
23+
$service = new \App\UseCases\TransactionService();
2424

2525
foreach ($users as $user) {
2626
$amount = rand(100, 400);
2727

28-
$transaction->createTransaction($user, $myUser, $amount);
28+
$service->create($user, $myUser, $amount);
2929
}
3030
foreach ($users as $user) {
3131
$amount = rand(100, 300);
3232

33-
$transaction->createTransaction($myUser, $user, $amount);
33+
$service->create($myUser, $user, $amount);
3434
}
3535

3636
}

0 commit comments

Comments
 (0)