feat: api for frontend> tv > new tv request
parent
546df1abf6
commit
fb281607d1
@ -0,0 +1,112 @@
|
|||||||
|
<?php
|
||||||
|
namespace App\Helper\STS;
|
||||||
|
|
||||||
|
use App\Helper\JSONResponse;
|
||||||
|
use App\Models\StsLog;
|
||||||
|
use App\Models\Tv;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use Illuminate\Http\Client\ConnectionException;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Http;
|
||||||
|
use Illuminate\Validation\ValidationException;
|
||||||
|
|
||||||
|
class Indokargo {
|
||||||
|
const STATUS_SUCCESS = 'Success';
|
||||||
|
const STATUS_FAILURE = 'Failure';
|
||||||
|
// const STATUS_WARNING = 'Warning';
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
//-- UTILITIES
|
||||||
|
private static function _checkIkResponse($res) {
|
||||||
|
$status = $res['status'];
|
||||||
|
if($res['status'] == self::STATUS_SUCCESS) return;
|
||||||
|
else if($res['status'] == self::STATUS_FAILURE) {
|
||||||
|
// note: Indokargo error message can be array or string
|
||||||
|
$errorMessage = $res['error']['error_message'];
|
||||||
|
if(is_array($errorMessage)) throw ValidationException::withMessages($errorMessage);
|
||||||
|
else throw new \Exception($errorMessage);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
throw new \Exception("Indokargo status is not valid (ik status = $status)" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//-- END UTILITIES
|
||||||
|
//------------------------------------------------------------------------
|
||||||
|
|
||||||
|
public static function createTVAddress(Request $request, int $tvFk, int $lastSeq = 0) {
|
||||||
|
$seq = $lastSeq + 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* local id = TV FK, partnerId = ik_address_id
|
||||||
|
* Why not new tv request id as local_id?
|
||||||
|
* - New Tv request data will be deleted after TV data is inserted into the local DB
|
||||||
|
*/
|
||||||
|
$stsLog = new StsLog();
|
||||||
|
$stsLog->partner = StsLog::PARTNER_INDOKARGO;
|
||||||
|
$stsLog->is_outgoing = false;
|
||||||
|
$stsLog->module = StsLog::MODULE_TV;
|
||||||
|
$stsLog->service_name = StsLog::SERVICE_CREATE_TV_ADDRESS;
|
||||||
|
$stsLog->local_id = $tvFk;
|
||||||
|
$stsLog->partner_id = null;
|
||||||
|
$stsLog->seq = $seq;
|
||||||
|
$stsLog->request_data = $request->all();
|
||||||
|
$stsLog->request_time = Carbon::now();
|
||||||
|
|
||||||
|
try {
|
||||||
|
$request->validate(['code' => 'required|string']);
|
||||||
|
|
||||||
|
$result = Http::indokargo()->post('tv/address/create', $request->all());
|
||||||
|
$res = $result->throw()->json();
|
||||||
|
|
||||||
|
// update stsLog
|
||||||
|
$stsLog->response_data = $res;
|
||||||
|
$stsLog->response_time = Carbon::now();
|
||||||
|
|
||||||
|
self::_checkIkResponse($res);
|
||||||
|
|
||||||
|
$ikAddress = $res['data']['0'];
|
||||||
|
$ikAddressId = $ikAddress['id'];
|
||||||
|
$stsLog->partner_id = $ikAddressId;
|
||||||
|
|
||||||
|
// check ik address id is exist (almost impossible to happen, 0.01%)
|
||||||
|
$isDuplicateIkAddressId = TV::where([
|
||||||
|
['ik_address_id', '=', $ikAddressId],
|
||||||
|
['id', '!=', $tvFk]
|
||||||
|
])->first();
|
||||||
|
if($isDuplicateIkAddressId) throw new \Exception("IK Address ID Already exist in current db ($ikAddressId)");
|
||||||
|
|
||||||
|
DB::beginTransaction();
|
||||||
|
$tv = Tv::findOrFail($tvFk);
|
||||||
|
$tv->ik_address_id = $ikAddressId;
|
||||||
|
$tv->save();
|
||||||
|
|
||||||
|
$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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\api\superadmin\tv;
|
||||||
|
|
||||||
|
use App\Helper\DatabaseHelper;
|
||||||
|
use App\Helper\JSONResponse;
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Models\NewTvRequest;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class NewTvRequestController extends Controller {
|
||||||
|
public function init(Request $request) {
|
||||||
|
NewTvRequest::deleteExpiredRequests();
|
||||||
|
$request->validate([
|
||||||
|
'perPage' => 'nullable|integer|min:1',
|
||||||
|
...DatabaseHelper::getOrderBysValidations(),
|
||||||
|
'search' => DatabaseHelper::getSearchValidation()
|
||||||
|
]);
|
||||||
|
|
||||||
|
$newTvRequests = NewTvRequest::addColumnCanApprove()
|
||||||
|
->addColumnCanReject()
|
||||||
|
->multiSearch($request->search, ['code'])
|
||||||
|
->multiOrderBy($request->orderBys, 'created_at desc')
|
||||||
|
->paginate($request->perPage ?? 10);
|
||||||
|
|
||||||
|
return JSONResponse::Success(['data' => $newTvRequests ]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function approve(Request $request) { return NewTvRequest::approveFromRequest($request); }
|
||||||
|
public function reject(Request $request) { return NewTvRequest::rejectFromRequest($request); }
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue