NewsController.php 8.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\News;
  5. use App\Models\NewsCategory;
  6. use App\Supports\Response;
  7. use Carbon\Carbon;
  8. use Illuminate\Http\Request;
  9. use Illuminate\Support\Facades\DB;
  10. use Illuminate\Support\Facades\Log;
  11. use App\Http\Helper\Helper;
  12. /**
  13. * @group Lottery Prize
  14. */
  15. class NewsController extends Controller
  16. {
  17. public function __construct(
  18. )
  19. {
  20. }
  21. public function list(Request $request, $locate = 'tw')
  22. {
  23. $categoryId = $request->input("categoryId", "");
  24. $page = $request->input("page", 1);
  25. $per_page = $request->input("per_page", 15);
  26. $locate = $locate == "tw" ? "zh_TW" : $locate;
  27. $result = [];
  28. //年份清單
  29. $yearList = News::select(DB::raw("DATE_FORMAT(post_date, '%Y') as years"))->distinct()->orderBy("years", "desc")->pluck("years");
  30. $result["yearList"] = $yearList;
  31. //文章列表
  32. $news = News::where("visible", 1);
  33. if($categoryId){
  34. $news->where("news_category_id", $categoryId);
  35. }
  36. $news = $news->orderByDesc("order")->orderByDesc("post_date");
  37. $result["pagination"] = [
  38. "page" => $page,
  39. "per_page" => $per_page
  40. ];
  41. if($per_page == -1){
  42. $news = $news->get();
  43. $result["pagination"]["total"] = $news->count();
  44. $result["pagination"]["total_page"] =1;
  45. }else{
  46. $news = $news->paginate($per_page, ['*'], 'page', $page);
  47. $result["pagination"]["total"] = $news->total();
  48. $result["pagination"]["total_page"] =$news->lastPage();
  49. }
  50. foreach($news as $item){
  51. $result["list"][] = [
  52. "id" => $item->id,
  53. "categoryId" => $item->newsCategory->id,
  54. "category" => $item->newsCategory->getTranslation("name", $locate),
  55. "postDate" => Carbon::parse($item->post_date)->format("Y.m.d"),
  56. "title" => $item->getTranslation("title", $locate),
  57. "imgPC" => $item->news_img_pc_url,
  58. "imgMobile" => $item->news_img_mobile_url,
  59. "written" => $item->getTranslation("written_by", $locate),
  60. "description" => $item->getTranslation("description", $locate),
  61. ];
  62. }
  63. return response()->json(["data" => $result], 200);
  64. }
  65. public function getTop(Request $request, $locate = 'tw')
  66. {
  67. $categoryId = $request->input("categoryId", "");
  68. $locate = $locate == "tw" ? "zh_TW" : $locate;
  69. $result = [];
  70. //年份清單
  71. $yearList = News::select(DB::raw("DATE_FORMAT(post_date, '%Y') as years"))->distinct()->orderBy("years", "desc")->pluck("years");
  72. //文章列表
  73. $news = News::where("visible", 1);
  74. if($categoryId){
  75. $news->where("news_category_id", $categoryId);
  76. }
  77. $news = $news->where('on_top', 1)->first();
  78. $result["data"] = [
  79. "meta" => [
  80. "meta_title" => $news->getTranslation("meta_title", $locate),
  81. "meta_keyword" => $news->getTranslation("meta_keyword", $locate),
  82. "meta_description" => $news->getTranslation("meta_description", $locate),
  83. "imgPC" => $news->news_meta_img,
  84. ],
  85. "yearList" =>[
  86. $yearList
  87. ],
  88. "top" => [
  89. "id" => $news->id,
  90. "categoryId" => $news->newsCategory->id,
  91. "category" => $news->newsCategory->getTranslation("name", $locate),
  92. "postDate" => Carbon::parse($news->post_date)->format("Y/m/d"),
  93. "title" => $news->getTranslation("title", $locate),
  94. "imgPC" => $news->news_img_pc_url,
  95. "imgMobile" => $news->news_img_mobile_url,
  96. "written" => $news->getTranslation("written_by", $locate),
  97. "description" => $news->getTranslation("description", $locate),
  98. ]
  99. ];
  100. return response()->json($result, 200);
  101. }
  102. public function detail($locale = 'tw', $id){
  103. $locate = $locale == "tw" ? "zh_TW" : $locale;
  104. $news = News::find($id);
  105. $otherNewsList = [];
  106. //取得前一篇
  107. $previous = News::where(function ($query) use ($news) {
  108. $query->where('order', $news->order)
  109. ->where('post_date', $news->post_date)
  110. ->where('id', '>', $news->id);
  111. })
  112. ->orWhere(function ($query) use ($news) {
  113. $query->where('order', $news->order)
  114. ->where('post_date', '>', $news->post_date);
  115. })
  116. ->orWhere(function ($query) use ($news) {
  117. $query->where('order', '>', $news->order);
  118. })
  119. ->orderBy('order', 'asc')
  120. ->orderBy('post_date', 'asc')
  121. ->orderBy('id', 'asc')
  122. ->first();
  123. //取得下一篇
  124. $next = News::where(function ($query) use ($news) {
  125. $query->where('order', $news->order)
  126. ->where('post_date', $news->post_date)
  127. ->where('id', '<', $news->id);
  128. })
  129. ->orWhere(function ($query) use ($news) {
  130. $query->where('order', $news->order)
  131. ->where('post_date', '<', $news->post_date);
  132. })
  133. ->orWhere(function ($query) use ($news) {
  134. $query->where('order', '<', $news->order);
  135. })
  136. ->orderBy('order', 'desc')
  137. ->orderBy('post_date', 'desc')
  138. ->orderBy('id', 'desc')
  139. ->first();
  140. if($previous)$otherNewsList["previous"] = [
  141. "id" => $previous->id,
  142. "categoryId" => $previous->newsCategory->id,
  143. "category" => $previous->newsCategory->getTranslation("name", $locate),
  144. "postDate" => Carbon::parse($previous->post_date)->format("Y/m/d"),
  145. "title" => $previous->getTranslation("title", $locate),
  146. "imgPC" => $previous->news_img_pc_url,
  147. "imgMobile" => $previous->news_img_mobile_url,
  148. "written" => $previous->getTranslation("written_by", $locate),
  149. "description" => $previous->getTranslation("description", $locate),
  150. ];
  151. if($next)$otherNewsList["next"] = [
  152. "id" => $next->id,
  153. "categoryId" => $next->newsCategory->id,
  154. "category" => $next->newsCategory->getTranslation("name", $locate),
  155. "postDate" => Carbon::parse($previous->post_date)->format("Y/m/d"),
  156. "title" => $next->getTranslation("title", $locate),
  157. "imgPC" => $next->news_img_pc_url,
  158. "imgMobile" => $next->news_img_mobile_url,
  159. "written" => $next->getTranslation("written_by", $locate),
  160. "description" => $next->getTranslation("description", $locate),
  161. ];
  162. $paragraphs = [];
  163. foreach($news->paragraphs as $paragraph){
  164. $paragraphs[] = [
  165. "type" => $paragraph->contentType(),
  166. "imgUrl" => $paragraph->paragraph_img,
  167. "imgOutLink" => $paragraph->image_link,
  168. "alt" => $paragraph->getTranslation("image_alt", $locate),
  169. "content" => nl2br($paragraph->getTranslation("text_content", $locate)),
  170. "videoImg" => $paragraph->paragraph_video_img,
  171. "videoType" => $paragraph->paragraph_video_type,
  172. "link" => $paragraph->paragraph_video_url,
  173. ];
  174. }
  175. $extraPhotos = [];
  176. foreach($news->photos as $photo){
  177. $extraPhotos[] = [
  178. "imgUrl" => $photo->news_photo_img,
  179. "imgOutLink" => $photo->image_link,
  180. ];
  181. }
  182. $result = [
  183. "categoryId" => $news->newsCategory->id,
  184. "category" => $news->newsCategory->getTranslation("name", $locate),
  185. "postDate" => Carbon::parse($news->post_date)->format("Y/m/d"),
  186. "title" => $news->getTranslation("title", $locate),
  187. "description" => $news->getTranslation("description", $locate),
  188. "written" => $news->getTranslation("written_by", $locate),
  189. "imgPC" => $news->news_img_pc_url,
  190. "imgMobile" => $news->news_img_mobile_url,
  191. "metaTitle" => $news->getTranslation("meta_title", $locate),
  192. "metaKeyword" => $news->getTranslation("meta_keyword", $locate),
  193. "metaDesc" => $news->getTranslation("meta_description", $locate),
  194. "metaImg" => $news->meta_img,
  195. "paragraphs" => $paragraphs,
  196. "photos" => $extraPhotos,
  197. "otherNews" => $otherNewsList
  198. ];
  199. return response()->json(["data" => $result], 200);
  200. }
  201. }