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\RelationController; | 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; | ||||
use Illuminate\Support\Str; | |||||
class SharedFoldersController extends RelationController | class SharedFoldersController extends RelationController | ||||
{ | { | ||||
/** @var string Resource localization label */ | /** @var string Resource localization label */ | ||||
protected $label = 'shared-folder'; | protected $label = 'shared-folder'; | ||||
/** @var string Resource model name */ | /** @var string Resource model name */ | ||||
protected $model = SharedFolder::class; | protected $model = SharedFolder::class; | ||||
Show All 29 Lines | class SharedFoldersController extends RelationController | ||||
* | * | ||||
* @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) | ||||
{ | { | ||||
$current_user = $this->guard()->user(); | $current_user = $this->guard()->user(); | ||||
$owner = $current_user->wallet()->owner; | $owner = $current_user->walletOwner(); | ||||
if ($owner->id != $current_user->id) { | if (empty($owner) || $owner->id != $current_user->id) { | ||||
return $this->errorResponse(403); | return $this->errorResponse(403); | ||||
} | } | ||||
$domain = request()->input('domain'); | if ($error_response = $this->validateFolderRequest($request, null, $owner)) { | ||||
return $error_response; | |||||
$rules = [ | |||||
'name' => ['required', 'string', new SharedFolderName($owner, $domain)], | |||||
'type' => ['required', 'string', new SharedFolderType()] | |||||
]; | |||||
$v = Validator::make($request->all(), $rules); | |||||
if ($v->fails()) { | |||||
return response()->json(['status' => 'error', 'errors' => $v->errors()], 422); | |||||
} | } | ||||
DB::beginTransaction(); | DB::beginTransaction(); | ||||
// Create the shared folder | // Create the shared folder | ||||
$folder = new SharedFolder(); | $folder = new SharedFolder(); | ||||
$folder->name = request()->input('name'); | $folder->name = $request->input('name'); | ||||
$folder->type = request()->input('type'); | $folder->type = $request->input('type'); | ||||
$folder->domain = $domain; | $folder->domainName = $request->input('domain'); | ||||
$folder->save(); | $folder->save(); | ||||
if (!empty($request->aliases) && $folder->type === 'mail') { | |||||
$folder->setAliases($request->aliases); | |||||
} | |||||
$folder->assignToWallet($owner->wallets->first()); | $folder->assignToWallet($owner->wallets->first()); | ||||
DB::commit(); | DB::commit(); | ||||
return response()->json([ | return response()->json([ | ||||
'status' => 'success', | 'status' => 'success', | ||||
'message' => \trans('app.shared-folder-create-success'), | 'message' => \trans('app.shared-folder-create-success'), | ||||
]); | ]); | ||||
Show All 16 Lines | public function update(Request $request, $id) | ||||
} | } | ||||
$current_user = $this->guard()->user(); | $current_user = $this->guard()->user(); | ||||
if (!$current_user->canUpdate($folder)) { | if (!$current_user->canUpdate($folder)) { | ||||
return $this->errorResponse(403); | return $this->errorResponse(403); | ||||
} | } | ||||
$owner = $folder->wallet()->owner; | if ($error_response = $this->validateFolderRequest($request, $folder, $folder->walletOwner())) { | ||||
return $error_response; | |||||
} | |||||
$name = $request->input('name'); | $name = $request->input('name'); | ||||
$errors = []; | |||||
// Validate the folder name | |||||
if ($name !== null && $name != $folder->name) { | |||||
$domainName = explode('@', $folder->email, 2)[1]; | |||||
$rules = ['name' => ['required', 'string', new SharedFolderName($owner, $domainName)]]; | |||||
$v = Validator::make($request->all(), $rules); | DB::beginTransaction(); | ||||
if ($v->fails()) { | if ($name && $name != $folder->name) { | ||||
$errors = $v->errors()->toArray(); | |||||
} else { | |||||
$folder->name = $name; | $folder->name = $name; | ||||
} | } | ||||
} | |||||
if (!empty($errors)) { | $folder->save(); | ||||
return response()->json(['status' => 'error', 'errors' => $errors], 422); | |||||
if (isset($request->aliases) && $folder->type === 'mail') { | |||||
$folder->setAliases($request->aliases); | |||||
} | } | ||||
$folder->save(); | DB::commit(); | ||||
return response()->json([ | return response()->json([ | ||||
'status' => 'success', | 'status' => 'success', | ||||
'message' => \trans('app.shared-folder-update-success'), | 'message' => \trans('app.shared-folder-update-success'), | ||||
]); | ]); | ||||
} | } | ||||
/** | /** | ||||
Show All 40 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; | ||||
} | } | ||||
/** | |||||
* Validate shared folder input | |||||
* | |||||
* @param \Illuminate\Http\Request $request The API request. | |||||
* @param \App\SharedFolder|null $folder Shared folder | |||||
* @param \App\User|null $owner Account owner | |||||
* | |||||
* @return \Illuminate\Http\JsonResponse|null The error response on error | |||||
*/ | |||||
protected function validateFolderRequest(Request $request, $folder, $owner) | |||||
{ | |||||
$errors = []; | |||||
if (empty($folder)) { | |||||
$domain = $request->input('domain'); | |||||
$rules = [ | |||||
'name' => ['required', 'string', new SharedFolderName($owner, $domain)], | |||||
'type' => ['required', 'string', new SharedFolderType()], | |||||
]; | |||||
} else { | |||||
// On update validate the folder name (if changed) | |||||
$name = $request->input('name'); | |||||
if ($name !== null && $name != $folder->name) { | |||||
$domain = explode('@', $folder->email, 2)[1]; | |||||
$rules = ['name' => ['required', 'string', new SharedFolderName($owner, $domain)]]; | |||||
} | |||||
} | |||||
if (!empty($rules)) { | |||||
$v = Validator::make($request->all(), $rules); | |||||
if ($v->fails()) { | |||||
$errors = $v->errors()->toArray(); | |||||
} | |||||
} | |||||
// Validate aliases input | |||||
if (isset($request->aliases)) { | |||||
$aliases = []; | |||||
$existing_aliases = $owner->aliases()->get()->pluck('alias')->toArray(); | |||||
foreach ($request->aliases as $idx => $alias) { | |||||
if (is_string($alias) && !empty($alias)) { | |||||
// Alias cannot be the same as the email address | |||||
if (!empty($folder) && Str::lower($alias) == Str::lower($folder->email)) { | |||||
continue; | |||||
} | |||||
// validate new aliases | |||||
if ( | |||||
!in_array($alias, $existing_aliases) | |||||
&& ($error = UsersController::validateAlias($alias, $owner)) | |||||
) { | |||||
if (!isset($errors['aliases'])) { | |||||
$errors['aliases'] = []; | |||||
} | |||||
$errors['aliases'][$idx] = $error; | |||||
continue; | |||||
} | |||||
$aliases[] = $alias; | |||||
} | |||||
} | |||||
$request->aliases = $aliases; | |||||
} | |||||
if (!empty($errors)) { | |||||
return response()->json(['status' => 'error', 'errors' => $errors], 422); | |||||
} | |||||
return null; | |||||
} | |||||
} | } |