File "UsersApiController.php"

Full Path: /home/clickysoft/public_html/jmapi5.clickysoft.net/app/Http/Controllers/Api/V1/Admin/UsersApiController.php
File size: 6.58 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\Controllers\Traits\MediaUploadingTrait;
use App\Http\Requests\Admin\StoreUserRequest;
use App\Http\Requests\Admin\UpdateUserRequest;
use App\Http\Resources\Admin\UserEmployeeResource;
use App\Http\Resources\Admin\UserResource;
use App\Http\Resources\Admin\UserResourceWithRoles;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Support\Facades\Gate;
use Illuminate\Auth\Events\Registered;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Symfony\Component\HttpFoundation\Response;

class UsersApiController extends Controller
{
    use MediaUploadingTrait;

    public function index(Request $request)
    {
        abort_if(Gate::denies('user_access'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        $noPaging = $request->get('no_paging') === "true";

        $users = User::when($request->filled('search'), function ($query) use ($request){
            $search = addslashes($request->get('search'));
            $query->whereRaw("name like '%".$search."%' OR email like '%".$search."%' OR phone_number like '%".$search."%' OR secondary_email like '%".$search."%' OR secondary_phone like '%".$search."%' OR company like '%".$search."%' OR fax_number like '%".$search."%'");
        })->when($request->filled('role'), function ($query) use ($request){
            $query->whereHas(
                'roles', function($q) use ($request){
                $q->where('id', $request->get('role'));
            });
        })->where('id', '<>', 1)
            ->where('id', '<>', auth()->id())
            ->with('roles')
            ->orderBy('created_at', 'DESC');

        $users = $noPaging ? $users->get() : $users->paginate(50);

        UserResource::withoutWrapping();
        return UserResource::collection($users);
    }

    public function get_user_types()
    {
        abort_if(Gate::denies('user_access'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        return \response()
            ->json(['data' => User::USER_TYPE_RADIO], Response::HTTP_OK);
    }

    public function get_user_durations()
    {
        abort_if(Gate::denies('user_access'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        return \response()
            ->json(['data' => User::REMINDER_DURATION], Response::HTTP_OK);
    }

    public function get_employees(Request $request)
    {
        abort_if(Gate::denies('user_access'), Response::HTTP_FORBIDDEN, '403 Forbidden');
        $users = User::when($request->filled('name'), function ($query) use ($request){
            $query->where('name', 'like', "%{$request->get('name')}%");
        })
            ->where('user_type', 2)->get();

        UserEmployeeResource::withoutWrapping();
        return UserEmployeeResource::collection($users);
    }

    public function get_customers()
    {
        abort_if(Gate::denies('user_access'), Response::HTTP_FORBIDDEN, '403 Forbidden');
        $users = User::where('user_type', 3)->get();

        UserEmployeeResource::withoutWrapping();
        return UserEmployeeResource::collection($users);
    }

    public function change_status($id)
    {
        abort_if(Gate::denies('user_edit'), Response::HTTP_FORBIDDEN, '403 Forbidden');

        $user = User::findOrFail($id);
        $user->status = !$user->status;
        $user->save();

        return response()
            ->json(['message' => 'Status updated successfully!'], Response::HTTP_OK);
    }

    public function store(StoreUserRequest $request)
    {
        $user = $request->validated();
        $user = User::create($user);
        $user->email_verified_at = now();
        $user->save();
        $user->roles()->sync($request->input('roles', []));
        if ($request->hasFile('profile_image')) {
            $user->addMediaFromRequest('profile_image')
                ->toMediaCollection('profile_image', 'user');
        }

        try {
            event(new Registered($user));
        } catch (\Exception $e) {
            Log::info($e->getMessage());
        }

        return (new UserResource($user))
            ->response()
            ->setStatusCode(Response::HTTP_CREATED);
    }

    public function show(User $user)
    {
        abort_if(Gate::denies('user_show'), Response::HTTP_FORBIDDEN, '403 Forbidden');
        UserResourceWithRoles::withoutWrapping();
        return new UserResourceWithRoles($user->load(['roles']));
    }

    public function update(UpdateUserRequest $request, User $user)
    {
        $user->update([
            'name' => $request->get('name'),
            'email' => $request->get('email'),
            'phone_number' => $request->get('phone_number'),
            'secondary_email' => $request->get('secondary_email'),
            'secondary_phone' => $request->get('secondary_phone'),
            'secondary_name' => $request->get('secondary_name'),
            'company' => $request->get('company'),
            'fax_number' => $request->get('fax_number'),
            'user_type' => $request->get('user_type'),
            'status' => $request->get('status'),
            'reminder_duration' => $request->get('reminder_duration'),
            'sms_notification' => $request->get('sms_notification'),
        ]);

        if ($request->has('password')) {
            $user->update([
                'password' => $request->get('password')
            ]);
        }

        if ($request->has('birth_date')){
            $user->update([
                'birth_date' => Carbon::make($request->get('birth_date')),
            ]);
        }

        $user->roles()->sync($request->input('roles', []));

        if ($request->hasFile('profile_image')) {
            if (!empty($user->profile_image)) {
                $user->profile_image->delete();
            }
            $user->addMediaFromRequest('profile_image')
                ->toMediaCollection('profile_image', 'user');
        }

        return (new UserResource($user))
            ->response()
            ->setStatusCode(Response::HTTP_CREATED);
    }

    public function destroy(User $user)
    {
        abort_if(Gate::denies('user_delete'), Response::HTTP_FORBIDDEN, '403 Forbidden');

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