From 62dcae48bb9e5f18e1596323d5cb481dd8054105 Mon Sep 17 00:00:00 2001 From: hackerESQ Date: Fri, 24 Jan 2025 22:45:28 -0600 Subject: [PATCH] wip --- .../ApiControllers/PortfolioController.php | 37 +++++++++++++++++-- app/Http/Requests/StorePortfolioRequest.php | 23 ++++++++++++ app/Http/Requests/UpdatePortfolioRequest.php | 23 ++++++++++++ app/Http/Resources/PortfolioResource.php | 1 + composer.lock | 8 ++-- routes/api.php | 2 +- 6 files changed, 86 insertions(+), 8 deletions(-) create mode 100644 app/Http/Requests/StorePortfolioRequest.php create mode 100644 app/Http/Requests/UpdatePortfolioRequest.php diff --git a/app/Http/ApiControllers/PortfolioController.php b/app/Http/ApiControllers/PortfolioController.php index 92af14e..54e83ec 100644 --- a/app/Http/ApiControllers/PortfolioController.php +++ b/app/Http/ApiControllers/PortfolioController.php @@ -5,22 +5,53 @@ declare(strict_types=1); namespace App\Http\ApiControllers; use App\Models\Portfolio; -use Illuminate\Http\Request; +use Illuminate\Support\Facades\Gate; use HackerEsq\FilterModels\FilterModels; use App\Http\Resources\PortfolioResource; +use App\Http\Requests\StorePortfolioRequest; +use App\Http\Requests\UpdatePortfolioRequest; use App\Http\ApiControllers\Controller as ApiController; class PortfolioController extends ApiController { public function index(FilterModels $filters) { - $filters->setQuery(Portfolio::query()); $filters->setScopes(['myPortfolios']); $filters->setEagerRelations(['users', 'transactions', 'holdings']); - $filters->setFilterableRelations(['holdings' => 'symbol', 'transactions' => 'symbol']); + $filters->setFilterableRelations(['holdings.symbol']); $filters->setSearchableColumns(['title', 'notes']); return PortfolioResource::collection($filters->paginated()); } + + public function store(StorePortfolioRequest $request) + { + $portfolio = Portfolio::create($request->validated()); + + return PortfolioResource::make($portfolio); + } + + public function show(Portfolio $portfolio) + { + Gate::authorize('readOnly', $portfolio); + + return PortfolioResource::make($portfolio); + } + + public function update(UpdatePortfolioRequest $request, Portfolio $portfolio) + { + Gate::authorize('fullAccess', $portfolio); + + $portfolio->update($request->validated()); + + return PortfolioResource::make($portfolio); + } + + public function destroy(Portfolio $portfolio) + { + Gate::authorize('fullAccess', $portfolio); + + return response()->noContent(); + } } \ No newline at end of file diff --git a/app/Http/Requests/StorePortfolioRequest.php b/app/Http/Requests/StorePortfolioRequest.php new file mode 100644 index 0000000..86b0eef --- /dev/null +++ b/app/Http/Requests/StorePortfolioRequest.php @@ -0,0 +1,23 @@ +|string> + */ + public function rules(): array + { + return [ + 'title' => ['required', 'string', 'max:255'], + 'notes' => ['sometimes', 'nullable', 'string'], + 'wishlist' => ['sometimes', 'nullable', 'boolean'], + ]; + } +} diff --git a/app/Http/Requests/UpdatePortfolioRequest.php b/app/Http/Requests/UpdatePortfolioRequest.php new file mode 100644 index 0000000..6840a5a --- /dev/null +++ b/app/Http/Requests/UpdatePortfolioRequest.php @@ -0,0 +1,23 @@ +|string> + */ + public function rules(): array + { + return [ + 'title' => ['sometimes', 'string', 'max:255'], + 'notes' => ['sometimes', 'nullable', 'string'], + 'wishlist' => ['sometimes', 'nullable', 'boolean'], + ]; + } +} diff --git a/app/Http/Resources/PortfolioResource.php b/app/Http/Resources/PortfolioResource.php index 1bd9f06..19d3b8a 100644 --- a/app/Http/Resources/PortfolioResource.php +++ b/app/Http/Resources/PortfolioResource.php @@ -19,6 +19,7 @@ class PortfolioResource extends JsonResource return [ 'id' => $this->id, 'title' => $this->title, + 'notes' => $this->notes, 'wishlist' => $this->wishlist, 'owner' => UserResource::make($this->owner), 'transactions' => TransactionResource::collection($this->whenLoaded('transactions')), diff --git a/composer.lock b/composer.lock index c5bcd19..c7d511f 100644 --- a/composer.lock +++ b/composer.lock @@ -1733,12 +1733,12 @@ "source": { "type": "git", "url": "https://github.com/hackerESQ/filter-models.git", - "reference": "4ddba2483dc3987dcdf3f637be7edb8a2c96606c" + "reference": "565537120ea01bd73f49051ecde90d05e4127c6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hackerESQ/filter-models/zipball/4ddba2483dc3987dcdf3f637be7edb8a2c96606c", - "reference": "4ddba2483dc3987dcdf3f637be7edb8a2c96606c", + "url": "https://api.github.com/repos/hackerESQ/filter-models/zipball/565537120ea01bd73f49051ecde90d05e4127c6b", + "reference": "565537120ea01bd73f49051ecde90d05e4127c6b", "shasum": "" }, "require": { @@ -1764,7 +1764,7 @@ "source": "https://github.com/hackerESQ/filter-models/tree/main", "issues": "https://github.com/hackerESQ/filter-models/issues" }, - "time": "2025-01-25T01:22:46+00:00" + "time": "2025-01-25T04:44:58+00:00" }, { "name": "jfcherng/php-color-output", diff --git a/routes/api.php b/routes/api.php index f1c9894..6249abb 100644 --- a/routes/api.php +++ b/routes/api.php @@ -13,7 +13,7 @@ Route::middleware(['auth:sanctum'])->group(function () { Route::get('/me', [UserController::class, 'me']); // portfolio - Route::get('/portfolio', [PortfolioController::class, 'index']); + Route::apiResource('/portfolio', PortfolioController::class); // transaction Route::get('/transaction', [TransactionController::class, 'index']);