Changeset View
Changeset View
Standalone View
Standalone View
src/app/Http/Controllers/API/V4/Admin/UsersController.php
<?php | <?php | ||||
namespace App\Http\Controllers\API\V4\Admin; | namespace App\Http\Controllers\API\V4\Admin; | ||||
use App\Domain; | use App\Domain; | ||||
use App\Group; | use App\Group; | ||||
use App\Sku; | use App\Sku; | ||||
use App\User; | use App\User; | ||||
use App\UserAlias; | use App\UserAlias; | ||||
use App\UserSetting; | use App\UserSetting; | ||||
use App\Wallet; | |||||
use Illuminate\Http\Request; | use Illuminate\Http\Request; | ||||
use Illuminate\Support\Facades\Validator; | use Illuminate\Support\Facades\Validator; | ||||
class UsersController extends \App\Http\Controllers\API\V4\UsersController | class UsersController extends \App\Http\Controllers\API\V4\UsersController | ||||
{ | { | ||||
/** | /** | ||||
* Delete a user. | * Delete a user. | ||||
* | * | ||||
Show All 13 Lines | class UsersController extends \App\Http\Controllers\API\V4\UsersController | ||||
*/ | */ | ||||
public function index() | public function index() | ||||
{ | { | ||||
$search = trim(request()->input('search')); | $search = trim(request()->input('search')); | ||||
$owner = trim(request()->input('owner')); | $owner = trim(request()->input('owner')); | ||||
$result = collect([]); | $result = collect([]); | ||||
if ($owner) { | if ($owner) { | ||||
$owner = User::where('id', $owner) | $owner = User::find($owner); | ||||
->withEnvTenant() | |||||
->whereNull('role') | |||||
->first(); | |||||
if ($owner) { | if ($owner) { | ||||
$result = $owner->users(false)->whereNull('role')->orderBy('email')->get(); | $result = $owner->users(false)->orderBy('email')->get(); | ||||
} | } | ||||
} elseif (strpos($search, '@')) { | } elseif (strpos($search, '@')) { | ||||
// Search by email | // Search by email | ||||
$result = User::withTrashed()->where('email', $search) | $result = User::withTrashed()->where('email', $search) | ||||
->withEnvTenant() | |||||
->whereNull('role') | |||||
->orderBy('email') | ->orderBy('email') | ||||
->get(); | ->get(); | ||||
if ($result->isEmpty()) { | if ($result->isEmpty()) { | ||||
// Search by an alias | // Search by an alias | ||||
$user_ids = UserAlias::where('alias', $search)->get()->pluck('user_id'); | $user_ids = UserAlias::where('alias', $search)->get()->pluck('user_id'); | ||||
// Search by an external email | // Search by an external email | ||||
$ext_user_ids = UserSetting::where('key', 'external_email') | $ext_user_ids = UserSetting::where('key', 'external_email') | ||||
->where('value', $search) | ->where('value', $search) | ||||
->get() | ->get() | ||||
->pluck('user_id'); | ->pluck('user_id'); | ||||
$user_ids = $user_ids->merge($ext_user_ids)->unique(); | $user_ids = $user_ids->merge($ext_user_ids)->unique(); | ||||
// Search by a distribution list email | // Search by a distribution list email | ||||
if ($group = Group::withTrashed()->where('email', $search)->first()) { | if ($group = Group::withTrashed()->where('email', $search)->first()) { | ||||
$user_ids = $user_ids->merge([$group->wallet()->user_id])->unique(); | $user_ids = $user_ids->merge([$group->wallet()->user_id])->unique(); | ||||
} | } | ||||
if (!$user_ids->isEmpty()) { | if (!$user_ids->isEmpty()) { | ||||
$result = User::withTrashed()->whereIn('id', $user_ids) | $result = User::withTrashed()->whereIn('id', $user_ids) | ||||
->withEnvTenant() | |||||
->whereNull('role') | |||||
->orderBy('email') | ->orderBy('email') | ||||
->get(); | ->get(); | ||||
} | } | ||||
} | } | ||||
} elseif (is_numeric($search)) { | } elseif (is_numeric($search)) { | ||||
// Search by user ID | // Search by user ID | ||||
$user = User::withTrashed()->where('id', $search) | $user = User::withTrashed()->where('id', $search) | ||||
->withEnvTenant() | |||||
->whereNull('role') | |||||
->first(); | ->first(); | ||||
if ($user) { | if ($user) { | ||||
$result->push($user); | $result->push($user); | ||||
} | } | ||||
} elseif (!empty($search)) { | } elseif (strpos($search, '.') !== false) { | ||||
// Search by domain | // Search by domain | ||||
$domain = Domain::withTrashed()->where('namespace', $search) | $domain = Domain::withTrashed()->where('namespace', $search) | ||||
->withEnvTenant() | |||||
->first(); | ->first(); | ||||
if ($domain) { | if ($domain) { | ||||
if ( | if (($wallet = $domain->wallet()) && ($owner = $wallet->owner()->withTrashed()->first())) { | ||||
($wallet = $domain->wallet()) | $result->push($owner); | ||||
&& ($owner = $wallet->owner()->withTrashed()->withEnvTenant()->first()) | } | ||||
&& empty($owner->role) | } | ||||
) { | } elseif (!empty($search)) { | ||||
$wallet = Wallet::find($search); | |||||
if ($wallet) { | |||||
if ($owner = $wallet->owner()->withTrashed()->first()) { | |||||
$result->push($owner); | $result->push($owner); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
// Process the result | // Process the result | ||||
$result = $result->map(function ($user) { | $result = $result->map( | ||||
function ($user) { | |||||
$data = $user->toArray(); | $data = $user->toArray(); | ||||
$data = array_merge($data, self::userStatuses($user)); | $data = array_merge($data, self::userStatuses($user)); | ||||
return $data; | return $data; | ||||
}); | } | ||||
); | |||||
$result = [ | $result = [ | ||||
'list' => $result, | 'list' => $result, | ||||
'count' => count($result), | 'count' => count($result), | ||||
'message' => \trans('app.search-foundxusers', ['x' => count($result)]), | 'message' => \trans('app.search-foundxusers', ['x' => count($result)]), | ||||
]; | ]; | ||||
return response()->json($result); | return response()->json($result); | ||||
} | } | ||||
/** | /** | ||||
* Reset 2-Factor Authentication for the user | * Reset 2-Factor Authentication for the user | ||||
* | * | ||||
* @param \Illuminate\Http\Request $request The API request. | * @param \Illuminate\Http\Request $request The API request. | ||||
* @param string $id User identifier | * @param string $id User identifier | ||||
* | * | ||||
* @return \Illuminate\Http\JsonResponse The response | * @return \Illuminate\Http\JsonResponse The response | ||||
*/ | */ | ||||
public function reset2FA(Request $request, $id) | public function reset2FA(Request $request, $id) | ||||
{ | { | ||||
$user = User::withEnvTenant()->find($id); | $user = User::find($id); | ||||
if (empty($user) || !$this->guard()->user()->canUpdate($user)) { | if (empty($user) || !$this->guard()->user()->canUpdate($user)) { | ||||
return $this->errorResponse(404); | return $this->errorResponse(404); | ||||
} | } | ||||
$sku = Sku::where('title', '2fa')->first(); | $sku = Sku::where('title', '2fa')->first(); | ||||
// Note: we do select first, so the observer can delete | // Note: we do select first, so the observer can delete | ||||
// 2FA preferences from Roundcube database, so don't | // 2FA preferences from Roundcube database, so don't | ||||
// be tempted to replace first() with delete() below | // be tempted to replace first() with delete() below | ||||
$entitlement = $user->entitlements()->where('sku_id', $sku->id)->first(); | $entitlement = $user->entitlements()->where('sku_id', $sku->id)->first(); | ||||
$entitlement->delete(); | $entitlement->delete(); | ||||
return response()->json([ | return response()->json([ | ||||
'status' => 'success', | 'status' => 'success', | ||||
'message' => __('app.user-reset-2fa-success'), | 'message' => __('app.user-reset-2fa-success'), | ||||
]); | ]); | ||||
} | } | ||||
/** | /** | ||||
* Display information on the user account specified by $id. | |||||
* | |||||
* @param int $id The account to show information for. | |||||
* | |||||
* @return \Illuminate\Http\JsonResponse | |||||
*/ | |||||
public function show($id) | |||||
{ | |||||
$user = User::find($id); | |||||
if (empty($user)) { | |||||
return $this->errorResponse(404); | |||||
} | |||||
if (!$this->guard()->user()->canRead($user)) { | |||||
return $this->errorResponse(403); | |||||
} | |||||
$response = $this->userResponse($user); | |||||
// Simplified Entitlement/SKU information, | |||||
// TODO: I agree this format may need to be extended in future | |||||
$response['skus'] = []; | |||||
foreach ($user->entitlements as $ent) { | |||||
$sku = $ent->sku; | |||||
if (!isset($response['skus'][$sku->id])) { | |||||
$response['skus'][$sku->id] = ['costs' => [], 'count' => 0]; | |||||
} | |||||
$response['skus'][$sku->id]['count']++; | |||||
$response['skus'][$sku->id]['costs'][] = $ent->cost; | |||||
} | |||||
return response()->json($response); | |||||
} | |||||
/** | |||||
* Create a new user record. | * Create a new user record. | ||||
* | * | ||||
* @param \Illuminate\Http\Request $request The API request. | * @param \Illuminate\Http\Request $request The API request. | ||||
* | * | ||||
* @return \Illuminate\Http\JsonResponse The response | * @return \Illuminate\Http\JsonResponse The response | ||||
*/ | */ | ||||
public function store(Request $request) | public function store(Request $request) | ||||
{ | { | ||||
return $this->errorResponse(404); | return $this->errorResponse(404); | ||||
} | } | ||||
/** | /** | ||||
* Suspend the user | * Suspend the user | ||||
* | * | ||||
* @param \Illuminate\Http\Request $request The API request. | * @param \Illuminate\Http\Request $request The API request. | ||||
* @param string $id User identifier | * @param string $id User identifier | ||||
* | * | ||||
* @return \Illuminate\Http\JsonResponse The response | * @return \Illuminate\Http\JsonResponse The response | ||||
*/ | */ | ||||
public function suspend(Request $request, $id) | public function suspend(Request $request, $id) | ||||
{ | { | ||||
$user = User::withEnvTenant()->find($id); | $user = User::find($id); | ||||
if (empty($user) || !$this->guard()->user()->canUpdate($user)) { | if (empty($user) || !$this->guard()->user()->canUpdate($user)) { | ||||
return $this->errorResponse(404); | return $this->errorResponse(404); | ||||
} | } | ||||
$user->suspend(); | $user->suspend(); | ||||
return response()->json([ | return response()->json([ | ||||
'status' => 'success', | 'status' => 'success', | ||||
'message' => __('app.user-suspend-success'), | 'message' => __('app.user-suspend-success'), | ||||
]); | ]); | ||||
} | } | ||||
/** | /** | ||||
* Un-Suspend the user | * Un-Suspend the user | ||||
* | * | ||||
* @param \Illuminate\Http\Request $request The API request. | * @param \Illuminate\Http\Request $request The API request. | ||||
* @param string $id User identifier | * @param string $id User identifier | ||||
* | * | ||||
* @return \Illuminate\Http\JsonResponse The response | * @return \Illuminate\Http\JsonResponse The response | ||||
*/ | */ | ||||
public function unsuspend(Request $request, $id) | public function unsuspend(Request $request, $id) | ||||
{ | { | ||||
$user = User::withEnvTenant()->find($id); | $user = User::find($id); | ||||
if (empty($user) || !$this->guard()->user()->canUpdate($user)) { | if (empty($user) || !$this->guard()->user()->canUpdate($user)) { | ||||
return $this->errorResponse(404); | return $this->errorResponse(404); | ||||
} | } | ||||
$user->unsuspend(); | $user->unsuspend(); | ||||
return response()->json([ | return response()->json([ | ||||
'status' => 'success', | 'status' => 'success', | ||||
'message' => __('app.user-unsuspend-success'), | 'message' => __('app.user-unsuspend-success'), | ||||
]); | ]); | ||||
} | } | ||||
/** | /** | ||||
* Update user data. | * Update user data. | ||||
* | * | ||||
* @param \Illuminate\Http\Request $request The API request. | * @param \Illuminate\Http\Request $request The API request. | ||||
* @param string $id User identifier | * @param string $id User identifier | ||||
* | * | ||||
* @return \Illuminate\Http\JsonResponse The response | * @return \Illuminate\Http\JsonResponse The response | ||||
*/ | */ | ||||
public function update(Request $request, $id) | public function update(Request $request, $id) | ||||
{ | { | ||||
$user = User::withEnvTenant()->find($id); | $user = User::find($id); | ||||
if (empty($user) || !$this->guard()->user()->canUpdate($user)) { | if (empty($user) || !$this->guard()->user()->canUpdate($user)) { | ||||
return $this->errorResponse(404); | return $this->errorResponse(404); | ||||
} | } | ||||
// For now admins can change only user external email address | // For now admins can change only user external email address | ||||
$rules = []; | $rules = []; | ||||
Show All 25 Lines |