Browse Source

Merge pull request #1993 from visuddhinanda/laravel

支持nissaya自动匹配
visuddhinanda 2 years ago
parent
commit
4b25a53049

+ 9 - 4
app/Http/Controllers/GroupController.php

@@ -158,17 +158,22 @@ class GroupController extends Controller
 		if(!$result){
             return $this->error("没有查询到数据");
 		}
-        if($result->status<30){
+        if($result->status < 30){
             //私有,判断权限
             $user = AuthApi::current($request);
             if(!$user){
                 return $this->error(__('auth.failed'));
             }
-            //判断当前用户是否有指定的studio的权限
+            //判断当前用户是否有指定的group的权限
             if($user['user_uid'] !== $result->owner){
                 //非所有者
-                //TODO 判断是否协作
-                return $this->error(__('auth.failed'));
+                //判断是否协作
+                $power = GroupMember::where('group_id', $id)
+                            ->where('user_id',$user['user_uid'])
+                            ->value('power');
+                if($power === null){
+                   return $this->error(__('auth.failed'));
+                }
             }
         }
         return $this->ok(new GroupResource($result));

+ 1 - 1
app/Http/Controllers/GroupMemberController.php

@@ -44,7 +44,7 @@ class GroupMemberController extends Controller
         if(isset($_GET["order"]) && isset($_GET["dir"])){
             $table = $table->orderBy($_GET["order"],$_GET["dir"]);
         }else{
-            $table = $table->orderBy('updated_at','desc');
+            $table = $table->orderBy('created_at');
         }
 
         $table->skip($request->get('offset',0))

+ 64 - 6
app/Http/Controllers/SentenceController.php

@@ -5,19 +5,24 @@ namespace App\Http\Controllers;
 use App\Models\Sentence;
 use App\Models\Channel;
 use App\Models\SentHistory;
+use App\Models\WbwAnalysis;
+
 use Illuminate\Http\Request;
 use Illuminate\Support\Str;
+use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\Redis;
+
 use App\Http\Resources\SentResource;
 use App\Http\Api\AuthApi;
 use App\Http\Api\ShareApi;
 use App\Http\Api\ChannelApi;
 use App\Http\Api\PaliTextApi;
-use Illuminate\Support\Facades\Log;
-use Illuminate\Support\Facades\Cache;
-use App\Tools\RedisClusters;
 use App\Http\Api\Mq;
+
+use App\Tools\RedisClusters;
 use App\Tools\OpsLog;
-use Illuminate\Support\Facades\Redis;
+
 
 class SentenceController extends Controller
 {
@@ -373,7 +378,7 @@ class SentenceController extends Controller
         $user = AuthApi::current($request);
         if(!$user){
             //未登录鉴权失败
-            return $this->error(__('auth.failed'),[],403);
+            return $this->error(__('auth.failed'),403,403);
         }
         $channel = Channel::where('uid',$param[4])->first();
         if(!$channel){
@@ -383,7 +388,7 @@ class SentenceController extends Controller
             // 判断是否为协作
             $power = ShareApi::getResPower($user["user_uid"],$channel->uid,2);
             if($power < 20){
-                return $this->error(__('auth.failed'),[],403);
+                return $this->error(__('auth.failed'),403,403);
             }
         }
 
@@ -419,6 +424,7 @@ class SentenceController extends Controller
         }
         $sent->editor_uid = $realEditor;
         $sent->save();
+        $sent = $sent->refresh();
         //清除缓存
         $sentId = "{$sent['book_id']}-{$sent['paragraph']}-{$sent['word_start']}-{$sent['word_end']}";
         $hKey = "/sentence/res-count/{$sentId}/";
@@ -447,6 +453,11 @@ class SentenceController extends Controller
                             'channel'=>$channelId,
                             ]);
         Mq::publish('content',new SentResource($sent));
+
+        if($channel->type === 'nissaya' && $sent->content_type === 'json'){
+            $this->updateWbwAnalyses($sent->content,$channel->lang,$user["user_id"]);
+        }
+
         return $this->ok(new SentResource($sent));
     }
 
@@ -460,4 +471,51 @@ class SentenceController extends Controller
     {
         //
     }
