From 4b56d762f65a4180edcdd28d598f2db0f5757fbc Mon Sep 17 00:00:00 2001 From: ricky rx Date: Tue, 28 May 2024 15:58:52 +0700 Subject: [PATCH] feat: api for mobile > tv > new tv request --- .../Controllers/api/mobile/TvController.php | 23 ++++++++ app/Models/NewTvRequest.php | 58 ++++++++++++------- app/Models/Tv.php | 11 +--- routes/api/mobile.php | 8 ++- 4 files changed, 68 insertions(+), 32 deletions(-) create mode 100644 app/Http/Controllers/api/mobile/TvController.php diff --git a/app/Http/Controllers/api/mobile/TvController.php b/app/Http/Controllers/api/mobile/TvController.php new file mode 100644 index 0000000..6543acb --- /dev/null +++ b/app/Http/Controllers/api/mobile/TvController.php @@ -0,0 +1,23 @@ +validate(['id' => 'nullable|integer']); + + $tv = null; + if($request->id) { $tv = Tv::find($request->id); } + return JSONResponse::Success(['tv' => $tv]); + } +} diff --git a/app/Models/NewTvRequest.php b/app/Models/NewTvRequest.php index aeb1e13..d1305bb 100644 --- a/app/Models/NewTvRequest.php +++ b/app/Models/NewTvRequest.php @@ -61,13 +61,30 @@ class NewTvRequest extends Model { } return $randomDigit; } + + /** + * Rule: + * 1. if it has not been activated for more than the expiry date, deleted it + * 2. if it has been activated & has been responded more than expiry date, delete it + * - case: when has been activated, but intenet connection missing, how can device know + * that the new request tv has been activated? + */ + private static function _getMaxExpiredTime() :Carbon { return Carbon::now()->subHour(); } + public static function deleteExpiredRequests() { + $expiredTime = self::_getMaxExpiredTime()->toDateTimeString(); + NewTvRequest::where(function($q) use ($expiredTime) { + $q->whereNull('activated_at')->where('created_at', '<=', $expiredTime); + })->orWhere(function($q) use ($expiredTime) { + $q->where('responded_at', '<=', $expiredTime ); + })->delete(); + } // -- END RELATED TO DATA FUNCTION //------------------------------------------------------------ //------------------------------------------------------------ // -- RELATED TO FROM REQUEST FUNCTION private static function _checkOrCreateResponse(NewTvRequest $newTvReq) { - if($newTvReq->is_activated) { + if($newTvReq->activated_at) { // make sure waiting tv_device responded before deleted if(empty($newTvReq->responded_at)) { $newTvReq->responded_at = now(); @@ -76,7 +93,6 @@ class NewTvRequest extends Model { return JSONResponse::Success([ 'message' => 'activated', - 'is_active' => true, 'new_tv_request' => $newTvReq, 'tv' => $newTvReq->tv ]); @@ -84,11 +100,28 @@ class NewTvRequest extends Model { return JSONResponse::Success([ 'message' => 'not activate', - 'is_active' => false, 'new_tv_request' => $newTvReq, 'tv' => null ]); } + public static function checkOrCreateFromRequest(Request $request) { + $request->validate([ + 'id' => 'nullable|string|required_with:code|integer', + 'code' => 'nullable|string|required_with:id', + 'device_info' => 'required|array' + ]); + + if(!empty($request->id)) { + $checkTvReq = NewTvRequest::where('code', $request->code)->find($request->id); + if($checkTvReq) return self::_checkOrCreateResponse($checkTvReq); + } + + $newTvReq = new self; + $newTvReq->code = self::_generateRandomCode(); + $newTvReq->device_info = $request->device_info; + $newTvReq->save(); + return self::_checkOrCreateResponse($newTvReq); + } public static function approveFromRequest(Request $request) { $request->validate([ @@ -97,7 +130,7 @@ class NewTvRequest extends Model { ]); $tvRequest = new Request($request->tv); - if($tvRequest->filled('code')) $tvRequest->code = strtoupper($tvRequest->code); + if($tvRequest->code) $tvRequest->merge(['code' => strtoupper($tvRequest->code)]); $tvRequest->validate([ 'code' => 'required|string|unique:App\Models\Tv,code', @@ -161,23 +194,6 @@ class NewTvRequest extends Model { return JSONResponse::Success(['data' => $newTvRequest ]); } - - /** - * Rule: - * 1. if it has not been activated for more than the expiry date, deleted it - * 2. if it has been activated & has been responded more than expiry date, delete it - * - case: when has been activated, but intenet connection missing, how can device know - * that the new request tv has been activated? - */ - private static function _getMaxExpiredTime() :Carbon { return Carbon::now()->subHour(); } - public static function deleteExpiredRequests() { - $expiredTime = self::_getMaxExpiredTime()->toString(); - NewTvRequest::where(function($q) use ($expiredTime) { - $q->whereNull('activated_at')->where('created_at', '<=', $expiredTime); - })->orWhere(function($q) use ($expiredTime) { - $q->where('responded_at', '<=', $expiredTime ); - })->delete(); - } // -- END RELATED TO FROM REQUEST FUNCTION //------------------------------------------------------------ } diff --git a/app/Models/Tv.php b/app/Models/Tv.php index f116808..5eff49a 100644 --- a/app/Models/Tv.php +++ b/app/Models/Tv.php @@ -3,13 +3,13 @@ namespace App\Models; use App\Helper\JSONResponse; -use AWS\CRT\HTTP\Request; use Illuminate\Database\Eloquent\Casts\AsArrayObject; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasOne; +use Illuminate\Http\Request; class Tv extends Model { use HasFactory; @@ -42,13 +42,4 @@ class Tv extends Model { } // -- END RELATED TO DATA FUNCTION //------------------------------------------------------------ - - - //------------------------------------------------------------ - // -- RELATED TO REQUEST - public static function renewTvInformation(Request $request) { - - } - // -- END RELATED TO REQUEST - //------------------------------------------------------------ } diff --git a/routes/api/mobile.php b/routes/api/mobile.php index 0a5c364..7946ca2 100644 --- a/routes/api/mobile.php +++ b/routes/api/mobile.php @@ -1,10 +1,16 @@ group(function() { Route::post('/check-update/video-update/latest', 'videoUpdateLatest'); Route::post('/check-update/apk-update/latest', 'apkUpdateLatest'); -}) +}); + +Route::controller(TvController::class)->group(function() { + Route::post('/tv/new-request', 'newRequest'); + Route::post('/tv/update-condition', 'updateCondition'); +}); ?> \ No newline at end of file