Browse Source

Merge pull request #2083 from visuddhinanda/laravel

支持 sign_up_message
visuddhinanda 1 year ago
parent
commit
f7a7372e0f

+ 20 - 0
app/Http/Api/CourseApi.php

@@ -0,0 +1,20 @@
+<?php
+namespace App\Http\Api;
+
+use App\Models\CourseMember;
+use Illuminate\Support\Facades\Log;
+
+class CourseApi{
+    public static function getStudentChannels($courseId){
+        $channels = [];
+        $studentsChannel = CourseMember::where('course_id',$courseId)
+                ->whereNotNull('channel_id')
+                ->select('channel_id')
+                ->orderBy('created_at')
+                ->get();
+        foreach ($studentsChannel as $key => $channel) {
+            $channels[] = $channel->channel_id;
+        }
+        return $channels;
+    }
+}

+ 1 - 0
app/Http/Controllers/CourseController.php

@@ -256,6 +256,7 @@ class CourseController extends Controller
         $course->number = $request->get('number',0);
         $course->number = $request->get('number',0);
         if($request->has('cover')) {$course->cover = $request->get('cover');}
         if($request->has('cover')) {$course->cover = $request->get('cover');}
         $course->content = $request->get('content');
         $course->content = $request->get('content');
+        $course->sign_up_message = $request->get('sign_up_message');
         if($request->has('teacher_id')) {$course->teacher = $request->get('teacher_id');}
         if($request->has('teacher_id')) {$course->teacher = $request->get('teacher_id');}
         if($request->has('anthology_id')) {$course->anthology_id = $request->get('anthology_id');}
         if($request->has('anthology_id')) {$course->anthology_id = $request->get('anthology_id');}
         $course->channel_id = $request->get('channel_id');
         $course->channel_id = $request->get('channel_id');

+ 34 - 10
app/Http/Controllers/DiscussionController.php

@@ -4,19 +4,22 @@ namespace App\Http\Controllers;
 
 
 use Illuminate\Support\Facades\Log;
 use Illuminate\Support\Facades\Log;
 use Illuminate\Http\Request;
 use Illuminate\Http\Request;
+
 use App\Models\Discussion;
 use App\Models\Discussion;
 use App\Models\Wbw;
 use App\Models\Wbw;
 use App\Models\WbwBlock;
 use App\Models\WbwBlock;
 use App\Models\PaliSentence;
 use App\Models\PaliSentence;
 use App\Models\Sentence;
 use App\Models\Sentence;
 use App\Models\Channel;
 use App\Models\Channel;
+use App\Http\Controllers\ArticleController;
+use App\Http\Controllers\WbwSentenceController;
 use App\Http\Resources\DiscussionResource;
 use App\Http\Resources\DiscussionResource;
 use App\Http\Api\MdRender;
 use App\Http\Api\MdRender;
 use App\Http\Api\AuthApi;
 use App\Http\Api\AuthApi;
 use App\Http\Api\Mq;
 use App\Http\Api\Mq;
-use App\Http\Controllers\ArticleController;
 use App\Http\Api\UserApi;
 use App\Http\Api\UserApi;
 use App\Http\Api\ChannelApi;
 use App\Http\Api\ChannelApi;
+use App\Http\Api\CourseApi;
 
 
 class DiscussionController extends Controller
 class DiscussionController extends Controller
 {
 {
@@ -65,10 +68,10 @@ class DiscussionController extends Controller
                         'can_reply' => false,
                         'can_reply' => false,
                         ]);
                         ]);
                 }
                 }
-
+                $resType = Discussion::where('res_id',$request->get('id'))
+                                        ->value('res_type');
                 if($user){
                 if($user){
-                    $res_type = Discussion::where('res_id',$request->get('id'))->value('res_type');
-                    switch ($res_type) {
+                    switch ($resType) {
                         case 'sentence':
                         case 'sentence':
                             # code...
                             # code...
                             break;
                             break;
@@ -87,7 +90,30 @@ class DiscussionController extends Controller
                     }
                     }
                 }
                 }
 
 
-                $table = Discussion::where('res_id',$request->get('id'))
+
+                $resId = [$request->get('id')];
+                if(!empty($request->get('course'))){
+                    //获取学员提问
+                    //获取学员channel
+                    $channelsId = CourseApi::getStudentChannels($request->get('course'));
+                    switch ($resType) {
+                        case 'wbw':
+                            //获取答案单词编号
+                            $wbwWord = Wbw::where('uid',$request->get('id'))
+                                        ->first();
+                            $wbwId = WbwSentenceController::getWbwIdByChannels(
+                                            $channelsId,
+                                            $wbwWord->book_id,
+                                            $wbwWord->paragraph,
+                                            $wbwWord->wid);
+                            $resId = array_merge($resId,$wbwId);
+                            break;
+                        case 'sentence':
+                            break;
+                    }
+
+                }
+                $table = Discussion::whereIn('res_id',$resId)
                                     ->where('type', $request->get('type','discussion'))
                                     ->where('type', $request->get('type','discussion'))
                                     ->where('status',$request->get('status','active'))
                                     ->where('status',$request->get('status','active'))
                                     ->where('parent',null);
                                     ->where('parent',null);
