RankController.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <?php
  2. namespace App\Http\Controllers\Movie;
  3. use Illuminate\Http\Request;
  4. use Illuminate\Support\Facades\Http;
  5. use Illuminate\Support\Facades\Validator;
  6. use App\Http\Controllers\Controller;
  7. use App\Http\Traits\CommonTrait;
  8. use App\Models\DTO\Movie\BoxOfficeParams;
  9. use App\Models\DTO\Movie\InfoParams;
  10. use App\Models\Movie\MovieReview;
  11. use DateTime;
  12. use Exception;
  13. class RankController extends Controller
  14. {
  15. use CommonTrait;
  16. private string $host;
  17. private MovieReview $movieReviewModel;
  18. public function __construct(MovieReview $movieReviewModel) {
  19. $this->middleware('front');
  20. if(env('APP_ENV') == "local") {
  21. $this->host = ('host.mysql.moview:1050');
  22. }else{
  23. $this->host = ('172.17.0.1:1050');
  24. }
  25. $this->movieReviewModel = $movieReviewModel;
  26. }
  27. /**
  28. * 영화 인기순위
  29. * @method GET
  30. * @see /movie/rank
  31. */
  32. public function index(Request $request, BoxOfficeParams $params)
  33. {
  34. $rules = [
  35. 'date' => 'nullable|date_format:Y-m-d',
  36. 'nation' => 'nullable|in:k,f'
  37. ];
  38. $attributes = [
  39. 'date' => '기간',
  40. 'nation' => '구분'
  41. ];
  42. $message = [
  43. 'date.date_format' => '날짜 형식이 옳지 않습니다.',
  44. 'nation.in' => '구분 형식이 옳지 않습니다.',
  45. ];
  46. // 검색 유효성 검사
  47. Validator::make($request->all(), $rules, $message, $attributes)->validated();
  48. $date = $request->get('date', now()->format('Y-m-d'));
  49. $nation = $request->get('nation', []);
  50. $dateTime = new DateTime($date);
  51. if ($dateTime->format('N') < 6) { // 평일
  52. $url = ($this->host . MOVIE_DAILY_LIST);
  53. if(now()->diffInDays($date) == 0) {
  54. $dateTime->modify('-1 day');
  55. }
  56. } else { // 주말
  57. $url = ($this->host . MOVIE_WEEK_LIST);
  58. $dateTime->modify('-7 day');
  59. }
  60. // 검색 기간
  61. $params->targetDt = $dateTime->format('Ymd');
  62. // 국가 구분 값 계산
  63. if($nation) {
  64. $nl = 0;
  65. foreach($nation as $n) {
  66. $n = strtolower($n);
  67. if($n == 'k') {
  68. $params->repNationCd = 'K';
  69. $nl++;
  70. }
  71. if($n == 'f') {
  72. $params->repNationCd = 'F';
  73. $nl++;
  74. }
  75. }
  76. if($nl == 2) {
  77. $params->repNationCd = '';
  78. }
  79. }
  80. // 검색 조건
  81. $response = Http::get($url, $params->toArray());
  82. $data = null;
  83. if($response->ok()) {
  84. $data = json_decode($response->body());
  85. if($data->total > 0) {
  86. $queryString = $request->getQueryString();
  87. foreach($data->list as $row) {
  88. $row->OpenDt = date('Y.m.d', strtotime($row->OpenDt));
  89. if(isset($row->DailyID)) {
  90. $id = base64_encode($row->DailyID . '|daily');
  91. }else{
  92. $id = base64_encode($row->WeeklyID . '|weekly');
  93. }
  94. $row->viewURL = route('movie.rank.show', $id);
  95. if($queryString) {
  96. $row->viewURL .= ('?' . $queryString);
  97. }
  98. }
  99. }
  100. }
  101. return view('movie.rank.index', [
  102. 'data' => $data,
  103. 'date' => $date,
  104. 'nation' => $nation
  105. ]);
  106. }
  107. /**
  108. * 영화 인기순위 보기
  109. * @method GET
  110. * @see /movie/rank/{daily_id|weekly_id}
  111. */
  112. public function show(string $base64, Request $request, InfoParams $params)
  113. {
  114. try {
  115. if(!$base64) {
  116. throw new Exception('잘못된 접근입니다. [1]');
  117. }
  118. [$id, $type] = explode('|', base64_decode($base64));
  119. if(!$id || !$type) {
  120. throw new Exception('잘못된 접근입니다. [2]');
  121. }
  122. $listURL = route('movie.rank.index');
  123. if($queryString = $request->getQueryString()) {
  124. $listURL .= ('?' . $queryString);
  125. }
  126. // 검색 조건
  127. if($type == 'daily') {
  128. $url = ($this->host . MOVIE_DAILY_INFO);
  129. }else{
  130. $url = ($this->host . MOVIE_WEEKLY_INFO);
  131. }
  132. $params->{$type. 'ID'} = $id;
  133. $response = Http::get($url, $params->toArray());
  134. if(!$response->ok()) {
  135. throw new Exception('요청한 정보가 없습니다.');
  136. }
  137. $data = json_decode($response->body());
  138. $stats = $data->stats;
  139. $info = $data->info;
  140. $detail = $data->detail;
  141. $movieCd = base64_encode($info->MovieCd);
  142. $movieNm = $info->MovieNm;
  143. if($info->MovieNmEn) {
  144. $movieNm .= (' (' . $info->MovieNmEn . ')');
  145. }
  146. $avgRate = $this->movieReviewModel->getAvgRate($info->MovieCd);
  147. return view('movie.rank.show', [
  148. 'movieCd' => $movieCd,
  149. 'movieNm' => $movieNm,
  150. 'stats' => $stats,
  151. 'info' => $info,
  152. 'detail' => $detail,
  153. 'listURL' => $listURL,
  154. 'avgRate' => $avgRate
  155. ]);
  156. }catch(Exception $e) {
  157. abort($e->getCode(), $e->getMessage());
  158. }
  159. }
  160. }