diff --git a/public/mix-manifest.json b/public/mix-manifest.json index e142fa8b..f4315922 100644 --- a/public/mix-manifest.json +++ b/public/mix-manifest.json @@ -62,7 +62,7 @@ "/chunks/settings-password.js": "/chunks/settings-password.js?id=d00bf503d8126dc4", "/chunks/settings-storage.js": "/chunks/settings-storage.js?id=092e324aad54656b", "/chunks/billing.js": "/chunks/billing.js?id=115c25478cee576d", - "/chunks/platform.js": "/chunks/platform.js?id=38562970e9950381", + "/chunks/platform.js": "/chunks/platform.js?id=6c6ff48803c933ab", "/chunks/files.js": "/chunks/files.js?id=a74bc8acc7ea876a", "/chunks/recent-uploads.js": "/chunks/recent-uploads.js?id=c6ed26eaace65f01", "/chunks/my-shared-items.js": "/chunks/my-shared-items.js?id=6adbb309c700eaf7", diff --git a/resources/js/components/Popups/ShareCreatePopup.vue b/resources/js/components/Popups/ShareCreatePopup.vue index 68e7f8b2..66d517de 100644 --- a/resources/js/components/Popups/ShareCreatePopup.vue +++ b/resources/js/components/Popups/ShareCreatePopup.vue @@ -209,15 +209,15 @@ export default { }, data() { return { + id: undefined, isExpiration: false, isEmailSharing: false, shareOptions: { - isPassword: false, + isPassword: undefined, expiration: undefined, password: undefined, permission: undefined, type: undefined, - id: undefined, emails: undefined, }, pickedItem: undefined, @@ -244,7 +244,7 @@ export default { // Send request to get share link axios - .post(`/api/share`, this.shareOptions) + .post(`/api/share/${this.id}`, this.shareOptions) .then((response) => { // End loading this.isGeneratedShared = true @@ -278,13 +278,14 @@ export default { this.pickedItem = args.item this.shareOptions.type = args.item.data.type - this.shareOptions.id = args.item.data.id + this.id = args.item.data.id }) // Close popup events.$on('popup:close', () => { // Restore data setTimeout(() => { + this.id = undefined this.isGeneratedShared = false this.isExpiration = false this.isEmailSharing = false @@ -294,7 +295,6 @@ export default { password: undefined, permission: undefined, type: undefined, - id: undefined, emails: undefined, } }, 150) diff --git a/routes/api.php b/routes/api.php index 0accfb01..cba7ec5b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,5 +1,6 @@ ['auth:sanctum']], function () { Route::get('/share/{token}/qr', GetShareLinkViaQrCodeController::class); Route::post('/share/{token}/email', ShareViaEmailController::class); Route::apiResource('/share', ShareController::class); + Route::post('/share/{id}', ShareItemController::class); // Favourites Route::apiResource('/folders/favourites', FavouriteController::class); diff --git a/src/Domain/Sharing/Controllers/ShareController.php b/src/Domain/Sharing/Controllers/ShareController.php index db638e30..efc88f53 100644 --- a/src/Domain/Sharing/Controllers/ShareController.php +++ b/src/Domain/Sharing/Controllers/ShareController.php @@ -6,8 +6,6 @@ use Domain\Sharing\Models\Share; use App\Http\Controllers\Controller; use Illuminate\Support\Facades\Auth; use Domain\Sharing\Resources\ShareResource; -use Domain\Sharing\Actions\SendViaEmailAction; -use Domain\Sharing\Requests\CreateShareRequest; use Domain\Sharing\Requests\UpdateShareRequest; class ShareController extends Controller @@ -21,40 +19,6 @@ class ShareController extends Controller return new ShareResource($share); } - /** - * Generate file share link - */ - public function store( - CreateShareRequest $request, - SendViaEmailAction $sendLinkToEmailAction, - ): Response { - $item = get_item($request->input('type'), $request->input('id')); - - $this->authorize('owner', $item); - - $shared = Share::create([ - 'password' => $request->has('password') ? bcrypt($request->input('password')) : null, - 'type' => $request->input('type') === 'folder' ? 'folder' : 'file', - 'is_protected' => $request->input('isPassword'), - 'permission' => $request->input('permission') ?? null, - 'expire_in' => $request->input('expiration') ?? null, - 'item_id' => $request->input('id'), - 'user_id' => Auth::id(), - ]); - - // Send shared link via email - if ($request->has('emails')) { - $sendLinkToEmailAction->onQueue()->execute( - emails: $request->input('emails'), - token: $shared->token, - user: $shared->user, - ); - } - - // Return created shared record - return response(new ShareResource($shared), 201); - } - /** * Update sharing */ diff --git a/src/Domain/Sharing/Controllers/ShareItemController.php b/src/Domain/Sharing/Controllers/ShareItemController.php new file mode 100644 index 00000000..393a344f --- /dev/null +++ b/src/Domain/Sharing/Controllers/ShareItemController.php @@ -0,0 +1,68 @@ +input('type'), $id); + + // Check if item is currently shared + if ($item->shared()->exists()) { + return response()->json([ + 'type' => 'error', + 'message' => 'The item is currently shared.', + ], 422); + } + + // If sharing folder, check permission attribute + if ($item instanceof Folder && $request->missing('permission')) { + return response()->json([ + 'type' => 'error', + 'message' => 'The permission field for folder is required.', + ], 422); + } + + $this->authorize('owner', $item); + + $shared = Share::create([ + 'password' => $request->has('password') ? bcrypt($request->input('password')) : null, + 'type' => $request->input('type') === 'folder' ? 'folder' : 'file', + 'is_protected' => $request->input('isPassword') ?? false, + 'permission' => $request->input('permission') ?? null, + 'expire_in' => $request->input('expiration') ?? null, + 'item_id' => $item->id, + 'user_id' => auth()->id(), + ]); + + // Send shared link via email + if ($request->has('emails')) { + ($this->sendLinkToEmailAction)->onQueue()->execute( + emails: $request->input('emails'), + token: $shared->token, + user: $shared->user, + ); + } + + // Return created shared record + return response()->json(new ShareResource($shared), 201); + } +} \ No newline at end of file diff --git a/src/Domain/Sharing/Requests/CreateShareRequest.php b/src/Domain/Sharing/Requests/CreateShareRequest.php index c5003193..cc171570 100644 --- a/src/Domain/Sharing/Requests/CreateShareRequest.php +++ b/src/Domain/Sharing/Requests/CreateShareRequest.php @@ -1,4 +1,5 @@ 'required|string', - 'isPassword' => 'required|boolean', + 'isPassword' => 'sometimes|boolean', + 'password' => 'required_if:isPassword,true', 'type' => 'required|string', - 'expiration' => 'integer|nullable', - 'permission' => 'string', - 'password' => 'string', + 'expiration' => 'sometimes|integer', + 'permission' => 'sometimes|string', + 'emails' => 'sometimes|array', 'emails.*' => 'email', ]; }