create share api update

This commit is contained in:
Čarodej
2022-05-03 09:57:56 +02:00
parent b1fd046084
commit 664f8d8e53
6 changed files with 82 additions and 47 deletions

View File

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

View File

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

View File

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

View File

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

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

View File

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