From 3dbea9dd966494e27df809b9f64b8d5216e5278e Mon Sep 17 00:00:00 2001 From: Jing Li Date: Tue, 30 Apr 2024 20:32:10 +0800 Subject: [PATCH] =?UTF-8?q?[api]=20=E6=9C=80=E6=96=B0=E7=9A=84app=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Api/AppVersionController.php | 68 +++++++++++++++++++ app/Http/Resources/AppVersionResource.php | 29 ++++++++ app/Models/AppVersion.php | 27 ++++++++ routes/api.php | 4 +- 4 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 app/Http/Controllers/Api/AppVersionController.php create mode 100644 app/Http/Resources/AppVersionResource.php diff --git a/app/Http/Controllers/Api/AppVersionController.php b/app/Http/Controllers/Api/AppVersionController.php new file mode 100644 index 0000000..4abd8bd --- /dev/null +++ b/app/Http/Controllers/Api/AppVersionController.php @@ -0,0 +1,68 @@ +header('app-cli-os')); + // 客户端版本 + $cliVersion = (int) $request->header('app-cli-version', 0); + + $data = ['android' => null, 'ios' => null]; + + foreach ([ + AppOs::Android, + AppOs::Ios, + ] as $os) { + /** @var \App\Models\AppVersion|null */ + $appVersion = AppVersion::onlyReleased() + ->where('os', $os) + ->latest('version') + ->first(); + + if (is_null($appVersion)) { + continue; + } + + $json = AppVersionResource::make($appVersion)->resolve($request); + + // 如果客户端版本和最新的版本之前有全量包更新的版本,则需全量包更新 + if (! $appVersion->isApkUpdate() && $cliOs === $os && $appVersion->version > $cliVersion + 1) { + $isApkUpdate = AppVersion::onlyReleased() + ->where('os', $cliOs) + ->where('version', '>', $cliVersion) + ->where('update_strategy', AppUpdateStrategy::Apk) + ->exists(); + + if ($isApkUpdate) { + $json['update_strategy'] = AppUpdateStrategy::Apk; + if ((string) $appVersion->apk_url === '') { + $json['apk_url'] = AppVersion::getLatestApkUrl($cliOs, $cliVersion); + } + } + } + + // 如果客户端版本和最新的版本之间有强制更新的版本,则需强制更新 + if (! $appVersion->is_force && $cliOs === $os && $appVersion->version > $cliVersion + 1) { + $json['is_force'] = AppVersion::onlyReleased() + ->where('os', $cliOs) + ->where('version', '>', $cliVersion) + ->where('is_force', true) + ->exists(); + } + + $data[$os->value] = $json; + } + + return $data; + } +} diff --git a/app/Http/Resources/AppVersionResource.php b/app/Http/Resources/AppVersionResource.php new file mode 100644 index 0000000..600e02a --- /dev/null +++ b/app/Http/Resources/AppVersionResource.php @@ -0,0 +1,29 @@ + + */ + public function toArray(Request $request): array + { + return [ + 'name' => $this->resource->name, + 'version' => $this->resource->version, + 'title' => $this->resource->title, + 'description' => $this->resource->description, + 'update_strategy' => $this->resource->update_strategy, + 'is_force' => $this->resource->is_force, + 'apk_url' => $this->resource->apk_url, + 'wgt_url' => $this->resource->wgt_url, + 'release_at' => $this->resource->release_at?->timestamp, + ]; + } +} diff --git a/app/Models/AppVersion.php b/app/Models/AppVersion.php index 031997a..149abee 100644 --- a/app/Models/AppVersion.php +++ b/app/Models/AppVersion.php @@ -6,6 +6,7 @@ use App\Enums\AppOs; use App\Enums\AppUpdateStrategy; use App\Traits\HasDateTimeFormatter; use EloquentFilter\Filterable; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; @@ -42,6 +43,32 @@ class AppVersion extends Model 'release_at', ]; + public function scopeOnlyReleased(Builder $query) + { + $query->whereNotNull('release_at')->where('release_at', '<=', now()); + } + + /** + * 是否是全量包升级 + */ + public function isApkUpdate(): bool + { + return $this->update_strategy === AppUpdateStrategy::Apk; + } + + /** + * 按客户端系统和版本号获取最新的全量包 + */ + public static function getLatestApkUrl(AppOs $clientOs, int $clientVersion): string + { + return (string) static::OnlyReleased() + ->where('os', $clientOs) + ->where('version', '>', $clientVersion) + ->whereNotNull('apk_url') + ->latest('version') + ->value('apk_url'); + } + protected function isRelease(): Attribute { return Attribute::make( diff --git a/routes/api.php b/routes/api.php index a31dfd4..7ae025c 100644 --- a/routes/api.php +++ b/routes/api.php @@ -3,6 +3,7 @@ use App\Http\Controllers\Api\Account\StoreMasterCommissionController; use App\Http\Controllers\Api\Account\StorePerformanceController; use App\Http\Controllers\Api\Account\TaskPerformanceController; +use App\Http\Controllers\Api\AppVersionController; use App\Http\Controllers\Api\Auth\AccessTokenController; use App\Http\Controllers\Api\ComplaintController; use App\Http\Controllers\Api\FeedbackController; @@ -11,7 +12,6 @@ use App\Http\Controllers\Api\KeywordController; use App\Http\Controllers\Api\LedgerController; use App\Http\Controllers\Api\MessageController; use App\Http\Controllers\Api\RegionController; -use App\Http\Controllers\Api\ReimbursementController; use App\Http\Controllers\Api\StatisticsController; use App\Http\Controllers\Api\TaskController; use Illuminate\Support\Facades\Route; @@ -27,6 +27,8 @@ Route::get('keywords', [KeywordController::class, 'index']); Route::get('region', [RegionController::class, 'index']); +Route::get('latest-app-versions', [AppVersionController::class, 'latest']); + Route::group([ 'middleware' => ['auth:api'], ], function () {