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

View File

@@ -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);
}

View File

@@ -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()) {

View File

@@ -1,9 +1,9 @@
<?php
namespace App\Users\Controllers\Authentication;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Str;
use Illuminate\Http\Response;
use Illuminate\Http\JsonResponse;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Laravel\Sanctum\PersonalAccessToken;
@@ -28,7 +28,7 @@ class AccountAccessTokenController extends Controller
{
if (isDemoAccount()) {
return response()->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);
}

View File

@@ -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

View File

@@ -9,7 +9,7 @@ class FlushUserNotificationsController extends Controller
public function __invoke(): JsonResponse
{
$successMessage = [
'type' => 'success',
'type' => 'success',
'message' => 'All your notifications was deleted.',
];

View File

@@ -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);

View File

@@ -1,13 +1,16 @@
<?php
namespace Domain\SetupWizard\Controllers;
use Illuminate\Http\Response;
use Illuminate\Http\JsonResponse;
use App\Http\Controllers\Controller;
class PingAPIController extends Controller
{
public function __invoke(): Response
public function __invoke(): JsonResponse
{
return response('pong');
return response()->json([
'type' => 'success',
'message' => 'pong',
]);
}
}

View File

@@ -1,11 +1,12 @@
<?php
namespace Domain\Teams\Controllers;
use Illuminate\Http\Response;
use Domain\Folders\Models\Folder;
use Illuminate\Http\JsonResponse;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Gate;
use Domain\Teams\Models\TeamFolderMember;
use Illuminate\Contracts\Routing\ResponseFactory;
use Domain\Folders\Resources\FolderResource;
use Domain\Teams\Requests\ConvertIntoTeamFolderRequest;
use Domain\Teams\Actions\InviteMembersIntoTeamFolderAction;
use Domain\Teams\Actions\SetTeamFolderPropertyForAllChildrenAction;
@@ -21,15 +22,18 @@ class ConvertFolderIntoTeamFolderController extends Controller
public function __invoke(
ConvertIntoTeamFolderRequest $request,
Folder $folder
): ResponseFactory|Response {
): JsonResponse {
// Authorize action
Gate::authorize('owner', [$folder]);
// Abort in demo mode
if (isDemoAccount()) {
return response($folder, 201);
return response()->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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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,
],
];
]);
}
}

View File

@@ -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);
}
}

View File

@@ -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
*/

View File

@@ -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',
];
}
}

View File

@@ -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',
];
}
}

View File

@@ -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',
];
}
}

View File

@@ -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;