chore: code style
This commit is contained in:
@@ -1,8 +1,8 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace App\Http\ApiControllers;
|
||||
|
||||
|
||||
abstract class Controller
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,14 +2,13 @@
|
||||
|
||||
namespace App\Http\ApiControllers;
|
||||
|
||||
use App\Models\Holding;
|
||||
use App\Models\Portfolio;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use App\Http\ApiControllers\Controller as ApiController;
|
||||
use App\Http\Requests\HoldingRequest;
|
||||
use App\Http\Resources\HoldingResource;
|
||||
use App\Models\Holding;
|
||||
use App\Models\Portfolio;
|
||||
use HackerEsq\FilterModels\FilterModels;
|
||||
use App\Http\ApiControllers\Controller as ApiController;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
|
||||
class HoldingController extends ApiController
|
||||
{
|
||||
@@ -45,4 +44,4 @@ class HoldingController extends ApiController
|
||||
|
||||
return HoldingResource::make($holding);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,10 +4,10 @@ declare(strict_types=1);
|
||||
|
||||
namespace App\Http\ApiControllers;
|
||||
|
||||
use App\Http\ApiControllers\Controller as ApiController;
|
||||
use App\Http\Resources\MarketDataResource;
|
||||
use App\Models\MarketData;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Http\Resources\MarketDataResource;
|
||||
use App\Http\ApiControllers\Controller as ApiController;
|
||||
|
||||
class MarketDataController extends ApiController
|
||||
{
|
||||
@@ -18,4 +18,4 @@ class MarketDataController extends ApiController
|
||||
MarketData::getMarketData($symbol)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,12 +4,12 @@ declare(strict_types=1);
|
||||
|
||||
namespace App\Http\ApiControllers;
|
||||
|
||||
use App\Models\Portfolio;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use HackerEsq\FilterModels\FilterModels;
|
||||
use App\Http\Resources\PortfolioResource;
|
||||
use App\Http\Requests\PortfolioRequest;
|
||||
use App\Http\ApiControllers\Controller as ApiController;
|
||||
use App\Http\Requests\PortfolioRequest;
|
||||
use App\Http\Resources\PortfolioResource;
|
||||
use App\Models\Portfolio;
|
||||
use HackerEsq\FilterModels\FilterModels;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
|
||||
class PortfolioController extends ApiController
|
||||
{
|
||||
@@ -27,7 +27,7 @@ class PortfolioController extends ApiController
|
||||
public function store(PortfolioRequest $request)
|
||||
{
|
||||
$portfolio = Portfolio::create($request->validated());
|
||||
|
||||
|
||||
return PortfolioResource::make($portfolio);
|
||||
}
|
||||
|
||||
@@ -55,4 +55,4 @@ class PortfolioController extends ApiController
|
||||
|
||||
return response()->noContent();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,13 +2,12 @@
|
||||
|
||||
namespace App\Http\ApiControllers;
|
||||
|
||||
use App\Models\Transaction;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
use HackerEsq\FilterModels\FilterModels;
|
||||
use App\Http\ApiControllers\Controller as ApiController;
|
||||
use App\Http\Requests\TransactionRequest;
|
||||
use App\Http\Resources\TransactionResource;
|
||||
use App\Http\ApiControllers\Controller as ApiController;
|
||||
use App\Models\Transaction;
|
||||
use HackerEsq\FilterModels\FilterModels;
|
||||
use Illuminate\Support\Facades\Gate;
|
||||
|
||||
class TransactionController extends ApiController
|
||||
{
|
||||
@@ -23,11 +22,11 @@ class TransactionController extends ApiController
|
||||
}
|
||||
|
||||
public function store(TransactionRequest $request)
|
||||
{
|
||||
{
|
||||
Gate::authorize('fullAccess', $request->portfolio);
|
||||
|
||||
$transaction = Transaction::create($request->validated());
|
||||
|
||||
|
||||
return TransactionResource::make($transaction);
|
||||
}
|
||||
|
||||
@@ -55,4 +54,4 @@ class TransactionController extends ApiController
|
||||
|
||||
return response()->noContent();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
|
||||
namespace App\Http\ApiControllers;
|
||||
|
||||
use Illuminate\Http\Request;
|
||||
use App\Http\Resources\UserResource;
|
||||
use App\Http\ApiControllers\Controller as ApiController;
|
||||
use App\Http\Resources\UserResource;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class UserController extends ApiController
|
||||
{
|
||||
@@ -12,4 +12,4 @@ class UserController extends ApiController
|
||||
{
|
||||
return UserResource::make($request->user());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,21 +2,19 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Exception;
|
||||
use App\Models\User;
|
||||
use App\Models\ConnectedAccount;
|
||||
use Illuminate\Support\MessageBag;
|
||||
use App\Models\User;
|
||||
use App\Notifications\VerifyConnectedAccountNotification;
|
||||
use Exception;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Blade;
|
||||
use Illuminate\Support\MessageBag;
|
||||
use Laravel\Socialite\Facades\Socialite;
|
||||
use App\Notifications\VerifyConnectedAccountNotification;
|
||||
|
||||
class ConnectedAccountController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Redirect the user to the GitHub authentication page.
|
||||
*
|
||||
*/
|
||||
public function redirectToProvider(string $provider)
|
||||
{
|
||||
@@ -27,7 +25,6 @@ class ConnectedAccountController extends Controller
|
||||
|
||||
/**
|
||||
* Obtain the user information from GitHub.
|
||||
*
|
||||
*/
|
||||
public function handleProviderCallback(string $provider)
|
||||
{
|
||||
@@ -44,21 +41,21 @@ class ConnectedAccountController extends Controller
|
||||
}
|
||||
|
||||
// check if this account is already linked
|
||||
$connected_account = ConnectedAccount::firstOrNew([
|
||||
$connected_account = ConnectedAccount::firstOrNew([
|
||||
'provider' => $provider,
|
||||
'provider_id' => $providerUser->id
|
||||
'provider_id' => $providerUser->id,
|
||||
], [
|
||||
'token' => $providerUser->token,
|
||||
'secret' => $providerUser->tokenSecret,
|
||||
'refresh_token' => $providerUser->refreshToken,
|
||||
'expires_at' => $providerUser->expiresIn,
|
||||
'verified_at' => false
|
||||
'verified_at' => false,
|
||||
]);
|
||||
|
||||
// already linked and verified, let's go login!
|
||||
if (
|
||||
$connected_account->exists
|
||||
&& !is_null($connected_account->verified_at)
|
||||
$connected_account->exists
|
||||
&& ! is_null($connected_account->verified_at)
|
||||
) {
|
||||
|
||||
Auth::login($connected_account->user, true);
|
||||
@@ -67,20 +64,20 @@ class ConnectedAccountController extends Controller
|
||||
}
|
||||
|
||||
// new user, let's create one
|
||||
if (!$user = User::where('email', $providerUser->email)->first()) {
|
||||
if (! $user = User::where('email', $providerUser->email)->first()) {
|
||||
|
||||
$user = User::create([
|
||||
'name' => $providerUser->name,
|
||||
'email' => $providerUser->email,
|
||||
'email_verified_at' => now()
|
||||
'email_verified_at' => now(),
|
||||
]);
|
||||
|
||||
|
||||
$connected_account->user_id = $user->id;
|
||||
$connected_account->verified_at = now();
|
||||
$connected_account->save();
|
||||
|
||||
|
||||
Auth::login($user, true);
|
||||
|
||||
|
||||
return redirect(route('dashboard'));
|
||||
}
|
||||
|
||||
@@ -91,23 +88,23 @@ class ConnectedAccountController extends Controller
|
||||
$user->notify(new VerifyConnectedAccountNotification($connected_account->id));
|
||||
|
||||
return redirect(route('login'))
|
||||
->with('status', __(
|
||||
'Account already exists. Check your email to connect your :provider account.',
|
||||
['provider' => config("services.$provider.name")]
|
||||
));
|
||||
->with('status', __(
|
||||
'Account already exists. Check your email to connect your :provider account.',
|
||||
['provider' => config("services.$provider.name")]
|
||||
));
|
||||
}
|
||||
|
||||
protected function validateProvider($provider): void
|
||||
{
|
||||
if (!in_array($provider, explode(',', config('services.enabled_login_providers')))) {
|
||||
|
||||
if (! in_array($provider, explode(',', config('services.enabled_login_providers')))) {
|
||||
|
||||
throw new Exception('Please provide a valid social provider.');
|
||||
}
|
||||
}
|
||||
|
||||
public function verify(ConnectedAccount $connected_account)
|
||||
{
|
||||
if (!$connected_account->verified_at) {
|
||||
if (! $connected_account->verified_at) {
|
||||
|
||||
// mark request as verified
|
||||
$connected_account->verified_at = now();
|
||||
@@ -127,8 +124,8 @@ class ConnectedAccountController extends Controller
|
||||
'css' => 'alert-success',
|
||||
'icon' => Blade::render("<x-mary-icon class='w-7 h-7' name='o-check-circle' />"),
|
||||
'position' => 'toast-top toast-end',
|
||||
'timeout' => '5000'
|
||||
]
|
||||
'timeout' => '5000',
|
||||
],
|
||||
]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<?php
|
||||
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
|
||||
abstract class Controller
|
||||
{
|
||||
//
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,15 +16,15 @@ class DashboardController extends Controller
|
||||
|
||||
// get portfolio metrics
|
||||
$metrics = cache()->remember(
|
||||
'dashboard-metrics-' . $user->id,
|
||||
10,
|
||||
'dashboard-metrics-'.$user->id,
|
||||
10,
|
||||
function () {
|
||||
return
|
||||
Holding::query()
|
||||
->myHoldings()
|
||||
->withoutWishlists()
|
||||
->withPortfolioMetrics()
|
||||
->first();
|
||||
->myHoldings()
|
||||
->withoutWishlists()
|
||||
->withPortfolioMetrics()
|
||||
->first();
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
@@ -8,21 +8,20 @@ use Illuminate\Http\Request;
|
||||
|
||||
class HoldingController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
public function show(Request $request, Portfolio $portfolio, String $symbol)
|
||||
public function show(Request $request, Portfolio $portfolio, string $symbol)
|
||||
{
|
||||
$holding = Holding::with([
|
||||
'market_data',
|
||||
'transactions' => function ($query) use ($symbol) {
|
||||
$query->where('transactions.symbol', $symbol);
|
||||
}
|
||||
])
|
||||
->symbol($symbol)
|
||||
->portfolio($portfolio->id)
|
||||
->firstOrFail();
|
||||
'market_data',
|
||||
'transactions' => function ($query) use ($symbol) {
|
||||
$query->where('transactions.symbol', $symbol);
|
||||
},
|
||||
])
|
||||
->symbol($symbol)
|
||||
->portfolio($portfolio->id)
|
||||
->firstOrFail();
|
||||
|
||||
$formattedTransactions = $holding->getFormattedTransactions();
|
||||
|
||||
|
||||
@@ -2,21 +2,19 @@
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\User;
|
||||
use App\Models\Portfolio;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class InvitedOnboardingController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Check if the invited user needs a password?
|
||||
*
|
||||
*/
|
||||
public function __invoke(Request $request, Portfolio $portfolio, User $user)
|
||||
{
|
||||
|
||||
if (!$request->hasValidSignature()) {
|
||||
if (! $request->hasValidSignature()) {
|
||||
abort(401, 'Invalid signature');
|
||||
}
|
||||
|
||||
@@ -26,7 +24,7 @@ class InvitedOnboardingController extends Controller
|
||||
// route to create password form
|
||||
return view('auth.invited-onboarding', [
|
||||
'portfolio' => $portfolio,
|
||||
'user' => $user
|
||||
'user' => $user,
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@ use Illuminate\Support\Facades\Gate;
|
||||
|
||||
class PortfolioController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*/
|
||||
@@ -26,21 +25,21 @@ class PortfolioController extends Controller
|
||||
Gate::authorize('readOnly', $portfolio);
|
||||
|
||||
$portfolio->load(['transactions', 'holdings']);
|
||||
|
||||
|
||||
// get portfolio metrics
|
||||
$metrics = cache()->remember(
|
||||
'portfolio-metrics-' . $portfolio->id,
|
||||
60,
|
||||
'portfolio-metrics-'.$portfolio->id,
|
||||
60,
|
||||
function () use ($portfolio) {
|
||||
return Holding::query()
|
||||
->portfolio($portfolio->id)
|
||||
->withPortfolioMetrics()
|
||||
->first();
|
||||
->portfolio($portfolio->id)
|
||||
->withPortfolioMetrics()
|
||||
->first();
|
||||
}
|
||||
);
|
||||
|
||||
$formattedHoldings = $portfolio->getFormattedHoldings();
|
||||
|
||||
|
||||
return view('portfolio.show', compact(['portfolio', 'metrics', 'formattedHoldings']));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ namespace App\Http\Controllers;
|
||||
|
||||
class TransactionController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* Display the specified resource.
|
||||
*/
|
||||
|
||||
@@ -14,7 +14,7 @@ class SetLocale
|
||||
*/
|
||||
public function handle(Request $request, Closure $next)
|
||||
{
|
||||
if (!session()->has('locale')) {
|
||||
if (! session()->has('locale')) {
|
||||
session()->put('locale', $request->getPreferredLanguage(
|
||||
config('app.available_locales')
|
||||
));
|
||||
@@ -24,4 +24,4 @@ class SetLocale
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,9 +6,8 @@ use Illuminate\Foundation\Http\FormRequest as BaseFormRequest;
|
||||
|
||||
class FormRequest extends BaseFormRequest
|
||||
{
|
||||
|
||||
public function requestOrModelValue($key, $model): mixed
|
||||
{
|
||||
return $this->request->get($key) ?? $this->{$model}?->{$key};
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,11 +2,8 @@
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use App\Http\Requests\FormRequest;
|
||||
|
||||
class HoldingRequest extends FormRequest
|
||||
{
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
@@ -16,7 +13,7 @@ class HoldingRequest extends FormRequest
|
||||
{
|
||||
|
||||
$rules = [
|
||||
'reinvest_dividends' => ['sometimes', 'boolean']
|
||||
'reinvest_dividends' => ['sometimes', 'boolean'],
|
||||
];
|
||||
|
||||
return $rules;
|
||||
|
||||
@@ -2,11 +2,8 @@
|
||||
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use App\Http\Requests\FormRequest;
|
||||
|
||||
class PortfolioRequest extends FormRequest
|
||||
{
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
@@ -21,9 +18,9 @@ class PortfolioRequest extends FormRequest
|
||||
'wishlist' => ['sometimes', 'nullable', 'boolean'],
|
||||
];
|
||||
|
||||
if (!is_null($this->portfolio)) {
|
||||
if (! is_null($this->portfolio)) {
|
||||
$rules['title'][0] = 'sometimes';
|
||||
}
|
||||
}
|
||||
|
||||
return $rules;
|
||||
}
|
||||
|
||||
@@ -3,18 +3,16 @@
|
||||
namespace App\Http\Requests;
|
||||
|
||||
use App\Models\Portfolio;
|
||||
use App\Http\Requests\FormRequest;
|
||||
use App\Rules\SymbolValidationRule;
|
||||
use App\Rules\QuantityValidationRule;
|
||||
use App\Rules\SymbolValidationRule;
|
||||
|
||||
class TransactionRequest extends FormRequest
|
||||
{
|
||||
|
||||
protected function prepareForValidation(): void
|
||||
{
|
||||
|
||||
$this->merge([
|
||||
'portfolio' => Portfolio::find($this->requestOrModelValue('portfolio_id', 'transaction'))
|
||||
'portfolio' => Portfolio::find($this->requestOrModelValue('portfolio_id', 'transaction')),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -25,28 +23,28 @@ class TransactionRequest extends FormRequest
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
|
||||
|
||||
$rules = [
|
||||
'portfolio_id' => ['required', 'exists:portfolios,id'],
|
||||
'symbol' => ['required', 'string', new SymbolValidationRule],
|
||||
'transaction_type' => ['required', 'string', 'in:BUY,SELL'],
|
||||
'date' => ['required', 'date_format:Y-m-d', 'before_or_equal:' . now()->format('Y-m-d')],
|
||||
'date' => ['required', 'date_format:Y-m-d', 'before_or_equal:'.now()->format('Y-m-d')],
|
||||
'quantity' => [
|
||||
'required',
|
||||
'numeric',
|
||||
'min:0',
|
||||
'required',
|
||||
'numeric',
|
||||
'min:0',
|
||||
new QuantityValidationRule(
|
||||
$this->input('portfolio'),
|
||||
$this->requestOrModelValue('symbol', 'transaction'),
|
||||
$this->requestOrModelValue('transaction_type', 'transaction'),
|
||||
$this->requestOrModelValue('date', 'transaction')
|
||||
)
|
||||
),
|
||||
],
|
||||
'cost_basis' => ['exclude_if:transaction_type,SELL', 'min:0', 'numeric'],
|
||||
'sale_price' => ['exclude_if:transaction_type,BUY', 'min:0', 'numeric'],
|
||||
];
|
||||
|
||||
if (!is_null($this->transaction)) {
|
||||
if (! is_null($this->transaction)) {
|
||||
$rules['portfolio_id'][0] = 'sometimes';
|
||||
$rules['symbol'][0] = 'sometimes';
|
||||
$rules['transaction_type'][0] = 'sometimes';
|
||||
@@ -64,7 +62,7 @@ class TransactionRequest extends FormRequest
|
||||
) {
|
||||
$rules['cost_basis'][0] = 'required';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $rules;
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ class HoldingResource extends JsonResource
|
||||
'market_gain_dollars' => $this->market_gain_dollars,
|
||||
'market_gain_percent' => $this->market_gain_percent,
|
||||
'created_at' => $this->created_at,
|
||||
'updated_at' => $this->updated_at
|
||||
'updated_at' => $this->updated_at,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class UserResource extends JsonResource
|
||||
{
|
||||
{
|
||||
/**
|
||||
* Transform the resource into an array.
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user