+
+    private function updateWbwAnalyses($data,$lang,$editorId){
+        $wbwData = json_decode($data);
+        $currWbwId = 0;
+        $prefix = 'wbw-preference';
+        foreach ($wbwData as $key => $word) {
+            # code...
+            if(count($word->sn) === 1 ){
+                $currWbwId = $word->uid;
+                WbwAnalysis::where('wbw_id',$word->uid)->delete();
+            }
+            $newData = [
+                'wbw_id' => $currWbwId,
+                'wbw_word' => $word->real->value,
+                'book_id' => $word->book,
+                'paragraph' => $word->para,
+                'wid' => $word->sn[0],
+                'type' => 0,
+                'data' => '',
+                'confidence' => 100,
+                'lang' => $lang,
+                'editor_id'=>$editorId,
+                'created_at'=>now(),
+                'updated_at'=>now()
+            ];
+            $newData['type'] = 3;
+            if(!empty($word->meaning->value)){
+                $newData['data'] = $word->meaning->value;
+                WbwAnalysis::insert($newData);
+                RedisClusters::put("{$prefix}/{$word->real->value}/3/{$editorId}",$word->meaning->value);
+            }
+            if(isset($word->factors) && isset($word->factorMeaning)){
+                $factors = explode('+',str_replace('-','+',$word->factors->value));
+                $factorMeaning = explode('+',str_replace('-','+',$word->factorMeaning->value));
+                foreach ($factors as $key => $factor) {
+                    if(isset($factorMeaning[$key])){
+                        if(!empty($factorMeaning[$key])){
+                            $newData['wbw_word'] = $factor;
+                            $newData['data'] = $factorMeaning[$key];
+                            WbwAnalysis::insert($newData);
+                            RedisClusters::put("{$prefix}/{$factor}/3/{$editorId}",$factorMeaning[$key]);
+                        }
+                    }
+                }
+            }
+        }
+    }
 }

+ 68 - 0
app/Http/Controllers/SnowFlakeIdController.php

@@ -0,0 +1,68 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+
+class SnowFlakeIdController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function index(Request $request)
+    {
+        //
+        $output = [];
+        for ($i=0 ; $i < $request->get('count',1)  ; $i++ ) {
+            $output[] = app('snowflake')->id();
+        }
+        return $this->ok(['rows'=>$output,'count'=>count($output)]);
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @return \Illuminate\Http\Response
+     */
+    public function store(Request $request)
+    {
+        //
+    }
+
+    /**
+     * Display the specified resource.
+     *
+     * @param  int  $id
+     * @return \Illuminate\Http\Response
+     */
+    public function show($id)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  int  $id
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, $id)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  int  $id
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy($id)
+    {
+        //
+    }
+}

+ 50 - 10
app/Http/Controllers/WbwLookupController.php

@@ -168,15 +168,16 @@ class WbwLookupController extends Controller
         $fieldId = $fieldMap[$field];
         $myPreference = RedisClusters::get("{$prefix}/{$word}/{$fieldId}/{$userId}");
         if(!empty($myPreference)){
-            Log::info($word.'命中我的wbw-'.$field);
+            Log::debug($word.'命中我的wbw-'.$field,['data'=>$myPreference]);
             return ['value'=>$myPreference,'status'=>5];
         }else{
             $myPreference = RedisClusters::get("{$prefix}/{$word}/3/0");
             if(!empty($myPreference)){
-                Log::info($word.'命中社区wbw-'.$field);
+                Log::debug($word.'命中社区wbw-'.$field,['data'=>$myPreference]);
                 return ['value'=>$myPreference,'status'=>5];
             }
         }
