ViewController.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\View;
  4. use App\Models\ProgressChapter;
  5. use App\Models\PaliText;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Support\Str;
  8. use Illuminate\Support\Facades\Log;
  9. use App\Http\Resources\ViewResource;
  10. use App\Http\Api\AuthApi;
  11. use App\Http\Api\StudioApi;
  12. class ViewController extends Controller
  13. {
  14. private function getTargetId($request){
  15. /*
  16. *根据target type 和不同类型的不同参数
  17. */
  18. $target_id = FALSE;
  19. switch ($request->get("target_type")) {
  20. case 'chapter-instance':
  21. # code...
  22. $target_id = $request->get("target_id");
  23. break;
  24. case 'chapter':
  25. # code...
  26. $target_id = ProgressChapter::where("channel_id",$request->get("channel"))
  27. ->where("book",$request->get("book"))
  28. ->where("para",$request->get("para"))
  29. ->value("uid");
  30. break;
  31. case 'article-instance':
  32. # code...
  33. break;
  34. case 'article':
  35. # code...
  36. break;
  37. default:
  38. $target_id = $request->get("target_id");
  39. # code...
  40. break;
  41. }
  42. if(Str::isUuid($target_id)){
  43. return $target_id;
  44. }else{
  45. return false;
  46. }
  47. }
  48. /**
  49. * Display a listing of the resource.
  50. *
  51. * @return \Illuminate\Http\Response
  52. */
  53. public function index(Request $request)
  54. {
  55. //
  56. switch ($request->get("view")) {
  57. case 'count':
  58. #获取 target id
  59. $target_id = $this->getTargetId($request);
  60. if($target_id){
  61. $count = View::where("target_id",$target_id)->count();
  62. }else{
  63. $count = 0;
  64. }
  65. return $this->ok($count);
  66. break;
  67. case 'user-recent':
  68. $user = AuthApi::current($request);
  69. if(!$user){
  70. return $this->error(__('auth.failed'));
  71. }
  72. $user_id = $user["user_uid"];
  73. $views = View::where("user_id",$user_id)->orderBy('created_at','desc');
  74. $views = $views->take($request->get("take",10));
  75. $items = $views->get();
  76. return $this->ok($items);
  77. break;
  78. case 'user':
  79. $user = AuthApi::current($request);
  80. if(!$user){
  81. return $this->error(__('auth.failed'));
  82. }
  83. $user_id = $user["user_uid"];
  84. $table = View::where("user_id",$user_id);
  85. break;
  86. case 'studio':
  87. # 获取studio内所有 数据
  88. $user = AuthApi::current($request);
  89. if(!$user){
  90. return $this->error(__('auth.failed'));
  91. }
  92. //判断当前用户是否有指定的studio的权限
  93. $studioId = StudioApi::getIdByName($request->get('name'));
  94. if($user['user_uid'] !== $studioId){
  95. return $this->error(__('auth.failed'));
  96. }
  97. $table = View::where('user_id',$studioId);
  98. break;
  99. default:
  100. # code...
  101. break;
  102. }
  103. //处理搜索
  104. if($request->has("search")){
  105. $table = $table->where('name', 'like', "%".$request->get("search")."%");
  106. }
  107. //获取记录总条数
  108. $count = $table->count();
  109. //处理排序
  110. $table = $table->orderBy($request->get("order",'updated_at'),$request->get("dir",'desc'));
  111. //处理分页
  112. $table = $table->skip($request->get("offset",0))
  113. ->take($request->get("limit",20));
  114. //获取数据
  115. $result = $table->get();
  116. return $this->ok(["rows"=>ViewResource::collection($result),"count"=>$count]);
  117. }
  118. /**
  119. * Store a newly created resource in storage.
  120. *
  121. * @param \Illuminate\Http\Request $request
  122. * @return \Illuminate\Http\Response
  123. */
  124. public function store(Request $request)
  125. {
  126. /*
  127. $rules = array(
  128. 'target_type' => 'required'
  129. );
  130. $validator = Validator::make($request->all(), $rules);
  131. // process the login
  132. if ($validator->fails()) {
  133. return $this->error($validator);
  134. }
  135. */
  136. //根据target type 获取 target id
  137. $target_id = $this->getTargetId($request);
  138. if(!$target_id){
  139. return $this->error('no id');
  140. }
  141. $clientIp = request()->ip();
  142. $param = [
  143. 'target_id' => $target_id,
  144. 'target_type' => $request->get("target_type"),
  145. ];
  146. $user = AuthApi::current($request);
  147. if($user){
  148. //已经登陆
  149. $user_id = $user['user_uid'];
  150. $param['user_id'] = $user_id;
  151. }
  152. $param['user_ip'] = $clientIp;
  153. $new = View::firstOrNew($param);
  154. $new->user_ip = $clientIp;
  155. switch($request->get("target_type")){
  156. case "chapter":
  157. $new->title = ProgressChapter::where("channel_id",$request->get("channel"))
  158. ->where("book",$request->get("book"))
  159. ->where("para",$request->get("para"))
  160. ->value("title");
  161. $new->org_title = PaliText::where("book",$request->get("book"))
  162. ->where("paragraph",$request->get("para"))
  163. ->value("toc");
  164. //获取标题 成功
  165. $new->meta = \json_encode([
  166. "book"=>$request->get("book"),
  167. "para"=>$request->get("para"),
  168. "channel"=>$request->get("channel"),
  169. "mode"=>$request->get("mode","read"),
  170. ]);
  171. break;
  172. default:
  173. return $this->error('未知的数据类型');
  174. break;
  175. }
  176. $new->count = $new->count+1;
  177. $new->save();
  178. //保存成功
  179. $count = View::where("target_id",$new->target_id)->count();
  180. return $this->ok($count);
  181. }
  182. /**
  183. * Display the specified resource.
  184. *
  185. * @param \App\Models\View $view
  186. * @return \Illuminate\Http\Response
  187. */
  188. public function show(View $view)
  189. {
  190. //
  191. }
  192. /**
  193. * Update the specified resource in storage.
  194. *
  195. * @param \Illuminate\Http\Request $request
  196. * @param \App\Models\View $view
  197. * @return \Illuminate\Http\Response
  198. */
  199. public function update(Request $request, View $view)
  200. {
  201. //
  202. }
  203. /**
  204. * Remove the specified resource from storage.
  205. *
  206. * @param \App\Models\View $view
  207. * @return \Illuminate\Http\Response
  208. */
  209. public function destroy(View $view)
  210. {
  211. //
  212. }
  213. }