%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /var/www/html/shaban/duassis/api/app/Http/Controllers/Api/v1/
Upload File :
Create Path :
Current File : //var/www/html/shaban/duassis/api/app/Http/Controllers/Api/v1/UsersController.php

<?php

namespace App\Http\Controllers\Api\v1;

use App\Http\Controllers\Api\ApiController;
use App\Http\Requests\Api\v1\Users\ChangePasswordRequest;
use App\Http\Requests\Api\v1\Users\CreateUserRequest;
use App\Http\Requests\Api\v1\Users\UpdateAvatarRequest;
use App\Http\Requests\Api\v1\Users\UpdateProfileRequest;
use App\Http\Requests\Api\v1\Users\UpdateUserRequest;
use App\Models\Category;
use App\Models\Role;
use App\Models\Tag;
use App\Models\User;
use App\Transformers\RoleTransformer;
use App\Transformers\UserTransformer;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;

class UsersController extends ApiController
{
    /**
     * User $user.
     */
    protected $user;

    /**
     * PostsController constructor.
     */
    public function __construct()
    {
        $this->user = auth()
            ->guard('api')
            ->user();
    }

    /**
     * @OA\Get(
     *      path="/api/v1/users",
     *      operationId="getUsersList",
     *      tags={"Users"},
     *      summary="Get list of users",
     *      description="Returns list of users",
     *      @OA\Response(
     *          response=200,
     *          description="successful operation"
     *       ),
     *       @OA\Response(response=400, description="Bad request"),
     *       security={
     *           {"api_key_security_example": {}}
     *       }
     *     )
     *
     * Returns list of users
     */
    /**
     * @param Request $request
     * @return UsersController
     */
    public function index(Request $request)
    {
        /** @var LengthAwarePaginator $result */
        $users = User::query();

        if ($category = $request->get('category')) {
            $users = $users->whereHas('categories', function ($q) use ($category) {
                $q->where('category_id', $category);
            });
        }

        $result = $this->filterUsers($request)
                       ->paginate($request->get('perPage'));
        return $this->withPaginated($result, new UserTransformer());
    }

    private function filterUsers(Request $request)
    {
        $result = User::query()
                      ->whereHas('roles', function ($q) {
                          $q->where('name', Role::CLIENT);
                      });

        if ($name = $request->get('display_name')) {
            $result = $result->where('display_name', 'like', "$name%");
        }
        if ($search = $request->get('search')) {
            $result = $result->where('email', 'like', "%$search%")
                             ->orWhere('display_name', 'like', "%$search%");
        }
        return $result;
    }

    /**
     * @OA\Get(
     *      path="/api/v1/users/{id}",
     *      operationId="getUserById",
     *      tags={"Users"},
     *      summary="Get user information",
     *      description="Returns user data",
     *      @OA\Parameter(
     *          name="id",
     *          description="User id",
     *          required=true,
     *          in="path",
     *          @OA\Schema(
     *              type="integer"
     *          )
     *      ),
     *      @OA\Response(
     *          response=200,
     *          description="successful operation"
     *       ),
     *      @OA\Response(response=400, description="Bad request"),
     *      @OA\Response(response=404, description="Resource Not Found"),
     *      security={
     *         {
     *             "oauth2_security_example": {"write:users", "read:users"}
     *         }
     *     },
     * )
     */
    /**
     * @param $id
     * @return UsersController
     */
    public function show($id)
    {
        $user = User::query()
                    ->find($id);
        return $this->item($user, new UserTransformer());
    }

    /**
     * @OA\Post(
     *      path="/api/v1/users",
     *      operationId="createUser",
     *      tags={"Users"},
     *      summary="Create user",
     *      description="Returns 200",
     *      @OA\Parameter(
     *          name="display_name",
     *          description="User Diplay Name",
     *          required=true,
     *          in="query",
     *          @OA\Schema(
     *              type="string"
     *          )
     *      ),
     *      @OA\Parameter(
     *          name="email",
     *          description="User email",
     *          required=true,
     *          in="query",
     *          @OA\Schema(
     *              type="email"
     *          )
     *      ),
     *      @OA\Parameter(
     *          name="password",
     *          description="User password",
     *          required=true,
     *          in="query",
     *          @OA\Schema(
     *              type="string"
     *          )
     *      ),
     *      @OA\Parameter(
     *          name="password_confirmation",
     *          description="User password confirmation",
     *          required=true,
     *          in="query",
     *          @OA\Schema(
     *              type="string"
     *          )
     *      ),
     *      @OA\Response(
     *          response=200,
     *          description="successful operation"
     *       ),
     *      @OA\Response(response=400, description="Bad request"),
     *      @OA\Response(response=404, description="Resource Not Found"),
     *      security={
     *         {
     *             "oauth2_security_example": {"write:users", "read:users"}
     *         }
     *     },
     * )
     * @param CreateUserRequest $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function store(CreateUserRequest $request)
    {
        /** @var User $user */
        $user = User::query()
                    ->create($request->only(['display_name', 'email', 'password']));

