store-manage/app/Http/Controllers/Api/AppVersionController.php

69 lines
2.3 KiB
PHP

<?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;
}
}