| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- <?php
- namespace App\Module\OpenAPI\Validators;
- use App\Module\OpenAPI\Enums\APP_STATUS;
- use App\Module\OpenAPI\Enums\AUTH_TYPE;
- use App\Module\OpenAPI\Enums\SCOPE_TYPE;
- use App\Module\OpenAPI\Models\OpenApiApp;
- use UCore\Validator;
- /**
- * OpenAPI应用验证器
- *
- * 用于验证应用相关的数据
- */
- class AppValidator extends Validator
- {
- /**
- * 验证应用数据
- *
- * @param mixed $value
- * @param array $data
- * @return bool
- */
- public function validate(mixed $value, array $data): bool
- {
- $validationType = $this->args[0] ?? 'create';
-
- return match($validationType) {
- 'create' => $this->validateCreate($data),
- 'update' => $this->validateUpdate($data),
- 'status' => $this->validateStatus($value),
- 'scopes' => $this->validateScopes($value),
- 'auth_type' => $this->validateAuthType($value),
- 'callback_url' => $this->validateCallbackUrl($value),
- 'app_id_unique' => $this->validateAppIdUnique($value),
- default => false,
- };
- }
- /**
- * 验证创建应用数据
- *
- * @param array $data
- * @return bool
- */
- protected function validateCreate(array $data): bool
- {
- // 验证必填字段
- $requiredFields = ['name', 'description', 'callback_url'];
-
- foreach ($requiredFields as $field) {
- if (empty($data[$field])) {
- $this->addError("字段 {$field} 不能为空");
- return false;
- }
- }
- // 验证应用名称长度
- if (strlen($data['name']) > 255) {
- $this->addError('应用名称不能超过255个字符');
- return false;
- }
- // 验证描述长度
- if (strlen($data['description']) > 1000) {
- $this->addError('应用描述不能超过1000个字符');
- return false;
- }
- // 验证回调地址
- if (!$this->validateCallbackUrl($data['callback_url'])) {
- return false;
- }
- // 验证权限范围
- if (isset($data['scopes']) && !$this->validateScopes($data['scopes'])) {
- return false;
- }
- // 验证认证类型
- if (isset($data['auth_type']) && !$this->validateAuthType($data['auth_type'])) {
- return false;
- }
- return true;
- }
- /**
- * 验证更新应用数据
- *
- * @param array $data
- * @return bool
- */
- protected function validateUpdate(array $data): bool
- {
- // 验证应用名称
- if (isset($data['name'])) {
- if (empty($data['name'])) {
- $this->addError('应用名称不能为空');
- return false;
- }
-
- if (strlen($data['name']) > 255) {
- $this->addError('应用名称不能超过255个字符');
- return false;
- }
- }
- // 验证描述
- if (isset($data['description']) && strlen($data['description']) > 1000) {
- $this->addError('应用描述不能超过1000个字符');
- return false;
- }
- // 验证回调地址
- if (isset($data['callback_url']) && !$this->validateCallbackUrl($data['callback_url'])) {
- return false;
- }
- // 验证权限范围
- if (isset($data['scopes']) && !$this->validateScopes($data['scopes'])) {
- return false;
- }
- // 验证认证类型
- if (isset($data['auth_type']) && !$this->validateAuthType($data['auth_type'])) {
- return false;
- }
- // 验证状态
- if (isset($data['status']) && !$this->validateStatus($data['status'])) {
- return false;
- }
- return true;
- }
- /**
- * 验证应用状态
- *
- * @param string $status
- * @return bool
- */
- protected function validateStatus(string $status): bool
- {
- $validStatuses = array_column(APP_STATUS::cases(), 'value');
-
- if (!in_array($status, $validStatuses)) {
- $this->addError("无效的应用状态: {$status}");
- return false;
- }
- return true;
- }
- /**
- * 验证权限范围
- *
- * @param array $scopes
- * @return bool
- */
- protected function validateScopes(array $scopes): bool
- {
- if (empty($scopes)) {
- $this->addError('权限范围不能为空');
- return false;
- }
- $validScopes = array_column(SCOPE_TYPE::cases(), 'value');
-
- foreach ($scopes as $scope) {
- if (!in_array($scope, $validScopes)) {
- $this->addError("无效的权限范围: {$scope}");
- return false;
- }
- }
- return true;
- }
- /**
- * 验证认证类型
- *
- * @param string $authType
- * @return bool
- */
- protected function validateAuthType(string $authType): bool
- {
- $validAuthTypes = array_column(AUTH_TYPE::cases(), 'value');
-
- if (!in_array($authType, $validAuthTypes)) {
- $this->addError("无效的认证类型: {$authType}");
- return false;
- }
- return true;
- }
- /**
- * 验证回调地址
- *
- * @param string $url
- * @return bool
- */
- protected function validateCallbackUrl(string $url): bool
- {
- if (empty($url)) {
- $this->addError('回调地址不能为空');
- return false;
- }
- // 验证URL格式
- if (!filter_var($url, FILTER_VALIDATE_URL)) {
- $this->addError('回调地址格式不正确');
- return false;
- }
- // 验证协议
- $scheme = parse_url($url, PHP_URL_SCHEME);
- if (!in_array($scheme, ['http', 'https'])) {
- $this->addError('回调地址必须使用HTTP或HTTPS协议');
- return false;
- }
- // 验证长度
- if (strlen($url) > 500) {
- $this->addError('回调地址不能超过500个字符');
- return false;
- }
- return true;
- }
- /**
- * 验证应用ID唯一性
- *
- * @param string $appId
- * @return bool
- */
- protected function validateAppIdUnique(string $appId): bool
- {
- $exists = OpenApiApp::where('app_id', $appId)->exists();
-
- if ($exists) {
- $this->addError("应用ID {$appId} 已存在");
- return false;
- }
- return true;
- }
- }
|