AppController.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  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. try {
  40. // 从请求中获取应用信息(由认证中间件设置)
  41. $app = $request->attributes->get('openapi_app');
  42. if (!$app) {
  43. return response()->json([
  44. 'success' => false,
  45. 'message' => '应用信息不存在',
  46. ], 404);
  47. }
  48. return response()->json([
  49. 'success' => true,
  50. 'data' => [
  51. 'app_id' => $app->app_id,
  52. 'name' => $app->name,
  53. 'description' => $app->description,
  54. 'website' => $app->website,
  55. 'logo' => $app->logo,
  56. 'status' => $app->status,
  57. 'auth_type' => $app->auth_type,
  58. 'scopes' => $app->scopes,
  59. 'created_at' => $app->created_at,
  60. 'updated_at' => $app->updated_at,
  61. ],
  62. ]);
  63. } catch (\Exception $e) {
  64. return response()->json([
  65. 'success' => false,
  66. 'message' => '获取应用信息失败',
  67. 'error' => $e->getMessage(),
  68. ], 500);
  69. }
  70. }
  71. /**
  72. * 获取应用权限范围
  73. *
  74. * @param Request $request
  75. * @return JsonResponse
  76. */
  77. #[Route('GET', '/scopes', name: 'openapi.app.scopes')]
  78. #[Middleware('openapi.scope:APP_READ')]
  79. public function scopes(Request $request): JsonResponse
  80. {
  81. try {
  82. $app = $request->attributes->get('openapi_app');
  83. if (!$app) {
  84. return response()->json([
  85. 'success' => false,
  86. 'message' => '应用信息不存在',
  87. ], 404);
  88. }
  89. $scopes = $this->scopeService->getAppScopes($app);
  90. $scopeGroups = $this->scopeService->getScopeGroups();
  91. return response()->json([
  92. 'success' => true,
  93. 'data' => [
  94. 'app_scopes' => $scopes,
  95. 'available_scopes' => $scopeGroups,
  96. ],
  97. ]);
  98. } catch (\Exception $e) {
  99. return response()->json([
  100. 'success' => false,
  101. 'message' => '获取权限范围失败',
  102. 'error' => $e->getMessage(),
  103. ], 500);
  104. }
  105. }
  106. /**
  107. * 获取应用统计信息
  108. *
  109. * @param Request $request
  110. * @return JsonResponse
  111. */
  112. #[Route('GET', '/stats', name: 'openapi.app.stats')]
  113. #[Middleware('openapi.scope:APP_READ')]
  114. public function stats(Request $request): JsonResponse
  115. {
  116. try {
  117. $app = $request->attributes->get('openapi_app');
  118. if (!$app) {
  119. return response()->json([
  120. 'success' => false,
  121. 'message' => '应用信息不存在',
  122. ], 404);
  123. }
  124. $period = $request->get('period', 'day');
  125. $validPeriods = ['hour', 'day', 'week', 'month'];
  126. if (!in_array($period, $validPeriods)) {
  127. return response()->json([
  128. 'success' => false,
  129. 'message' => '无效的统计周期',
  130. ], 400);
  131. }
  132. // 获取API调用统计
  133. $apiStats = $this->openApiService->getAppStats($app->app_id, $period);
  134. return response()->json([
  135. 'success' => true,
  136. 'data' => $apiStats,
  137. ]);
  138. } catch (\Exception $e) {
  139. return response()->json([
  140. 'success' => false,
  141. 'message' => '获取统计信息失败',
  142. 'error' => $e->getMessage(),
  143. ], 500);
  144. }
  145. }
  146. /**
  147. * 更新应用信息
  148. *
  149. * @param Request $request
  150. * @return JsonResponse
  151. */
  152. #[Route('PUT', '/update', name: 'openapi.app.update')]
  153. #[Middleware('openapi.scope:APP_WRITE')]
  154. public function update(Request $request): JsonResponse
  155. {
  156. try {
  157. $app = $request->attributes->get('openapi_app');
  158. if (!$app) {
  159. return response()->json([
  160. 'success' => false,
  161. 'message' => '应用信息不存在',
  162. ], 404);
  163. }
  164. // 使用标准验证系统
  165. $requestData = $request->only(['name', 'description', 'website', 'logo', 'callback_url', 'contact_email']);
  166. $validation = new \App\Module\OpenAPI\Validations\AppUpdateValidation($requestData);
  167. $validation->validate();
  168. if ($validation->isFail()) {
  169. return response()->json([
  170. 'success' => false,
  171. 'message' => '数据验证失败',
  172. 'errors' => $validation->getErrors(),
  173. ], 422);
  174. }
  175. $data = $validation->getSafeData();
  176. // 更新应用信息
  177. $updatedApp = $this->openApiService->updateApp($app->id, $data);
  178. return response()->json([
  179. 'success' => true,
  180. 'message' => '应用信息更新成功',
  181. 'data' => [
  182. 'app_id' => $updatedApp->app_id,
  183. 'name' => $updatedApp->name,
  184. 'description' => $updatedApp->description,
  185. 'website' => $updatedApp->website,
  186. 'logo' => $updatedApp->logo,
  187. 'callback_url' => $updatedApp->callback_url,
  188. 'contact_email' => $updatedApp->contact_email,
  189. 'updated_at' => $updatedApp->updated_at,
  190. ],
  191. ]);
  192. } catch (\Exception $e) {
  193. return response()->json([
  194. 'success' => false,
  195. 'message' => '更新应用信息失败',
  196. 'error' => $e->getMessage(),
  197. ], 500);
  198. }
  199. }
  200. /**
  201. * 重新生成应用密钥
  202. *
  203. * @param Request $request
  204. * @return JsonResponse
  205. */
  206. #[Route('POST', '/regenerate-secret', name: 'openapi.app.regenerate_secret')]
  207. #[Middleware('openapi.scope:APP_WRITE')]
  208. public function regenerateSecret(Request $request): JsonResponse
  209. {
  210. try {
  211. $app = $request->attributes->get('openapi_app');
  212. if (!$app) {
  213. return response()->json([
  214. 'success' => false,
  215. 'message' => '应用信息不存在',
  216. ], 404);
  217. }
  218. // 重新生成密钥
  219. $newSecret = $this->openApiService->regenerateAppSecret($app->id);
  220. return response()->json([
  221. 'success' => true,
  222. 'message' => '应用密钥重新生成成功',
  223. 'data' => [
  224. 'app_id' => $app->app_id,
  225. 'app_secret' => $newSecret,
  226. 'regenerated_at' => now(),
  227. ],
  228. ]);
  229. } catch (\Exception $e) {
  230. return response()->json([
  231. 'success' => false,
  232. 'message' => '重新生成密钥失败',
  233. 'error' => $e->getMessage(),
  234. ], 500);
  235. }
  236. }
  237. /**
  238. * 获取应用配额信息
  239. *
  240. * @param Request $request
  241. * @return JsonResponse
  242. */
  243. #[Route('GET', '/quota', name: 'openapi.app.quota')]
  244. #[Middleware('openapi.scope:APP_READ')]
  245. public function quota(Request $request): JsonResponse
  246. {
  247. try {
  248. $app = $request->attributes->get('openapi_app');
  249. if (!$app) {
  250. return response()->json([
  251. 'success' => false,
  252. 'message' => '应用信息不存在',
  253. ], 404);
  254. }
  255. // 获取配额信息
  256. $quotaInfo = $this->openApiService->getAppQuota($app->app_id);
  257. return response()->json([
  258. 'success' => true,
  259. 'data' => $quotaInfo,
  260. ]);
  261. } catch (\Exception $e) {
  262. return response()->json([
  263. 'success' => false,
  264. 'message' => '获取配额信息失败',
  265. 'error' => $e->getMessage(),
  266. ], 500);
  267. }
  268. }
  269. }