Bläddra i källkod

feat(sixshop-auth): 新增应用状态上报功能并更新配置地址新增 `AppStatusHook` 类用于在应用状态变更时向指定服务器发送 POST 请求,同时将配置中的默认市场服务器地址由 HTTP 更新为 HTTPS。
移除了旧的 `ConfigFileHook` 相关逻辑,不再生成本地模块列表缓存文件。
新增对应单元测试文件以验证上报方法的基本调用流程。

runphp 6 månader sedan
förälder
incheckning
0ae7c82631
5 ändrade filer med 81 tillägg och 66 borttagningar
  1. 1 1
      config.php
  2. 2 2
      src/Extension.php
  3. 59 0
      src/Hook/AppStatusHook.php
  4. 0 63
      src/Hook/ConfigFileHook.php
  5. 19 0
      test/Hook/AppStatusHookTest.php

+ 1 - 1
config.php

@@ -6,7 +6,7 @@ return [
         'type' => 'input',
         'title' => '应用市场服务器地址',
         'field' => 'market_server_url',
-        'value' => 'http://apix.jd29.com',
+        'value' => 'https://apix.jd29.com',
         'props' => [
             'placeholder' => '请输入应用市场服务器地址',
         ],

+ 2 - 2
src/Extension.php

@@ -6,7 +6,7 @@ namespace SixShop\Auth;
 
 use SixShop\Auth\Hook\AuthHook;
 use SixShop\Core\ExtensionAbstract;
-use SixShop\Auth\Hook\ConfigFileHook;
+use SixShop\Auth\Hook\AppStatusHook;
 
 class Extension extends ExtensionAbstract
 {
@@ -14,7 +14,7 @@ class Extension extends ExtensionAbstract
     {
         return [
             AuthHook::class,
-            ConfigFileHook::class
+            AppStatusHook::class
         ];
     }
 

+ 59 - 0
src/Hook/AppStatusHook.php

@@ -0,0 +1,59 @@
+<?php
+declare(strict_types=1);
+
+namespace SixShop\Auth\Hook;
+
+use Composer\Factory;
+use SixShop\Core\Attribute\Hook;
+use Symfony\Component\HttpClient\Exception\ClientException;
+use Symfony\Component\HttpClient\HttpClient;
+use Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface;
+use Symfony\Contracts\HttpClient\HttpClientInterface;
+use think\Env;
+use think\facade\Log;
+
+class AppStatusHook
+{
+
+    private const string BASE_URL = 'https://apix.jd29.com';
+
+    private const string PACKAGIST_DOMAIN = 'packagist.jd29.com';
+
+    private HttpClientInterface $httpClient;
+    public function __construct(
+        private readonly Env $env,
+    )
+    {
+        $authConfigSource = Factory::createConfig()->getAuthConfigSource();
+        $authFile = $authConfigSource->getName();
+        if (!file_exists($authFile)) {
+            $authFile = root_path('runtime').'auth.json';
+        }
+        $authJsonArr = json_decode(file_get_contents($authFile), true);
+        $bearerToken = $authJsonArr['bearer'][self::PACKAGIST_DOMAIN];
+        $defaultOptions = [
+            'base_uri' => self::BASE_URL,
+            'headers' => ['Authorization' => 'Bearer ' . $bearerToken],
+        ];
+        if ($this->env->get('IS_DDEV_PROJECT') === true) {
+            $defaultOptions['verify_peer'] = false;
+            $defaultOptions['verify_host'] = false;
+        }
+        $this->httpClient = HttpClient::create($defaultOptions);
+
+    }
+
+    #[Hook('post_app_status')]
+    public function postAppStatus(array $data): void
+    {
+        try {
+            $this->httpClient->request('POST', '/php/app_status', [
+                'json' => $data
+            ]);
+        } catch (ClientException $e) {
+            Log::error($e->getMessage());
+        } catch (TransportExceptionInterface $e) {
+            Log::error($e->getMessage());
+        }
+    }
+}

+ 0 - 63
src/Hook/ConfigFileHook.php

@@ -1,63 +0,0 @@
-<?php
-declare(strict_types=1);
-
-namespace SixShop\Auth\Hook;
-
-use SixShop\Core\Attribute\Hook;
-use SixShop\Core\Helper;
-use Symfony\Component\HttpClient\HttpClient;
-
-class ConfigFileHook
-{
-    private array $normalModuleList = [];
-
-    /**
-     * @param array{market_server_url: array<string, string>, market_server_url: array<string, string>, market_api_key: string} $config
-     */
-    #[Hook('after_write_extension_config:auth')]
-    public function updateNormalModuleList(array $config): void
-    {
-        $marketServerUrl = $config['market_server_url']['value'] ?? '';
-        $marketApiKey    = $config['market_api_key']['value'] ?? '';
-
-        // 方案A:当 key 为空时,跳过外部校验与请求,保持保存成功且不抛错
-        if ($marketApiKey === '') {
-            $this->normalModuleList = [];
-            return;
-        }
-
-        try {
-            $client = HttpClient::create([
-                'base_uri' => $marketServerUrl,
-                'headers' => ['X-API-KEY' => $marketApiKey],
-            ]);
-            $response = $client->request('GET', '/php/site/extension');
-            if ($response->getStatusCode() !== 200) {
-                // 有 key 但校验/请求失败时,也不抛错,静默返回
-                return;
-            }
-            $content = $response->getContent(false); // 不抛异常,手动校验
-            if (!json_validate($content)) {
-                return;
-            }
-            $data = json_decode($content, true);
-            if (!isset($data['data']) || !is_array($data['data'])) {
-                return;
-            }
-            $this->normalModuleList = array_column($data['data'], 'slug');
-        } catch (\Throwable $e) {
-            // 不抛错,保证保存流程成功
-            return;
-        }
-    }
-
-    public function __destruct()
-    {
-        $header = '// This file is automatically generated at:' . date('Y-m-d H:i:s') . PHP_EOL . 'declare (strict_types = 1);' . PHP_EOL;
-        $content = '<?php ' . PHP_EOL . $header . "return " . var_export($this->normalModuleList, true) . ';';
-        file_put_contents(
-            root_path('runtime') . 'module_name_list_normal.php',
-            $content
-        );
-    }
-}

+ 19 - 0
test/Hook/AppStatusHookTest.php

@@ -0,0 +1,19 @@
+<?php
+declare(strict_types=1);
+namespace SixShop\Auth\Hook;
+
+use PHPUnit\Framework\TestCase;
+
+class AppStatusHookTest extends TestCase
+{
+    private AppStatusHook $appStatusHook;
+    protected function setUp(): void
+    {
+        $this->appStatusHook = app()->make(AppStatusHook::class);
+    }
+
+    public function testPostAppStatus(): void
+    {
+        $this->appStatusHook->postAppStatus(['test'=>'test']);
+    }
+}