generated from liutk/owl-admin-base
[api] 最新的app版本
parent
f48d906a86
commit
3dbea9dd96
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -6,6 +6,7 @@ use App\Enums\AppOs;
|
||||||
use App\Enums\AppUpdateStrategy;
|
use App\Enums\AppUpdateStrategy;
|
||||||
use App\Traits\HasDateTimeFormatter;
|
use App\Traits\HasDateTimeFormatter;
|
||||||
use EloquentFilter\Filterable;
|
use EloquentFilter\Filterable;
|
||||||
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
use Illuminate\Database\Eloquent\Casts\Attribute;
|
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
@ -42,6 +43,32 @@ class AppVersion extends Model
|
||||||
'release_at',
|
'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
|
protected function isRelease(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::make(
|
return Attribute::make(
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
use App\Http\Controllers\Api\Account\StoreMasterCommissionController;
|
use App\Http\Controllers\Api\Account\StoreMasterCommissionController;
|
||||||
use App\Http\Controllers\Api\Account\StorePerformanceController;
|
use App\Http\Controllers\Api\Account\StorePerformanceController;
|
||||||
use App\Http\Controllers\Api\Account\TaskPerformanceController;
|
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\Auth\AccessTokenController;
|
||||||
use App\Http\Controllers\Api\ComplaintController;
|
use App\Http\Controllers\Api\ComplaintController;
|
||||||
use App\Http\Controllers\Api\FeedbackController;
|
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\LedgerController;
|
||||||
use App\Http\Controllers\Api\MessageController;
|
use App\Http\Controllers\Api\MessageController;
|
||||||
use App\Http\Controllers\Api\RegionController;
|
use App\Http\Controllers\Api\RegionController;
|
||||||
use App\Http\Controllers\Api\ReimbursementController;
|
|
||||||
use App\Http\Controllers\Api\StatisticsController;
|
use App\Http\Controllers\Api\StatisticsController;
|
||||||
use App\Http\Controllers\Api\TaskController;
|
use App\Http\Controllers\Api\TaskController;
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
|
|
@ -27,6 +27,8 @@ Route::get('keywords', [KeywordController::class, 'index']);
|
||||||
|
|
||||||
Route::get('region', [RegionController::class, 'index']);
|
Route::get('region', [RegionController::class, 'index']);
|
||||||
|
|
||||||
|
Route::get('latest-app-versions', [AppVersionController::class, 'latest']);
|
||||||
|
|
||||||
Route::group([
|
Route::group([
|
||||||
'middleware' => ['auth:api'],
|
'middleware' => ['auth:api'],
|
||||||
], function () {
|
], function () {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue