Changeset View
Changeset View
Standalone View
Standalone View
src/app/Http/Controllers/API/V4/SharedFoldersController.php
<?php | <?php | ||||
namespace App\Http\Controllers\API\V4; | namespace App\Http\Controllers\API\V4; | ||||
use App\Http\Controllers\Controller; | use App\Http\Controllers\RelationController; | ||||
use App\SharedFolder; | use App\SharedFolder; | ||||
use App\Rules\SharedFolderName; | use App\Rules\SharedFolderName; | ||||
use App\Rules\SharedFolderType; | use App\Rules\SharedFolderType; | ||||
use Illuminate\Http\Request; | use Illuminate\Http\Request; | ||||
use Illuminate\Support\Facades\DB; | use Illuminate\Support\Facades\DB; | ||||
use Illuminate\Support\Facades\Validator; | use Illuminate\Support\Facades\Validator; | ||||
class SharedFoldersController extends Controller | class SharedFoldersController extends RelationController | ||||
{ | { | ||||
/** @var array Common object properties in the API response */ | /** @var string Resource localization label */ | ||||
protected static $objectProps = ['email', 'name', 'type']; | protected $label = 'shared-folder'; | ||||
/** | /** @var string Resource model name */ | ||||
* Show the form for creating a new shared folder. | protected $model = SharedFolder::class; | ||||
* | |||||
* @return \Illuminate\Http\JsonResponse | |||||
*/ | |||||
public function create() | |||||
{ | |||||
return $this->errorResponse(404); | |||||
} | |||||
/** | /** @var array Resource listing order (column names) */ | ||||
* Delete a shared folder. | protected $order = ['name']; | ||||
* | |||||
* @param int $id Shared folder identifier | |||||
* | |||||
* @return \Illuminate\Http\JsonResponse The response | |||||
*/ | |||||
public function destroy($id) | |||||
{ | |||||
$folder = SharedFolder::find($id); | |||||
if (!$this->checkTenant($folder)) { | /** @var array Common object properties in the API response */ | ||||
return $this->errorResponse(404); | protected $objectProps = ['email', 'name', 'type']; | ||||
} | |||||
if (!$this->guard()->user()->canDelete($folder)) { | |||||
return $this->errorResponse(403); | |||||
} | |||||
$folder->delete(); | |||||
return response()->json([ | |||||
'status' => 'success', | |||||
'message' => \trans('app.shared-folder-delete-success'), | |||||
]); | |||||
} | |||||
/** | |||||
* Show the form for editing the specified shared folder. | |||||
* | |||||
* @param int $id Shared folder identifier | |||||
* | |||||
* @return \Illuminate\Http\JsonResponse | |||||
*/ | |||||
public function edit($id) | |||||
{ | |||||
return $this->errorResponse(404); | |||||
} | |||||
/** | |||||
* Listing of a shared folders belonging to the authenticated user. | |||||
* | |||||
* The shared-folder entitlements billed to the current user wallet(s) | |||||
* | |||||
* @return \Illuminate\Http\JsonResponse | |||||
*/ | |||||
public function index() | |||||
{ | |||||
$user = $this->guard()->user(); | |||||
$result = $user->sharedFolders()->orderBy('name')->get() | |||||
->map(function (SharedFolder $folder) { | |||||
return $this->objectToClient($folder); | |||||
}); | |||||
return response()->json($result); | |||||
} | |||||
/** | |||||
* Set the shared folder configuration. | |||||
* | |||||
* @param int $id Shared folder identifier | |||||
* | |||||
* @return \Illuminate\Http\JsonResponse|void | |||||
*/ | |||||
public function setConfig($id) | |||||
{ | |||||
$folder = SharedFolder::find($id); | |||||
if (!$this->checkTenant($folder)) { | |||||
return $this->errorResponse(404); | |||||
} | |||||
if (!$this->guard()->user()->canUpdate($folder)) { | |||||
return $this->errorResponse(403); | |||||
} | |||||
$errors = $folder->setConfig(request()->input()); | |||||
if (!empty($errors)) { | |||||
return response()->json(['status' => 'error', 'errors' => $errors], 422); | |||||
} | |||||
return response()->json([ | |||||
'status' => 'success', | |||||
'message' => \trans('app.shared-folder-setconfig-success'), | |||||
]); | |||||
} | |||||
/** | |||||
* Display information of a shared folder specified by $id. | |||||
* | |||||
* @param int $id Shared folder identifier | |||||
* | |||||
* @return \Illuminate\Http\JsonResponse | |||||
*/ | |||||
public function show($id) | |||||
{ | |||||
$folder = SharedFolder::find($id); | |||||
if (!$this->checkTenant($folder)) { | |||||
return $this->errorResponse(404); | |||||
} | |||||
if (!$this->guard()->user()->canRead($folder)) { | |||||
return $this->errorResponse(403); | |||||
} | |||||
$response = $this->objectToClient($folder, true); | |||||
$response['statusInfo'] = self::statusInfo($folder); | |||||
// Shared folder configuration, e.g. acl | |||||
$response['config'] = $folder->getConfig(); | |||||
return response()->json($response); | |||||
} | |||||
/** | /** | ||||
* Fetch a shared folder status (and reload setup process) | * Prepare shared folder statuses for the UI | ||||
* | * | ||||
* @param int $id Shared folder identifier | * @param \App\SharedFolder $folder Shared folder object | ||||
* | * | ||||
* @return \Illuminate\Http\JsonResponse | * @return array Statuses array | ||||
*/ | */ | ||||
public function status($id) | protected static function objectState($folder): array | ||||
{ | { | ||||
$folder = SharedFolder::find($id); | return [ | ||||
'isLdapReady' => $folder->isLdapReady(), | |||||
if (!$this->checkTenant($folder)) { | 'isImapReady' => $folder->isImapReady(), | ||||
return $this->errorResponse(404); | 'isActive' => $folder->isActive(), | ||||
} | 'isDeleted' => $folder->isDeleted() || $folder->trashed(), | ||||
]; | |||||
if (!$this->guard()->user()->canRead($folder)) { | |||||
return $this->errorResponse(403); | |||||
} | |||||
$response = $this->processStateUpdate($folder); | |||||
$response = array_merge($response, self::objectState($folder)); | |||||
return response()->json($response); | |||||
} | } | ||||
/** | /** | ||||
* SharedFolder status (extended) information | * SharedFolder status (extended) information | ||||
* | * | ||||
* @param \App\SharedFolder $folder SharedFolder object | * @param \App\SharedFolder $folder SharedFolder object | ||||
* | * | ||||
* @return array Status information | * @return array Status information | ||||
*/ | */ | ||||
public static function statusInfo(SharedFolder $folder): array | public static function statusInfo($folder): array | ||||
{ | { | ||||
return self::processStateInfo( | return self::processStateInfo( | ||||
$folder, | $folder, | ||||
[ | [ | ||||
'shared-folder-new' => true, | 'shared-folder-new' => true, | ||||
'shared-folder-ldap-ready' => $folder->isLdapReady(), | 'shared-folder-ldap-ready' => $folder->isLdapReady(), | ||||
'shared-folder-imap-ready' => $folder->isImapReady(), | 'shared-folder-imap-ready' => $folder->isImapReady(), | ||||
] | ] | ||||
▲ Show 20 Lines • Show All 145 Lines • ▼ Show 20 Lines | public static function execProcessStep(SharedFolder $folder, string $step): ?bool | ||||
return $folder->isImapReady(); | return $folder->isImapReady(); | ||||
} | } | ||||
} catch (\Exception $e) { | } catch (\Exception $e) { | ||||
\Log::error($e); | \Log::error($e); | ||||
} | } | ||||
return false; | return false; | ||||
} | } | ||||
/** | |||||
* Prepare shared folder statuses for the UI | |||||
* | |||||
* @param \App\SharedFolder $folder Shared folder object | |||||
* | |||||
* @return array Statuses array | |||||
*/ | |||||
protected static function objectState(SharedFolder $folder): array | |||||
{ | |||||
return [ | |||||
'isLdapReady' => $folder->isLdapReady(), | |||||
'isImapReady' => $folder->isImapReady(), | |||||
'isActive' => $folder->isActive(), | |||||
'isDeleted' => $folder->isDeleted() || $folder->trashed(), | |||||
]; | |||||
} | |||||
} | } |