| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457 |
- <?php
- namespace App\Http\Controllers\Movie;
- use Illuminate\Http\Request;
- use Illuminate\Support\Str;
- use App\Http\Controllers\Controller;
- use App\Http\Traits\CommonTrait;
- use App\Models\Movie\Movie;
- use App\Models\Movie\MovieInfo;
- use App\Models\Movie\MovieDetail;
- use App\Models\Movie\MovieReview;
- use App\Models\Movie\MovieLike;
- use App\Models\Movie\MovieBlame;
- use App\Models\DTO\ResponseData;
- use App\Models\DTO\SearchData;
- use App\Rules\FilterSpamKeyword;
- use Exception;
- class ReviewController extends Controller
- {
- use CommonTrait;
- private Movie $movieModel;
- private MovieInfo $movieInfoModel;
- private MovieDetail $movieDetailModel;
- private MovieReview $movieReviewModel;
- private MovieLike $movieLikeModel;
- public function __construct(
- Movie $movieModel,
- MovieInfo $movieInfoModel,
- MovieDetail $movieDetailModel,
- MovieReview $movieReviewModel,
- MovieLike $movieLikeModel
- ) {
- $this->middleware('front');
- $this->movieModel = $movieModel;
- $this->movieInfoModel = $movieInfoModel;
- $this->movieDetailModel = $movieDetailModel;
- $this->movieReviewModel = $movieReviewModel;
- $this->movieLikeModel = $movieLikeModel;
- }
- /**
- * 영화 평점·후기 목록
- * @method GET
- * @see /movie/review
- */
- public function index(Request $request)
- {
- $params = SearchData::fromRequest($request);
- $params->userID = UID;
- $params->sort = $request->get('sort', 1);
- $reviews = $this->movieReviewModel->list($params);
- if($reviews->rows > 0) {
- foreach($reviews->list as &$row) {
- $length = strlen($row->sid);
- $row->owner = ($row->name . '(' . Str::mask($row->sid, '*', intval($length / 2), $length) . ')');
- $row->createdAt = date('Y.m.d', strtotime($row->created_at));
- $row->isLike = $this->movieLikeModel->isLike($row->id, UID);
- $row->isDisLike = $this->movieLikeModel->isDisLike($row->id, UID);
- $row->viewURL = route('movie.search.show', base64_encode($row->movie_cd));
- }
- }
- return view(layout('movie.review.index'), [
- 'params' => $params,
- 'reviews' => $reviews
- ]);
- }
- /**
- * 영화 평점·후기 보기
- * @method GET
- * @see /movie/review/{movieCd}
- */
- public function show(Request $request)
- {
- $movieCd = base64_decode($request->route('review'));
- $params = SearchData::fromRequest($request);
- $params->movieCd = $movieCd;
- $params->userID = UID;
- $params->sort = $request->get('sort', 1);
- // 이미 등록 했는지 확인
- if(!$this->movieModel->isExists($movieCd)) {
- return alert('잘못된 접근입니다.', DIRECTORY_SEPARATOR);
- }
- $info = $this->movieInfoModel->info($movieCd);
- $detail = $this->movieDetailModel->info($movieCd);
- $avgRate = $this->movieReviewModel->getAvgRate($movieCd);
- $reviews = $this->movieReviewModel->list($params);
- if($reviews->rows > 0) {
- foreach($reviews->list as &$row) {
- $length = strlen($row->sid);
- $row->owner = ($row->name . '(' . Str::mask($row->sid, '*', intval($length / 2), $length) . ')');
- $row->createdAt = date('Y.m.d', strtotime($row->created_at));
- $row->isLike = $this->movieLikeModel->isLike($row->id, UID);
- $row->isDisLike = $this->movieLikeModel->isDisLike($row->id, UID);
- }
- }
- $movieCd = base64_encode($movieCd);
- $movieNm = $info->movie_nm;
- if($info->movie_nm_en) {
- $movieNm .= (' (' . $info->movie_nm_en . ')');
- }
- return view(layout('movie.review.show'), [
- 'movieCd' => $movieCd,
- 'movieNm' => $movieNm,
- 'params' => $params,
- 'info' => $info,
- 'detail' => $detail,
- 'reviews' => $reviews,
- 'avgRate' => $avgRate
- ]);
- }
- /**
- * 영화 평점·후기 등록
- * @method POST
- * @see /movie/review
- */
- public function store(Request $request, ResponseData $response): ResponseData
- {
- try {
- $request->merge([
- 'mid' => base64_decode($request->post('mid'))
- ]);
- $rules = [
- 'mid' => 'required|exists:tb_movie,movie_cd',
- 'mode' => 'required|in:write',
- 'rate' => 'required|numeric|min:1|max:10',
- 'content' => ['required', 'string', 'min:1', 'max:1000', new FilterSpamKeyword]
- ];
- $attributes = [
- 'mid' => '영화 PK',
- 'mode' => '처리 구분',
- 'rate' => '평점',
- 'content' => '감상평'
- ];
- $messages = [
- 'mid.required' => '영화 PK는 필수 값 입니다.',
- 'mid.exists' => '영화 PK가 존재하지 않습니다.',
- 'mode.required' => '처리 구분을 입력해주세요.',
- 'mode.in' => '처리 구분 형식이 옳지 않습니다.',
- 'rate.required' => '평점을 선택해주세요.',
- 'rate.numeric' => '평점은 형식이 옳지 않습니다.',
- 'rate.min' => '평점은 최소 1 이상 입니다.',
- 'rate.max' => '평점은 최대 10 이하 입니다.',
- 'content.required' => '감상평을 입력해주세요.',
- 'content.string' => '감상평 형식이 옳지 않습니다.',
- 'content.min' => '감상평을 입력해주세요.',
- 'content.max' => '감상평은 최대 1000자 입력 가능합니다.'
- ];
- $posts = $this->validate($request, $rules, $messages, $attributes);
- // 이미 등록 했는지 확인
- if($this->movieReviewModel->isAlready($posts['mid'], UID)) {
- throw new Exception('이미 감상 후기를 등록하셨습니다.');
- }
- $this->movieReviewModel->insert([
- 'movie_cd' => $posts['mid'],
- 'user_id' => UID,
- 'content' => trim($posts['content']),
- 'rate' => $posts['rate'],
- 'like' => 0,
- 'dislike' => 0,
- 'blame' => 0,
- 'ip_address' => IP_ADDRESS,
- 'user_agent' => USER_AGENT,
- 'updated_at' => null,
- 'created_at' => now()
- ]);
- }catch(Exception $e) {
- $response = $response::fromException($e);
- }
- return $response;
- }
- /**
- * 영화 평점·후기 수정
- * @method PUT
- * @see /movie/review/{review_id}
- */
- public function update(Request $request, ResponseData $response): ResponseData
- {
- try {
- $request->merge([
- 'mid' => base64_decode($request->post('mid'))
- ]);
- $rules = [
- 'mid' => 'required|exists:tb_movie,movie_cd',
- 'rid' => 'required|exists:tb_movie_review,id',
- 'mode' => 'required|in:modify',
- 'rate' => 'required|numeric|min:1|max:10',
- 'content' => ['required', 'string', 'min:1', 'max:1000', new FilterSpamKeyword]
- ];
- $attributes = [
- 'rid' => '후기 PK',
- 'mid' => '영화 PK',
- 'mode' => '처리 구분',
- 'rate' => '평점',
- 'content' => '감상평'
- ];
- $messages = [
- 'mid.required' => '영화 PK는 필수 값 입니다.',
- 'mid.exists' => '영화 PK가 존재하지 않습니다.',
- 'rid.required' => '후기 PK는 필수 값 입니다.',
- 'rid.exists' => '후기 PK가 존재하지 않습니다.',
- 'mode.required' => '처리 구분을 입력해주세요.',
- 'mode.in' => '처리 구분 형식이 옳지 않습니다.',
- 'rate.required' => '평점을 선택해주세요.',
- 'rate.numeric' => '평점은 형식이 옳지 않습니다.',
- 'rate.min' => '평점은 최소 1 이상 입니다.',
- 'rate.max' => '평점은 최대 10 이하 입니다.',
- 'content.required' => '감상평을 입력해주세요.',
- 'content.string' => '감상평 형식이 옳지 않습니다.',
- 'content.min' => '감상평을 입력해주세요.',
- 'content.max' => '감상평은 최대 1000자 입력 가능합니다.'
- ];
- $posts = $this->validate($request, $rules, $messages, $attributes);
- // 내가 등록한 후기 인지 확인
- if(!$this->movieReviewModel->isExists($posts['rid'], UID)) {
- throw new Exception('내가 등록한 감상 후기가 아닙니다.');
- }
- $this->movieReviewModel->find($posts['rid'])->update([
- 'content' => trim($posts['content']),
- 'rate' => $posts['rate'],
- 'updated_at' => now()
- ]);
- }catch(Exception $e) {
- $response = $response::fromException($e);
- }
- return $response;
- }
- /**
- * 영화 평점·후기 삭제
- * @method DELETE
- * @see /movie/review/{review_id}
- */
- public function destroy(Request $request, ResponseData $response): ResponseData
- {
- try {
- $request->merge([
- 'mid' => base64_decode($request->post('mid'))
- ]);
- $rules = [
- 'mid' => 'required|exists:tb_movie,movie_cd',
- 'rid' => 'required|exists:tb_movie_review,id',
- 'mode' => 'required|in:delete'
- ];
- $attributes = [
- 'rid' => '후기 PK',
- 'mid' => '영화 PK',
- 'mode' => '처리 구분'
- ];
- $messages = [
- 'mid.required' => '영화 PK는 필수 값 입니다.',
- 'mid.exists' => '영화 PK가 존재하지 않습니다.',
- 'rid.required' => '후기 PK는 필수 값 입니다.',
- 'rid.exists' => '후기 PK가 존재하지 않습니다.',
- 'mode.required' => '처리 구분을 입력해주세요.',
- 'mode.in' => '처리 구분 형식이 옳지 않습니다.'
- ];
- $posts = $this->validate($request, $rules, $messages, $attributes);
- // 내가 등록한 후기 인지 확인
- if(!$this->movieReviewModel->isExists($posts['rid'], UID)) {
- throw new Exception('내가 등록한 감상 후기가 아닙니다.');
- }
- $this->movieReviewModel->find($posts['rid'])->delete();
- }catch(Exception $e) {
- $response = $response::fromException($e);
- }
- return $response;
- }
- /**
- * 평점·후기 공감하기
- * @method POST
- * @see /movie/review/like
- */
- public function like(Request $request, ResponseData $response): ResponseData
- {
- try {
- $request->merge([
- 'mid' => base64_decode($request->post('mid'))
- ]);
- $rules = [
- 'mid' => 'required|exists:tb_movie,movie_cd',
- 'rid' => 'required|exists:tb_movie_review,id'
- ];
- $attributes = [
- 'mid' => '영화 PK',
- 'rid' => '후기 PK'
- ];
- $messages = [
- 'mid.required' => '영화 PK는 필수 값 입니다.',
- 'mid.exists' => '영화 PK가 존재하지 않습니다.',
- 'rid.required' => '후기 PK는 필수 값 입니다.',
- 'rid.exists' => '후기 PK가 존재하지 않습니다.',
- ];
- $posts = $this->validate($request, $rules, $messages, $attributes);
- $like = $this->movieLikeModel->getType($posts['rid'], UID);
- if($like->exists) {
- throw new Exception(sprintf("이미 %s 하셨습니다.", ($like->type == 1 ? '공감' : '비공감')));
- }
- $response->like = $this->movieReviewModel->setLike($posts['mid'], $posts['rid'], UID, LIKE);
- }catch(Exception $e) {
- $response = $response::fromException($e);
- }
- return $response;
- }
- /**
- * 평점·후기 비공감하기
- * @method POST
- * @see /movie/review/dislike
- */
- public function dislike(Request $request, ResponseData $response): ResponseData
- {
- try {
- $request->merge([
- 'mid' => base64_decode($request->post('mid'))
- ]);
- $rules = [
- 'mid' => 'required|exists:tb_movie,movie_cd',
- 'rid' => 'required|exists:tb_movie_review,id'
- ];
- $attributes = [
- 'mid' => '영화 PK',
- 'rid' => '후기 PK',
- ];
- $messages = [
- 'mid.required' => '영화 PK는 필수 값 입니다.',
- 'mid.exists' => '영화 PK가 존재하지 않습니다.',
- 'rid.required' => '후기 PK는 필수 값 입니다.',
- 'rid.exists' => '후기 PK가 존재하지 않습니다.'
- ];
- $posts = $this->validate($request, $rules, $messages, $attributes);
- $like = $this->movieLikeModel->getType($posts['rid'], UID);
- if($like->exists) {
- throw new Exception(sprintf("이미 %s 하셨습니다.", ($like->type == 1 ? '공감' : '비공감')));
- }
- $response->dislike = $this->movieReviewModel->setLike($posts['mid'], $posts['rid'], UID, DISLIKE);
- }catch(Exception $e) {
- $response = $response::fromException($e);
- }
- return $response;
- }
- /**
- * 평점·후기 신고
- * @method POST
- * @see /movie/review/blame
- */
- public function blame(Request $request, ResponseData $response, MovieBlame $movieBlameModel): ResponseData
- {
- try {
- $request->merge([
- 'mid' => base64_decode($request->post('mid'))
- ]);
- $rules = [
- 'mid' => 'required|exists:tb_movie,movie_cd',
- 'rid' => 'required|exists:tb_movie_review,id',
- 'blame_type' => 'required|numeric|in:1,2,3,4,5,6,7,8,9',
- 'blame_reason' => 'required|string|max:1000'
- ];
- $attributes = [
- 'rid' => '후기 PK',
- 'mid' => '영화 PK',
- 'blame_type' => '신고 사유',
- 'blame_reason' => '신고 내용'
- ];
- $messages = [
- 'mid.required' => '영화 PK는 필수 값 입니다.',
- 'mid.exists' => '영화 PK가 존재하지 않습니다.',
- 'rid.required' => '후기 PK는 필수 값 입니다.',
- 'rid.exists' => '후기 PK가 존재하지 않습니다.',
- 'blame_type.required' => '신고 사유를 선택해주세요.',
- 'blame_type.numeric' => '신고 사유 형식이 옳지 않습니다.',
- 'blame_type.in' => '신고 사유가 잘못되었습니다.',
- 'blame_reason.required' => '신고 내용을 입력해주세요.',
- 'blame_reason.string' => '신고 내용 형식이 옳지 않습니다.',
- 'blame_reason.max' => '신고 내용은 최대 1000자 입력 가능합니다.'
- ];
- $posts = $this->validate($request, $rules, $messages, $attributes);
- if($movieBlameModel->isAlready($posts['mid'], $posts['rid'], UID)) {
- throw new Exception('이미 신고가 접수되었습니다.');
- }
- $this->movieReviewModel->setBlame($posts['mid'], $posts['rid'], UID, $posts['blame_type'], $posts['blame_reason']);
- }catch(Exception $e) {
- $response = $response::fromException($e);
- }
- return $response;
- }
- }
|