From 1aeda710e199a0b74c92ec584b7be846d262e3e6 Mon Sep 17 00:00:00 2001 From: Truong Vo <41848815+vmtruong301296@users.noreply.github.com> Date: Fri, 20 Sep 2024 15:27:32 +0700 Subject: [PATCH 1/2] =?UTF-8?q?B=E1=BB=95=20sung=20api=20Technical?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Http/Controllers/TechnicalController.php | 173 ++++++++++++++++++ .../Modules/Admin/app/Models/Technical.php | 13 ++ .../Admin/app/Models/TechnicalUser.php | 32 ++++ BACKEND/Modules/Admin/routes/api.php | 13 ++ 4 files changed, 231 insertions(+) create mode 100644 BACKEND/Modules/Admin/app/Http/Controllers/TechnicalController.php create mode 100644 BACKEND/Modules/Admin/app/Models/Technical.php create mode 100644 BACKEND/Modules/Admin/app/Models/TechnicalUser.php diff --git a/BACKEND/Modules/Admin/app/Http/Controllers/TechnicalController.php b/BACKEND/Modules/Admin/app/Http/Controllers/TechnicalController.php new file mode 100644 index 0000000..2c14e01 --- /dev/null +++ b/BACKEND/Modules/Admin/app/Http/Controllers/TechnicalController.php @@ -0,0 +1,173 @@ +orderByRequest($technicals, $request); + + $technicals->orderBy('name', 'asc'); + // Filter + $this->filterRequest( + builder: $technicals, + request: $request, + filterKeys: [ + 'name' => self::F_TEXT, + 'level' => self::F_TEXT, + ] + ); + + $this->searchRequest( + builder: $technicals, + value: $request->get('search'), + fields: [ + 'name', + 'level' + ] + ); + + $responseData = $technicals->get(); + + return AbstractController::ResultSuccess($responseData); + } + + public function createTechnical(Request $request) + { + $request->validate([ + 'name' => 'required|string|max:255', + 'level' => 'nullable|integer|min:1|max:3', + ]); + $technical = Technical::create([ + 'name' => $request->name, + 'level' => $request->level, + ]); + + return AbstractController::ResultSuccess($technical, "Technical created successfully!"); + } + + public function deleteTechnical(Request $request) + { + $id = $request->input('id'); + $technical = Technical::find($id); + if (!$technical) { + return AbstractController::ResultError("Technical not found"); + } + $technical->delete(); + return AbstractController::ResultSuccess("Technical deleted successfully!"); + } + + public function getTechnicalsByUserId($userId) + { + $technicals = TechnicalUser::with('technical') + ->where('user_id', $userId) + ->get(); + + if ($technicals->isEmpty()) { + return AbstractController::ResultError("No technicals found for this user."); + } + + // Chuẩn bị dữ liệu để trả về + $technicalData = $technicals->map(function ($technicalUser) { + return [ + 'id' => $technicalUser->technical->id, + 'name' => $technicalUser->technical->name, + 'level' => $technicalUser->technical->level, + 'point' => $technicalUser->point, + 'updated_at' => $technicalUser->updated_at + ]; + }); + return AbstractController::ResultSuccess($technicalData); + } + + public function getTechnicalsOfUser() + { + $userInfo = auth('admins')->user(); + $userId = $userInfo->id; + $technicals = TechnicalUser::with('technical') + ->where('user_id', $userId) + ->get(); + + if ($technicals->isEmpty()) { + return AbstractController::ResultError("No technicals found for this user."); + } + + // Chuẩn bị dữ liệu để trả về + $technicalData = $technicals->map(function ($technicalUser) { + return [ + 'id' => $technicalUser->technical->id, + 'name' => $technicalUser->technical->name, + 'level' => $technicalUser->technical->level, + 'point' => $technicalUser->point, + 'updated_at' => $technicalUser->updated_at + ]; + }); + return AbstractController::ResultSuccess($technicalData); + } + + public function getListUserByTechnicalId($technicalId) + { + $users = TechnicalUser::with('user') + ->where('technical_id', $technicalId) + ->get(); + + if ($users->isEmpty()) { + return AbstractController::ResultError("No users found for this technical."); + } + $userData = $users->map(function ($technicalUser) { + if ($technicalUser->user) { + return [ + 'user_id' => $technicalUser->user->id ?? "", + 'name' => $technicalUser->user->name, + 'email' => $technicalUser->user->email, + 'point' => $technicalUser->point + ]; + } + }); + + return AbstractController::ResultSuccess($userData); + } + + public function updateTechnicalsUser(Request $request) + { + $userInfo = auth('admins')->user(); + + $validatedData = $request->validate([ + 'technicals' => 'required|array', + 'technicals.*.technical_id' => 'required|exists:technicals,id', // Phải tồn tại trong bảng technicals + 'technicals.*.point' => 'required|integer|min:0|max:3', // Điểm trong khoảng [0-3] + ]); + + // Xóa hết các bản ghi hiện có của user trong bảng technical_users + TechnicalUser::where('user_id', $userInfo->id)->delete(); + + // Duyệt qua mảng technicals và thêm mới dữ liệu + foreach ($validatedData['technicals'] as $technical) { + TechnicalUser::create([ + 'user_id' => $userInfo->id, + 'technical_id' => $technical['technical_id'], + 'point' => $technical['point'] + ]); + } + + return AbstractController::ResultSuccess('Technicals for user updated successfully.'); + } +} diff --git a/BACKEND/Modules/Admin/app/Models/Technical.php b/BACKEND/Modules/Admin/app/Models/Technical.php new file mode 100644 index 0000000..4b2314c --- /dev/null +++ b/BACKEND/Modules/Admin/app/Models/Technical.php @@ -0,0 +1,13 @@ +belongsTo(User::class, 'user_id'); + } + + // Quan hệ với bảng technicals + public function technical() + { + return $this->belongsTo(Technical::class, 'technical_id'); + } +} diff --git a/BACKEND/Modules/Admin/routes/api.php b/BACKEND/Modules/Admin/routes/api.php index b6382a7..0961b75 100755 --- a/BACKEND/Modules/Admin/routes/api.php +++ b/BACKEND/Modules/Admin/routes/api.php @@ -17,6 +17,7 @@ use Modules\Admin\app\Http\Controllers\TimekeepingController; use Modules\Admin\app\Http\Controllers\TrackingController; use Modules\Admin\app\Http\Controllers\CriteriasController; use Modules\Admin\app\Http\Controllers\ProfileController; +use Modules\Admin\app\Http\Controllers\TechnicalController; use Modules\Admin\app\Http\Controllers\TestCaseForSprintController; use Modules\Admin\app\Http\Middleware\AdminMiddleware; @@ -173,6 +174,18 @@ Route::middleware('api') Route::get('/profiles-data', [ProfileController::class, 'getProfilesData'])->middleware('check.permission:admin.hr.staff.tester'); Route::post('/profiles-data/update', [ProfileController::class, 'updateProfilesData'])->middleware('check.permission:admin.hr.staff.tester'); }); + + Route::group([ + 'prefix' => 'technical', + ], function () { + Route::get('/get-all', [TechnicalController::class, 'getAllTechnical']); + Route::post('/create', [TechnicalController::class, 'createTechnical'])->middleware('check.permission:admin'); + Route::get('/delete', [TechnicalController::class, 'deleteTechnical'])->middleware('check.permission:admin'); + Route::get('/get-tech-of-user', [TechnicalController::class, 'getTechnicalsOfUser']); + Route::get('/get-tech-by-user-id/{userId}', [TechnicalController::class, 'getTechnicalsByUserId'])->middleware('check.permission:admin'); + Route::get('/get-list-user-by-tech-id/{technicalId}', [TechnicalController::class, 'getListUserByTechnicalId'])->middleware('check.permission:admin'); + Route::post('/technicals-user/update', [TechnicalController::class, 'updateTechnicalsUser']); + }); }); }); From e114d5b3ae04b0dc6763347eab1d9fbb0b67838f Mon Sep 17 00:00:00 2001 From: Truong Vo <41848815+vmtruong301296@users.noreply.github.com> Date: Fri, 20 Sep 2024 15:52:33 +0700 Subject: [PATCH 2/2] =?UTF-8?q?B=E1=BB=95=20sung=20api=20get=20all=20user?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Http/Controllers/ProfileController.php | 32 ++++++++++++++++--- .../Http/Controllers/TechnicalController.php | 7 ++++ BACKEND/Modules/Admin/routes/api.php | 1 + 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/BACKEND/Modules/Admin/app/Http/Controllers/ProfileController.php b/BACKEND/Modules/Admin/app/Http/Controllers/ProfileController.php index 9e7b90e..82909b9 100644 --- a/BACKEND/Modules/Admin/app/Http/Controllers/ProfileController.php +++ b/BACKEND/Modules/Admin/app/Http/Controllers/ProfileController.php @@ -28,18 +28,39 @@ class ProfileController extends Controller $this->jiraService = $jiraService; } - public function getProfilesData() + public function getProfilesData(Request $request) { $user = auth('admins')->user(); $userEmail = $user->email; $projects = $this->jiraService->getAllProjects(); - $userCriterias = UserCriteria::with([ - 'sprint', // Join với bảng sprint - 'criteria', // Join với bảng criteria - ])->where('user_email', $userEmail)->get(); + $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); @@ -49,6 +70,7 @@ class ProfileController extends Controller $sprint = $userCriteriasBySprint->first()->sprint; return [ 'name' => $sprint->name, + 'complete_date' => $sprint->complete_date ?? '', 'criterias' => $userCriteriasBySprint->map(function ($userCriteria) { $criteria = $userCriteria->criteria; return [ diff --git a/BACKEND/Modules/Admin/app/Http/Controllers/TechnicalController.php b/BACKEND/Modules/Admin/app/Http/Controllers/TechnicalController.php index 2c14e01..af43dac 100644 --- a/BACKEND/Modules/Admin/app/Http/Controllers/TechnicalController.php +++ b/BACKEND/Modules/Admin/app/Http/Controllers/TechnicalController.php @@ -10,6 +10,7 @@ use App\Traits\AnalyzeData; use App\Traits\HasFilterRequest; use App\Traits\HasOrderByRequest; use App\Traits\HasSearchRequest; +use Modules\Admin\app\Models\Admin; class TechnicalController extends Controller { @@ -18,6 +19,12 @@ class TechnicalController extends Controller use HasSearchRequest; use AnalyzeData; + public function getAllUsers() + { + $users = Admin::where('permission', 'like', '%staff%')->get()->toArray(); + return AbstractController::ResultSuccess($users); + } + public function getAllTechnical(Request $request) { $technicals = new Technical; diff --git a/BACKEND/Modules/Admin/routes/api.php b/BACKEND/Modules/Admin/routes/api.php index 0961b75..d36b3fe 100755 --- a/BACKEND/Modules/Admin/routes/api.php +++ b/BACKEND/Modules/Admin/routes/api.php @@ -178,6 +178,7 @@ Route::middleware('api') Route::group([ 'prefix' => 'technical', ], function () { + Route::get('/get-all-user', [TechnicalController::class, 'getAllUsers'])->middleware('check.permission:admin'); Route::get('/get-all', [TechnicalController::class, 'getAllTechnical']); Route::post('/create', [TechnicalController::class, 'createTechnical'])->middleware('check.permission:admin'); Route::get('/delete', [TechnicalController::class, 'deleteTechnical'])->middleware('check.permission:admin');