Преглед на файлове

remove request from service

visuddhinanda преди 5 дни
родител
ревизия
5983a791d7
променени са 2 файла, в които са добавени 63 реда и са изтрити 72 реда
  1. 55 5
      api-v12/app/Http/Controllers/CollectionController.php
  2. 8 67
      api-v12/app/Services/CollectionService.php

+ 55 - 5
api-v12/app/Http/Controllers/CollectionController.php

@@ -11,6 +11,7 @@ use App\Http\Api\StudioApi;
 use App\Http\Resources\CollectionResource;
 use App\Http\Resources\CollectionResource;
 use App\Services\CollectionService;
 use App\Services\CollectionService;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\DB;
+use Illuminate\Database\Eloquent\Builder;
 
 
 class CollectionController extends Controller
 class CollectionController extends Controller
 {
 {
@@ -18,18 +19,67 @@ class CollectionController extends Controller
 
 
     public function index(Request $request)
     public function index(Request $request)
     {
     {
-        $result = $this->service->buildIndexQuery($request);
+        try {
+            $table = match ($request->get('view')) {
+                'studio_list' => $this->service->buildStudioListQuery(),
+                'studio'      => $this->buildStudioIndex($request),
+                'public'      => $this->service->buildPublicQuery(
+                    $request->has('studio')
+                        ? StudioApi::getIdByName($request->get('studio'))
+                        : null
+                ),
+                default       => throw new \InvalidArgumentException('无法识别的view参数'),
+            };
+        } catch (\Illuminate\Auth\AuthenticationException $e) {
+            return $this->error($e->getMessage(), 403, 403);
+        } catch (\InvalidArgumentException $e) {
+            return $this->error($e->getMessage(), 200, 200);
+        }
 
 
-        if (isset($result['error'])) {
-            return $this->error($result['error'], $result['code'] ?? 200, $result['code'] ?? 200);
+        if ($request->filled('search')) {
+            $table = $table->where('title', 'like', '%' . $request->get('search') . '%');
+        }
+
+        $count = $table->count();
+
+        if ($request->has('order') && $request->has('dir')) {
+            $table = $table->orderBy($request->get('order'), $request->get('dir'));
+        } else {
+            $orderCol = $request->get('view') === 'studio_list' ? 'count' : 'updated_at';
+            $table = $table->orderBy($orderCol, 'desc');
         }
         }
 
 
+        $result = $table
+            ->skip($request->get('offset', 0))
+            ->take($request->get('limit', 1000))
+            ->get();
+
         return $this->ok([
         return $this->ok([
-            'rows'  => CollectionResource::collection($result['data']),
-            'count' => $result['count'],
+            'rows'  => CollectionResource::collection($result),
+            'count' => $count,
         ]);
         ]);
     }
     }
 
 
+    // studio 分支的鉴权逻辑留在 controller
+    private function buildStudioIndex(Request $request): Builder
+    {
+        $user = AuthApi::current($request);
+        if (!$user) {
+            throw new \Illuminate\Auth\AuthenticationException(__('auth.failed'));
+        }
+
+        $studioId = StudioApi::getIdByName($request->get('name'));
+        if ($user['user_uid'] !== $studioId) {
+            throw new \Illuminate\Auth\AuthenticationException(__('auth.failed'));
+        }
+
+        return $this->service->buildStudioQuery(
+            $user['user_uid'],
+            $studioId,
+            $request->get('view2', 'my')
+        );
+    }
+
     public function showMyNumber(Request $request)
     public function showMyNumber(Request $request)
     {
     {
         $result = $this->service->getMyNumber($request);
         $result = $this->service->getMyNumber($request);

+ 8 - 67
api-v12/app/Services/CollectionService.php

@@ -9,6 +9,7 @@ use App\Http\Api\ShareApi;
 use Illuminate\Http\Request;
 use Illuminate\Http\Request;
 use App\Http\Resources\CollectionResource;
 use App\Http\Resources\CollectionResource;
 use Illuminate\Support\Facades\Log;
 use Illuminate\Support\Facades\Log;
+use Illuminate\Database\Eloquent\Builder;
 
 
 class CollectionService
 class CollectionService
 {
 {
@@ -76,56 +77,8 @@ class CollectionService
         return ['data' => ['my' => $my, 'collaboration' => $collaboration]];
         return ['data' => ['my' => $my, 'collaboration' => $collaboration]];
     }
     }
 
 
-    /**
-     * 构建 index 查询,根据 view 参数分发不同逻辑
-     */
-    public function buildIndexQuery(Request $request): array
-    {
-
-        $table = match ($request->get('view')) {
-            'studio_list' => $this->buildStudioListQuery($this->indexCol),
-            'studio'      => $this->buildStudioQuery($request, $this->indexCol),
-            'public'      => $this->buildPublicQuery($request, $this->indexCol),
-            default       => null,
-        };
-
-        if ($table === null) {
-            return ['error' => '无法识别的view参数'];
-        }
-
-        // 如果是鉴权失败从 studio 分支返回的错误
-        if (isset($table['error'])) {
-            return $table;
-        }
-
-        // 搜索
-        if ($request->filled('search')) {
-            $table = $table->where('title', 'like', '%' . $request->get('search') . '%');
-        }
-
-        $count = $table->count();
-
-        // 排序
-        if ($request->has('order') && $request->has('dir')) {
-            $table = $table->orderBy($request->get('order'), $request->get('dir'));
-        } else {
-            $orderCol = $request->get('view') === 'studio_list' ? 'count' : 'updated_at';
-            $table = $table->orderBy($orderCol, 'desc');
-        }
-
-        $result = $table
-            ->skip($request->get('offset', 0))
-            ->take($request->get('limit', 1000))
-            ->get();
-
-        return ['data' => $result, 'count' => $count];
-    }
 
 
-    // -------------------------------------------------------------------------
-    // 私有:各 view 的查询构建
-    // -------------------------------------------------------------------------
-
-    private function buildStudioListQuery(array $indexCol)
+    public function buildStudioListQuery(): Builder
     {
     {
         return Collection::select(['owner'])
         return Collection::select(['owner'])
             ->selectRaw('count(*) as count')
             ->selectRaw('count(*) as count')
@@ -133,37 +86,25 @@ class CollectionService
             ->groupBy('owner');
             ->groupBy('owner');
     }
     }
 
 
-    private function buildStudioQuery(Request $request, array $indexCol): array|\Illuminate\Database\Eloquent\Builder
+    public function buildStudioQuery(string $userUid, string $studioId, string $view2 = 'my'): Builder
     {
     {
-        $user = AuthApi::current($request);
-        if (!$user) {
-            return ['error' => __('auth.failed'), 'code' => 403];
-        }
+        $table = Collection::select($this->indexCol);
 
 
-        $studioId = StudioApi::getIdByName($request->get('name'));
-        if ($user['user_uid'] !== $studioId) {
-            return ['error' => __('auth.failed'), 'code' => 403];
-        }
-
-        $table = Collection::select($indexCol);
-
-        if ($request->get('view2', 'my') === 'my') {
+        if ($view2 === 'my') {
             return $table->where('owner', $studioId);
             return $table->where('owner', $studioId);
         }
         }
 
 
-        // 协作
         $resList = ShareApi::getResList($studioId, 4);
         $resList = ShareApi::getResList($studioId, 4);
         $resId = array_column($resList, 'res_id');
         $resId = array_column($resList, 'res_id');
 
 
         return $table->whereIn('uid', $resId)->where('owner', '<>', $studioId);
         return $table->whereIn('uid', $resId)->where('owner', '<>', $studioId);
     }
     }
 
 
-    private function buildPublicQuery(Request $request, array $indexCol)
+    public function buildPublicQuery(?string $studioId = null): Builder
     {
     {
-        $table = Collection::select($indexCol)->where('status', 30);
+        $table = Collection::select($this->indexCol)->where('status', 30);
 
 
-        if ($request->has('studio')) {
-            $studioId = StudioApi::getIdByName($request->get('studio'));
+        if ($studioId) {
             $table = $table->where('owner', $studioId);
             $table = $table->where('owner', $studioId);
         }
         }