%PDF- %PDF-
Direktori : /home/graphicd/public_html/vebto/app/Http/Controllers/ |
Current File : /home/graphicd/public_html/vebto/app/Http/Controllers/SharesController.php |
<?php namespace App\Http\Controllers; use App; use App\FileEntry; use App\Notifications\FileEntrySharedNotif; use App\Services\Shares\AttachUsersToEntry; use App\Services\Shares\DetachUsersFromEntries; use App\Services\Shares\GetUsersWithAccessToEntry; use App\ShareableLink; use App\User; use Auth; use Common\Core\BaseController; use Common\Files\Traits\LoadsAllChildEntries; use Common\Settings\Settings; use Common\Validation\Validators\EmailsAreValid; use DB; use Exception; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Http\Response; use Notification; class SharesController extends BaseController { use LoadsAllChildEntries; /** * @var Request */ private $request; /** * @var Settings */ private $settings; /** * @param Request $request * @param Settings $settings */ public function __construct(Request $request, Settings $settings) { $this->request = $request; $this->settings = $settings; } /** * Import entry into current user's drive using specified shareable link. * * @param int $linkId * @param AttachUsersToEntry $action * @param ShareableLink $linkModel * @return JsonResponse */ public function addCurrentUser($linkId, AttachUsersToEntry $action, ShareableLink $linkModel) { /* @var ShareableLink $link */ $link = $linkModel->with('entry')->findOrFail($linkId); $this->authorize('show', [$link->entry, $link]); $permissions = [ 'view' => true, 'edit' => $link->allow_edit, 'download' => $link->allow_download, ]; $action->execute( [$this->request->user()->email], [$link->entry_id], $permissions ); $users = app(GetUsersWithAccessToEntry::class) ->execute($link->entry_id); return $this->success(['users' => $users]); } /** * Share drive entries with specified users. * * @param AttachUsersToEntry $action * @return Response */ public function addUsers(AttachUsersToEntry $action) { $entryIds = $this->request->get('entryIds'); $shareeEmails = $this->request->get('emails'); $this->authorize('update', [FileEntry::class, $entryIds]); // TODO: refactor messages into custom validator, so can reuse elsewhere $emails = $this->request->get('emails', []); $messages = []; foreach ($emails as $key => $email) { $messages["emails.$key"] = $email; } $this->validate($this->request, [ 'emails' => ['required', 'min:1', new EmailsAreValid()], 'permissions' => 'required|array', 'entryIds' => 'required|min:1', 'entryIds.*' => 'required|integer', ], [], $messages); $sharees = $action->execute( $shareeEmails, $entryIds, $this->request->get('permissions') ); if ($this->settings->get('drive.send_share_notification')) { try { Notification::send($sharees, new FileEntrySharedNotif($entryIds, Auth::user())); } catch (Exception $e) { // } } $users = app(GetUsersWithAccessToEntry::class) ->execute(head($entryIds)); return $this->success(['users' => $users]); } public function changePermissions(int $memberId) { $this->request->validate([ 'permissions' => 'required|array', 'entryIds' => 'required|array', ]); $entryIds = $this->request->get('entryIds'); $this->authorize('update', [FileEntry::class, $entryIds]); DB::table('file_entry_models') ->where('model_id', $memberId) ->where('model_type', User::class) ->whereIn('file_entry_id', $this->loadChildEntries($entryIds)->pluck('id')) ->update(['permissions' => json_encode($this->request->get('permissions'))]); $users = app(GetUsersWithAccessToEntry::class) ->execute(head($entryIds)); return $this->success(['users' => $users]); } /** * Detach user from specified entries. * * @param int $userId * @param DetachUsersFromEntries $action * @return JsonResponse */ public function removeUser($userId, DetachUsersFromEntries $action) { $entryIds = $this->request->get('entryIds'); // there's no need to authorize if user is // trying to remove himself from the entry if ((int) $userId !== $this->request->user()->id) { $this->authorize('update', [FileEntry::class, $entryIds]); } $action->execute(collect($entryIds), collect([$userId])); $users = app(GetUsersWithAccessToEntry::class) ->execute(head($entryIds)); return $this->success(['users' => $users]); } }