mirror of
https://github.com/VueFileManager/vuefilemanager.git
synced 2026-04-18 16:22:14 +00:00
create share api update
This commit is contained in:
@@ -62,7 +62,7 @@
|
|||||||
"/chunks/settings-password.js": "/chunks/settings-password.js?id=d00bf503d8126dc4",
|
"/chunks/settings-password.js": "/chunks/settings-password.js?id=d00bf503d8126dc4",
|
||||||
"/chunks/settings-storage.js": "/chunks/settings-storage.js?id=092e324aad54656b",
|
"/chunks/settings-storage.js": "/chunks/settings-storage.js?id=092e324aad54656b",
|
||||||
"/chunks/billing.js": "/chunks/billing.js?id=115c25478cee576d",
|
"/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/files.js": "/chunks/files.js?id=a74bc8acc7ea876a",
|
||||||
"/chunks/recent-uploads.js": "/chunks/recent-uploads.js?id=c6ed26eaace65f01",
|
"/chunks/recent-uploads.js": "/chunks/recent-uploads.js?id=c6ed26eaace65f01",
|
||||||
"/chunks/my-shared-items.js": "/chunks/my-shared-items.js?id=6adbb309c700eaf7",
|
"/chunks/my-shared-items.js": "/chunks/my-shared-items.js?id=6adbb309c700eaf7",
|
||||||
|
|||||||
@@ -209,15 +209,15 @@ export default {
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
id: undefined,
|
||||||
isExpiration: false,
|
isExpiration: false,
|
||||||
isEmailSharing: false,
|
isEmailSharing: false,
|
||||||
shareOptions: {
|
shareOptions: {
|
||||||
isPassword: false,
|
isPassword: undefined,
|
||||||
expiration: undefined,
|
expiration: undefined,
|
||||||
password: undefined,
|
password: undefined,
|
||||||
permission: undefined,
|
permission: undefined,
|
||||||
type: undefined,
|
type: undefined,
|
||||||
id: undefined,
|
|
||||||
emails: undefined,
|
emails: undefined,
|
||||||
},
|
},
|
||||||
pickedItem: undefined,
|
pickedItem: undefined,
|
||||||
@@ -244,7 +244,7 @@ export default {
|
|||||||
|
|
||||||
// Send request to get share link
|
// Send request to get share link
|
||||||
axios
|
axios
|
||||||
.post(`/api/share`, this.shareOptions)
|
.post(`/api/share/${this.id}`, this.shareOptions)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
// End loading
|
// End loading
|
||||||
this.isGeneratedShared = true
|
this.isGeneratedShared = true
|
||||||
@@ -278,13 +278,14 @@ export default {
|
|||||||
this.pickedItem = args.item
|
this.pickedItem = args.item
|
||||||
|
|
||||||
this.shareOptions.type = args.item.data.type
|
this.shareOptions.type = args.item.data.type
|
||||||
this.shareOptions.id = args.item.data.id
|
this.id = args.item.data.id
|
||||||
})
|
})
|
||||||
|
|
||||||
// Close popup
|
// Close popup
|
||||||
events.$on('popup:close', () => {
|
events.$on('popup:close', () => {
|
||||||
// Restore data
|
// Restore data
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
|
this.id = undefined
|
||||||
this.isGeneratedShared = false
|
this.isGeneratedShared = false
|
||||||
this.isExpiration = false
|
this.isExpiration = false
|
||||||
this.isEmailSharing = false
|
this.isEmailSharing = false
|
||||||
@@ -294,7 +295,6 @@ export default {
|
|||||||
password: undefined,
|
password: undefined,
|
||||||
permission: undefined,
|
permission: undefined,
|
||||||
type: undefined,
|
type: undefined,
|
||||||
id: undefined,
|
|
||||||
emails: undefined,
|
emails: undefined,
|
||||||
}
|
}
|
||||||
}, 150)
|
}, 150)
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use Domain\Sharing\Controllers\ShareItemController;
|
||||||
use Domain\Zip\Controllers\ZipController;
|
use Domain\Zip\Controllers\ZipController;
|
||||||
use Domain\Pages\Controllers\PagesController;
|
use Domain\Pages\Controllers\PagesController;
|
||||||
use Domain\Sharing\Controllers\ShareController;
|
use Domain\Sharing\Controllers\ShareController;
|
||||||
@@ -72,6 +73,7 @@ Route::group(['middleware' => ['auth:sanctum']], function () {
|
|||||||
Route::get('/share/{token}/qr', GetShareLinkViaQrCodeController::class);
|
Route::get('/share/{token}/qr', GetShareLinkViaQrCodeController::class);
|
||||||
Route::post('/share/{token}/email', ShareViaEmailController::class);
|
Route::post('/share/{token}/email', ShareViaEmailController::class);
|
||||||
Route::apiResource('/share', ShareController::class);
|
Route::apiResource('/share', ShareController::class);
|
||||||
|
Route::post('/share/{id}', ShareItemController::class);
|
||||||
|
|
||||||
// Favourites
|
// Favourites
|
||||||
Route::apiResource('/folders/favourites', FavouriteController::class);
|
Route::apiResource('/folders/favourites', FavouriteController::class);
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ use Domain\Sharing\Models\Share;
|
|||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
use Domain\Sharing\Resources\ShareResource;
|
use Domain\Sharing\Resources\ShareResource;
|
||||||
use Domain\Sharing\Actions\SendViaEmailAction;
|
|
||||||
use Domain\Sharing\Requests\CreateShareRequest;
|
|
||||||
use Domain\Sharing\Requests\UpdateShareRequest;
|
use Domain\Sharing\Requests\UpdateShareRequest;
|
||||||
|
|
||||||
class ShareController extends Controller
|
class ShareController extends Controller
|
||||||
@@ -21,40 +19,6 @@ class ShareController extends Controller
|
|||||||
return new ShareResource($share);
|
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
|
* Update sharing
|
||||||
*/
|
*/
|
||||||
|
|||||||
68
src/Domain/Sharing/Controllers/ShareItemController.php
Normal file
68
src/Domain/Sharing/Controllers/ShareItemController.php
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Domain\Sharing\Controllers;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use Domain\Folders\Models\Folder;
|
||||||
|
use Domain\Sharing\Actions\SendViaEmailAction;
|
||||||
|
use Domain\Sharing\Models\Share;
|
||||||
|
use Domain\Sharing\Requests\CreateShareRequest;
|
||||||
|
use Domain\Sharing\Resources\ShareResource;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
|
class ShareItemController extends Controller
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
public SendViaEmailAction $sendLinkToEmailAction,
|
||||||
|
) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate file share link
|
||||||
|
*/
|
||||||
|
public function __invoke(
|
||||||
|
CreateShareRequest $request,
|
||||||
|
string $id,
|
||||||
|
): JsonResponse {
|
||||||
|
$item = get_item($request->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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
namespace Domain\Sharing\Requests;
|
namespace Domain\Sharing\Requests;
|
||||||
|
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
@@ -24,12 +25,12 @@ class CreateShareRequest extends FormRequest
|
|||||||
public function rules()
|
public function rules()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'id' => 'required|string',
|
'isPassword' => 'sometimes|boolean',
|
||||||
'isPassword' => 'required|boolean',
|
'password' => 'required_if:isPassword,true',
|
||||||
'type' => 'required|string',
|
'type' => 'required|string',
|
||||||
'expiration' => 'integer|nullable',
|
'expiration' => 'sometimes|integer',
|
||||||
'permission' => 'string',
|
'permission' => 'sometimes|string',
|
||||||
'password' => 'string',
|
'emails' => 'sometimes|array',
|
||||||
'emails.*' => 'email',
|
'emails.*' => 'email',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user