119 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			119 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
namespace Modules\Admin\app\Http\Controllers;
 | 
						|
 | 
						|
use App\Http\Controllers\Controller;
 | 
						|
use App\Models\User;
 | 
						|
use App\Services\JiraService;
 | 
						|
use App\Traits\AnalyzeData;
 | 
						|
use App\Traits\HasFilterRequest;
 | 
						|
use App\Traits\HasOrderByRequest;
 | 
						|
use App\Traits\HasSearchRequest;
 | 
						|
use Illuminate\Http\Request;
 | 
						|
use Illuminate\Support\Facades\Storage;
 | 
						|
use Modules\Admin\app\Models\Sprint;
 | 
						|
use Modules\Admin\app\Models\UserCriteria;
 | 
						|
 | 
						|
class ProfileController extends Controller
 | 
						|
{
 | 
						|
    use HasOrderByRequest;
 | 
						|
    use HasFilterRequest;
 | 
						|
    use HasSearchRequest;
 | 
						|
    use AnalyzeData;
 | 
						|
 | 
						|
    protected $jiraService;
 | 
						|
 | 
						|
    public function __construct(JiraService $jiraService)
 | 
						|
    {
 | 
						|
        $this->jiraService = $jiraService;
 | 
						|
    }
 | 
						|
 | 
						|
    public function getProfilesData(Request $request)
 | 
						|
    {
 | 
						|
        $user = auth('admins')->user();
 | 
						|
 | 
						|
        $userEmail = $user->email;
 | 
						|
        $projects = $this->jiraService->getAllProjects();
 | 
						|
 | 
						|
        $startDate = $request->input('fromDate');
 | 
						|
        $endDate = $request->input('toDate');
 | 
						|
 | 
						|
        $userCriterias = UserCriteria::with([
 | 
						|
            'sprint' => function ($query) use ($startDate, $endDate) {
 | 
						|
                if ($startDate && $endDate) {
 | 
						|
                    $query->whereBetween('complete_date', [$startDate, $endDate]);
 | 
						|
                } elseif ($startDate) {
 | 
						|
                    $query->where('complete_date', '>=', $startDate);
 | 
						|
                } elseif ($endDate) {
 | 
						|
                    $query->where('complete_date', '<=', $endDate);
 | 
						|
                }
 | 
						|
            },
 | 
						|
            'criteria',
 | 
						|
        ])->where('user_email', $userEmail)
 | 
						|
            ->whereHas('sprint', function ($query) use ($startDate, $endDate) {
 | 
						|
                if ($startDate && $endDate) {
 | 
						|
                    $query->whereBetween('complete_date', [$startDate, $endDate]);
 | 
						|
                } elseif ($startDate) {
 | 
						|
                    $query->where('complete_date', '>=', $startDate);
 | 
						|
                } elseif ($endDate) {
 | 
						|
                    $query->where('complete_date', '<=', $endDate);
 | 
						|
                }
 | 
						|
            })
 | 
						|
            ->get();
 | 
						|
        // dd($userCriterias);
 | 
						|
        // Xử lý dữ liệu thành cấu trúc mong muốn
 | 
						|
        $projectsData = $userCriterias->groupBy('sprint.project_id')->map(function ($userCriteriasByProject, $projectId) use ($projects) {
 | 
						|
            $result = self::getProjectById($projects, $projectId);
 | 
						|
            return [
 | 
						|
                'name' => $result['name'],
 | 
						|
                'sprints' => $userCriteriasByProject->groupBy('sprint.id')->map(function ($userCriteriasBySprint) {
 | 
						|
                    $sprint = $userCriteriasBySprint->first()->sprint;
 | 
						|
                    return [
 | 
						|
                        'name' => $sprint->name,
 | 
						|
                        'complete_date' => $sprint->complete_date ?? '',
 | 
						|
                        'criterias' => $userCriteriasBySprint->map(function ($userCriteria) {
 | 
						|
                            $criteria = $userCriteria->criteria;
 | 
						|
                            return [
 | 
						|
                                'criteria' => $criteria->name,
 | 
						|
                                'note' => $userCriteria->note ?? '',
 | 
						|
                                'createdBy' => $userCriteria->created_by ?? '', // Lấy tên user từ auth
 | 
						|
                                'point' => $userCriteria->point ?? '',
 | 
						|
                            ];
 | 
						|
                        })
 | 
						|
                    ];
 | 
						|
                })->values()
 | 
						|
            ];
 | 
						|
        })->values();
 | 
						|
 | 
						|
        // Trả về kết quả
 | 
						|
        return AbstractController::ResultSuccess($projectsData);
 | 
						|
    }
 | 
						|
 | 
						|
    public function getProjectById($projects, $inputId)
 | 
						|
    {
 | 
						|
        $filteredProjects = array_filter($projects, function ($project) use ($inputId) {
 | 
						|
            return $project['id'] == $inputId;
 | 
						|
        });
 | 
						|
        return array_values($filteredProjects) ? array_values($filteredProjects)[0] : array_values($filteredProjects);
 | 
						|
    }
 | 
						|
 | 
						|
    public function updateProfilesData(Request $request)
 | 
						|
    {
 | 
						|
        $userInfo = auth('admins')->user();
 | 
						|
        $request->validate([
 | 
						|
            'file' => 'required|image|mimes:jpeg,png,jpg,gif|max:2048', // Chỉ chấp nhận file ảnh dưới 2MB
 | 
						|
        ]);
 | 
						|
 | 
						|
        $user = User::findOrFail($userInfo->id);
 | 
						|
 | 
						|
        if ($user->avatar) {
 | 
						|
            Storage::disk('public')->delete($user->avatar);
 | 
						|
        }
 | 
						|
 | 
						|
        $path = $request->file('file')->store('avatars', 'public');
 | 
						|
        $user->avatar = $path;
 | 
						|
        $user->save();
 | 
						|
        return AbstractController::ResultSuccess($path);
 | 
						|
    }
 | 
						|
}
 |