teams api update

This commit is contained in:
Čarodej
2022-05-04 10:17:36 +02:00
parent f9b762de43
commit 4250e58370
17 changed files with 139 additions and 64 deletions
+1 -1
View File
@@ -52,7 +52,7 @@ class Handler extends ExceptionHandler
if ($exception instanceof ModelNotFoundException) { if ($exception instanceof ModelNotFoundException) {
if (in_array('application/json', $request->getAcceptableContentTypes())) { if (in_array('application/json', $request->getAcceptableContentTypes())) {
return response()->json([ return response()->json([
'type' => 'error', 'type' => 'error',
'message' => "We couldn't find your requested item.", 'message' => "We couldn't find your requested item.",
], 404); ], 404);
} }
@@ -12,7 +12,7 @@ class UpdatePasswordController extends Controller
): JsonResponse { ): JsonResponse {
$successMessage = [ $successMessage = [
'type' => 'success', 'type' => 'success',
'message' => "The password was successfully changed.", 'message' => 'The password was successfully changed.',
]; ];
if (isDemoAccount()) { if (isDemoAccount()) {
@@ -1,9 +1,9 @@
<?php <?php
namespace App\Users\Controllers\Authentication; namespace App\Users\Controllers\Authentication;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Illuminate\Http\Response; use Illuminate\Http\Response;
use Illuminate\Http\JsonResponse;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Laravel\Sanctum\PersonalAccessToken; use Laravel\Sanctum\PersonalAccessToken;
@@ -28,7 +28,7 @@ class AccountAccessTokenController extends Controller
{ {
if (isDemoAccount()) { if (isDemoAccount()) {
return response()->json([ return response()->json([
'plainTextToken' => Str::random(40) 'plainTextToken' => Str::random(40),
], 201); ], 201);
} }
@@ -45,7 +45,7 @@ class AccountAccessTokenController extends Controller
{ {
$successMessage = [ $successMessage = [
'type' => 'success', 'type' => 'success',
'message' => "The token was successfully deleted.", 'message' => 'The token was successfully deleted.',
]; ];
if (isDemoAccount()) { if (isDemoAccount()) {
@@ -55,7 +55,7 @@ class AccountAccessTokenController extends Controller
if (Auth::id() !== $token->tokenable_id) { if (Auth::id() !== $token->tokenable_id) {
return response()->json([ return response()->json([
'type' => 'error', 'type' => 'error',
'message' => "You are not entitled to delete this token.", 'message' => 'You are not entitled to delete this token.',
], 401); ], 401);
} }
@@ -2,11 +2,11 @@
namespace App\Users\Controllers\Authentication; namespace App\Users\Controllers\Authentication;
use App\Users\DTO\CreateUserData; use App\Users\DTO\CreateUserData;
use Illuminate\Http\JsonResponse;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Users\Actions\CreateNewUserAction; use App\Users\Actions\CreateNewUserAction;
use App\Users\Requests\RegisterUserRequest; use App\Users\Requests\RegisterUserRequest;
use Illuminate\Contracts\Auth\StatefulGuard; use Illuminate\Contracts\Auth\StatefulGuard;
use Illuminate\Http\JsonResponse;
use VueFileManager\Subscription\Domain\Plans\Exceptions\MeteredBillingPlanDoesntExist; use VueFileManager\Subscription\Domain\Plans\Exceptions\MeteredBillingPlanDoesntExist;
class RegisterUserController extends Controller class RegisterUserController extends Controller
@@ -9,7 +9,7 @@ class FlushUserNotificationsController extends Controller
public function __invoke(): JsonResponse public function __invoke(): JsonResponse
{ {
$successMessage = [ $successMessage = [
'type' => 'success', 'type' => 'success',
'message' => 'All your notifications was deleted.', 'message' => 'All your notifications was deleted.',
]; ];
@@ -9,7 +9,7 @@ class MarkUserNotificationsAsReadController extends Controller
public function __invoke(): JsonResponse public function __invoke(): JsonResponse
{ {
$successMessage = [ $successMessage = [
'type' => 'success', 'type' => 'success',
'message' => 'All your notifications was marked as read.', 'message' => 'All your notifications was marked as read.',
]; ];
@@ -19,7 +19,7 @@ class MarkUserNotificationsAsReadController extends Controller
// Mark all notifications as read // Mark all notifications as read
auth()->user()->unreadNotifications()->update([ auth()->user()->unreadNotifications()->update([
'read_at' => now() 'read_at' => now(),
]); ]);
return response()->json($successMessage); return response()->json($successMessage);
@@ -1,13 +1,16 @@
<?php <?php
namespace Domain\SetupWizard\Controllers; namespace Domain\SetupWizard\Controllers;
use Illuminate\Http\Response; use Illuminate\Http\JsonResponse;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
class PingAPIController extends Controller class PingAPIController extends Controller
{ {
public function __invoke(): Response public function __invoke(): JsonResponse
{ {
return response('pong'); return response()->json([
'type' => 'success',
'message' => 'pong',
]);
} }
} }
@@ -1,11 +1,12 @@
<?php <?php
namespace Domain\Teams\Controllers; namespace Domain\Teams\Controllers;
use Illuminate\Http\Response;
use Domain\Folders\Models\Folder; use Domain\Folders\Models\Folder;
use Illuminate\Http\JsonResponse;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Gate;
use Domain\Teams\Models\TeamFolderMember; use Domain\Teams\Models\TeamFolderMember;
use Illuminate\Contracts\Routing\ResponseFactory; use Domain\Folders\Resources\FolderResource;
use Domain\Teams\Requests\ConvertIntoTeamFolderRequest; use Domain\Teams\Requests\ConvertIntoTeamFolderRequest;
use Domain\Teams\Actions\InviteMembersIntoTeamFolderAction; use Domain\Teams\Actions\InviteMembersIntoTeamFolderAction;
use Domain\Teams\Actions\SetTeamFolderPropertyForAllChildrenAction; use Domain\Teams\Actions\SetTeamFolderPropertyForAllChildrenAction;
@@ -21,15 +22,18 @@ class ConvertFolderIntoTeamFolderController extends Controller
public function __invoke( public function __invoke(
ConvertIntoTeamFolderRequest $request, ConvertIntoTeamFolderRequest $request,
Folder $folder Folder $folder
): ResponseFactory|Response { ): JsonResponse {
// Authorize action
Gate::authorize('owner', [$folder]);
// Abort in demo mode // Abort in demo mode
if (isDemoAccount()) { if (isDemoAccount()) {
return response($folder, 201); return response()->json(new FolderResource($folder), 201);
} }
// Check if user didn't exceed max team members limit // Check if user didn't exceed max team members limit
if (! $folder->user->canInviteTeamMembers($request->input('invitations'))) { if (! $folder->user->canInviteTeamMembers($request->input('invitations'))) {
return response([ return response()->json([
'type' => 'error', 'type' => 'error',
'message' => 'You exceed your members limit.', 'message' => 'You exceed your members limit.',
], 401); ], 401);
@@ -37,7 +41,7 @@ class ConvertFolderIntoTeamFolderController extends Controller
// Update root team folder // Update root team folder
$folder->update([ $folder->update([
'team_folder' => 1, 'team_folder' => true,
'parent_id' => null, 'parent_id' => null,
]); ]);
@@ -54,6 +58,6 @@ class ConvertFolderIntoTeamFolderController extends Controller
// Invite team members // Invite team members
($this->inviteMembers)($request->input('invitations'), $folder); ($this->inviteMembers)($request->input('invitations'), $folder);
return response($folder, 201); return response()->json(new FolderResource($folder), 201);
} }
} }
@@ -2,35 +2,53 @@
namespace Domain\Teams\Controllers; namespace Domain\Teams\Controllers;
use App\Users\Models\User; use App\Users\Models\User;
use Illuminate\Http\Response; use Illuminate\Http\JsonResponse;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Domain\Teams\Models\TeamFolderMember; use Domain\Teams\Models\TeamFolderMember;
use Domain\Teams\Models\TeamFolderInvitation; use Domain\Teams\Models\TeamFolderInvitation;
use Illuminate\Contracts\Routing\ResponseFactory;
use Domain\Teams\Resources\TeamInvitationResource; use Domain\Teams\Resources\TeamInvitationResource;
use Domain\Teams\Actions\ClearActionInInvitationNotificationAction; use Domain\Teams\Actions\ClearActionInInvitationNotificationAction;
class InvitationsController extends Controller 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') { 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( public function update(
TeamFolderInvitation $invitation, TeamFolderInvitation $invitation,
ClearActionInInvitationNotificationAction $clearActionInInvitationNotification, 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) $user = User::where('email', $invitation->email)
->first(); ->first();
if ($user) { if ($user) {
if (isDemoAccount()) { if (isDemoAccount()) {
return response('Done', 204); return response()->json($successMessage);
} }
$invitation->accept(); $invitation->accept();
@@ -52,13 +70,27 @@ class InvitationsController extends Controller
]); ]);
} }
return response('Done', 204); return response()->json($successMessage);
} }
public function destroy( public function destroy(
TeamFolderInvitation $invitation, TeamFolderInvitation $invitation,
ClearActionInInvitationNotificationAction $clearActionInInvitationNotification, 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(); $invitation->reject();
// Get user from invitation // Get user from invitation
@@ -68,12 +100,12 @@ class InvitationsController extends Controller
// Clear action in existing notification // Clear action in existing notification
if ($user) { if ($user) {
if (isDemoAccount()) { if (isDemoAccount()) {
return response('Done', 204); return response()->json($successMessage);
} }
$clearActionInInvitationNotification($user, $invitation); $clearActionInInvitationNotification($user, $invitation);
} }
return response('Done', 204); return response()->json($successMessage);
} }
} }
@@ -2,25 +2,31 @@
namespace Domain\Teams\Controllers; namespace Domain\Teams\Controllers;
use Gate; use Gate;
use Illuminate\Http\Response;
use Domain\Folders\Models\Folder; use Domain\Folders\Models\Folder;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
class LeaveTeamFolderController extends Controller 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 // Abort in demo mode
if (isDemoAccount()) { if (isDemoAccount()) {
return response('Done.', 204); return response()->json($successMessage);
} }
// Authorize action // Authorize action
if (! Gate::any(['can-edit', 'can-view'], [$folder, null])) { 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 // Find and delete attached member from team folder
@@ -29,6 +35,6 @@ class LeaveTeamFolderController extends Controller
->where('user_id', auth()->id()) ->where('user_id', auth()->id())
->delete(); ->delete();
return response('Done.', 204); return response()->json($successMessage);
} }
} }
@@ -3,11 +3,13 @@ namespace Domain\Teams\Controllers;
use Gate; use Gate;
use Domain\Folders\Models\Folder; use Domain\Folders\Models\Folder;
use Illuminate\Http\JsonResponse;
class NavigationTreeController class NavigationTreeController
{ {
public function __invoke(Folder $folder): array public function __invoke(Folder $folder): JsonResponse
{ {
// Get the root team folder
$teamFolder = $folder->getLatestParent(); $teamFolder = $folder->getLatestParent();
if (! Gate::any(['can-edit', 'can-view'], [$teamFolder, null])) { if (! Gate::any(['can-edit', 'can-view'], [$teamFolder, null])) {
@@ -19,13 +21,13 @@ class NavigationTreeController
->sortable() ->sortable()
->get(['id', 'parent_id', 'id', 'name', 'team_folder']); ->get(['id', 'parent_id', 'id', 'name', 'team_folder']);
return [ return response()->json([
[ [
'name' => $teamFolder->name, 'name' => $teamFolder->name,
'folders' => $folders, 'folders' => $folders,
'isMovable' => true, 'isMovable' => true,
'isOpen' => true, 'isOpen' => true,
], ],
]; ]);
} }
} }
@@ -3,8 +3,8 @@ namespace Domain\Teams\Controllers;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Domain\Files\Models\File; use Domain\Files\Models\File;
use Illuminate\Http\Response;
use Domain\Folders\Models\Folder; use Domain\Folders\Models\Folder;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
@@ -15,7 +15,6 @@ use Domain\Folders\Resources\FolderResource;
use Domain\Teams\Actions\UpdateMembersAction; use Domain\Teams\Actions\UpdateMembersAction;
use Domain\Folders\Resources\FolderCollection; use Domain\Folders\Resources\FolderCollection;
use Domain\Teams\Actions\UpdateInvitationsAction; use Domain\Teams\Actions\UpdateInvitationsAction;
use Illuminate\Contracts\Routing\ResponseFactory;
use Domain\Teams\Requests\CreateTeamFolderRequest; use Domain\Teams\Requests\CreateTeamFolderRequest;
use Domain\Teams\Requests\UpdateTeamFolderMembersRequest; use Domain\Teams\Requests\UpdateTeamFolderMembersRequest;
use Domain\Teams\Actions\InviteMembersIntoTeamFolderAction; use Domain\Teams\Actions\InviteMembersIntoTeamFolderAction;
@@ -63,15 +62,20 @@ class TeamFoldersController extends Controller
public function store( public function store(
CreateTeamFolderRequest $request, CreateTeamFolderRequest $request,
): ResponseFactory | Response { ): JsonResponse {
// Abort in demo mode // 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); $data = CreateTeamFolderData::fromRequest($request);
// Check if user can create team folder // Check if user can create team folder
if (! $request->user()->canCreateTeamFolder()) { if (! $request->user()->canCreateTeamFolder()) {
return response([ return response()->json([
'type' => 'error', 'type' => 'error',
'message' => 'This user action is not allowed.', 'message' => 'This user action is not allowed.',
], 401); ], 401);
@@ -79,7 +83,7 @@ class TeamFoldersController extends Controller
// Check if user didn't exceed max team members limit // Check if user didn't exceed max team members limit
if (! $request->user()->canInviteTeamMembers($data->invitations)) { if (! $request->user()->canInviteTeamMembers($data->invitations)) {
return response([ return response()->json([
'type' => 'error', 'type' => 'error',
'message' => 'You exceed your members limit.', 'message' => 'You exceed your members limit.',
], 401); ], 401);
@@ -89,7 +93,7 @@ class TeamFoldersController extends Controller
$folder = Folder::create([ $folder = Folder::create([
'user_id' => $request->user()->id, 'user_id' => $request->user()->id,
'name' => $data->name, 'name' => $data->name,
'team_folder' => 1, 'team_folder' => true,
]); ]);
// Attach owner into members // Attach owner into members
@@ -102,7 +106,7 @@ class TeamFoldersController extends Controller
// Invite team members // Invite team members
$this->inviteMembers->onQueue()->execute($data->invitations, $folder); $this->inviteMembers->onQueue()->execute($data->invitations, $folder);
return response(new FolderResource($folder), 201); return response()->json(new FolderResource($folder), 201);
} }
public function update( public function update(
@@ -110,10 +114,10 @@ class TeamFoldersController extends Controller
Folder $folder, Folder $folder,
UpdateInvitationsAction $updateInvitations, UpdateInvitationsAction $updateInvitations,
UpdateMembersAction $updateMembers, UpdateMembersAction $updateMembers,
): ResponseFactory | Response { ): JsonResponse {
// Abort in demo mode // Abort in demo mode
if (isDemoAccount()) { if (isDemoAccount()) {
return response(new FolderResource($folder), 201); return response()->json(new FolderResource($folder), 201);
} }
// Authorize request // Authorize request
@@ -121,7 +125,7 @@ class TeamFoldersController extends Controller
// Check if user didn't exceed max team members limit // Check if user didn't exceed max team members limit
if (! $request->user()->canInviteTeamMembers($request->input('invitations'))) { if (! $request->user()->canInviteTeamMembers($request->input('invitations'))) {
return response([ return response()->json([
'type' => 'error', 'type' => 'error',
'message' => 'You exceed your members limit.', 'message' => 'You exceed your members limit.',
], 401); ], 401);
@@ -137,14 +141,26 @@ class TeamFoldersController extends Controller
$request->input('members') $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 // Abort in demo mode
if (isDemoAccount()) { if (isDemoAccount()) {
return response('Done.', 201); return response()->json($successMessage);
} }
$this->authorize('owner', $folder); $this->authorize('owner', $folder);
@@ -162,9 +178,9 @@ class TeamFoldersController extends Controller
($this->setTeamFolderPropertyForAllChildren)($folder, false); ($this->setTeamFolderPropertyForAllChildren)($folder, false);
$folder->update([ $folder->update([
'team_folder' => 0, 'team_folder' => false,
]); ]);
return response('Done.', 204); return response()->json($successMessage);
} }
} }
@@ -14,6 +14,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
* @property string parent_id * @property string parent_id
* @property string email * @property string email
* @property string status * @property string status
* @property string permission
* @property string created_at * @property string created_at
* @property string updated_at * @property string updated_at
*/ */
@@ -23,7 +23,10 @@ class ConvertIntoTeamFolderRequest extends FormRequest
public function rules() public function rules()
{ {
return [ return [
'invitations' => 'required|array', 'invitations' => 'required|array',
'invitations.*.email' => 'required|email',
'invitations.*.permission' => 'required|string',
'invitations.*.type' => 'required|string',
]; ];
} }
} }
@@ -23,8 +23,11 @@ class CreateTeamFolderRequest extends FormRequest
public function rules() public function rules()
{ {
return [ return [
'name' => 'required|string', 'name' => 'required|string',
'invitations' => 'required|array', 'invitations' => 'required|array',
'invitations.*.email' => 'required|email',
'invitations.*.permission' => 'required|string',
'invitations.*.type' => 'required|string',
]; ];
} }
} }
@@ -23,8 +23,13 @@ class UpdateTeamFolderMembersRequest extends FormRequest
public function rules() public function rules()
{ {
return [ return [
'members' => 'present|array', 'members' => 'present|array',
'invitations' => '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',
]; ];
} }
} }
@@ -3,11 +3,11 @@ namespace Domain\UploadRequest\Controllers;
use Auth; use Auth;
use Gate; use Gate;
use Illuminate\Auth\Access\AuthorizationException;
use Notification; use Notification;
use Illuminate\Http\JsonResponse;
use Domain\Folders\Models\Folder; use Domain\Folders\Models\Folder;
use Illuminate\Http\JsonResponse;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Auth\Access\AuthorizationException;
use Domain\UploadRequest\Requests\StoreUploadRequest; use Domain\UploadRequest\Requests\StoreUploadRequest;
use Domain\UploadRequest\Resources\UploadRequestResource; use Domain\UploadRequest\Resources\UploadRequestResource;
use Domain\UploadRequest\Notifications\UploadRequestNotification; use Domain\UploadRequest\Notifications\UploadRequestNotification;