From 4250e58370a22dbead2aaf16a260c68d8ea6f89b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=8Carodej?= Date: Wed, 4 May 2022 10:17:36 +0200 Subject: [PATCH] teams api update --- src/App/Exceptions/Handler.php | 2 +- .../Account/UpdatePasswordController.php | 2 +- .../AccountAccessTokenController.php | 8 +-- .../Authentication/RegisterUserController.php | 2 +- .../FlushUserNotificationsController.php | 2 +- .../MarkUserNotificationsAsReadController.php | 4 +- .../Controllers/PingAPIController.php | 9 ++-- .../ConvertFolderIntoTeamFolderController.php | 18 ++++--- .../Controllers/InvitationsController.php | 54 +++++++++++++++---- .../Controllers/LeaveTeamFolderController.php | 20 ++++--- .../Controllers/NavigationTreeController.php | 8 +-- .../Controllers/TeamFoldersController.php | 48 +++++++++++------ .../Teams/Models/TeamFolderInvitation.php | 1 + .../Requests/ConvertIntoTeamFolderRequest.php | 5 +- .../Requests/CreateTeamFolderRequest.php | 7 ++- .../UpdateTeamFolderMembersRequest.php | 9 +++- .../CreateUploadRequestController.php | 4 +- 17 files changed, 139 insertions(+), 64 deletions(-) diff --git a/src/App/Exceptions/Handler.php b/src/App/Exceptions/Handler.php index d79b6cd1..3326bede 100644 --- a/src/App/Exceptions/Handler.php +++ b/src/App/Exceptions/Handler.php @@ -52,7 +52,7 @@ class Handler extends ExceptionHandler if ($exception instanceof ModelNotFoundException) { if (in_array('application/json', $request->getAcceptableContentTypes())) { return response()->json([ - 'type' => 'error', + 'type' => 'error', 'message' => "We couldn't find your requested item.", ], 404); } diff --git a/src/App/Users/Controllers/Account/UpdatePasswordController.php b/src/App/Users/Controllers/Account/UpdatePasswordController.php index 3aba017d..a4d0ea0d 100644 --- a/src/App/Users/Controllers/Account/UpdatePasswordController.php +++ b/src/App/Users/Controllers/Account/UpdatePasswordController.php @@ -12,7 +12,7 @@ class UpdatePasswordController extends Controller ): JsonResponse { $successMessage = [ 'type' => 'success', - 'message' => "The password was successfully changed.", + 'message' => 'The password was successfully changed.', ]; if (isDemoAccount()) { diff --git a/src/App/Users/Controllers/Authentication/AccountAccessTokenController.php b/src/App/Users/Controllers/Authentication/AccountAccessTokenController.php index b88ad4e0..3121e6ab 100644 --- a/src/App/Users/Controllers/Authentication/AccountAccessTokenController.php +++ b/src/App/Users/Controllers/Authentication/AccountAccessTokenController.php @@ -1,9 +1,9 @@ json([ - 'plainTextToken' => Str::random(40) + 'plainTextToken' => Str::random(40), ], 201); } @@ -45,7 +45,7 @@ class AccountAccessTokenController extends Controller { $successMessage = [ 'type' => 'success', - 'message' => "The token was successfully deleted.", + 'message' => 'The token was successfully deleted.', ]; if (isDemoAccount()) { @@ -55,7 +55,7 @@ class AccountAccessTokenController extends Controller if (Auth::id() !== $token->tokenable_id) { return response()->json([ 'type' => 'error', - 'message' => "You are not entitled to delete this token.", + 'message' => 'You are not entitled to delete this token.', ], 401); } diff --git a/src/App/Users/Controllers/Authentication/RegisterUserController.php b/src/App/Users/Controllers/Authentication/RegisterUserController.php index c8479b6f..f3652260 100644 --- a/src/App/Users/Controllers/Authentication/RegisterUserController.php +++ b/src/App/Users/Controllers/Authentication/RegisterUserController.php @@ -2,11 +2,11 @@ namespace App\Users\Controllers\Authentication; use App\Users\DTO\CreateUserData; +use Illuminate\Http\JsonResponse; use App\Http\Controllers\Controller; use App\Users\Actions\CreateNewUserAction; use App\Users\Requests\RegisterUserRequest; use Illuminate\Contracts\Auth\StatefulGuard; -use Illuminate\Http\JsonResponse; use VueFileManager\Subscription\Domain\Plans\Exceptions\MeteredBillingPlanDoesntExist; class RegisterUserController extends Controller diff --git a/src/Domain/Notifications/Controllers/FlushUserNotificationsController.php b/src/Domain/Notifications/Controllers/FlushUserNotificationsController.php index 2e993e2c..27e20380 100644 --- a/src/Domain/Notifications/Controllers/FlushUserNotificationsController.php +++ b/src/Domain/Notifications/Controllers/FlushUserNotificationsController.php @@ -9,7 +9,7 @@ class FlushUserNotificationsController extends Controller public function __invoke(): JsonResponse { $successMessage = [ - 'type' => 'success', + 'type' => 'success', 'message' => 'All your notifications was deleted.', ]; diff --git a/src/Domain/Notifications/Controllers/MarkUserNotificationsAsReadController.php b/src/Domain/Notifications/Controllers/MarkUserNotificationsAsReadController.php index cbab0fc4..f6d0b2f0 100644 --- a/src/Domain/Notifications/Controllers/MarkUserNotificationsAsReadController.php +++ b/src/Domain/Notifications/Controllers/MarkUserNotificationsAsReadController.php @@ -9,7 +9,7 @@ class MarkUserNotificationsAsReadController extends Controller public function __invoke(): JsonResponse { $successMessage = [ - 'type' => 'success', + 'type' => 'success', 'message' => 'All your notifications was marked as read.', ]; @@ -19,7 +19,7 @@ class MarkUserNotificationsAsReadController extends Controller // Mark all notifications as read auth()->user()->unreadNotifications()->update([ - 'read_at' => now() + 'read_at' => now(), ]); return response()->json($successMessage); diff --git a/src/Domain/SetupWizard/Controllers/PingAPIController.php b/src/Domain/SetupWizard/Controllers/PingAPIController.php index 24360e57..b54d9e3d 100644 --- a/src/Domain/SetupWizard/Controllers/PingAPIController.php +++ b/src/Domain/SetupWizard/Controllers/PingAPIController.php @@ -1,13 +1,16 @@ json([ + 'type' => 'success', + 'message' => 'pong', + ]); } } diff --git a/src/Domain/Teams/Controllers/ConvertFolderIntoTeamFolderController.php b/src/Domain/Teams/Controllers/ConvertFolderIntoTeamFolderController.php index 63a582fb..f5bdf6c8 100644 --- a/src/Domain/Teams/Controllers/ConvertFolderIntoTeamFolderController.php +++ b/src/Domain/Teams/Controllers/ConvertFolderIntoTeamFolderController.php @@ -1,11 +1,12 @@ json(new FolderResource($folder), 201); } // Check if user didn't exceed max team members limit if (! $folder->user->canInviteTeamMembers($request->input('invitations'))) { - return response([ + return response()->json([ 'type' => 'error', 'message' => 'You exceed your members limit.', ], 401); @@ -37,7 +41,7 @@ class ConvertFolderIntoTeamFolderController extends Controller // Update root team folder $folder->update([ - 'team_folder' => 1, + 'team_folder' => true, 'parent_id' => null, ]); @@ -54,6 +58,6 @@ class ConvertFolderIntoTeamFolderController extends Controller // Invite team members ($this->inviteMembers)($request->input('invitations'), $folder); - return response($folder, 201); + return response()->json(new FolderResource($folder), 201); } } diff --git a/src/Domain/Teams/Controllers/InvitationsController.php b/src/Domain/Teams/Controllers/InvitationsController.php index c5313f32..75c54b8f 100644 --- a/src/Domain/Teams/Controllers/InvitationsController.php +++ b/src/Domain/Teams/Controllers/InvitationsController.php @@ -2,35 +2,53 @@ namespace Domain\Teams\Controllers; use App\Users\Models\User; -use Illuminate\Http\Response; +use Illuminate\Http\JsonResponse; use App\Http\Controllers\Controller; use Domain\Teams\Models\TeamFolderMember; use Domain\Teams\Models\TeamFolderInvitation; -use Illuminate\Contracts\Routing\ResponseFactory; use Domain\Teams\Resources\TeamInvitationResource; use Domain\Teams\Actions\ClearActionInInvitationNotificationAction; class InvitationsController extends Controller { - public function show(TeamFolderInvitation $invitation) + public function show(TeamFolderInvitation $invitation): JsonResponse { + // Check if invitation is not pending if ($invitation->status !== 'pending') { - abort(410); + return response()->json([ + 'type' => 'error', + 'message' => 'Invitation was already used.', + ], 410); } - return new TeamInvitationResource($invitation); + return response()->json(new TeamInvitationResource($invitation)); } public function update( TeamFolderInvitation $invitation, ClearActionInInvitationNotificationAction $clearActionInInvitationNotification, - ): ResponseFactory|Response { + ): JsonResponse { + // Check if invitation has other state than pending + if ($invitation->status !== 'pending') { + return response()->json([ + 'type' => 'error', + 'message' => 'The invitation was previously used.', + ], 422); + } + + // Prepare success message + $successMessage = [ + 'type' => 'success', + 'message' => 'Invitation was accepted.', + ]; + + // Get invited user $user = User::where('email', $invitation->email) ->first(); if ($user) { if (isDemoAccount()) { - return response('Done', 204); + return response()->json($successMessage); } $invitation->accept(); @@ -52,13 +70,27 @@ class InvitationsController extends Controller ]); } - return response('Done', 204); + return response()->json($successMessage); } public function destroy( TeamFolderInvitation $invitation, ClearActionInInvitationNotificationAction $clearActionInInvitationNotification, - ): ResponseFactory|Response { + ): JsonResponse { + // Check if invitation has other state than pending + if ($invitation->status !== 'pending') { + return response()->json([ + 'type' => 'error', + 'message' => 'The invitation was previously used.', + ], 422); + } + + // Prepare success message + $successMessage = [ + 'type' => 'success', + 'message' => 'Invitation was declined.', + ]; + $invitation->reject(); // Get user from invitation @@ -68,12 +100,12 @@ class InvitationsController extends Controller // Clear action in existing notification if ($user) { if (isDemoAccount()) { - return response('Done', 204); + return response()->json($successMessage); } $clearActionInInvitationNotification($user, $invitation); } - return response('Done', 204); + return response()->json($successMessage); } } diff --git a/src/Domain/Teams/Controllers/LeaveTeamFolderController.php b/src/Domain/Teams/Controllers/LeaveTeamFolderController.php index d8727104..4c618951 100644 --- a/src/Domain/Teams/Controllers/LeaveTeamFolderController.php +++ b/src/Domain/Teams/Controllers/LeaveTeamFolderController.php @@ -2,25 +2,31 @@ namespace Domain\Teams\Controllers; use Gate; -use Illuminate\Http\Response; use Domain\Folders\Models\Folder; +use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\DB; use App\Http\Controllers\Controller; -use Illuminate\Contracts\Foundation\Application; -use Illuminate\Contracts\Routing\ResponseFactory; class LeaveTeamFolderController extends Controller { - public function __invoke(Folder $folder): Response|Application|ResponseFactory + public function __invoke(Folder $folder): JsonResponse { + $successMessage = [ + 'type' => 'success', + 'message' => 'You left the team folder.', + ]; + // Abort in demo mode if (isDemoAccount()) { - return response('Done.', 204); + return response()->json($successMessage); } // Authorize action if (! Gate::any(['can-edit', 'can-view'], [$folder, null])) { - abort(403, 'Access Denied'); + return response()->json([ + 'type' => 'error', + 'message' => 'You are not member of this team folder.', + ], 403); } // Find and delete attached member from team folder @@ -29,6 +35,6 @@ class LeaveTeamFolderController extends Controller ->where('user_id', auth()->id()) ->delete(); - return response('Done.', 204); + return response()->json($successMessage); } } diff --git a/src/Domain/Teams/Controllers/NavigationTreeController.php b/src/Domain/Teams/Controllers/NavigationTreeController.php index 453b59a4..2584c7e2 100644 --- a/src/Domain/Teams/Controllers/NavigationTreeController.php +++ b/src/Domain/Teams/Controllers/NavigationTreeController.php @@ -3,11 +3,13 @@ namespace Domain\Teams\Controllers; use Gate; use Domain\Folders\Models\Folder; +use Illuminate\Http\JsonResponse; class NavigationTreeController { - public function __invoke(Folder $folder): array + public function __invoke(Folder $folder): JsonResponse { + // Get the root team folder $teamFolder = $folder->getLatestParent(); if (! Gate::any(['can-edit', 'can-view'], [$teamFolder, null])) { @@ -19,13 +21,13 @@ class NavigationTreeController ->sortable() ->get(['id', 'parent_id', 'id', 'name', 'team_folder']); - return [ + return response()->json([ [ 'name' => $teamFolder->name, 'folders' => $folders, 'isMovable' => true, 'isOpen' => true, ], - ]; + ]); } } diff --git a/src/Domain/Teams/Controllers/TeamFoldersController.php b/src/Domain/Teams/Controllers/TeamFoldersController.php index 955be76d..9048cf45 100644 --- a/src/Domain/Teams/Controllers/TeamFoldersController.php +++ b/src/Domain/Teams/Controllers/TeamFoldersController.php @@ -3,8 +3,8 @@ namespace Domain\Teams\Controllers; use Illuminate\Support\Str; use Domain\Files\Models\File; -use Illuminate\Http\Response; use Domain\Folders\Models\Folder; +use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\DB; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Auth; @@ -15,7 +15,6 @@ use Domain\Folders\Resources\FolderResource; use Domain\Teams\Actions\UpdateMembersAction; use Domain\Folders\Resources\FolderCollection; use Domain\Teams\Actions\UpdateInvitationsAction; -use Illuminate\Contracts\Routing\ResponseFactory; use Domain\Teams\Requests\CreateTeamFolderRequest; use Domain\Teams\Requests\UpdateTeamFolderMembersRequest; use Domain\Teams\Actions\InviteMembersIntoTeamFolderAction; @@ -63,15 +62,20 @@ class TeamFoldersController extends Controller public function store( CreateTeamFolderRequest $request, - ): ResponseFactory | Response { + ): JsonResponse { // Abort in demo mode - abort_if(isDemoAccount(), 201, 'Done.'); + if (isDemoAccount()) { + return response()->json([ + 'type' => 'success', + 'message' => 'The team folder was created', + ], 201); + } $data = CreateTeamFolderData::fromRequest($request); // Check if user can create team folder if (! $request->user()->canCreateTeamFolder()) { - return response([ + return response()->json([ 'type' => 'error', 'message' => 'This user action is not allowed.', ], 401); @@ -79,7 +83,7 @@ class TeamFoldersController extends Controller // Check if user didn't exceed max team members limit if (! $request->user()->canInviteTeamMembers($data->invitations)) { - return response([ + return response()->json([ 'type' => 'error', 'message' => 'You exceed your members limit.', ], 401); @@ -89,7 +93,7 @@ class TeamFoldersController extends Controller $folder = Folder::create([ 'user_id' => $request->user()->id, 'name' => $data->name, - 'team_folder' => 1, + 'team_folder' => true, ]); // Attach owner into members @@ -102,7 +106,7 @@ class TeamFoldersController extends Controller // Invite team members $this->inviteMembers->onQueue()->execute($data->invitations, $folder); - return response(new FolderResource($folder), 201); + return response()->json(new FolderResource($folder), 201); } public function update( @@ -110,10 +114,10 @@ class TeamFoldersController extends Controller Folder $folder, UpdateInvitationsAction $updateInvitations, UpdateMembersAction $updateMembers, - ): ResponseFactory | Response { + ): JsonResponse { // Abort in demo mode if (isDemoAccount()) { - return response(new FolderResource($folder), 201); + return response()->json(new FolderResource($folder), 201); } // Authorize request @@ -121,7 +125,7 @@ class TeamFoldersController extends Controller // Check if user didn't exceed max team members limit if (! $request->user()->canInviteTeamMembers($request->input('invitations'))) { - return response([ + return response()->json([ 'type' => 'error', 'message' => 'You exceed your members limit.', ], 401); @@ -137,14 +141,26 @@ class TeamFoldersController extends Controller $request->input('members') ); - return response(new FolderResource($folder), 201); + return response()->json(new FolderResource($folder), 201); } - public function destroy(Folder $folder): ResponseFactory | Response + public function destroy(Folder $folder): JsonResponse { + if (! $folder->team_folder) { + return response()->json([ + 'type' => 'error', + 'message' => "You're trying to access non-team folder.", + ]); + } + + $successMessage = [ + 'type' => 'success', + 'message' => 'The team was dissolved.', + ]; + // Abort in demo mode if (isDemoAccount()) { - return response('Done.', 201); + return response()->json($successMessage); } $this->authorize('owner', $folder); @@ -162,9 +178,9 @@ class TeamFoldersController extends Controller ($this->setTeamFolderPropertyForAllChildren)($folder, false); $folder->update([ - 'team_folder' => 0, + 'team_folder' => false, ]); - return response('Done.', 204); + return response()->json($successMessage); } } diff --git a/src/Domain/Teams/Models/TeamFolderInvitation.php b/src/Domain/Teams/Models/TeamFolderInvitation.php index f5a4c791..fa0139e9 100644 --- a/src/Domain/Teams/Models/TeamFolderInvitation.php +++ b/src/Domain/Teams/Models/TeamFolderInvitation.php @@ -14,6 +14,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; * @property string parent_id * @property string email * @property string status + * @property string permission * @property string created_at * @property string updated_at */ diff --git a/src/Domain/Teams/Requests/ConvertIntoTeamFolderRequest.php b/src/Domain/Teams/Requests/ConvertIntoTeamFolderRequest.php index edf12c3c..ce135009 100644 --- a/src/Domain/Teams/Requests/ConvertIntoTeamFolderRequest.php +++ b/src/Domain/Teams/Requests/ConvertIntoTeamFolderRequest.php @@ -23,7 +23,10 @@ class ConvertIntoTeamFolderRequest extends FormRequest public function rules() { return [ - 'invitations' => 'required|array', + 'invitations' => 'required|array', + 'invitations.*.email' => 'required|email', + 'invitations.*.permission' => 'required|string', + 'invitations.*.type' => 'required|string', ]; } } diff --git a/src/Domain/Teams/Requests/CreateTeamFolderRequest.php b/src/Domain/Teams/Requests/CreateTeamFolderRequest.php index 9e7cf31b..54e9f479 100644 --- a/src/Domain/Teams/Requests/CreateTeamFolderRequest.php +++ b/src/Domain/Teams/Requests/CreateTeamFolderRequest.php @@ -23,8 +23,11 @@ class CreateTeamFolderRequest extends FormRequest public function rules() { return [ - 'name' => 'required|string', - 'invitations' => 'required|array', + 'name' => 'required|string', + 'invitations' => 'required|array', + 'invitations.*.email' => 'required|email', + 'invitations.*.permission' => 'required|string', + 'invitations.*.type' => 'required|string', ]; } } diff --git a/src/Domain/Teams/Requests/UpdateTeamFolderMembersRequest.php b/src/Domain/Teams/Requests/UpdateTeamFolderMembersRequest.php index 785638ae..60c1071a 100644 --- a/src/Domain/Teams/Requests/UpdateTeamFolderMembersRequest.php +++ b/src/Domain/Teams/Requests/UpdateTeamFolderMembersRequest.php @@ -23,8 +23,13 @@ class UpdateTeamFolderMembersRequest extends FormRequest public function rules() { return [ - 'members' => 'present|array', - 'invitations' => 'present|array', + 'members' => 'present|array', + 'members.*.permission' => 'required|string', + 'members.*.id' => 'required|uuid', + 'invitations' => 'present|array', + 'invitations.*.email' => 'required|email', + 'invitations.*.permission' => 'required|string', + 'invitations.*.type' => 'required|string', ]; } } diff --git a/src/Domain/UploadRequest/Controllers/CreateUploadRequestController.php b/src/Domain/UploadRequest/Controllers/CreateUploadRequestController.php index 8a91f68b..869769b4 100644 --- a/src/Domain/UploadRequest/Controllers/CreateUploadRequestController.php +++ b/src/Domain/UploadRequest/Controllers/CreateUploadRequestController.php @@ -3,11 +3,11 @@ namespace Domain\UploadRequest\Controllers; use Auth; use Gate; -use Illuminate\Auth\Access\AuthorizationException; use Notification; -use Illuminate\Http\JsonResponse; use Domain\Folders\Models\Folder; +use Illuminate\Http\JsonResponse; use App\Http\Controllers\Controller; +use Illuminate\Auth\Access\AuthorizationException; use Domain\UploadRequest\Requests\StoreUploadRequest; use Domain\UploadRequest\Resources\UploadRequestResource; use Domain\UploadRequest\Notifications\UploadRequestNotification;