@@ -102,11 +128,11 @@ class DiscussionController extends Controller
                             }
                             }
                     }
                     }
                 }
                 }
-                $activeNumber = Discussion::where('res_id',$request->get('id'))
+                $activeNumber = Discussion::whereIn('res_id',$resId)
                                             ->where('parent',null)
                                             ->where('parent',null)
                                             ->where('type', $request->get('type','discussion'))
                                             ->where('type', $request->get('type','discussion'))
                                             ->where('status','active')->count();
                                             ->where('status','active')->count();
-                $closeNumber = Discussion::where('res_id',$request->get('id'))
+                $closeNumber = Discussion::whereIn('res_id',$resId)
                                             ->where('parent',null)
                                             ->where('parent',null)
                                             ->where('type', $request->get('type','discussion'))
                                             ->where('type', $request->get('type','discussion'))
                                             ->where('status','close')->count();
                                             ->where('status','close')->count();
@@ -415,9 +441,7 @@ class DiscussionController extends Controller
             if(isset($channelId)){
             if(isset($channelId)){
                 $channel = Channel::find($channelId);
                 $channel = Channel::find($channelId);
                 if($channel){
                 if($channel){
-                    if($channel->owner_uid===$user['user_uid']){
-                        $isResManager = true;
-                    }
+                    $isResManager = ChannelApi::userCanEdit($user['user_uid'],$channelId);
                 }
                 }
             }
             }
         }
         }

+ 155 - 0
app/Http/Controllers/TagsInChapterCountController.php

@@ -0,0 +1,155 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Support\Str;
+use Illuminate\Support\Facades\DB;
+use App\Models\Tag;
+use App\Models\TagMap;
+use App\Models\ProgressChapter;
+use Illuminate\Http\Request;
+
+class TagsInChapterCountController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     *
+     * @return \Illuminate\Http\Response
+     */
+    public function index()
+    {
+        switch ($request->get('view')) {
+            case "chapter":
+                $progress = $request->get('progress',0.8);
+                $lang = $request->get('lang');
+                $channelType = $request->get('type','translation');
+
+                $tm = (new TagMap)->getTable();
+                $pc =(new ProgressChapter)->getTable();
+                $tg = (new Tag)->getTable();
+
+                //标签过滤
+                if($request->get('tags') && $request->get('tags')!==''){
+                    $tags = explode(',',$request->get('tags'));
+                    foreach ($tags as $tag) {
+                        # code...
+                        if(!empty($tag)){
+                            $tagNames[] = $tag;
+                        }
+                    }
+                }
+                if(isset($tagNames)){
+                    $where1 = " where co = ".count($tagNames);
+                    $a = implode(",",array_fill(0, count($tagNames), '?')) ;
+                    $in1 = "and t.name in ({$a})";
+                    $param = $tagNames;
+                }else{
+                    $where1 = " ";
+                    $in1 = " ";
+                }
+                if(Str::isUuid($request->get('channel'))){
+                    $channel = "and channel_id = '".$request->get('channel')."' ";
+                }else{
+                    $channel = "";
+                }
+                //完成度过滤
+                $param[] = $progress;
+
+                //语言过滤
+                if(!empty($request->get('lang'))){
+                    $whereLang = " and pc.lang = ? ";
+                    $param[] = $request->get('lang');
+                }else{
+                    $whereLang = "   ";
+                }
+                //channel type过滤
+				if($request->has('channel_type') && !empty($request->get('channel_type'))){
+					$channel_type = "and ch.type = ? ";
+					$param[] = $request->get('channel_type');
+				}else{
+					$channel_type = "";
+				}
+
+                $param_count = $param;
+
+                $query = "
+                select TID.tag_id as id,name, TID.count from(
+                    select tm2.tag_id, count(*)      from(
+						select pcd.uid as pc_uid
+							from (
+								select uid, book,para,lang,progress,channel_id,title,summary ,created_at ,updated_at
+									from (
+										select anchor_id as cid
+											from (
+												select tm.anchor_id , count(*) as co
+													from $tm as  tm
+													left join $tg as t on tm.tag_id = t.id
+													where tm.table_name  = 'progress_chapters'
+													$in1
+													group by tm.anchor_id
+											) T
+											$where1
+									) CID
+								left join $pc as pc on CID.cid = pc.uid
+								where pc.progress > ?
+								$channel  $whereLang
+							) pcd
+						left join channels as ch on pcd.channel_id = ch.uid
+						where ch.status >= 30 $channel_type
+                    ) CUID
+                    left join tag_maps tm2 on CUID.pc_uid = tm2.anchor_id
+				group by tm2.tag_id
+				) TID
+				left join tags t2 on t2.id = TID.tag_id
+				order by count desc";
+                $result = DB::select($query,$param);
+                return $this->ok(['rows'=>$result,'count'=>count($result)]);
+                break;
+        }
+    }
+
+    /**
+     * 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  \App\Models\Tag  $tag
+     * @return \Illuminate\Http\Response
+     */
+    public function show(Tag $tag)
+    {
+        //
+    }
+
+    /**
+     * Update the specified resource in storage.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \App\Models\Tag  $tag
+     * @return \Illuminate\Http\Response
+     */
+    public function update(Request $request, Tag $tag)
+    {
+        //
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     *
+     * @param  \App\Models\Tag  $tag
+     * @return \Illuminate\Http\Response
+     */
+    public function destroy(Tag $tag)
+    {
+        //
+    }
+}

