Archived
1
0
This repository has been archived on 2024-05-04. You can view files and clone it, but cannot push or open issues or pull requests.
cyca/app/Http/Controllers/DocumentController.php
2022-01-12 00:35:37 +01:00

137 lines
3.9 KiB
PHP
Executable File

<?php
namespace App\Http\Controllers;
use App\Http\Requests\Documents\StoreRequest;
use App\Models\Document;
use App\Models\Folder;
use App\Notifications\UnreadItemsChanged;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Notification;
use Storage;
class DocumentController extends Controller
{
public function __construct()
{
$this->authorizeResource(Document::class, 'document');
}
/**
* Store a newly created resource in storage.
*
* @param App\Http\Requests\Documents\StoreRequest $request
*
* @return \Illuminate\Http\Response
*/
public function store(StoreRequest $request)
{
$validated = $request->validated();
$user = $request->user();
$url = $validated['url'];
$folder = Folder::find($validated['folder_id']);
$document = Document::firstOrCreate(['url' => $url]);
$folder->documents()->save($document, [
'initial_url' => $url,
]);
return $folder->listDocuments($user);
}
/**
* Display the specified resource.
*
* @return \Illuminate\Http\Response
*/
public function show(Request $request, Document $document)
{
$user = $request->user();
$document->findDupplicatesFor($user);
$document->loadMissing('feeds')->loadCount(['feedItemStates' => function ($query) use ($user) {
$query->where('is_read', false)->where('user_id', $user->id);
}]);
if (Storage::exists($document->getStoragePath().'/meta.json')) {
$document->meta_data = \json_decode(Storage::get($document->getStoragePath().'/meta.json'));
}
if (Storage::exists($document->getStoragePath().'/response.json')) {
$document->response = \json_decode(Storage::get($document->getStoragePath().'/response.json'));
}
return $document;
}
/**
* Move document into specified folder.
*
* @param Folder $folder
*
* @return \Illuminate\Http\Response
*/
public function move(Request $request, Folder $sourceFolder, Folder $targetFolder)
{
$this->authorize('createBookmarkIn', $targetFolder);
$this->authorize('deleteBookmarkFrom', $sourceFolder);
$bookmarks = $sourceFolder->documents()->whereIn('documents.id', $request->input('documents'))->get();
foreach ($bookmarks as $bookmark) {
$sourceFolder->documents()->updateExistingPivot($bookmark->id, ['folder_id' => $targetFolder->id]);
}
$usersToNotify = $sourceFolder->group->activeUsers->merge($targetFolder->group->activeUsers);
Notification::send($usersToNotify, new UnreadItemsChanged([
'folders' => [
$sourceFolder->id,
$targetFolder->id,
],
]));
return $request->user()->countUnreadItems([
'folders' => [
$sourceFolder->id,
$targetFolder->id,
],
]);
}
/**
* Remove documents from specified folder.
*
* @return \Illuminate\Http\Response
*/
public function destroyBookmarks(Request $request, Folder $folder)
{
$this->authorize('deleteBookmarkFrom', $folder);
$user = $request->user();
$documents = $folder->documents()->whereIn('documents.id', $request->input('documents'))->get();
foreach ($documents as $document) {
$folder->documents()->detach($document);
}
Notification::send($folder->group->activeUsers()->get(), new UnreadItemsChanged(['folders' => [$folder]]));
return $folder->listDocuments($user);
}
/**
* Increment visits for specified document in specified folder.
*
* @return \Illuminate\Http\Response
*/
public function visit(Request $request, Document $document)
{
++$document->visits;
$document->save();
return $this->show($request, $document);
}
}