AppController.php 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. <?php
  2. namespace App\Module\OpenAPI\Controllers;
  3. use App\Module\OpenAPI\Models\OpenApiApp;
  4. use App\Module\OpenAPI\Services\OpenApiService;
  5. use App\Module\OpenAPI\Services\ScopeService;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Http\JsonResponse;
  8. use Spatie\RouteAttributes\Attributes\Route;
  9. use Spatie\RouteAttributes\Attributes\Prefix;
  10. use Spatie\RouteAttributes\Attributes\Middleware;
  11. /**
  12. * OpenAPI应用信息控制器
  13. *
  14. * 提供应用信息查询和管理的API接口
  15. */
  16. #[Prefix('openapi/app')]
  17. #[Middleware(['api', 'openapi.auth'])]
  18. class AppController
  19. {
  20. protected OpenApiService $openApiService;
  21. protected ScopeService $scopeService;
  22. public function __construct(
  23. OpenApiService $openApiService,
  24. ScopeService $scopeService
  25. ) {
  26. $this->openApiService = $openApiService;
  27. $this->scopeService = $scopeService;
  28. }
  29. /**
  30. * 获取应用信息
  31. *
  32. * @param Request $request
  33. * @return JsonResponse
  34. */
  35. #[Route('GET', '/info', name: 'openapi.app.info')]
  36. #[Middleware('openapi.scope:APP_READ')]
  37. public function info(Request $request): JsonResponse
  38. {
  39. $startTime = microtime(true);
  40. // 初始化请求日志记录器
  41. $requestLogger = new \App\Module\System\Services\RequestLogger($request);
  42. $requestLogger->setRouter("openapi/app/info");
  43. try {
  44. // 从请求中获取应用信息(由认证中间件设置)
  45. $app = $request->attributes->get('openapi_app');
  46. if (!$app) {
  47. $requestLogger->setError('应用信息不存在');
  48. $requestLogger->setRunTime($startTime);
  49. return response()->json([
  50. 'success' => false,
  51. 'message' => '应用信息不存在',
  52. ], 404);
  53. }
  54. // 记录运行时间
  55. $requestLogger->setRunTime($startTime);
  56. return response()->json([
  57. 'success' => true,
  58. 'data' => [
  59. 'app_id' => $app->app_id,
  60. 'name' => $app->name,
  61. 'description' => $app->description,
  62. 'website' => $app->website,
  63. 'logo' => $app->logo,
  64. 'status' => $app->status,
  65. 'auth_type' => $app->auth_type,
  66. 'scopes' => $app->scopes,
  67. 'created_at' => $app->created_at,
  68. 'updated_at' => $app->updated_at,
  69. ],
  70. ]);
  71. } catch (\Exception $e) {
  72. // 记录错误信息和运行时间
  73. $requestLogger->setError($e->getMessage());
  74. $requestLogger->setRunTime($startTime);
  75. return response()->json([
  76. 'success' => false,
  77. 'message' => '获取应用信息失败',
  78. 'error' => $e->getMessage(),
  79. ], 500);
  80. }
  81. }
  82. /**
  83. * 获取应用权限范围
  84. *
  85. * @param Request $request
  86. * @return JsonResponse
  87. */
  88. #[Route('GET', '/scopes', name: 'openapi.app.scopes')]
  89. #[Middleware('openapi.scope:APP_READ')]
  90. public function scopes(Request $request): JsonResponse
  91. {
  92. try {
  93. $app = $request->attributes->get('openapi_app');
  94. if (!$app) {
  95. return response()->json([
  96. 'success' => false,
  97. 'message' => '应用信息不存在',
  98. ], 404);
  99. }
  100. $scopes = $this->scopeService->getAppScopes($app);
  101. $scopeGroups = $this->scopeService->getScopeGroups();
  102. return response()->json([
  103. 'success' => true,
  104. 'data' => [
  105. 'app_scopes' => $scopes,
  106. 'available_scopes' => $scopeGroups,
  107. ],
  108. ]);
  109. } catch (\Exception $e) {
  110. return response()->json([
  111. 'success' => false,
  112. 'message' => '获取权限范围失败',
  113. 'error' => $e->getMessage(),
  114. ], 500);
  115. }
  116. }
  117. /**
  118. * 获取应用统计信息
  119. *
  120. * @param Request $request
  121. * @return JsonResponse
  122. */
  123. #[Route('GET', '/stats', name: 'openapi.app.stats')]
  124. #[Middleware('openapi.scope:APP_READ')]
  125. public function stats(Request $request): JsonResponse
  126. {
  127. try {
  128. $app = $request->attributes->get('openapi_app');
  129. if (!$app) {
  130. return response()->json([
  131. 'success' => false,
  132. 'message' => '应用信息不存在',
  133. ], 404);
  134. }
  135. $period = $request->get('period', 'day');
  136. $validPeriods = ['hour', 'day', 'week', 'month'];
  137. if (!in_array($period, $validPeriods)) {
  138. return response()->json([
  139. 'success' => false,
  140. 'message' => '无效的统计周期',
  141. ], 400);
  142. }
  143. // 获取API调用统计
  144. $apiStats = $this->openApiService->getAppStats($app->app_id, $period);
  145. return response()->json([
  146. 'success' => true,
  147. 'data' => $apiStats,
  148. ]);
  149. } catch (\Exception $e) {
  150. return response()->json([
  151. 'success' => false,
  152. 'message' => '获取统计信息失败',
  153. 'error' => $e->getMessage(),
  154. ], 500);
  155. }
  156. }
  157. /**
  158. * 更新应用信息
  159. *
  160. * @param Request $request
  161. * @return JsonResponse
  162. */
  163. #[Route('PUT', '/update', name: 'openapi.app.update')]
  164. #[Middleware('openapi.scope:APP_WRITE')]
  165. public function update(Request $request): JsonResponse
  166. {
  167. try {
  168. $app = $request->attributes->get('openapi_app');
  169. if (!$app) {
  170. return response()->json([
  171. 'success' => false,
  172. 'message' => '应用信息不存在',
  173. ], 404);
  174. }
  175. // 使用标准验证系统
  176. $requestData = $request->only(['name', 'description', 'website', 'logo', 'callback_url', 'contact_email']);
  177. $validation = new \App\Module\OpenAPI\Validations\AppUpdateValidation($requestData);
  178. $validation->validate();
  179. if ($validation->isFail()) {
  180. return response()->json([
  181. 'success' => false,
  182. 'message' => '数据验证失败',
  183. 'errors' => $validation->getErrors(),
  184. ], 422);
  185. }
  186. $data = $validation->getSafeData();
  187. // 更新应用信息
  188. $updatedApp = $this->openApiService->updateApp($app->id, $data);
  189. return response()->json([
  190. 'success' => true,
  191. 'message' => '应用信息更新成功',
  192. 'data' => [
  193. 'app_id' => $updatedApp->app_id,
  194. 'name' => $updatedApp->name,
  195. 'description' => $updatedApp->description,
  196. 'website' => $updatedApp->website,
  197. 'logo' => $updatedApp->logo,
  198. 'callback_url' => $updatedApp->callback_url,
  199. 'contact_email' => $updatedApp->contact_email,
  200. 'updated_at' => $updatedApp->updated_at,
  201. ],
  202. ]);
  203. } catch (\Exception $e) {
  204. return response()->json([
  205. 'success' => false,
  206. 'message' => '更新应用信息失败',
  207. 'error' => $e->getMessage(),
  208. ], 500);
  209. }
  210. }
  211. /**
  212. * 重新生成应用密钥
  213. *
  214. * @param Request $request
  215. * @return JsonResponse
  216. */
  217. #[Route('POST', '/regenerate-secret', name: 'openapi.app.regenerate_secret')]
  218. #[Middleware('openapi.scope:APP_WRITE')]
  219. public function regenerateSecret(Request $request): JsonResponse
  220. {
  221. try {
  222. $app = $request->attributes->get('openapi_app');
  223. if (!$app) {
  224. return response()->json([
  225. 'success' => false,
  226. 'message' => '应用信息不存在',
  227. ], 404);
  228. }
  229. // 重新生成密钥
  230. $newSecret = $this->openApiService->regenerateAppSecret($app->id);
  231. return response()->json([
  232. 'success' => true,
  233. 'message' => '应用密钥重新生成成功',
  234. 'data' => [
  235. 'app_id' => $app->app_id,
  236. 'app_secret' => $newSecret,
  237. 'regenerated_at' => now(),
  238. ],
  239. ]);
  240. } catch (\Exception $e) {
  241. return response()->json([
  242. 'success' => false,
  243. 'message' => '重新生成密钥失败',
  244. 'error' => $e->getMessage(),
  245. ], 500);
  246. }
  247. }
  248. /**
  249. * 获取应用配额信息
  250. *
  251. * @param Request $request
  252. * @return JsonResponse
  253. */
  254. #[Route('GET', '/quota', name: 'openapi.app.quota')]
  255. #[Middleware('openapi.scope:APP_READ')]
  256. public function quota(Request $request): JsonResponse
  257. {
  258. try {
  259. $app = $request->attributes->get('openapi_app');
  260. if (!$app) {
  261. return response()->json([
  262. 'success' => false,
  263. 'message' => '应用信息不存在',
  264. ], 404);
  265. }
  266. // 获取配额信息
  267. $quotaInfo = $this->openApiService->getAppQuota($app->app_id);
  268. return response()->json([
  269. 'success' => true,
  270. 'data' => $quotaInfo,
  271. ]);
  272. } catch (\Exception $e) {
  273. return response()->json([
  274. 'success' => false,
  275. 'message' => '获取配额信息失败',
  276. 'error' => $e->getMessage(),
  277. ], 500);
  278. }
  279. }
  280. }