+ 44 - 22
app/Http/Controllers/WbwSentenceController.php

@@ -12,6 +12,7 @@ use Illuminate\Http\Request;
 use App\Http\Api\AuthApi;
 use App\Http\Api\AuthApi;
 use App\Http\Api\ShareApi;
 use App\Http\Api\ShareApi;
 use App\Http\Api\ChannelApi;
 use App\Http\Api\ChannelApi;
+use App\Http\Api\CourseApi;
 
 
 class WbwSentenceController extends Controller
 class WbwSentenceController extends Controller
 {
 {
@@ -37,14 +38,7 @@ class WbwSentenceController extends Controller
                           $request->get('wordEnd');
                           $request->get('wordEnd');
                 $channels = [];
                 $channels = [];
                 if($request->has('course')){
                 if($request->has('course')){
-                    $studentsChannel = CourseMember::where('course_id',$request->get('course'))
-                                                    ->whereNotNull('channel_id')
-                                                    ->select('channel_id')
-                                                    ->orderBy('created_at')
-                                                    ->get();
-                    foreach ($studentsChannel as $key => $channel) {
-                        $channels[] = $channel->channel_id;
-                    }
+                    $channels = CourseApi::getStudentChannels($request->get('course'));
                     $channels[] = Course::where('id',$request->get('course'))
                     $channels[] = Course::where('id',$request->get('course'))
                                     ->value('channel_id');
                                     ->value('channel_id');
                 }else{
                 }else{
@@ -70,21 +64,15 @@ class WbwSentenceController extends Controller
                 }else{
                 }else{
                     $channelsId = $channels;
                     $channelsId = $channels;
                 }
                 }
-                $wbwBlocksId = WbwBlock::where('book_id',$request->get('book'))
-                                    ->where('paragraph',$request->get('para'))
-                                    ->whereIn('channel_uid',$channelsId)
-                                    ->select('uid')
-                                    ->get();
-                $validBlocks = Wbw::whereIn('block_uid',$wbwBlocksId)
-                            ->where('book_id',$request->get('book'))
-                            ->where('paragraph',$request->get('para'))
-                            ->where('wid',$request->get('wordStart'))
-                            ->select('block_uid')
-                            ->groupBy('block_uid')
-                            ->get();
 
 
-                foreach ($validBlocks as $key => $block) {
-                    $channel = WbwBlock::where('uid',$block->block_uid)->first();
+                $validBlocks = WbwSentenceController::getBlocksByChannels($channelsId,
+                                    $request->get('book'),
+                                    $request->get('para'),
+                                    $request->get('wordStart')
+                                );
+
+                foreach ($validBlocks as $key => $blockId) {
+                    $channel = WbwBlock::where('uid',$blockId)->first();
                     $corpus = new CorpusController;
                     $corpus = new CorpusController;
                     $props = $corpus->getSentTpl($sentId,[$channel->channel_uid],
                     $props = $corpus->getSentTpl($sentId,[$channel->channel_uid],
                                                'edit',true,
                                                'edit',true,
@@ -96,6 +84,40 @@ class WbwSentenceController extends Controller
         }
         }
     }
     }
 
 
+    public static function getBlocksByChannels($channelsId,$book,$para,$wordId){
+        $wbwBlocksId = WbwBlock::where('book_id',$book)
+                            ->where('paragraph',$para)
+                            ->whereIn('channel_uid',$channelsId)
+                            ->select('uid')
+                            ->get();
+        $validBlocks = Wbw::whereIn('block_uid',$wbwBlocksId)
+                        ->where('book_id',$book)
+                        ->where('paragraph',$para)
+                        ->where('wid',$wordId)
+                        ->select('block_uid')
+                        ->groupBy('block_uid')
+                        ->get();
+        $blocksId = [];
+        foreach ($validBlocks as $key => $block) {
+            $blocksId[] = $block->block_uid;
+        }
+        return $blocksId;
+    }
+
+    public static function getWbwIdByChannels($channelsId,$book,$para,$wordId){
+        $validBlocks = WbwSentenceController::getBlocksByChannels($channelsId,$book,$para,$wordId);
+        $wbwId = Wbw::whereIn('block_uid',$validBlocks)
+                        ->where('book_id',$book)
+                        ->where('paragraph',$para)
+                        ->where('wid',$wordId)
+                        ->select('uid')
+                        ->get();
+        $id = [];
+        foreach ($wbwId as $key => $value) {
+            $id[] = $value->uid;
+        }
+        return $id;
+    }
     /**
     /**
      * Store a newly created resource in storage.
      * Store a newly created resource in storage.
      *
      *

+ 2 - 0
app/Http/Resources/CourseResource.php

@@ -29,6 +29,7 @@ class CourseResource extends JsonResource
             "title"=> $this->title,
             "title"=> $this->title,
             "subtitle"=> $this->subtitle,
             "subtitle"=> $this->subtitle,
             "summary"=> $this->summary,
             "summary"=> $this->summary,
+            "sign_up_message"=> $this->sign_up_message,
             "teacher"=> UserApi::getByUuid($this->teacher),
             "teacher"=> UserApi::getByUuid($this->teacher),
             "course_count"=>10,
             "course_count"=>10,
             "publicity"=> $this->publicity,
             "publicity"=> $this->publicity,
@@ -43,6 +44,7 @@ class CourseResource extends JsonResource
             "join"=> $this->join,
             "join"=> $this->join,
             "number"=> $this->number,
             "number"=> $this->number,
             "request_exp"=> $this->request_exp,
             "request_exp"=> $this->request_exp,
+            "studio" => StudioApi::getById($this->studio_id),
             "created_at"=> $this->created_at,
             "created_at"=> $this->created_at,
             "updated_at"=> $this->updated_at,
             "updated_at"=> $this->updated_at,
         ];
         ];

+ 36 - 0
database/migrations/2024_05_14_123657_add_owner_in_tag_maps.php

@@ -0,0 +1,36 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddOwnerInTagMaps extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('tag_maps', function (Blueprint $table) {
+            //
+            $table->uuid('owner_uid')->index()->default(config("mint.admin.root_uuid"));
+            $table->uuid('editor_uid')->index()->default(config("mint.admin.root_uuid"));
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('tag_maps', function (Blueprint $table) {
+            //
+            $table->dropColumn('owner_uid');
+            $table->dropColumn('editor_uid');
+        });
+    }
+}

+ 34 - 0
database/migrations/2024_05_14_224013_add_signinmessage_in_courses.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddSigninmessageInCourses extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('courses', function (Blueprint $table) {
+            //
+            $table->text('sign_up_message')->nullable();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('courses', function (Blueprint $table) {
+            //
+            $table->dropColumn('sign_up_message');
+        });
+    }
+}

+ 2 - 0
routes/api.php

@@ -92,6 +92,7 @@ use App\Http\Controllers\SnowFlakeIdController;
 use App\Http\Controllers\ForgotPasswordController;
 use App\Http\Controllers\ForgotPasswordController;
 use App\Http\Controllers\ResetPasswordController;
 use App\Http\Controllers\ResetPasswordController;
 use App\Http\Controllers\DiscussionCountController;
 use App\Http\Controllers\DiscussionCountController;
+use App\Http\Controllers\TagsInChapterCountController;
 
 
 /*
 /*
 |--------------------------------------------------------------------------
 |--------------------------------------------------------------------------
@@ -239,6 +240,7 @@ Route::group(['prefix' => 'v2'],function(){
     Route::apiResource('wbw-sentence',WbwSentenceController::class);
     Route::apiResource('wbw-sentence',WbwSentenceController::class);
     Route::apiResource('snowflake',SnowFlakeIdController::class);
     Route::apiResource('snowflake',SnowFlakeIdController::class);
     Route::apiResource('discussion-count',DiscussionCountController::class);
     Route::apiResource('discussion-count',DiscussionCountController::class);
+    Route::apiResource('tags-in-chapter',TagsInChapterCountController::class);
 
 
     Route::get('download/{type1}/{type2}/{uuid}/{filename}', function ($type1,$type2,$uuid,$filename) {
     Route::get('download/{type1}/{type2}/{uuid}/{filename}', function ($type1,$type2,$uuid,$filename) {
         header("Content-Type: {$type1}/{$type1}");
         header("Content-Type: {$type1}/{$type1}");