visuddhinanda 2 lat temu
rodzic
commit
052a82ab47

+ 204 - 0
app/Http/Controllers/TransferController.php

@@ -0,0 +1,204 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Models\Transfer;
+use App\Models\Channel;
+
+use Illuminate\Http\Request;
+use App\Http\Api\AuthApi;
+use App\Http\Api\StudioApi;
+use App\Http\Resources\TransferResource;
+
+class TransferController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function index(Request $request)
+    {
+		switch ($request->get('view')) {
+            case 'studio':
+                # 获取studio内所有channel
+                $user = AuthApi::current($request);
+                if(!$user){
+                    return $this->error(__('auth.failed'));
+                }
+                //判断当前用户是否有指定的studio的管理权限
+                $studioId = StudioApi::getIdByName($request->get('name'));
+                if($user['user_uid'] !== $studioId){
+                    return $this->error(__('auth.failed'));
+                }
+                switch ($request->get('view2')) {
+                    case 'in':
+                        $table = Transfer::where('new_owner',$studioId);
+                        break;
+                    case 'out':
+                        $table = Transfer::where('origin_owner',$studioId);
+                        break;
+                    default:
+                        return $this->error('no view2');
+                    break;
+                }
+                $outNumber = Transfer::where('origin_owner',$studioId)
+                                    ->where('status','transferred')
+                                    ->count();
+                $inNumber = Transfer::where('new_owner',$studioId)
+                                    ->where('status','transferred')
+                                    ->count();
+                break;
+        }
+        if(!empty($search)){
+            $table->where('title', 'like', $search."%");
+        }
+        $table->orderBy($request->get('order','updated_at'),
+                        $request->get('dir','desc'));
+        $count = $table->count();
+        $table->skip($request->get("offset",0))
+              ->take($request->get('limit',100));
+
+        $result = $table->get();
+
+
+		return $this->ok(["rows"=>TransferResource::collection($result),
+                              "count"=>$count,
+                              'out'=>$outNumber,
+                              'in'=>$inNumber,
+                            ]);
+
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\Response
+     */
+    public function store(Request $request)
+    {
+        $user = AuthApi::current($request);
+        if(!$user){
+            return $this->error(__('auth.failed'));
+        }
+        //
+        // validate
+        // read more on validation at http://laravel.com/docs/validation
+
+
+        $rules = array(
+            'res_id' => 'required',
+            'res_type' => 'required',
+            'new_owner' => 'required',
+        );
+
+
+        $validated = $request->validate($rules);
+
+        $transfer = new Transfer;
+
+        //查看权限
+        switch ($request->get('res_type')) {
+            case 'channel':
+                $oldRes = Channel::find($request->get('res_id'));
+                if($oldRes->owner_uid !== $user['user_uid']){
+                    return $this->error(__('auth.failed'),[403],403);
+                }
+                $transfer->origin_owner = $oldRes->owner_uid;
+                break;
+
+            default:
+                # code...
+                break;
+        }
+        //查重
+        if(Transfer::where('res_id',$request->get('res_id'))
+                ->where('res_type',$request->get('res_type'))
+                ->where('status','transferred')
+                ->exists()){
+                    return $this->error('该资源已经进入转让流程',[200],200);
+                }
+        $transfer->res_id = $request->get('res_id');
+        $transfer->res_type = $request->get('res_type');
+
+        $transfer->transferor_id = $user['user_uid'];
+        $transfer->new_owner = $request->get('new_owner');
+        $transfer->save();
+        return $this->ok(new TransferResource($transfer));
+
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  \App\Models\Transfer  $transfer
+     * @return \Illuminate\Http\Response
+     */
+    public function show(Transfer $transfer)
+    {
+        //
+        return $this->ok(new TransferResource($discussion));
+
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \App\Models\Transfer  $transfer
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, Transfer $transfer)
+    {
+        $user = AuthApi::current($request);
+        if(!$user){
+            return $this->error(__('auth.failed'),[403],403);
+        }
+        //权限
+        switch ($request->get('status')) {
+            case 'accept':
+            case 'refuse':
+                if($transfer->new_owner!==$user['user_uid']){
+                    return $this->error(__('auth.failed'),[403],403);
+                }
+                $transfer->status = $request->get('status');
+                break;
+            case 'cancel':
+                if($transfer->origin_owner!==$user['user_uid']){
+                    return $this->error(__('auth.failed'),[403],403);
+                }
+                $transfer->status = 'cancel';
+                break;
+            default:
+                return $this->error(__('auth.failed'),[404],404);
+                break;
+        }
+        $transfer->editor_id = $user['user_uid'];
+        $transfer->save();
+        if($request->get('status')==='accept'){
+            switch ($transfer->res_type) {
+                case 'channel':
+                    Channel::where('uid',$transfer->res_id)
+                            ->update(['owner_uid'=>$transfer->new_owner]);
+                    break;
+                default:
+                    # code...
+                    break;
+            }
+        }
+        return $this->ok(new TransferResource($transfer));
+
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  \App\Models\Transfer  $transfer
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy(Transfer $transfer)
+    {
+        //
+    }
+}

+ 44 - 0
app/Http/Resources/TransferResource.php

@@ -0,0 +1,44 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Illuminate\Http\Resources\Json\JsonResource;
+use App\Http\Api\StudioApi;
+use App\Http\Api\UserApi;
+use App\Http\Api\ChannelApi;
+
+class TransferResource extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
+     */
+    public function toArray($request)
+    {
+        $data = [
+            "id" => $this->id,
+            "origin_owner"=>StudioApi::getById($this->origin_owner),
+            "res_type"=>$this->res_type,
+            "res_id"=> $this->res_id,
+            "transferor"=> UserApi::getByUuid($this->transferor_id),
+            "new_owner"=> StudioApi::getById($this->new_owner),
+            "status"=> $this->status,
+            "updated_at"=> $this->updated_at,
+            "created_at"=> $this->created_at,
+        ];
+        if(!empty($this->editor_id)){
+            $data['editor'] = UserApi::getByUuid($this->editor_id);
+        }
+        switch ($this->res_type) {
+            case 'channel':
+                $data['channel'] = ChannelApi::getById($this->res_id);
+                break;
+            default:
+                # code...
+                break;
+        }
+        return $data;
+    }
+}

+ 15 - 0
app/Models/Transfer.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class Transfer extends Model
+{
+    use HasFactory;
+    protected $primaryKey = 'id';
+	protected $casts = [
+		'id' => 'string'
+	];
+}

+ 38 - 0
database/migrations/2023_10_01_074218_create_transfers_table.php

@@ -0,0 +1,38 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class CreateTransfersTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('transfers', function (Blueprint $table) {
+            $table->uuid('id')->primary()->default(DB::raw('uuid_generate_v1mc()'));
+            $table->uuid('origin_owner')->index();
+            $table->string('res_type',32)->index();
+            $table->uuid('res_id')->index();
+            $table->uuid('transferor_id')->index();
+            $table->uuid('new_owner')->index();
+            $table->uuid('editor_id')->nullable()->index();
+            $table->string('status',32)->index()->default('transferred');
+            $table->timestamps();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::dropIfExists('transfers');
+    }
+}

+ 25 - 0
tests/Feature/TransferTest.php

@@ -0,0 +1,25 @@
+<?php
+
+namespace Tests\Feature;
+
+use Illuminate\Foundation\Testing\RefreshDatabase;
+use Illuminate\Foundation\Testing\WithFaker;
+use Tests\TestCase;
+
+class TransferTest extends TestCase
+{
+    /**
+     * A basic feature test example.
+     *
+     * @return void
+     */
+    public function test_example()
+    {
+        $response = $this->withHeaders([
+            'Authorization' => env('TEST_USER_TOKEN'),
+        ])->get('/api/v2/transfer?view=studio&name=visuddinanda');
+
+
+        $response->assertStatus(200);
+    }
+}