Skip to content

Commit 6b98661

Browse files
committed
- Made changes to Inventory, Trades, and Design Updates to handle items as stacks instead of individual objects
- Added migrations that add the necessary columns for the new system
1 parent c95f96f commit 6b98661

34 files changed

+874
-358
lines changed

app/Http/Controllers/Admin/Users/GrantController.php

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Config;
77
use Illuminate\Http\Request;
88

9+
use App\Models\User\User;
910
use App\Models\Item\Item;
1011
use App\Models\Currency\Currency;
1112

@@ -24,6 +25,7 @@ class GrantController extends Controller
2425
public function getUserCurrency()
2526
{
2627
return view('admin.grants.user_currency', [
28+
'users' => User::orderBy('id')->pluck('name', 'id'),
2729
'userCurrencies' => Currency::where('is_user_owned', 1)->orderBy('sort_user', 'DESC')->pluck('name', 'id')
2830
]);
2931
}
@@ -55,6 +57,7 @@ public function postUserCurrency(Request $request, CurrencyManager $service)
5557
public function getItems()
5658
{
5759
return view('admin.grants.items', [
60+
'users' => User::orderBy('id')->pluck('name', 'id'),
5861
'items' => Item::orderBy('name')->pluck('name', 'id')
5962
]);
6063
}
@@ -63,12 +66,12 @@ public function getItems()
6366
* Grants or removes items from multiple users.
6467
*
6568
* @param \Illuminate\Http\Request $request
66-
* @param App\Services\InvenntoryManager $service
69+
* @param App\Services\InventoryManager $service
6770
* @return \Illuminate\Http\RedirectResponse
6871
*/
6972
public function postItems(Request $request, InventoryManager $service)
7073
{
71-
$data = $request->only(['names', 'item_id', 'quantity', 'data', 'disallow_transfer', 'notes']);
74+
$data = $request->only(['names', 'item_ids', 'quantities', 'data', 'disallow_transfer', 'notes']);
7275
if($service->grantItems($data, Auth::user())) {
7376
flash('Items granted successfully.')->success();
7477
}

app/Http/Controllers/Characters/DesignController.php

+6-7
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use DB;
88
use Auth;
99
use Settings;
10+
use App\Models\Item\Item;
1011
use App\Models\User\User;
1112
use App\Models\User\UserItem;
1213
use App\Models\Character\Character;
@@ -144,17 +145,15 @@ public function getAddons($id)
144145
$r = CharacterDesignUpdate::find($id);
145146
if(!$r || ($r->user_id != Auth::user()->id && !Auth::user()->hasPower('manage_characters'))) abort(404);
146147
if($r->status == 'Draft' && $r->user_id == Auth::user()->id)
147-
$inventory = UserItem::with('item')->whereNull('deleted_at')->where('user_id', $r->user_id)->where(function($query) use ($id) {
148-
$query->whereNull('holding_id')->orWhere(function($query) use ($id) {
149-
$query->where('holding_type', 'Update')->where('holding_id', $id);
150-
});
151-
})->get();
148+
$inventory = UserItem::with('item')->whereNull('deleted_at')->where('count', '>', '0')->where('user_id', $r->user_id)->get();
152149
else
153-
$inventory = UserItem::with('item')->whereNull('deleted_at')->where('user_id', $r->user_id)->where('holding_id', $id)->where('holding_type', 'Update')->get();
150+
$inventory = isset($r->data['user']) ? parseAssetData($r->data['user']) : null;
154151
return view('character.design.addons', [
155152
'request' => $r,
156153
'categories' => ItemCategory::orderBy('sort', 'DESC')->get(),
157-
'inventory' => $inventory
154+
'inventory' => $inventory,
155+
'items' => Item::all()->keyBy('id'),
156+
'page' => 'update'
158157
]);
159158
}
160159

app/Http/Controllers/Users/InventoryController.php