        $role = Role::findByName(Role::CLIENT);
        $user->roles()
             ->attach($role);
        return $this->item($user->fresh(), new UserTransformer());
    }

    /**
     * @OA\Put(
     *      path="/api/v1/users/{id}",
     *      operationId="updateUserById",
     *      tags={"Users"},
     *      summary="Update user information",
     *      description="Returns 200",
     *      @OA\Parameter(
     *          name="id",
     *          description="User id",
     *          required=true,
     *          in="path",
     *          @OA\Schema(
     *              type="integer"
     *          )
     *      ),
     *      @OA\Parameter(
     *          name="display_name",
     *          description="User Display Name",
     *          required=true,
     *          in="query",
     *          @OA\Schema(
     *              type="string"
     *          )
     *      ),
     *      @OA\Response(
     *          response=200,
     *          description="successful operation"
     *       ),
     *      @OA\Response(response=400, description="Bad request"),
     *      @OA\Response(response=404, description="Resource Not Found"),
     *      security={
     *         {
     *             "oauth2_security_example": {"write:users", "read:users"}
     *         }
     *     },
     * )
     * @param UpdateUserRequest $request
     * @param $id
     * @return \Illuminate\Http\JsonResponse
     */
    public function update(UpdateUserRequest $request, $id)
    {
        $user = User::query()
                    ->findOrFail($id);
        $user->update($request->only(['display_name']));
        return $this->item($user, new UserTransformer());
    }

    /**
     * @OA\Delete(
     *      path="/api/v1/users/{id}",
     *      operationId="deleteUserById",
     *      tags={"Users"},
     *      summary="Delete user",
     *      description="Returns 204",
     *      @OA\Parameter(
     *          name="id",
     *          description="User id",
     *          required=true,
     *          in="path",
     *          @OA\Schema(
     *              type="integer"
     *          )
     *      ),
     *      @OA\Response(
     *          response=204,
     *          description="successful operation"
     *       ),
     *      @OA\Response(response=400, description="Bad request"),
     *      @OA\Response(response=404, description="Resource Not Found"),
     *      security={
     *         {
     *             "oauth2_security_example": {"write:users", "read:users"}
     *         }
     *     },
     * )
     * @param $id
     * @return array|\Illuminate\Http\JsonResponse
     */
    public function destroy($id)
    {
        /** @var User $user */
        $user = User::query()
                    ->findOrFail($id);
        try {
            $user->delete();
        } catch (\Exception $e) {
            return $this->wrongArguments([
                'message' => 'Not possible to delete this user for the moment, please contact your system admin!',
            ]);
        }
        return [];
    }

    /**
     * @OA\Post(
     *      path="/api/v1/users/{id}/actions/enable",
     *      operationId="enableUserById",
     *      tags={"Users"},
     *      summary="Enable user",
     *      description="Returns 200",
     *      @OA\Parameter(
     *          name="id",
     *          description="User id",
     *          required=true,
     *          in="path",
     *          @OA\Schema(
     *              type="integer"
     *          )
     *      ),
     *      @OA\Response(
     *          response=200,
     *          description="successful operation"
     *       ),
     *      @OA\Response(response=400, description="Bad request"),
     *      @OA\Response(response=404, description="Resource Not Found"),
     *      security={
     *         {
     *             "oauth2_security_example": {"write:users", "read:users"}
     *         }
     *     },
     * )
     * @param CreateUserRequest $request
     * @return \Illuminate\Http\JsonResponse
     */
    /**
     * @param $id
     * @return \Illuminate\Http\JsonResponse
     */
    public function enable($id)
    {
        /** @var User $user */
        $user = User::query()
                    ->findOrFail($id);
        $user->enable();
        // $user->notify(new AccountEnabledNotification());
        return $this->item($user, new UserTransformer);
    }

    /**
     * @OA\Delete(
     *      path="/api/v1/users/{id}/actions/disable",
     *      operationId="disableUserById",
     *      tags={"Users"},
     *      summary="Disable user",
     *      description="Returns 200",
     *      @OA\Parameter(
     *          name="id",
     *          description="User id",
     *          required=true,
     *          in="path",
     *          @OA\Schema(
     *              type="integer"
     *          )
     *      ),
     *      @OA\Response(
     *          response=200,
     *          description="successful operation"
     *       ),
     *      @OA\Response(response=400, description="Bad request"),
     *      @OA\Response(response=404, description="Resource Not Found"),
     *      security={
     *         {
     *             "oauth2_security_example": {"write:users", "read:users"}
     *         }
     *     },
     * )
     * @param CreateUserRequest $request
     * @return \Illuminate\Http\JsonResponse
     */
    /**
     * @param $id
     * @return \Illuminate\Http\JsonResponse
     */
    public function disable($id)
    {
        /** @var User $user */
        $user = User::query()
                    ->findOrFail($id);
        $user->disable();
        // $user->notify(new AccountDisabledNotification());
        return $this->item($user, new UserTransformer);
    }

    /**
     * @OA\Post(
     *      path="/api/v1/changePassword",
     *      operationId="changeLoggedInUserPassword",
     *      tags={"Users"},
     *      summary="Change logged in user's password",
     *      description="Returns user",
     *     @OA\Parameter(
     *          name="password",
     *          description="User password",
     *          required=true,
     *          in="query",
     *          @OA\Schema(
     *              type="string"
     *          )
     *      ),
     *      @OA\Parameter(
     *          name="password_confirmation",
     *          description="User password confirmation",
     *          required=true,
     *          in="query",
     *          @OA\Schema(
     *              type="string"
     *          )
     *      ),
     *      @OA\Response(
     *          response=200,
     *          description="successful operation"
     *       ),
     *       @OA\Response(response=400, description="Bad request"),
     *       security={
     *           {"api_key_security_example": {}}
     *       }
     *     )
     *
     * Returns list of users
     */
    /**
     * @param ChangePasswordRequest $request
     * @param $id
     * @return \Illuminate\Http\JsonResponse
     */
    public function updatePassword(ChangePasswordRequest $request, $id)
    {
        /** @var User $user */
        $user = User::query()
                    ->findOrFail($id);
        $user->updatePassword($request->get('password'));
        return $this->item($user, new UserTransformer);
    }

    /**
     * @OA\Get(
     *      path="/api/v1/users/actions/getRoles",
     *      operationId="getUsersList",
     *      tags={"Users"},
     *      summary="Get list of users",
     *      description="Returns list of users",
     *      @OA\Response(
     *          response=200,
     *          description="successful operation"
     *       ),
     *       @OA\Response(response=400, description="Bad request"),
     *       security={
     *           {"api_key_security_example": {}}
     *       }
     *     )
     *
     * Returns list of users
     */
    public function getRoles()
    {
        return $this->collection(Role::query()
                                     ->get(), new RoleTransformer());
    }

    public function updateProfile(UpdateProfileRequest $request)
    {
        /** @var User $user */
        $user = $this->user;
        $user->display_name = $request->get('display_name');

        $user->save();

        $user->profile()
             ->updateOrInsert(['user_id' => $user->id], [
                 'phone'    => $request->get('profile')["phone"],
                 'birthday' => isset($request->get('profile')["birthday"])
                     ? $request->get('profile')["birthday"]
                     : null,
             ]);

        $user->address()
             ->updateOrInsert(['model_id' => $user->id, 'model_type' => 'User'], [
                 'street'    => $request->get('address')["street"],
                 'latitude'  => isset($request->get('address')["latitude"])
                     ? $request->get('address')["latitude"]
                     : null,
                 'longitude' => isset($request->get('address')["longitude"])
                     ? $request->get('address')["longitude"]
                     : null,
                 'city'      => isset($request->get('address')["city"])
                     ? $request->get('address')["city"]
                     : null,
             ]);

        return $this->item($user, new UserTransformer);
    }

    public function updateAvatar(UpdateAvatarRequest $request)
    {
        try {
            $this->user->setAvatarBase64($request->get('image'));
            return $this->item($this->user->fresh(), new UserTransformer);
        } catch (\Exception $e) {
            return $this->wrongArguments([
                'message' => $e->getMessage(),
            ]);
        }
    }

    public function addCategory(User $user, Category $category)
    {
        $exits = $user->categories()
                      ->where('category_id', $category->id)
                      ->exists();

        if ($exits) {
            return $this->item($user->fresh(), new UserTransformer);
        }
        try {
            $user->categories()
                 ->attach($category);
            return $this->item($user->fresh(), new UserTransformer);
        } catch (\Exception $e) {
            return $this->wrongArguments([
                'message' => $e->getMessage(),
            ]);
        }
    }

    public function deleteCategory(User $user, Category $category)
    {
        try {
            $user->categories()
                 ->detach($category);
            return response()->json([], 204);
        } catch (\Exception $exception) {
            return $this->wrongArguments([
                'message' => $exception->getMessage(),
            ]);
        }
    }

    public function addTag($tag)
    {
        DB::beginTransaction();
        try {
            $tag = Tag::updateOrCreateByName($tag);
            $this->user->tags()
                 ->attach($tag);
            DB::commit();
            return $this->item($this->user->fresh(), new UserTransformer);
        } catch (\Exception $e) {
            DB::rollBack();
            return $this->wrongArguments([
                'message' => $e->getMessage(),
            ]);
        }
    }

    public function removeTag(Tag $tag)
    {
        try {
            $this->user->tags()
                 ->detach($tag);
            return response()->json([], 204);
        } catch (\Exception $exception) {
            return $this->wrongArguments([
                'message' => $exception->getMessage(),
            ]);
        }
    }
}

Zerion Mini Shell 1.0