AppController.php 10 KB

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