+62-18
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,20 @@ class InventoryController extends Controller
3434
public function getIndex()
3535
{
3636
$categories = ItemCategory::orderBy('sort', 'DESC')->get();
37-
$items = count($categories) ? Auth::user()->items()->orderByRaw('FIELD(item_category_id,'.implode(',', $categories->pluck('id')->toArray()).')')->orderBy('name')->orderBy('updated_at')->get()->groupBy('item_category_id') : Auth::user()->items()->orderBy('name')->orderBy('updated_at')->get()->groupBy('item_category_id');
37+
$items = count($categories) ?
38+
Auth::user()->items()
39+
->where('count', '>', 0)
40+
->orderByRaw('FIELD(item_category_id,'.implode(',', $categories->pluck('id')->toArray()).')')
41+
->orderBy('name')
42+
->orderBy('updated_at')
43+
->get()
44+
->groupBy(['item_category_id', 'id']) :
45+
Auth::user()->items()
46+
->where('count', '>', 0)
47+
->orderBy('name')
48+
->orderBy('updated_at')
49+
->get()
50+
->groupBy(['item_category_id', 'id']);
3851
return view('home.inventory', [
3952
'categories' => $categories->keyBy('id'),
4053
'items' => $items,
@@ -52,28 +65,61 @@ public function getIndex()
5265
*/
5366
public function getStack(Request $request, $id)
5467
{
55-
$stack = UserItem::withTrashed()->where('id', $id)->with('item')->first();
56-
$readOnly = $request->get('read_only') ? : ((Auth::check() && $stack && !$stack->deleted_at && ($stack->user_id == Auth::user()->id || Auth::user()->hasPower('edit_inventories'))) ? 0 : 1);
68+
$first_instance = UserItem::withTrashed()->where('id', $id)->first();
69+
$readOnly = $request->get('read_only') ? : ((Auth::check() && $first_instance && ($first_instance->user_id == Auth::user()->id || Auth::user()->hasPower('edit_inventories'))) ? 0 : 1);
70+
$stack = UserItem::where([['user_id', $first_instance->user_id], ['item_id', $first_instance->item_id], ['count', '>', 0]])->get();
71+
$item = Item::where('id', $first_instance->item_id)->first();
5772

5873
return view('home._inventory_stack', [
5974
'stack' => $stack,
75+
'item' => $item,
6076
'user' => Auth::user(),
61-
'userOptions' => ['' => 'Select User'] + User::visible()->where('id', '!=', $stack ? $stack->user_id : 0)->orderBy('name')->get()->pluck('verified_name', 'id')->toArray(),
77+
'userOptions' => ['' => 'Select User'] + User::visible()->where('id', '!=', $first_instance ? $first_instance->user_id : 0)->orderBy('name')->get()->pluck('verified_name', 'id')->toArray(),
6278
'readOnly' => $readOnly
6379
]);
6480
}
81+
82+
/**
83+
* Edits the inventory of involved users.
84+
*
85+
* @param \Illuminate\Http\Request $request
86+
* @param App\Services\InventoryManager $service
87+
* @return \Illuminate\Http\RedirectResponse
88+
*/
89+
public function postEdit(Request $request, InventoryManager $service)
90+
{
91+
if(!$request->ids) { flash('No items selected.')->error(); }
92+
if(!$request->quantities) { flash('Quantities not set.')->error(); }
93+
94+
if($request->ids && $request->quantities) {
95+
switch($request->action) {
96+
default:
97+
flash('Invalid action selected.')->error();
98+
break;
99+
case 'transfer':
100+
return $this->postTransfer($request, $service);
101+
break;
102+
case 'delete':
103+
return $this->postDelete($request, $service);
104+
break;
105+
case 'act':
106+
return $this->postAct($request);
107+
break;
108+
}
109+
}
110+
return redirect()->back();
111+
}
65112

66113
/**
67-
* Transfers an inventory stack to another user.
114+
* Transfers inventory items to another user.
68115
*
69116
* @param \Illuminate\Http\Request $request
70117
* @param App\Services\InventoryManager $service
71-
* @param int $id
72118
* @return \Illuminate\Http\RedirectResponse
73119
*/
74-
public function postTransfer(Request $request, InventoryManager $service, $id)
120+
private function postTransfer(Request $request, InventoryManager $service)
75121
{
76-
if($service->transferStack(Auth::user(), User::visible()->where('id', $request->get('user_id'))->first(), UserItem::where('id', $id)->first())) {
122+
if($service->transferStack(Auth::user(), User::visible()->where('id', $request->get('user_id'))->first(), UserItem::find($request->get('ids')), $request->get('quantities'))) {
77123
flash('Item transferred successfully.')->success();
78124
}
79125
else {
@@ -87,12 +133,11 @@ public function postTransfer(Request $request, InventoryManager $service, $id)
87133
*
88134
* @param \Illuminate\Http\Request $request
89135
* @param App\Services\InventoryManager $service
90-
* @param int $id
91136
* @return \Illuminate\Http\RedirectResponse
92137
*/
93-
public function postDelete(Request $request, InventoryManager $service, $id)
138+
private function postDelete(Request $request, InventoryManager $service)
94139
{
95-
if($service->deleteStack(Auth::user(), UserItem::where('id', $id)->first())) {
140+
if($service->deleteStack(Auth::user(), UserItem::find($request->get('ids')), $request->get('quantities'))) {
96141
flash('Item deleted successfully.')->success();
97142
}
98143
else {
@@ -118,18 +163,17 @@ public function getSelector($id)
118163
* Acts on an item based on the item's tag.
119164
*
120165
* @param \Illuminate\Http\Request $request
121-
* @param App\Services\InventoryManager $service
122-
* @param int $id
123166
* @return \Illuminate\Http\RedirectResponse
124167
*/
125-
public function postAct(Request $request, $id, $tag)
168+
private function postAct(Request $request)
126169
{
127-
$stack = UserItem::where('id', $id)->first();
128-
$service = $stack->item->hasTag($tag) ? $stack->item->tag($tag)->service : null;
129-
if($service && $service->act($stack, Auth::user(), $request->all())) {
170+
$stacks = UserItem::with('item')->find($request->get('ids'));
171+
$tag = $request->get('tag');
172+
$service = $stacks->first()->item->hasTag($tag) ? $stacks->first()->item->tag($tag)->service : null;
173+
if($service && $service->act($stacks, Auth::user(), $request->all())) {
130174
flash('Item used successfully.')->success();
131175
}
132-
else if(!$stack->item->hasTag($tag)) flash('Invalid action selected.')->error();
176+
else if(!$stacks->first()->item->hasTag($tag)) flash('Invalid action selected.')->error();
133177
else {
134178
foreach($service->errors()->getMessages()['error'] as $error) flash($error)->error();
135179
}

app/Http/Controllers/Users/TradeController.php

+40-14
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,28 @@ public function getIndex($status = 'open')
3939
$user = Auth::user();
4040
$trades = Trade::with('recipient')->with('sender')->with('staff')->where(function($query) {
4141
$query->where('recipient_id', Auth::user()->id)->orWhere('sender_id', Auth::user()->id);
42-
})->where('status', ucfirst($status));
42+
})->where('status', ucfirst($status))->orderBy('id', 'DESC');
43+
44+
$stacks = array();
45+
foreach($trades->get() as $trade) {
46+
foreach($trade->data as $side=>$assets) {
47+
if(isset($assets['user_items'])) {
48+
$user_items = UserItem::with('item')->find(array_keys($assets['user_items']));
49+
$items = array();
50+
foreach($assets['user_items'] as $id=>$quantity) {
51+
$user_item = $user_items->find($id);
52+
$user_item['quantity'] = $quantity;
53+
array_push($items,$user_item);
54+
}
55+
$items = collect($items)->groupBy('item_id');
56+
$stacks[$trade->id][$side] = $items;
57+
}
58+
}
59+
}
4360

4461
return view('home.trades.index', [
45-
'trades' => $trades->where('status', ucfirst($status))->orderBy('id', 'DESC')->paginate(20)
62+
'trades' => $trades->paginate(20),
63+
'stacks' => $stacks
4664
]);
4765
}
4866

@@ -54,17 +72,17 @@ public function getIndex($status = 'open')
5472
*/
5573
public function getTrade($id)
5674
{
57-
5875
$trade = Trade::find($id);
5976

6077
if($trade->status != 'Completed' && !Auth::user()->hasPower('manage_characters') && !($trade->sender_id == Auth::user()->id || $trade->recipient_id == Auth::user()->id)) $trade = null;
61-
78+
6279
if(!$trade) abort(404);
6380
return view('home.trades.trade', [
6481
'trade' => $trade,
6582
'partner' => (Auth::user()->id == $trade->sender_id) ? $trade->recipient : $trade->sender,
6683
'senderData' => isset($trade->data['sender']) ? parseAssetData($trade->data['sender']) : null,
67-
'recipientData' => isset($trade->data['recipient']) ? parseAssetData($trade->data['recipient']) : null
84+
'recipientData' => isset($trade->data['recipient']) ? parseAssetData($trade->data['recipient']) : null,
85+
'items' => Item::all()->keyBy('id')
6886
]);
6987
}
7088

@@ -76,13 +94,19 @@ public function getTrade($id)
7694
*/
7795
public function getCreateTrade()
7896
{
79-
$inventory = UserItem::with('item')->whereNull('deleted_at')->where('user_id', Auth::user()->id)->whereNull('holding_id')->get();
97+
$inventory = UserItem::with('item')->whereNull('deleted_at')->where('count', '>', '0')->where('user_id', Auth::user()->id)
98+
->get()
99+
->filter(function($userItem){
100+
return $userItem->isTransferrable == true;
101+
})
102+
->sortBy('item.name');;
80103
return view('home.trades.create_trade', [
81104
'categories' => ItemCategory::orderBy('sort', 'DESC')->get(),
82105
'inventory' => $inventory,
83-
'userOptions' => User::visible()->orderBy('name')->pluck('name', 'id')->toArray(),
106+
'userOptions' => User::visible()->where('id', '!=', Auth::user()->id)->orderBy('name')->pluck('name', 'id')->toArray(),
84107
'characters' => Auth::user()->allCharacters()->visible()->tradable()->with('designUpdate')->get(),
85108
'characterCategories' => CharacterCategory::orderBy('sort', 'DESC')->get(),
109+
'page' => 'trade'
86110
]);
87111
}
88112

@@ -99,11 +123,12 @@ public function getEditTrade($id)
99123
})->where('status', 'Open')->first();
100124

101125
if($trade)
102-
$inventory = UserItem::with('item')->whereNull('deleted_at')->where('user_id', Auth::user()->id)->where(function($query) use ($trade) {
103-
$query->whereNull('holding_id')->orWhere(function($query) use ($trade) {
104-
$query->where('holding_type', 'Trade')->where('holding_id', $trade->id);
105-
});
106-
})->get();
126+
$inventory = UserItem::with('item')->whereNull('deleted_at')->where('count', '>', '0')->where('user_id', Auth::user()->id)
127+
->get()
128+
->filter(function($userItem){
129+
return $userItem->isTransferrable == true;
130+
})
131+
->sortBy('item.name');
107132
else $trade = null;
108133
return view('home.trades.edit_trade', [
109134
'trade' => $trade,
@@ -113,6 +138,7 @@ public function getEditTrade($id)
113138
'userOptions' => User::visible()->orderBy('name')->pluck('name', 'id')->toArray(),
114139
'characters' => Auth::user()->allCharacters()->visible()->with('designUpdate')->get(),
115140
'characterCategories' => CharacterCategory::orderBy('sort', 'DESC')->get(),
141+
'page' => 'trade'
116142
]);
117143
}
118144

@@ -125,7 +151,7 @@ public function getEditTrade($id)
125151
*/
126152
public function postCreateTrade(Request $request, TradeManager $service)
127153
{
128-
if($trade = $service->createTrade($request->only(['recipient_id', 'comments', 'stack_id', 'currency_id', 'currency_quantity', 'character_id']), Auth::user())) {
154+
if($trade = $service->createTrade($request->only(['recipient_id', 'comments', 'stack_id', 'stack_quantity', 'currency_id', 'currency_quantity', 'character_id']), Auth::user())) {
129155
flash('Trade created successfully.')->success();
130156
return redirect()->to($trade->url);
131157
}
@@ -145,7 +171,7 @@ public function postCreateTrade(Request $request, TradeManager $service)
145171
*/
146172
public function postEditTrade(Request $request, TradeManager $service, $id)
147173
{
148-
if($trade = $service->editTrade($request->only(['comments', 'stack_id', 'currency_id', 'currency_quantity', 'character_id']) + ['id' => $id], Auth::user())) {
174+
if($trade = $service->editTrade($request->only(['comments', 'stack_id', 'stack_quantity', 'currency_id', 'currency_quantity', 'character_id']) + ['id' => $id], Auth::user())) {
149175
flash('Trade offer edited successfully.')->success();
150176
}
151177
else {

app/Http/Controllers/Users/UserController.php

+14-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,20 @@ public function getUserMyoSlots($name)
9595
public function getUserInventory($name)
9696
{
9797
$categories = ItemCategory::orderBy('sort', 'DESC')->get();
98-
$items = count($categories) ? $this->user->items()->orderByRaw('FIELD(item_category_id,'.implode(',', $categories->pluck('id')->toArray()).')')->orderBy('name')->orderBy('updated_at')->get()->groupBy('item_category_id') : $this->user->items()->orderBy('name')->orderBy('updated_at')->get()->groupBy('item_category_id');
98+
$items = count($categories) ?
99+
$this->user->items()
100+
->where('count', '>', 0)
101+
->orderByRaw('FIELD(item_category_id,'.implode(',', $categories->pluck('id')->toArray()).')')
102+
->orderBy('name')
103+
->orderBy('updated_at')
104+
->get()
105+
->groupBy(['item_category_id', 'id']) :
106+
$this->user->items()
107+
->where('count', '>', 0)
108+
->orderBy('name')
109+
->orderBy('updated_at')
110+
->get()
111+
->groupBy(['item_category_id', 'id']);
99112
return view('user.inventory', [
100113
'user' => $this->user,
101114
'categories' => $categories->keyBy('id'),

app/Models/Character/CharacterDesignUpdate.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ public function getInventoryAttribute()
213213
// This is for showing the addons page
214214
// just need to retrieve a list of stack IDs to tell which ones to check
215215

216-
return $this->data ? $this->data['stacks'] : [];
216+
return $this->data && isset($this->data['user']['user_items']) ? $this->data['user']['user_items'] : [];
217217
}
218218

219219
/**

app/Models/Trade.php

-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ public function getInventory($user)
156156
{
157157
$type = $this->sender_id == $user->id ? 'sender' : 'recipient';
158158
$inventory = $this->data && isset($this->data[$type]) && isset($this->data[$type]['user_items']) ? $this->data[$type]['user_items'] : [];
159-
if($inventory) $inventory = array_keys($inventory);
160159
return $inventory;
161160
}
162161

app/Models/User/User.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ public function rank()
131131
*/
132132
public function items()
133133
{
134-
return $this->belongsToMany('App\Models\Item\Item', 'user_items')->withPivot('data', 'updated_at', 'id')->whereNull('user_items.deleted_at')->whereNull('user_items.holding_type');
134+
return $this->belongsToMany('App\Models\Item\Item', 'user_items')->withPivot('count', 'data', 'updated_at', 'id')->whereNull('user_items.deleted_at');
135135
}
136136

137137
/**********************************************************************************************

0 commit comments

Comments
 (0)