landscape-platform/app/Components/Admin/Http/Controllers/AdminDashboardController.php

103 lines
4.0 KiB
PHP

<?php
namespace App\Components\Admin\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use App\Models\User;
use App\Models\Role;
use App\Models\ResourceType;
use App\Models\ResourceTypeMapping;
use Illuminate\View\View;
use Illuminate\Http\JsonResponse;
class AdminDashboardController extends Controller
{
public function index(): View
{
// System Statistics
$systemStats = [
'users_count' => User::count(),
'roles_count' => Role::count(),
'user_roles_count' => DB::table('auth.user_roles')->count(),
'resources_count' => ResourceType::count(),
'resource_mappings_count' => ResourceTypeMapping::count(),
];
// Database Statistics
$dbStats = DB::select("
SELECT
pg_size_pretty(pg_database_size(current_database())) as db_size,
(SELECT count(*) FROM information_schema.schemata
WHERE schema_name NOT IN ('information_schema', 'pg_catalog')) as schema_count,
(SELECT count(*) FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema', 'pg_catalog')
AND table_type = 'BASE TABLE') as table_count,
(SELECT count(*) FROM information_schema.views
WHERE table_schema NOT IN ('information_schema', 'pg_catalog')
AND table_name NOT LIKE 'pg_%') as view_count,
(SELECT count(*) FROM pg_matviews) as materialized_view_count,
(SELECT count(*) FROM pg_indexes
WHERE schemaname NOT IN ('information_schema', 'pg_catalog')) as index_count
");
return view('admin::admin.dashboard', compact('systemStats', 'dbStats'));
}
public function getDatabaseIO(): JsonResponse
{
// Get current stats
$stats = DB::select("
SELECT
blks_read,
blks_hit,
tup_returned,
tup_fetched,
tup_inserted,
tup_updated,
tup_deleted,
EXTRACT(EPOCH FROM now()) as timestamp,
xact_commit,
xact_rollback
FROM pg_stat_database
WHERE datname = current_database()
");
// Store the stats in cache with timestamp
$previousStats = cache()->get('database_stats');
$currentStats = $stats[0];
cache()->put('database_stats', $currentStats, now()->addMinutes(5));
// If we have previous stats, calculate the differences
if ($previousStats) {
$timeDiff = $currentStats->timestamp - $previousStats->timestamp;
$response = [
// Calculate rates per second
'blks_read' => ($currentStats->blks_read - $previousStats->blks_read) / $timeDiff,
'blks_hit' => ($currentStats->blks_hit - $previousStats->blks_hit) / $timeDiff,
'tup_returned' => ($currentStats->tup_returned - $previousStats->tup_returned) / $timeDiff,
'tup_inserted' => ($currentStats->tup_inserted - $previousStats->tup_inserted) / $timeDiff,
'tup_updated' => ($currentStats->tup_updated - $previousStats->tup_updated) / $timeDiff,
'tup_deleted' => ($currentStats->tup_deleted - $previousStats->tup_deleted) / $timeDiff,
'xact_commit' => ($currentStats->xact_commit - $previousStats->xact_commit) / $timeDiff,
'xact_rollback' => ($currentStats->xact_rollback - $previousStats->xact_rollback) / $timeDiff,
];
} else {
// For the first call, return zeros
$response = [
'blks_read' => 0,
'blks_hit' => 0,
'tup_returned' => 0,
'tup_inserted' => 0,
'tup_updated' => 0,
'tup_deleted' => 0,
'xact_commit' => 0,
'xact_rollback' => 0,
];
}
return response()->json($response);
}
}