From 7118fea23757c3fb4e78328aad5222665002d36d Mon Sep 17 00:00:00 2001 From: ricky rx Date: Wed, 12 Jun 2024 09:40:54 +0700 Subject: [PATCH] feat: api for tv > tv page --- app/Helper/STS/Indokargo.php | 104 ++++++++++++++++++ .../api/superadmin/tv/TvController.php | 28 +++++ app/Models/StsLog.php | 4 +- app/Models/Tv.php | 101 +++++++++++++++++ routes/api/superadmin.php | 7 ++ 5 files changed, 243 insertions(+), 1 deletion(-) create mode 100644 app/Http/Controllers/api/superadmin/tv/TvController.php diff --git a/app/Helper/STS/Indokargo.php b/app/Helper/STS/Indokargo.php index 597777f..6662f3b 100644 --- a/app/Helper/STS/Indokargo.php +++ b/app/Helper/STS/Indokargo.php @@ -107,6 +107,110 @@ class Indokargo { throw $th; } } + + public static function updateTVAddress(Request $request, int $tvFk, String $ikAddressId, int $lastSeq = 0) { + $seq = $lastSeq + 1; + + $request->merge(['ik_address_id' => $ikAddressId]); + $stsLog = new StsLog(); + $stsLog->partner = StsLog::PARTNER_INDOKARGO; + $stsLog->is_outgoing = false; + $stsLog->module = StsLog::MODULE_TV; + $stsLog->service_name = StsLog::SERVICE_UPDATE_TV_ADDRESS; + $stsLog->local_id = $tvFk; + $stsLog->partner_id = $ikAddressId; + $stsLog->seq = $seq; + $stsLog->request_data = $request->all(); + $stsLog->request_time = Carbon::now(); + + try { + $request->validate(['code' => 'required|string', 'ik_address_id' => 'required|string']); + $result = Http::indokargo()->post('tv/address/update-tv', $request->all()); + $res = $result->throw()->json(); + + // update stsLog + $stsLog->response_data = $res; + $stsLog->response_time = Carbon::now(); + self::_checkIkResponse($res); + $stsLog->result = StsLog::STATUS_SUCCESS; + $stsLog->save(); + DB::commit(); + + return JSONResponse::Success(['is_warning' => false, 'message' => 'Success To Save Data']); + } catch(ConnectionException $e) { + // if error cause by connection error, try again later + $stsLog->error_info = [ + 'message' => $e->getMessage(), + 'errors' => $e->getTrace() + ]; + $stsLog->result = StsLog::STATUS_FAILED; + $stsLog->is_retry = true; + $stsLog->save(); + return JSONResponse::Success(['is_warning' => true, + 'message' => "Failed to sync data with indokargo data, don't worry, we will sync data later"]); + } catch(\Throwable $th) { + DB::rollBack(); + $stsLog->error_info = [ + 'message' => $th->getMessage(), + 'errors' => $th->getTrace() + ]; + $stsLog->result = StsLog::STATUS_FAILED; + $stsLog->save(); + throw $th; + } + } + + public static function changeStatusAddress(Request $request, int $tvFk, String $ikAddressId, int $lastSeq = 0) { + $seq = $lastSeq + 1; + + $request->merge(['ik_address_id' => $ikAddressId]); + $stsLog = new StsLog(); + $stsLog->partner = StsLog::PARTNER_INDOKARGO; + $stsLog->is_outgoing = false; + $stsLog->module = StsLog::MODULE_TV; + $stsLog->service_name = StsLog::SERVICE_CHANGE_STATUS_TV_ADDRESS; + $stsLog->local_id = $tvFk; + $stsLog->partner_id = $request->ik_address_id; + $stsLog->seq = $seq; + $stsLog->request_data = $request->all(); + $stsLog->request_time = Carbon::now(); + + try { + $request->validate(['ik_address_id' => 'required|string', 'is_active'=> 'required|boolean']); + $result = Http::indokargo()->post('tv/address/change-status', $request->all()); + $res = $result->throw()->json(); + + // update stsLog + $stsLog->response_data = $res; + $stsLog->response_time = Carbon::now(); + self::_checkIkResponse($res); + $stsLog->result = StsLog::STATUS_SUCCESS; + $stsLog->save(); + DB::commit(); + + return JSONResponse::Success(['is_warning' => false, 'message' => 'Success To Change Status']); + } catch(ConnectionException $e) { + // if error cause by connection error, try again later + $stsLog->error_info = [ + 'message' => $e->getMessage(), + 'errors' => $e->getTrace() + ]; + $stsLog->result = StsLog::STATUS_FAILED; + $stsLog->is_retry = true; + $stsLog->save(); + return JSONResponse::Success(['is_warning' => true, + 'message' => "Failed to sync data with indokargo data, don't worry, we will sync data later"]); + } catch(\Throwable $th) { + DB::rollBack(); + $stsLog->error_info = [ + 'message' => $th->getMessage(), + 'errors' => $th->getTrace() + ]; + $stsLog->result = StsLog::STATUS_FAILED; + $stsLog->save(); + throw $th; + } + } } ?> \ No newline at end of file diff --git a/app/Http/Controllers/api/superadmin/tv/TvController.php b/app/Http/Controllers/api/superadmin/tv/TvController.php new file mode 100644 index 0000000..41c3544 --- /dev/null +++ b/app/Http/Controllers/api/superadmin/tv/TvController.php @@ -0,0 +1,28 @@ +validate([ + 'perPage' => 'nullable|integer|min:1', + ...DatabaseHelper::getOrderBysValidations(), + 'search' => DatabaseHelper::getSearchValidation() + ]); + + $newTvRequests = Tv::multiSearch($request->search, ['code']) + ->multiOrderBy($request->orderBys, 'created_at desc') + ->paginate($request->perPage ?? 10); + + return JSONResponse::Success(['data' => $newTvRequests ]); + } + + public function update(Request $request) { return Tv::updateFromRequest($request); } + public function changeStatus(Request $request) { return Tv::changeStatusFromRequest($request); } +} diff --git a/app/Models/StsLog.php b/app/Models/StsLog.php index 458ab7f..26ef4e4 100644 --- a/app/Models/StsLog.php +++ b/app/Models/StsLog.php @@ -43,5 +43,7 @@ class StsLog extends Model { // related to indokargo const MODULE_TV = 'tv'; - const SERVICE_CREATE_TV_ADDRESS = 'create-tv-addrass'; + const SERVICE_CREATE_TV_ADDRESS = 'create-tv-address'; + const SERVICE_UPDATE_TV_ADDRESS = 'update-tv-address'; + const SERVICE_CHANGE_STATUS_TV_ADDRESS = 'change-statustv-address'; } diff --git a/app/Models/Tv.php b/app/Models/Tv.php index 5eff49a..031dd84 100644 --- a/app/Models/Tv.php +++ b/app/Models/Tv.php @@ -3,6 +3,9 @@ namespace App\Models; use App\Helper\JSONResponse; +use App\Helper\STS\Indokargo; +use App\Helper\Traits\Models\CanMultiOrderBy; +use App\Helper\Traits\Models\CanMultiSearch; use Illuminate\Database\Eloquent\Casts\AsArrayObject; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -10,9 +13,13 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; +use Illuminate\Validation\Rule; class Tv extends Model { use HasFactory; + use CanMultiSearch; + use CanMultiOrderBy; protected $table = 'tvs'; protected $hidden = ['ik_cust_id', 'ik_address_id']; @@ -42,4 +49,98 @@ class Tv extends Model { } // -- END RELATED TO DATA FUNCTION //------------------------------------------------------------ + + //------------------------------------------------------------ + // -- RELATED TO REQUEST + public static function modifyAndValidateUpsertRequest(Request $request, $isUpdate = false) { + if($request->code) $request->merge(['code' => strtoupper($request->code)]); + $validationRules = [ + 'code' => ['required','string',Rule::unique('tvs', 'code') + ->when($request->id, function($q, $id) { + $q->whereNot('id', $id); + })], + 'col1' => 'nullable|string', + 'col2' => 'nullable|string', + 'col3' => 'nullable|string', + 'col4' => 'nullable|string', + 'col5' => 'nullable|string', + 'col6' => 'nullable|string', + 'col7' => 'nullable|string', + 'col8' => 'nullable|string', + 'col9' => 'nullable|string', + 'col10' => 'nullable|string', + 'notes' => 'nullable|string', + ]; + if($isUpdate) $validationRules['id'] = 'nullable|integer|exists:App\Models\Tv'; + $request->validate(); + return $request; + } + public static function updateFromRequest(Request $request) { + if($request->code) $request->merge(['code' => strtoupper($request->code)]); + $request->validate([ + 'id' => 'required|integer|exists:App\Models\Tv', + 'code' => ['required','string',Rule::unique('tvs', 'code') + ->when($request->id, function($q, $id) { + $q->whereNot('id', $id); + })], + 'col1' => 'nullable|string', + 'col2' => 'nullable|string', + 'col3' => 'nullable|string', + 'col4' => 'nullable|string', + 'col5' => 'nullable|string', + 'col6' => 'nullable|string', + 'col7' => 'nullable|string', + 'col8' => 'nullable|string', + 'col9' => 'nullable|string', + 'col10' => 'nullable|string', + 'notes' => 'nullable|string', + ]); + + try { + DB::beginTransaction(); + $tv = TV::findOrFail($request->id); + $tv->code = $request->code; + $tv->col1 = $request->col1; + $tv->col2 = $request->col2; + $tv->col3 = $request->col3; + $tv->col4 = $request->col4; + $tv->col5 = $request->col5; + $tv->col6 = $request->col6; + $tv->col7 = $request->col7; + $tv->col8 = $request->col8; + $tv->col9 = $request->col9; + $tv->col10 = $request->col10; + $tv->notes = $request->notes; + $tv->update(); + + // try to sys_to_sys with indokargo + $jsonResponse = Indokargo::updateTVAddress($request, $tv->id, $tv->ik_address_id); + DB::commit(); + return $jsonResponse; + } catch(\Throwable $th) { + DB::rollback(); + throw $th; + } + + } + public static function changeStatusFromRequest(Request $request) { + $request->validate(['id' => 'required|integer|exists:App\Models\TV,id']); + + try { + $tv = Tv::findOrFail($request->id); + $tv->is_active = !$tv->is_active; + $tv->save(); + + // try to sys_to_sys with indokargo + $jsonResponse = Indokargo::changeStatusAddress(new Request(['is_active' => $tv->is_active]), + $tv->id, $tv->ik_address_id); + DB::commit(); + return $jsonResponse; + } catch(\Throwable $th) { + DB::rollback(); + throw $th; + } + } + // -- END RELATED TO REQUES + //------------------------------------------------------------ } diff --git a/routes/api/superadmin.php b/routes/api/superadmin.php index 2c383d4..c9c9565 100644 --- a/routes/api/superadmin.php +++ b/routes/api/superadmin.php @@ -2,6 +2,7 @@ use App\Http\Controllers\api\superadmin\ApkUploadController; use App\Http\Controllers\api\superadmin\tv\NewTvRequestController; +use App\Http\Controllers\api\superadmin\tv\TvController; use App\Http\Controllers\api\superadmin\UserManagementController; use App\Http\Controllers\api\superadmin\VideoUploadController; use Illuminate\Support\Facades\Route; @@ -30,6 +31,12 @@ Route::controller(UserManagementController::class)->group(function() { Route::post('/user-management/delete', 'delete'); }); +Route::controller(TvController::class)->group(function() { + Route::post('/tv/tv', 'init'); + Route::post('/tv/tv/update', 'update'); + Route::post('/tv/tv/change-status', 'changeStatus'); +}); + Route::controller(NewTvRequestController::class)->group(function() { Route::post('/tv/new-tv-request', 'init'); Route::post('/tv/new-tv-request/approve', 'approve');