From a4218d3302ea2b248e870271e2eca75f25622a80 Mon Sep 17 00:00:00 2001 From: Graphictoria Date: Wed, 13 Jul 2022 22:59:19 -0400 Subject: [PATCH] More shop stuff (again!!!) --- .../Http/Controllers/Api/FeedController.php | 2 +- .../Http/Controllers/Api/ShopController.php | 36 ++++++++++---- web/app/Models/asset.php | 16 +++++++ web/resources/js/components/Shop.js | 48 ++++++++++--------- web/routes/api.php | 4 +- 5 files changed, 70 insertions(+), 36 deletions(-) diff --git a/web/app/Http/Controllers/Api/FeedController.php b/web/app/Http/Controllers/Api/FeedController.php index 8677201..42fd9f5 100644 --- a/web/app/Http/Controllers/Api/FeedController.php +++ b/web/app/Http/Controllers/Api/FeedController.php @@ -12,7 +12,7 @@ use Illuminate\Support\Facades\Auth; class FeedController extends Controller { - protected function listjson() + protected function listJson() { // TODO: XlXi: Group shouts. $postsQuery = Shout::getPosts() diff --git a/web/app/Http/Controllers/Api/ShopController.php b/web/app/Http/Controllers/Api/ShopController.php index 1f3dc1b..600b5cb 100644 --- a/web/app/Http/Controllers/Api/ShopController.php +++ b/web/app/Http/Controllers/Api/ShopController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Api; use App\Helpers\ValidationHelper; use App\Http\Controllers\Controller; use App\Models\Asset; +use App\Models\Shout; use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; @@ -25,9 +26,9 @@ class ShopController extends Controller return response(ValidationHelper::generateErrorJSON($validator), 400); } - protected function getAssets($assetTypeIds, $gearGenre=null) + protected static function getAssets($assetTypeIds, $gearGenre=null) { - // TODO: XlXi: IMPORTANT!! Do not return raw DB response, return only needed values. + // TODO: XlXi: Group owned assets return Asset::where('approved', true) ->where('moderated', false) ->where('onSale', true) @@ -36,11 +37,10 @@ class ShopController extends Controller if ($gearGenre != null) $query->whereIn('assetAttributeId', explode(',', $gearGenre)); - }) - ->get(); + }); } - protected function listjson(Request $request) + protected function listJson(Request $request) { $validator = Validator::make($request->all(), [ 'assetTypeId' => ['required', 'regex:/^\\d(,?\\d)*$/i'], @@ -65,13 +65,29 @@ class ShopController extends Controller return ShopController::generateValidatorError($validator); } - $assets = $this->getAssets($valid['assetTypeId'], (isset($valid['gearGenreId']) ? $valid['gearGenreId'] : null)); + /* */ + + $assets = self::getAssets($valid['assetTypeId'], (isset($valid['gearGenreId']) ? $valid['gearGenreId'] : null)); + $assets = $assets->orderByDesc('created_at') + ->paginate(30); + + $data = []; + foreach($assets as $asset) { + $creator = $asset->user; + + array_push($data, [ + 'Name' => $asset->name, + 'Creator' => [ + 'Name' => $creator->username, + 'Link' => url('/user/' . strval($creator->username) . '/profile') + ], + 'Thumbnail' => $asset->getThumbnail() + ]); + } return response([ - 'pages' => 123, - 'data' => $assets, - 'next_cursor' => null, - 'prev_cursor' => null + 'pages' => ($assets->hasPages() ? $assets->lastPage() : 1), + 'data' => $data ]); } } diff --git a/web/app/Models/asset.php b/web/app/Models/asset.php index 2fde861..dc545c5 100644 --- a/web/app/Models/asset.php +++ b/web/app/Models/asset.php @@ -5,11 +5,22 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use App\Models\AssetVersion; +use App\Models\User; class Asset extends Model { use HasFactory; + /** + * The attributes that should be cast. + * + * @var array + */ + protected $casts = [ + 'created_at' => 'datetime', + 'updated_at' => 'datetime', + ]; + public function user() { return $this->belongsTo(User::class, 'creatorId'); @@ -20,6 +31,11 @@ class Asset extends Model return $this->belongsTo(AssetVersion::class, 'assetVersionId'); } + public function getThumbnail() + { + return 'https://gtoria.local/images/testing/hat.png'; + } + // Version 0 is internally considered the latest. public function getContent($version = 0) { diff --git a/web/resources/js/components/Shop.js b/web/resources/js/components/Shop.js index a1690e4..c223f24 100644 --- a/web/resources/js/components/Shop.js +++ b/web/resources/js/components/Shop.js @@ -237,7 +237,7 @@ class Shop extends Component { } navigateCategory(categoryId, data) { - this.setState({selectedCategoryId: categoryId, pageLoaded: false, pageNumber: null, pageCount: null}); + this.setState({selectedCategoryId: categoryId, pageLoaded: false}); let url = buildGenericApiUrl('api', 'catalog/v1/list-json'); let paramIterator = 0; @@ -253,9 +253,6 @@ class Shop extends Component { .then(res => { const items = res.data; - this.nextCursor = items.next_cursor; - this.prevCursor = items.prev_cursor; - this.setState({ pageItems: items.data, pageCount: items.pages, pageNumber: 1, pageLoaded: true, error: false }); }).catch(err => { const data = err.response.data; @@ -264,7 +261,7 @@ class Shop extends Component { if(data.errors) errorMessage = data.errors[0].message; - this.setState({ pageItems: [], pageCount: null, pageNumber: null, pageLoaded: true, error: errorMessage }); + this.setState({ pageItems: [], pageCount: 1, pageNumber: 1, pageLoaded: true, error: errorMessage }); this.inputBox.current.focus(); }); } @@ -310,34 +307,39 @@ class Shop extends Component { :
{ - this.state.pageItems.map(({}, index) => { - + this.state.pageItems.map(({Name, Creator, Thumbnail}, index) => + - +
-

Test hat

+

{ Name }

Free

- }) + ) }
} - + { + this.state.pageCount > 1 ? + + : + null + } diff --git a/web/routes/api.php b/web/routes/api.php index b2d94ac..9c503aa 100644 --- a/web/routes/api.php +++ b/web/routes/api.php @@ -5,7 +5,7 @@ Route::get('/', 'ApiController@index')->name('index'); Route::middleware('auth')->group(function () { Route::group(['as' => 'feed.', 'prefix' => 'feed'], function() { Route::group(['as' => 'v1.', 'prefix' => 'v1'], function() { - Route::get('/list-json', 'FeedController@listjson')->name('list'); + Route::get('/list-json', 'FeedController@listJson')->name('list'); Route::post('/share', 'FeedController@share')->name('share')->middleware('throttle:3,2'); }); }); @@ -13,7 +13,7 @@ Route::middleware('auth')->group(function () { Route::group(['as' => 'catalog.', 'prefix' => 'catalog'], function() { Route::group(['as' => 'v1.', 'prefix' => 'v1'], function() { - Route::get('/list-json', 'ShopController@listjson')->name('list'); + Route::get('/list-json', 'ShopController@listJson')->name('list'); }); });