From cd5239b108f41867614b7ac1f3f164a20382af08 Mon Sep 17 00:00:00 2001 From: baodev0 Date: Mon, 13 Jul 2026 10:43:17 +0700 Subject: [PATCH] Add customer status update and bulk management endpoints --- .github/workflows/deploy.yml | 3 +- .../Api/Admin/Customer/CustomerController.php | 96 +++++++++++++++++++ routes/api.php | 5 + 3 files changed, 102 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index a08e453..f1d60fe 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -42,8 +42,7 @@ jobs: git clone -b "$BRANCH" "${{ secrets.REPO_URL }}" . fi - rm -rf vendor - composer install --no-dev --optimize-autoloader --no-interaction + composer install --optimize-autoloader --no-interaction php artisan migrate --force diff --git a/app/Http/Controllers/Api/Admin/Customer/CustomerController.php b/app/Http/Controllers/Api/Admin/Customer/CustomerController.php index 6aba7ae..10be87d 100644 --- a/app/Http/Controllers/Api/Admin/Customer/CustomerController.php +++ b/app/Http/Controllers/Api/Admin/Customer/CustomerController.php @@ -1272,6 +1272,102 @@ class CustomerController extends Controller ]); } + public function updateStatus(string $uuid, Request $request): JsonResponse + { + $request->validate(['status' => ['required', 'integer', 'in:0,1,2,3']]); + + $customer = $this->customerRepository->findBy('uuid', $uuid); + if (!$customer) { + return response()->json(['error' => true, 'message' => "Can't find customer by UUID #" . $uuid], 404); + } + + $customer->status = $request->input('status'); + $customer->save(); + + return response()->json(['error' => false, 'message' => 'Cập nhật trạng thái thành công']); + } + + public function bulkDelete(Request $request): JsonResponse + { + $request->validate(['uuids' => ['required', 'array', 'min:1'], 'uuids.*' => ['string']]); + + $uuids = $request->input('uuids'); + $customers = Customer::whereIn('uuid', $uuids)->get(); + + try { + DB::beginTransaction(); + foreach ($customers as $c) { + Invoice::where('customer_id', $c->id)->delete(); + Order::where('customer_id', $c->id)->delete(); + Transaction::where('customer_id', $c->id)->delete(); + $c->delete(); + } + DB::commit(); + return response()->json(['error' => false, 'message' => "Đã xoá {$customers->count()} khách hàng"]); + } catch (\Exception $e) { + DB::rollBack(); + return response()->json(['error' => true, 'message' => $e->getMessage()], 500); + } + } + + public function bulkRestore(Request $request): JsonResponse + { + $request->validate(['uuids' => ['required', 'array', 'min:1'], 'uuids.*' => ['string']]); + + $customers = Customer::onlyTrashed()->whereIn('uuid', $request->input('uuids'))->get(); + + try { + DB::beginTransaction(); + foreach ($customers as $c) { + $c->restore(); + Invoice::withTrashed()->where('customer_id', $c->id)->restore(); + Order::withTrashed()->where('customer_id', $c->id)->restore(); + Transaction::withTrashed()->where('customer_id', $c->id)->restore(); + } + DB::commit(); + return response()->json(['error' => false, 'message' => "Đã khôi phục {$customers->count()} khách hàng"]); + } catch (\Exception $e) { + DB::rollBack(); + return response()->json(['error' => true, 'message' => $e->getMessage()], 500); + } + } + + public function bulkForceDelete(Request $request): JsonResponse + { + $request->validate(['uuids' => ['required', 'array', 'min:1'], 'uuids.*' => ['string']]); + + $customers = Customer::onlyTrashed()->whereIn('uuid', $request->input('uuids'))->get(); + + try { + DB::beginTransaction(); + foreach ($customers as $c) { + Invoice::withTrashed()->where('customer_id', $c->id)->forceDelete(); + Order::withTrashed()->where('customer_id', $c->id)->forceDelete(); + Transaction::withTrashed()->where('customer_id', $c->id)->forceDelete(); + $c->forceDelete(); + } + DB::commit(); + return response()->json(['error' => false, 'message' => "Đã xoá vĩnh viễn {$customers->count()} khách hàng"]); + } catch (\Exception $e) { + DB::rollBack(); + return response()->json(['error' => true, 'message' => $e->getMessage()], 500); + } + } + + public function bulkStatus(Request $request): JsonResponse + { + $request->validate([ + 'uuids' => ['required', 'array', 'min:1'], + 'uuids.*' => ['string'], + 'status' => ['required', 'integer', 'in:0,1,2,3'], + ]); + + $count = Customer::whereIn('uuid', $request->input('uuids')) + ->update(['status' => $request->input('status')]); + + return response()->json(['error' => false, 'message' => "Đã cập nhật trạng thái {$count} khách hàng"]); + } + private function cycleToMonths(?string $cycle): int { return match ($cycle) { diff --git a/routes/api.php b/routes/api.php index 7ad9be5..65ba3f2 100644 --- a/routes/api.php +++ b/routes/api.php @@ -139,6 +139,11 @@ Route::prefix('v1') Route::get('{uuid}/dns-domains/{domainId}/records', 'getDnsDomainRecords')->middleware( 'perm:customer.view', ); + Route::patch('{uuid}/status', 'updateStatus')->middleware('perm:customer.edit'); + Route::post('bulk-delete', 'bulkDelete')->middleware('perm:customer.destroy'); + Route::post('bulk-restore', 'bulkRestore')->middleware('perm:customer.edit'); + Route::post('bulk-force-delete', 'bulkForceDelete')->middleware('perm:customer.destroy'); + Route::post('bulk-status', 'bulkStatus')->middleware('perm:customer.edit'); Route::post('{uuid}/restore', 'restore')->middleware('perm:customer.edit'); Route::delete('{uuid}/force', 'forceDelete')->middleware('perm:customer.destroy'); });