[api] 最新的app版本

main
Jing Li 2024-04-30 20:32:10 +08:00
parent f48d906a86
commit 3dbea9dd96
4 changed files with 127 additions and 1 deletions

View File

@ -0,0 +1,68 @@
<?php
namespace App\Http\Controllers\Api;
use App\Enums\AppOs;
use App\Enums\AppUpdateStrategy;
use App\Http\Resources\AppVersionResource;
use App\Models\AppVersion;
use Illuminate\Http\Request;
class AppVersionController extends Controller
{
public function latest(Request $request): array
{
// 客户端系统
$cliOs = AppOs::tryFrom((string) $request->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;
}
}

View File

@ -0,0 +1,29 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class AppVersionResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @return array<string, mixed>
*/
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,
];
}
}

View File

@ -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(

View File

@ -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 () {