| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452 |
- <?php
- namespace App\Module\OpenAPI\Controllers;
- use App\Module\OpenAPI\Models\OpenApiWebhook;
- use App\Module\OpenAPI\Services\WebhookService;
- use Illuminate\Http\Request;
- use Illuminate\Http\JsonResponse;
- use Spatie\RouteAttributes\Attributes\Route;
- use Spatie\RouteAttributes\Attributes\Prefix;
- use Spatie\RouteAttributes\Attributes\Middleware;
- /**
- * OpenAPI Webhook控制器
- *
- * 提供Webhook配置和管理的API接口
- */
- #[Prefix('openapi/webhook')]
- #[Middleware(['api', 'openapi.auth'])]
- class WebhookController
- {
- protected WebhookService $webhookService;
- public function __construct(WebhookService $webhookService)
- {
- $this->webhookService = $webhookService;
- }
- /**
- * 获取Webhook列表
- *
- * @param Request $request
- * @return JsonResponse
- */
- #[Route('GET', '/', name: 'openapi.webhook.index')]
- #[Middleware('openapi.scope:WEBHOOK_READ')]
- public function index(Request $request): JsonResponse
- {
- try {
- $app = $request->attributes->get('openapi_app');
-
- if (!$app) {
- return response()->json([
- 'success' => false,
- 'message' => '应用信息不存在',
- ], 404);
- }
- $webhooks = OpenApiWebhook::where('app_id', $app->app_id)
- ->orderBy('created_at', 'desc')
- ->get()
- ->map(function ($webhook) {
- return [
- 'id' => $webhook->id,
- 'name' => $webhook->name,
- 'url' => $webhook->url,
- 'events' => $webhook->events,
- 'status' => $webhook->status,
- 'status_label' => $webhook->status_label,
- 'success_rate' => $webhook->success_rate,
- 'total_deliveries' => $webhook->total_deliveries,
- 'successful_deliveries' => $webhook->successful_deliveries,
- 'failed_deliveries' => $webhook->failed_deliveries,
- 'last_success_at' => $webhook->last_success_at,
- 'last_failure_at' => $webhook->last_failure_at,
- 'created_at' => $webhook->created_at,
- ];
- });
- return response()->json([
- 'success' => true,
- 'data' => $webhooks,
- ]);
- } catch (\Exception $e) {
- return response()->json([
- 'success' => false,
- 'message' => '获取Webhook列表失败',
- 'error' => $e->getMessage(),
- ], 500);
- }
- }
- /**
- * 创建Webhook
- *
- * @param Request $request
- * @return JsonResponse
- */
- #[Route('POST', '/', name: 'openapi.webhook.store')]
- #[Middleware('openapi.scope:WEBHOOK_WRITE')]
- public function store(Request $request): JsonResponse
- {
- $startTime = microtime(true);
- // 初始化请求日志记录器
- $requestLogger = new \App\Module\System\Services\RequestLogger($request);
- $requestLogger->setRouter("openapi/webhook/store");
- try {
- $app = $request->attributes->get('openapi_app');
- if (!$app) {
- $requestLogger->setError('应用信息不存在');
- $requestLogger->setRunTime($startTime);
- return response()->json([
- 'success' => false,
- 'message' => '应用信息不存在',
- ], 404);
- }
- // 使用标准验证系统
- $validation = new \App\Module\OpenAPI\Validations\WebhookCreateValidation($request->all());
- $validation->validate();
- if ($validation->isFail()) {
- $requestLogger->setError('数据验证失败: ' . json_encode($validation->getErrors()));
- $requestLogger->setRunTime($startTime);
- return response()->json([
- 'success' => false,
- 'message' => '数据验证失败',
- 'errors' => $validation->getErrors(),
- ], 422);
- }
- $data = $validation->getSafeData();
- // 创建Webhook
- $webhook = $this->webhookService->createWebhook($app, $data);
- // 记录运行时间
- $requestLogger->setRunTime($startTime);
- return response()->json([
- 'success' => true,
- 'message' => 'Webhook创建成功',
- 'data' => [
- 'id' => $webhook->id,
- 'name' => $webhook->name,
- 'url' => $webhook->url,
- 'events' => $webhook->events,
- 'secret' => $webhook->secret,
- 'status' => $webhook->status,
- 'timeout' => $webhook->timeout,
- 'retry_count' => $webhook->retry_count,
- 'created_at' => $webhook->created_at,
- ],
- ]);
- } catch (\Exception $e) {
- // 记录错误信息和运行时间
- $requestLogger->setError($e->getMessage());
- $requestLogger->setRunTime($startTime);
- return response()->json([
- 'success' => false,
- 'message' => '创建Webhook失败',
- 'error' => $e->getMessage(),
- ], 500);
- }
- }
- /**
- * 获取Webhook详情
- *
- * @param Request $request
- * @param int $id
- * @return JsonResponse
- */
- #[Route('GET', '/{id}', name: 'openapi.webhook.show')]
- #[Middleware('openapi.scope:WEBHOOK_READ')]
- public function show(Request $request, int $id): JsonResponse
- {
- try {
- $app = $request->attributes->get('openapi_app');
-
- if (!$app) {
- return response()->json([
- 'success' => false,
- 'message' => '应用信息不存在',
- ], 404);
- }
- $webhook = OpenApiWebhook::where('app_id', $app->app_id)
- ->where('id', $id)
- ->first();
- if (!$webhook) {
- return response()->json([
- 'success' => false,
- 'message' => 'Webhook不存在',
- ], 404);
- }
- return response()->json([
- 'success' => true,
- 'data' => [
- 'id' => $webhook->id,
- 'name' => $webhook->name,
- 'url' => $webhook->url,
- 'events' => $webhook->events,
- 'secret' => $webhook->masked_secret,
- 'status' => $webhook->status,
- 'status_label' => $webhook->status_label,
- 'timeout' => $webhook->timeout,
- 'retry_count' => $webhook->retry_count,
- 'current_retry_count' => $webhook->current_retry_count,
- 'total_deliveries' => $webhook->total_deliveries,
- 'successful_deliveries' => $webhook->successful_deliveries,
- 'failed_deliveries' => $webhook->failed_deliveries,
- 'success_rate' => $webhook->success_rate,
- 'last_success_at' => $webhook->last_success_at,
- 'last_failure_at' => $webhook->last_failure_at,
- 'created_at' => $webhook->created_at,
- 'updated_at' => $webhook->updated_at,
- ],
- ]);
- } catch (\Exception $e) {
- return response()->json([
- 'success' => false,
- 'message' => '获取Webhook详情失败',
- 'error' => $e->getMessage(),
- ], 500);
- }
- }
- /**
- * 更新Webhook
- *
- * @param Request $request
- * @param int $id
- * @return JsonResponse
- */
- #[Route('PUT', '/{id}', name: 'openapi.webhook.update')]
- #[Middleware('openapi.scope:WEBHOOK_WRITE')]
- public function update(Request $request, int $id): JsonResponse
- {
- try {
- $app = $request->attributes->get('openapi_app');
-
- if (!$app) {
- return response()->json([
- 'success' => false,
- 'message' => '应用信息不存在',
- ], 404);
- }
- $webhook = OpenApiWebhook::where('app_id', $app->app_id)
- ->where('id', $id)
- ->first();
- if (!$webhook) {
- return response()->json([
- 'success' => false,
- 'message' => 'Webhook不存在',
- ], 404);
- }
- // 使用标准验证系统
- $requestData = $request->only(['name', 'url', 'events', 'status', 'timeout', 'retry_count']);
- $validation = new \App\Module\OpenAPI\Validations\WebhookUpdateValidation($requestData);
- $validation->validate();
- if ($validation->isFail()) {
- return response()->json([
- 'success' => false,
- 'message' => '数据验证失败',
- 'errors' => $validation->getErrors(),
- ], 422);
- }
- $data = $validation->getSafeData();
- // 更新Webhook
- $webhook->update(array_filter($data));
- return response()->json([
- 'success' => true,
- 'message' => 'Webhook更新成功',
- 'data' => [
- 'id' => $webhook->id,
- 'name' => $webhook->name,
- 'url' => $webhook->url,
- 'events' => $webhook->events,
- 'status' => $webhook->status,
- 'timeout' => $webhook->timeout,
- 'retry_count' => $webhook->retry_count,
- 'updated_at' => $webhook->updated_at,
- ],
- ]);
- } catch (\Exception $e) {
- return response()->json([
- 'success' => false,
- 'message' => '更新Webhook失败',
- 'error' => $e->getMessage(),
- ], 500);
- }
- }
- /**
- * 删除Webhook
- *
- * @param Request $request
- * @param int $id
- * @return JsonResponse
- */
- #[Route('DELETE', '/{id}', name: 'openapi.webhook.destroy')]
- #[Middleware('openapi.scope:WEBHOOK_WRITE')]
- public function destroy(Request $request, int $id): JsonResponse
- {
- try {
- $app = $request->attributes->get('openapi_app');
-
- if (!$app) {
- return response()->json([
- 'success' => false,
- 'message' => '应用信息不存在',
- ], 404);
- }
- $webhook = OpenApiWebhook::where('app_id', $app->app_id)
- ->where('id', $id)
- ->first();
- if (!$webhook) {
- return response()->json([
- 'success' => false,
- 'message' => 'Webhook不存在',
- ], 404);
- }
- $webhook->delete();
- return response()->json([
- 'success' => true,
- 'message' => 'Webhook删除成功',
- ]);
- } catch (\Exception $e) {
- return response()->json([
- 'success' => false,
- 'message' => '删除Webhook失败',
- 'error' => $e->getMessage(),
- ], 500);
- }
- }
- /**
- * 测试Webhook
- *
- * @param Request $request
- * @param int $id
- * @return JsonResponse
- */
- #[Route('POST', '/{id}/test', name: 'openapi.webhook.test')]
- #[Middleware('openapi.scope:WEBHOOK_WRITE')]
- public function test(Request $request, int $id): JsonResponse
- {
- try {
- $app = $request->attributes->get('openapi_app');
-
- if (!$app) {
- return response()->json([
- 'success' => false,
- 'message' => '应用信息不存在',
- ], 404);
- }
- $webhook = OpenApiWebhook::where('app_id', $app->app_id)
- ->where('id', $id)
- ->first();
- if (!$webhook) {
- return response()->json([
- 'success' => false,
- 'message' => 'Webhook不存在',
- ], 404);
- }
- // 测试Webhook
- $result = $this->webhookService->testWebhook($webhook);
- return response()->json([
- 'success' => true,
- 'message' => 'Webhook测试完成',
- 'data' => $result,
- ]);
- } catch (\Exception $e) {
- return response()->json([
- 'success' => false,
- 'message' => 'Webhook测试失败',
- 'error' => $e->getMessage(),
- ], 500);
- }
- }
- /**
- * 重新生成Webhook密钥
- *
- * @param Request $request
- * @param int $id
- * @return JsonResponse
- */
- #[Route('POST', '/{id}/regenerate-secret', name: 'openapi.webhook.regenerate_secret')]
- #[Middleware('openapi.scope:WEBHOOK_WRITE')]
- public function regenerateSecret(Request $request, int $id): JsonResponse
- {
- try {
- $app = $request->attributes->get('openapi_app');
-
- if (!$app) {
- return response()->json([
- 'success' => false,
- 'message' => '应用信息不存在',
- ], 404);
- }
- $webhook = OpenApiWebhook::where('app_id', $app->app_id)
- ->where('id', $id)
- ->first();
- if (!$webhook) {
- return response()->json([
- 'success' => false,
- 'message' => 'Webhook不存在',
- ], 404);
- }
- // 重新生成密钥
- $newSecret = $webhook->regenerateSecret();
- return response()->json([
- 'success' => true,
- 'message' => 'Webhook密钥重新生成成功',
- 'data' => [
- 'webhook_id' => $webhook->id,
- 'secret' => $newSecret,
- 'regenerated_at' => now(),
- ],
- ]);
- } catch (\Exception $e) {
- return response()->json([
- 'success' => false,
- 'message' => '重新生成密钥失败',
- 'error' => $e->getMessage(),
- ], 500);
- }
- }
- }
|