summaryrefslogtreecommitdiff
path: root/app/Http
diff options
context:
space:
mode:
Diffstat (limited to 'app/Http')
-rw-r--r--app/Http/Controllers/DashboardController.php27
-rw-r--r--app/Http/Controllers/FileController.php9
-rw-r--r--app/Http/Controllers/LinkController.php4
-rw-r--r--app/Http/Controllers/WritingController.php6
-rw-r--r--app/Http/Middleware/Admin.php21
5 files changed, 54 insertions, 13 deletions
diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php
index 7335629..c104e77 100644
--- a/app/Http/Controllers/DashboardController.php
+++ b/app/Http/Controllers/DashboardController.php
@@ -16,10 +16,29 @@ class DashboardController extends Controller
{
$user = Auth::user();
- // You can add any additional data preparation here
- // before passing to the view
-
- return view('dashboard');
+ // Storage stats
+ $usedStorage = $user->getStorageUsed();
+ $totalStorage = $user->storage_quota;
+ $storagePercent = $totalStorage > 0 ? min(100, round(($usedStorage / $totalStorage) * 100)) : 0;
+
+ // File stats
+ $fileCount = 0; // TODO: update when DB schema supports user->files()
+ $recentFiles = collect();
+
+ // Writing stats
+ $writingCount = $user->writings()->count();
+ $recentWritings = $user->writings()->orderBy('created_at', 'desc')->take(3)->get();
+
+ return view('dashboard', compact(
+ 'user',
+ 'usedStorage',
+ 'totalStorage',
+ 'storagePercent',
+ 'fileCount',
+ 'recentFiles',
+ 'writingCount',
+ 'recentWritings',
+ ));
}
/**
diff --git a/app/Http/Controllers/FileController.php b/app/Http/Controllers/FileController.php
index 5a4ed40..70d07ef 100644
--- a/app/Http/Controllers/FileController.php
+++ b/app/Http/Controllers/FileController.php
@@ -145,7 +145,8 @@ class FileController extends Controller
public function addTags(Request $request, $fileId)
{
$file = File::findOrFail($fileId);
-
+ $this->authorize('update', $file);
+
$validated = $request->validate([
'tags' => 'required|string'
]);
@@ -169,6 +170,8 @@ class FileController extends Controller
public function removeTag(Request $request, $fileId, $tagId)
{
$file = File::findOrFail($fileId);
+ $this->authorize('update', $file);
+
$tag = Tag::findOrFail($tagId);
$file->tags()->detach($tagId);
@@ -196,6 +199,8 @@ class FileController extends Controller
*/
public function update(Request $request, File $file)
{
+ $this->authorize('update', $file);
+
$validated = $request->validate([
'description' => 'nullable|string',
'tags' => 'nullable|string'
@@ -218,6 +223,8 @@ class FileController extends Controller
*/
public function destroy(File $file)
{
+ $this->authorize('delete', $file);
+
// Remove the file from storage
if (Storage::disk('public')->exists($file->path)) {
Storage::disk('public')->delete($file->path);
diff --git a/app/Http/Controllers/LinkController.php b/app/Http/Controllers/LinkController.php
index 9ac44d8..e889489 100644
--- a/app/Http/Controllers/LinkController.php
+++ b/app/Http/Controllers/LinkController.php
@@ -70,6 +70,8 @@ class LinkController extends Controller
*/
public function update(UpdateLinkRequest $request, Link $link)
{
+ $this->authorize('update', $link);
+
$validated = $request->validated();
$link->update($validated);
@@ -82,6 +84,8 @@ class LinkController extends Controller
*/
public function destroy(Link $link)
{
+ $this->authorize('delete', $link);
+
$link->delete();
$redirect = request()->input('_redirect', route('l.index'));
diff --git a/app/Http/Controllers/WritingController.php b/app/Http/Controllers/WritingController.php
index 974852f..67d7b8d 100644
--- a/app/Http/Controllers/WritingController.php
+++ b/app/Http/Controllers/WritingController.php
@@ -66,6 +66,8 @@ class WritingController extends Controller
public function edit($id)
{
$writing = Writing::findOrFail($id);
+ $this->authorize('update', $writing);
+
return view('writings.edit', [
'writing' => $writing
]);
@@ -76,6 +78,8 @@ class WritingController extends Controller
*/
public function update(Request $request, Writing $writing)
{
+ $this->authorize('update', $writing);
+
$validated = $request->validate([
'title' => 'required|min:3|max:255',
'content' => 'required|min:10',
@@ -92,6 +96,8 @@ class WritingController extends Controller
*/
public function destroy(Writing $writing)
{
+ $this->authorize('delete', $writing);
+
$writing->delete();
return redirect()->route('w.index')
diff --git a/app/Http/Middleware/Admin.php b/app/Http/Middleware/Admin.php
index ab70520..65fba8c 100644
--- a/app/Http/Middleware/Admin.php
+++ b/app/Http/Middleware/Admin.php
@@ -6,6 +6,7 @@ use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Notification;
use App\Notifications\AdminAccessNotification;
use Illuminate\Notifications\AnonymousNotifiable;
@@ -21,16 +22,20 @@ class Admin
abort(403, 'Unauthorized');
}
- // Notify admin email of access
+ // Notify admin email of access — throttled to once per 15 minutes per user+IP
$adminEmail = config('app.admin_notify_email');
if ($adminEmail) {
- Notification::route('mail', $adminEmail)->notify(
- new AdminAccessNotification(
- Auth::user()->name,
- $request->ip(),
- $request->header('User-Agent', 'unknown')
- )
- );
+ $cacheKey = 'admin_notify:' . Auth::id() . ':' . $request->ip();
+ if (!Cache::has($cacheKey)) {
+ Notification::route('mail', $adminEmail)->notify(
+ new AdminAccessNotification(
+ Auth::user()->name,
+ $request->ip(),
+ $request->header('User-Agent', 'unknown')
+ )
+ );
+ Cache::put($cacheKey, true, now()->addMinutes(15));
+ }
}
return $next($request);