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 { try { $app = $request->attributes->get('openapi_app'); if (!$app) { return response()->json([ 'success' => false, 'message' => '应用信息不存在', ], 404); } // 使用标准验证系统 $validation = new \App\Module\OpenAPI\Validations\WebhookCreateValidation($request->all()); $validation->validate(); if ($validation->isFail()) { return response()->json([ 'success' => false, 'message' => '数据验证失败', 'errors' => $validation->getErrors(), ], 422); } $data = $validation->getSafeData(); // 创建Webhook $webhook = $this->webhookService->createWebhook($app, $data); 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) { 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); } } }