File: D:/HostingSpaces/SBogers10/shop.komma.nl/app/Addresses/AddressController.php
<?php declare(strict_types=1);
namespace App\Addresses;
use App\Addresses\Models\Address;
use App\Base\Controller;
use App\Checkout\CheckoutService;
use App\Users\SiteUser;
use App\Users\SiteUserInterface;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Auth;
use Illuminate\View\View;
class AddressController extends Controller
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
protected AddressServiceInterface $addressService;
public function __construct()
{
$this->addressService = app(AddressServiceInterface::class);
parent::__construct();
}
/**
* @param Request $request
*/
public function index(Request $request) {
if(!$request->ajax()) return $this->render();
/** @var SiteUserInterface $siteUser */
$siteUser = Auth::user();
return AddressResource::collection($siteUser->addresses()->get());
}
/**
* @param Request $request
* @param Address $address
*/
public function update(Request $request, Address $address) {
$this->authorize('update', $address);
if(!$request->ajax()) abort(Response::HTTP_NOT_IMPLEMENTED, 'Not implemented. Only ajax calls please.');
/** @var SiteUserInterface $siteUser */
$siteUser = Auth::user();
$request->validate(array_merge([
'id' => ['required', 'integer'],
'first_name' => ['string'],
'last_name' => ['string'],
'last_name_prefix' => ['string'],
], Address::basicValidationRules()));
$address = Address::find($request->get('id'));
$address->fill($request->all());
$this->addressService->saveAddressForUser($address, $siteUser);
return new AddressResource($address);
}
/**
* @param Request $request
* @param Address $address
*/
public function store(Request $request, Address $address) {
$this->authorize('store', $address);
if(!$request->ajax()) abort(Response::HTTP_NOT_IMPLEMENTED, 'Not implemented. Only ajax calls please.');
/** @var SiteUserInterface $siteUser */
$siteUser = Auth::user();
$request->validate(array_merge([
'id' => ['required', 'integer'],
'first_name' => ['string'],
'last_name' => ['string'],
'last_name_prefix' => ['string'],
], Address::basicValidationRules()));
$address = new Address($request->all());
$this->addressService->saveAddressForUser($address, $siteUser);
return new AddressResource($address);
}
/**
* @param Request $request
* @param Address $address
*
* @return Response
*/
public function delete(Request $request, Address $address) {
$this->authorize('delete', $address);
if(!$request->ajax()) abort(Response::HTTP_NOT_IMPLEMENTED, 'Not implemented. Only ajax calls please.');
$this->addressService->delete($address);
return response(null, Response::HTTP_NO_CONTENT);
}
/**
* @return mixed
*/
public function accountAddress(Request $request) {
$this->authorize('get_account_address', Address::class);
/** @var SiteUserInterface $siteUser */
if(!$request->ajax()) return $siteUser->accountAddress()->first();
$siteUser = Auth::user();
$accountAddress = $siteUser->accountAddress()->first();
if(!$accountAddress) return response(null, Response::HTTP_NO_CONTENT);
return new AddressResource($accountAddress);
}
/**
* @param Request $request
* @param Address $address
*
* @return View|Response
*/
public function markAddressAsShippingAddress(Request $request, Address $address) {
$this->authorize('mark_as_shipping_address', $address);
/** @var SiteUser $siteUser */
$siteUser = Auth::user();
$siteUser->shippingAddress()->associate($address);
$siteUser->save();
if($request->ajax()) return response($address, Response::HTTP_OK);
return $this->render();
}
/**
* @param Request $request
*
* @return View|Response
*/
public function clearShippingAddress(Request $request) {
/** @var SiteUser $siteUser */
$siteUser = Auth::user();
$siteUser->shippingAddress()->dissociate();
$siteUser->save();
if($request->ajax()) return response(null, Response::HTTP_NO_CONTENT);
return $this->render();
}
/**
* @param Request $request
* @param Address $address
*/
public function markAddressAsInvoiceAddress(Request $request, Address $address) {
$this->authorize('mark_as_invoice_address', $address);
/** @var SiteUser $siteUser */
$siteUser = Auth::user();
$siteUser->invoiceAddress()->associate($address);
$siteUser->save();
if($request->ajax()) return response($address, Response::HTTP_OK);
return $this->render();
}
/**
* @param Request $request
* @param Address $address
*/
public function clearInvoiceAddress(Request $request) {
/** @var SiteUser $siteUser */
$siteUser = Auth::user();
$siteUser->invoiceAddress()->dissociate();
$siteUser->save();
if($request->ajax()) return response(null, Response::HTTP_NO_CONTENT);
return $this->render();
}
/**
* @param Request $request
* @return Address|Response|AddressResource|null
*/
public function shippingAddress(Request $request) {
/** @var SiteUser $siteUser */
if(!$request->ajax()) abort(Response::HTTP_NOT_IMPLEMENTED, 'Only ajax requests please');
$siteUser = Auth::user();
$shippingAddress = $siteUser->shippingAddress()->first();
if(!$shippingAddress) return response(null, Response::HTTP_NO_CONTENT);
return new AddressResource($shippingAddress);
}
/**
* @param Request $request
* @return Address|Response|AddressResource|null
*/
public function orderShippingAddress(Request $request) {
/** @var SiteUser $siteUser */
if(!$request->ajax()) abort(Response::HTTP_NOT_IMPLEMENTED, 'Only ajax requests please');
$shippingAddress = (new CheckoutService())->getShippingAddress();
if(!$shippingAddress) return response(null, Response::HTTP_NO_CONTENT);
return new AddressResource($shippingAddress);
}
/**
* @param Request $request
*
* @return Address|Response|AddressResource|null
*/
public function invoiceAddress(Request $request) {
/** @var SiteUser $siteUser */
if(!$request->ajax()) abort(Response::HTTP_NOT_IMPLEMENTED, 'Only ajax requests please');
$siteUser = Auth::user();
$invoiceAddress = $siteUser->invoiceAddress()->first();
if(!$invoiceAddress) return response(null, Response::HTTP_NO_CONTENT);
return new AddressResource($invoiceAddress);
}
/**
* @param Request $request
* @return Address|Response|AddressResource|null
*/
public function orderInvoiceAddress(Request $request) {
/** @var SiteUser $siteUser */
if(!$request->ajax()) abort(Response::HTTP_NOT_IMPLEMENTED, 'Only ajax requests please');
$invoiceAddress = (new CheckoutService())->getInvoiceAddress();
if(!$invoiceAddress) return response(null, Response::HTTP_NO_CONTENT);
return new AddressResource($invoiceAddress);
}
/**
* @return View
*/
protected function render() {
return view('organisms/my_account/addresses', [
'account_address' => Auth::user()->accountAddress()->first() ?? null,
'user' => Auth::user(),
'links' => $this->links,
]);
}
}