HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
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,
        ]);
    }
}