email)->first(); if ($user) { return response(['error' => 1, 'message' => 'user already exists'], 409); } $user = User::create([ 'email' => $request->email, 'password' => Hash::make($request->password), 'name' => $request->name, ]); UserRole::create([ 'user_id' => $user->id, 'role_id' => config('hydra.default_user_role_id', 2), ]); return $user; } /** * Authenticate an user and dispatch token. * * @param UserRequest $request * @return Response */ public function login(UserRequest $request) { $user = User::where('email', $request->email)->first(); if (! $user || ! Hash::check($request->password, $user->password)) { return response(['error' => 1, 'message' => 'invalid credentials'], 401); } if (config('hydra.delete_previous_access_tokens_on_login', false)) { $user->tokens()->delete(); } $roles = $user->roles->pluck('slug')->all(); $plainTextToken = $user->createToken('hydra-api-token', $roles)->plainTextToken; return response(['error' => 0, 'id' => $user->id, 'token' => $plainTextToken], 200); } /** * Display the specified resource. * * @param User $user * @return User */ public function show(User $user) { return $user; } /** * Update the specified resource in storage. * * @param Request $request * @param User $user * @return User */ public function update(UserRequest $request, User $user) { $user->name = $request->name ?? $user->name; $user->email = $request->email ?? $user->email; $user->password = $request->password ? Hash::make($request->password) : $user->password; $user->email_verified_at = $request->email_verified_at ?? $user->email_verified_at; //check if the logged in user is updating it's own record $loggedInUser = $request->user(); if ($loggedInUser->id == $user->id) { $user->update(); } elseif ($loggedInUser->tokenCan('admin') || $loggedInUser->tokenCan('super-admin')) { $user->update(); } else { throw new MissingAbilityException('Not Authorized'); } return $user; } /** * Remove the specified resource from storage. * * @param User $user * @return Response */ public function destroy(User $user) { $adminRole = Role::where('slug', 'admin')->first(); $userRoles = $user->roles; if ($userRoles->contains($adminRole)) { //the current user is admin, then if there is only one admin - don't delete $numberOfAdmins = Role::where('slug', 'admin')->first()->users()->count(); if (1 == $numberOfAdmins) { return response(['error' => 1, 'message' => 'Create another admin before deleting this only admin user'], 409); } } $user->delete(); return response(['error' => 0, 'message' => 'user deleted']); } public function me(Request $request) { return $request->user(); } }