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); } // 验证请求数据 $validator = new ApiValidator(); $data = $request->only(['name', 'url', 'events', 'timeout', 'retry_count']); if (empty($data['name'])) { $validator->addError('name', 'Webhook名称不能为空'); } if (empty($data['url'])) { $validator->addError('url', 'Webhook URL不能为空'); } elseif (!filter_var($data['url'], FILTER_VALIDATE_URL)) { $validator->addError('url', 'Webhook URL格式错误'); } if (empty($data['events']) || !is_array($data['events'])) { $validator->addError('events', '事件类型不能为空'); } if (isset($data['timeout']) && (!is_numeric($data['timeout']) || $data['timeout'] < 1 || $data['timeout'] > 300)) { $validator->addError('timeout', '超时时间必须在1-300秒之间'); } if (isset($data['retry_count']) && (!is_numeric($data['retry_count']) || $data['retry_count'] < 0 || $data['retry_count'] > 10)) { $validator->addError('retry_count', '重试次数必须在0-10次之间'); } if ($validator->hasErrors()) { return response()->json([ 'success' => false, 'message' => '数据验证失败', 'errors' => $validator->getErrors(), ], 422); } // 创建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); } // 验证请求数据 $validator = new ApiValidator(); $data = $request->only(['name', 'url', 'events', 'status', 'timeout', 'retry_count']); if (isset($data['name']) && empty($data['name'])) { $validator->addError('name', 'Webhook名称不能为空'); } if (isset($data['url']) && (!empty($data['url']) && !filter_var($data['url'], FILTER_VALIDATE_URL))) { $validator->addError('url', 'Webhook URL格式错误'); } if (isset($data['events']) && (!is_array($data['events']) || empty($data['events']))) { $validator->addError('events', '事件类型不能为空'); } if (isset($data['status']) && !in_array($data['status'], ['ACTIVE', 'INACTIVE'])) { $validator->addError('status', '状态值无效'); } if (isset($data['timeout']) && (!is_numeric($data['timeout']) || $data['timeout'] < 1 || $data['timeout'] > 300)) { $validator->addError('timeout', '超时时间必须在1-300秒之间'); } if (isset($data['retry_count']) && (!is_numeric($data['retry_count']) || $data['retry_count'] < 0 || $data['retry_count'] > 10)) { $validator->addError('retry_count', '重试次数必须在0-10次之间'); } if ($validator->hasErrors()) { return response()->json([ 'success' => false, 'message' => '数据验证失败', 'errors' => $validator->getErrors(), ], 422); } // 更新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); } } }