init commit

This commit is contained in:
David Melendez
2026-01-14 22:38:44 +01:00
parent 4e0c415f0b
commit e25d53d054
124 changed files with 21653 additions and 1 deletions

View File

@@ -0,0 +1,154 @@
<?php
/**
* Dashboard Controller
* Professional Resume Builder - Main Dashboard
*
* @author David Valera Melendez <david@valera-melendez.de>
* @created 2025-08-08
* @location Made in Germany 🇩🇪
*/
namespace App\Http\Controllers;
use App\Interfaces\UserRepositoryInterface;
use App\Interfaces\ResumeRepositoryInterface;
use App\Services\ResumeService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\View\View;
/**
* Dashboard Controller
* Handles the main dashboard functionality with repository pattern
*/
class DashboardController extends Controller
{
/**
* User repository instance
*/
protected UserRepositoryInterface $userRepository;
/**
* Resume repository instance
*/
protected ResumeRepositoryInterface $resumeRepository;
/**
* Resume service instance
*/
protected ResumeService $resumeService;
/**
* Create a new controller instance with dependency injection
*/
public function __construct(
UserRepositoryInterface $userRepository,
ResumeRepositoryInterface $resumeRepository,
ResumeService $resumeService
) {
$this->userRepository = $userRepository;
$this->resumeRepository = $resumeRepository;
$this->resumeService = $resumeService;
$this->middleware('auth');
}
/**
* Show the application dashboard
*/
public function index(): View
{
$user = Auth::user();
// Get user's resumes using repository
$resumes = $this->resumeRepository->getUserResumes($user->id);
// Get resume statistics using repository
$resumeStats = $this->resumeRepository->getResumeStatistics($user->id);
// Get recent resumes (last 5)
$recentResumes = $this->resumeRepository
->orderBy('updated_at', 'desc')
->limit(5)
->getUserResumes($user->id);
// Calculate profile completion
$profileCompletion = $this->calculateProfileCompletion($user);
return view('dashboard.index', [
'title' => 'Dashboard - Professional Resume Builder',
'user' => $user,
'resumes' => $resumes,
'resumeStats' => $resumeStats,
'recentResumes' => $recentResumes,
'profileCompletion' => $profileCompletion,
'stats' => [
'total_resumes' => $resumeStats['total_resumes'],
'published_resumes' => $resumeStats['published_resumes'],
'draft_resumes' => $resumeStats['draft_resumes'],
'completed_resumes' => $resumeStats['completed_resumes'],
'avg_completion' => $resumeStats['avg_completion'],
'total_views' => $resumeStats['total_views'],
'total_downloads' => $resumeStats['total_downloads'],
'profile_completion' => $profileCompletion
]
]);
}
/**
* Calculate profile completion percentage
*/
private function calculateProfileCompletion($user): int
{
$requiredFields = [
'first_name', 'last_name', 'email', 'phone',
'bio', 'website', 'linkedin'
];
$completed = 0;
foreach ($requiredFields as $field) {
if (!empty($user->$field)) {
$completed++;
}
}
return (int) (($completed / count($requiredFields)) * 100);
}
/**
* Get dashboard analytics data
*/
public function analytics(): \Illuminate\Http\JsonResponse
{
$user = Auth::user();
$analytics = [
'user_stats' => $this->userRepository->getUserStatistics(),
'resume_stats' => $this->resumeRepository->getResumeStatistics($user->id),
'recent_activity' => $this->getRecentActivity($user->id),
];
return response()->json($analytics);
}
/**
* Get recent user activity
*/
private function getRecentActivity(int $userId): array
{
$recentResumes = $this->resumeRepository
->orderBy('updated_at', 'desc')
->limit(10)
->getUserResumes($userId);
return $recentResumes->map(function ($resume) {
return [
'id' => $resume->id,
'title' => $resume->title,
'action' => 'updated',
'timestamp' => $resume->updated_at,
'status' => $resume->status,
];
})->toArray();
}
}