+        //Log::debug($word.'未命中'.$field);
         return false;
     }
     /**
@@ -191,7 +192,7 @@ class WbwLookupController extends Controller
         $user = AuthApi::current($request);
         if(!$user ){
             //未登录用户
-            return $this->error(__('auth.failed'),[],401);
+            return $this->error(__('auth.failed'),401,401);
         }
 
         $startAt = microtime(true)*1000;
@@ -265,19 +266,19 @@ class WbwLookupController extends Controller
                     if($value->type !== '.cp.'){
                         $parent = $this->insertValue([$value->parent],$parent,$increment);
                     }
-                    if($data['case']['status']<5){
+                    if(isset($data['case']) && $data['case']['status']<5){
                         if(!empty($value->type) && $value->type !== ".cp."){
                             $case = $this->insertValue([$value->type."#".$value->grammar],$case,$increment);
                         }
                     }
-                    if($data['factors']['status']<5){
+                    if($data['factors']['status'] < 50){
                         $factors = $this->insertValue([$value->factors],$factors,$increment);
                     }
-                    if($data['factorMeaning']['status']<5){
+                    if(isset($data['factorMeaning']) && $data['factorMeaning']['status'] < 50){
                         $factorMeaning = $this->insertValue([$value->factormean],$factorMeaning,$increment);
                     }
 
-                    if($data['meaning']['status']<5){
+                    if($data['meaning']['status'] < 50){
                         if($this->langCheck($lang,$value->language)){
                             $meaning = $this->insertValue(explode('$',$value->mean),$meaning,$increment,false);
                         }
@@ -293,18 +294,57 @@ class WbwLookupController extends Controller
                     $first = array_keys($parent)[0];
                     $data['parent'] = ['value'=>$first==="_null"?"":$first,'status'=>3];
                 }
-                if(count($factors)>0){
+                if(count($factors)>0 && empty($data['factors']['value'])){
                     arsort($factors);
                     $first = array_keys($factors)[0];
                     $data['factors'] = ['value'=>$first==="_null"?"":$first,'status'=>3];
                 }
+
+                if(isset($data['factorMeaning']['value'])){
+                    $inputFM = str_replace(['-','+'],['',''],$data['factorMeaning']['value']);
+                }else{
+                    $inputFM = '';
+                }
+
+                if(count($factorMeaning)>0 && empty($inputFM)){
+                    $first = array_keys($factorMeaning)[0];
+                    if($first==="_null"){
+                        $factorMeaning = [];
+                    }
+                }
                 //拆分意思
+                if(count($factorMeaning) === 0){
+                    $autoMeaning = '';
+                    //生成自动的拆分意思
+                    $currFactors = explode('+',$data['factors']['value']) ;
+                    $autoFM = [];
+                    foreach ($currFactors as $factor) {
+                        $subFactors = explode('-',$factor) ;
+                        $autoSubFM = [];
+                        foreach ($subFactors as $subFactor) {
+                            $preference = $this->wbwPreference($subFactor,'meaning',$user['user_id']);
+                            if($preference !== false){
+                                $autoSubFM[] = $preference['value'];
+                            }else{
+                                $autoSubFM[] = '';
+                            }
+                        }
+                        $autoFM[] = implode('-',$autoSubFM);
+                        $autoMeaning .= implode('',$autoSubFM);
+                    }
+                    $autoMeaning .= implode('',$autoFM);
+                    $factorMeaning = [implode('+',$autoFM)=>1];
+                    if(empty($data['meaning']['value']) && !empty($autoMeaning)){
+                        $data['meaning'] = ['value'=>$autoMeaning,'status'=>5];
+                    }
+                }
+
                 if(count($factorMeaning)>0){
                     arsort($factorMeaning);
                     $first = array_keys($factorMeaning)[0];
-                    $data['factorMeaning'] = ['value'=>$first==="_null"?"":$first,'status'=>3];
+                    $data['factorMeaning'] = ['value'=>$first==="_null"?"":$first,'status'=>5];
                 }
-                if($data['factorMeaning']['status']<5){
+                if(isset($data['factorMeaning']) && $data['factorMeaning']['status']<5){
                     $wbwFactorMeaning = [];
                     if(!empty($data['factors']['value'])){
                         foreach (explode("+",$data['factors']['value']) as  $factor) {

+ 4 - 1
app/Models/Sentence.php

@@ -4,13 +4,15 @@ namespace App\Models;
 
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\SoftDeletes;
 
 class Sentence extends Model
 {
     use HasFactory;
+    use SoftDeletes;
 	protected $fillable = ['id','uid','book_id',
                           'paragraph','word_start','word_end',
-                          'channel_uid','editor_uid','content',
+                          'channel_uid','editor_uid','content','content_type',
                           'strlen','status','create_time','modify_time','language'];
     protected $primaryKey = 'uid';
     protected $casts = [
@@ -20,6 +22,7 @@ class Sentence extends Model
     protected $dates = [
         'created_at',
         'updated_at',
+        'deleted_at',
         'fork_at'
     ];
 

+ 2 - 0
routes/api.php

@@ -88,6 +88,7 @@ use App\Http\Controllers\NotificationController;
 use App\Http\Controllers\InteractiveController;
 use App\Http\Controllers\ChapterIndexController;
 use App\Http\Controllers\WbwSentenceController;
+use App\Http\Controllers\SnowFlakeIdController;
 
 /*
 |--------------------------------------------------------------------------
@@ -231,6 +232,7 @@ Route::group(['prefix' => 'v2'],function(){
     Route::apiResource('interactive',InteractiveController::class);
     Route::apiResource('chapter-index',ChapterIndexController::class);
     Route::apiResource('wbw-sentence',WbwSentenceController::class);
+    Route::apiResource('snowflake',SnowFlakeIdController::class);
 
     Route::get('download/{type1}/{type2}/{uuid}/{filename}', function ($type1,$type2,$uuid,$filename) {
         header("Content-Type: {$type1}/{$type1}");