store-manage/app/Admin/Services/AppVersionService.php

182 lines
6.3 KiB
PHP

<?php
namespace App\Admin\Services;
use App\Admin\Filters\AppVersionFilter;
use App\Enums\AppOs;
use App\Enums\AppUpdateStrategy;
use App\Models\AppVersion;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;
class AppVersionService extends BaseService
{
protected string $modelName = AppVersion::class;
protected string $modelFilterName = AppVersionFilter::class;
public function sortColumn()
{
return 'version';
}
public function getEditData($id)
{
return tap(parent::getEditData($id), function ($instance) {
switch ($instance?->os) {
case AppOs::Android:
$instance->setAttribute('android', [
'apk_url' => $instance->apk_url,
'wgt_url' => $instance->wgt_url,
]);
break;
case AppOs::Ios:
$instance->setAttribute('ios', [
'apk_url' => $instance->apk_url,
'wgt_url' => $instance->wgt_url,
]);
break;
}
});
}
public function store($data): bool
{
Validator::validate(
data: $data,
rules: [
'name' => ['bail', 'required', 'max:255'],
'version' => ['bail', 'required', 'int'],
'title' => ['bail', 'required', 'max:255'],
'description' => ['bail', 'required'],
'update_strategy' => ['bail', 'required', Rule::enum(AppUpdateStrategy::class)],
'is_force' => ['bail', 'required', 'bool'],
'os' => ['bail', 'required', Rule::enum(AppOs::class)],
'release_at' => ['bail', 'nullable', 'date_format:Y-m-d H:i:s'],
],
attributes: [
'name' => __('app_version.name'),
'version' => __('app_version.version'),
'title' => __('app_version.title'),
'description' => __('app_version.description'),
'update_strategy' => __('app_version.update_strategy'),
'is_force' => __('app_version.is_force'),
'os' => __('app_version.os'),
'release_at' => __('app_version.release_at'),
],
);
// 全量包
$apkUrl = '';
// 增量包
$wgtUrl = '';
// 更新策略
$aus = AppUpdateStrategy::from($data['update_strategy']);
switch (AppOs::from($data['os'])) {
case AppOs::Android:
$apkUrl = (string) Arr::get($data, 'android.apk_url');
$wgtUrl = (string) Arr::get($data, 'android.wgt_url');
if ($aus === AppUpdateStrategy::Apk) {
admin_abort_if($apkUrl === '', '请上传全量包');
} else {
admin_abort_if($wgtUrl === '', '请上传增量包');
}
break;
case AppOs::Ios:
$apkUrl = (string) Arr::get($data, 'ios.apk_url');
$wgtUrl = (string) Arr::get($data, 'ios.wgt_url');
if ($aus === AppUpdateStrategy::Apk) {
admin_abort_if($apkUrl === '', '苹果应用地址 不能为空。');
} else {
admin_abort_if($wgtUrl === '', '请上传增量包');
}
break;
default:
admin_abort('未知操作系统');
break;
}
$model = $this->getModel();
$model::create(array_merge($data, [
'apk_url' => $apkUrl,
'wgt_url' => $wgtUrl,
]));
return true;
}
public function update($primaryKey, $data): bool
{
Validator::validate(
data: $data,
rules: [
'name' => ['bail', 'required', 'max:255'],
'version' => ['bail', 'required', 'int'],
'title' => ['bail', 'required', 'max:255'],
'description' => ['bail', 'required'],
'update_strategy' => ['bail', 'required', Rule::enum(AppUpdateStrategy::class)],
'is_force' => ['bail', 'required', 'bool'],
'os' => ['bail', 'required', Rule::enum(AppOs::class)],
'release_at' => ['bail', 'nullable', 'date_format:Y-m-d H:i:s'],
],
attributes: [
'name' => __('app_version.name'),
'version' => __('app_version.version'),
'title' => __('app_version.title'),
'description' => __('app_version.description'),
'update_strategy' => __('app_version.update_strategy'),
'is_force' => __('app_version.is_force'),
'os' => __('app_version.os'),
'release_at' => __('app_version.release_at'),
],
);
// 全量包
$apkUrl = '';
// 增量包
$wgtUrl = '';
// 更新策略
$aus = AppUpdateStrategy::from($data['update_strategy']);
switch (AppOs::from($data['os'])) {
case AppOs::Android:
$apkUrl = (string) Arr::get($data, 'android.apk_url');
$wgtUrl = (string) Arr::get($data, 'android.wgt_url');
if ($aus === AppUpdateStrategy::Apk) {
admin_abort_if($apkUrl === '', '请上传全量包');
} else {
admin_abort_if($wgtUrl === '', '请上传增量包');
}
break;
case AppOs::Ios:
$apkUrl = (string) Arr::get($data, 'ios.apk_url');
$wgtUrl = (string) Arr::get($data, 'ios.wgt_url');
if ($aus === AppUpdateStrategy::Apk) {
admin_abort_if($apkUrl === '', '苹果应用地址 不能为空。');
} else {
admin_abort_if($wgtUrl === '', '请上传增量包');
}
break;
default:
admin_abort('未知操作系统');
break;
}
$instance = $this->query()->whereKey($primaryKey)->firstOrFail();
$instance->update(array_merge($data, [
'apk_url' => $apkUrl,
'wgt_url' => $wgtUrl,
]));
return true;
}
}