File "AddressBookApiController.php"

Full Path: /home/clickysoft/public_html/jmapi5.clickysoft.net/app/Http/Controllers/Api/V1/Admin/AddressBookApiController.php
File size: 4.27 KB
MIME-type: text/x-php
Charset: utf-8

<?php

namespace App\Http\Controllers\Api\V1\Admin;

use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\StoreAddressBookRequest;
use App\Http\Requests\Admin\UpdateAddressBookRequest;
use App\Http\Resources\Admin\AddressBookResource;
use App\Http\Resources\Admin\AddressBookSpecificResource;
use App\Http\Resources\Admin\AddressBookUserResource;
use App\Models\AddressBook;
use Gate;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class AddressBookApiController extends Controller
{
    public function index(Request $request)
    {
        $search = addslashes($request->get('search'));
        $userId = (int)$request->get('user_id');

        abort_if(Gate::denies('address_book_access'), Response::HTTP_FORBIDDEN, '403 Forbidden');
        $address_books = AddressBook::selectRaw("address_books.*, users.id as userId, users.name as user_name, state_sales_taxes.name as state_name")
        ->leftJoin("users", "address_books.user_id", "users.id")
        ->leftJoin("state_sales_taxes", "address_books.state_id", "state_sales_taxes.id")
        ->when($request->filled('search'), function ($query) use ($search) {
            $query->whereRaw("(users.name like '%".$search."%' OR address_books.company_name like '%".$search."%' OR address_books.address_line_1 like '%".$search."%' OR address_books.address_line_2 like '%".$search."%' OR state_sales_taxes.name like '%".$search."%' OR address_books.city like '%".$search."%')");
        })->orderBy('created_at', 'DESC');
        $address_books = $userId > 0 ? $address_books->where('user_id', $userId)->get() : $address_books->paginate(50);

        AddressBookResource::withoutWrapping();
        return AddressBookResource::collection($address_books);
    }

    public function get_user_address(Request $request, $user_id)
    {
        abort_if(Gate::denies('address_book_access'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        $request->validate([
            'user_id' => 'required,exists:users,id'
        ]);
        $address_books = AddressBook::where('user_id', $user_id)
            ->with(['user'])->orderBy('created_at', 'DESC')->get();

        AddressBookResource::withoutWrapping();
        return AddressBookResource::collection($address_books);
    }

    public function my_addresses()
    {
        AddressBookUserResource::withoutWrapping();
        return AddressBookUserResource::collection(auth()->user()->userAddressBooks);
    }

    public function store(StoreAddressBookRequest $request)
    {
        if (auth()->user()->user_type != 1) $request->merge(['user_id' => auth()->id()]);
        $addressBook = AddressBook::create($request->all());

        return (new AddressBookResource($addressBook))
            ->response()
            ->setStatusCode(Response::HTTP_CREATED);
    }

    public function show(AddressBook $addressBook)
    {
        abort_if(Gate::denies('update-record', $addressBook) &&
            Gate::denies('address_book_show'),
            Response::HTTP_FORBIDDEN, '403 Forbidden');

        return new AddressBookSpecificResource($addressBook->load(['user']));
    }

    public function update(UpdateAddressBookRequest $request, AddressBook $addressBook)
    {
        if (auth()->user()->user_type != 1) $request->merge(['user_id' => auth()->id()]);
        $addressBook->update($request->all());

        return (new AddressBookResource($addressBook))
            ->response()
            ->setStatusCode(Response::HTTP_CREATED);
    }

    public function destroy(AddressBook $addressBook)
    {
        abort_if(Gate::denies('update-record', $addressBook) &&
            Gate::denies('address_book_delete'),
            Response::HTTP_FORBIDDEN, '403 Forbidden');

        try {
            $addressBook->delete();
            return response()
                ->json(['message' => 'Address book deleted successfully'], Response::HTTP_OK);
        }catch (\Exception $e){
            \Log::channel('db_errors')->info('Record Deletion Error : Address Book -> '.$addressBook->id);
            \Log::channel('db_errors')->info($e->getMessage());
            return response()
                ->json([
                    'message' => "Record not deleted.",
                    'errors' => ["error" => ["Unable to delete address book."]]
                ], Response::HTTP_INTERNAL_SERVER_ERROR);
        }
    }
}