request->getJSON(true); $userSeq = isset($request['USER_SEQ']) ? $request['USER_SEQ'] : null; $builder = $db->table('CS_BOARD C') ->select('C.*, U.NICK_NAME, U.NAME, V.COMPANY_NAME, V.NAME') ->join('USER_LIST U', 'C.USER_SEQ = U.SEQ', 'left') ->join('VENDOR_LIST V', 'C.USER_SEQ = V.SEQ', 'left'); //userSeq가 0이 아니면 본인이 쓴 글만 조회 if( $userSeq !== 0 ){ $builder->where('C.USER_SEQ', $userSeq); } $builder->orderBy('C.SEQ', 'DESC'); $lists = $builder->get()->getResultArray(); return $this->respond($lists, 200); } //문의 등록 public function csRegister() { $db = \Config\Database::connect(); $request = \Config\Services::request(); $regdate = date('Y-m-d H:i:s'); // 기본 유효성 검사 if ( !$request->getPost('USER_SEQ') || !$request->getPost('CATEGORY') || !$request->getPost('TITLE') || !$request->getPost('CONTENT') ) { return $this->respond([ 'status' => 'fail', 'message' => '필수 값이 누락됐습니다.' ], 400); } $db->transBegin(); // 트랜잭션 시작 try { // 첨부파일 처리 $fileName = null; $fileNameOrigin = null; $files = $request->getFiles(); if (isset($files['files']) && !empty($files['files'])) { $file = $files['files'][0]; // 첫 번째 파일만 처리 if ($file && $file->isValid() && !$file->hasMoved()) { $fileNameOrigin = $file->getClientName(); // 원본 파일명 $fileName = $file->getRandomName(); // 랜덤파일명 생성 $file->move(WRITEPATH . 'uploads/cs/', $fileName); // 저장 } } // CS_BOARD에 문의 정보 등록 $csData = [ 'USER_SEQ' => $request->getPost('USER_SEQ'), 'CATEGORY' => $request->getPost('CATEGORY'), 'TITLE' => $request->getPost('TITLE'), 'CONTENT' => $request->getPost('CONTENT'), 'STATUS' => '0', // 0: 대기중, 1: 답변완료 'REGDATE' => $regdate ]; // 파일이 있으면 파일 정보도 추가 if ($fileName) { $csData['FILE_NAME'] = $fileName; $csData['FILE_NAME_ORIGIN'] = $fileNameOrigin; } $insertResult = $db->table('CS_BOARD')->insert($csData); if (!$insertResult) { $error = $db->error(); return $this->respond([ 'status' => 'fail', 'message' => 'Insert 실패: ' . $error['message'] ], 500); } $csSeq = $db->insertID(); // 생성된 문의 SEQ값 $db->transCommit(); return $this->respond([ 'status' => 'success', 'success' => true, 'cs_seq' => $csSeq ], 201); } catch (\Exception $e) { $db->transRollback(); return $this->respond([ 'status' => 'fail', 'message' => 'DB 오류: ' . $e->getMessage() ], 500); } } //문의 상세 public function csDetail($seq) { // DB 객체 얻기 $db = \Config\Database::connect(); $builder = $db->table('CS_BOARD C') ->select('C.*, U.NICK_NAME, U.NAME, V.COMPANY_NAME, V.NAME') ->join('USER_LIST U', 'C.USER_SEQ = U.SEQ', 'left') ->join('VENDOR_LIST V', 'C.USER_SEQ = V.SEQ', 'left'); $item = $builder->where('C.seq', $seq)->get()->getRowArray(); if($item){ return $this->respond($item, 200); } else { return $this->respond([ 'status' => 'fail', 'message' => '유효하지 않은 seq입니다.' ], 404); } } //답변 등록 public function csAnswer() { $db = \Config\Database::connect(); $request = $this->request->getJSON(true); $answerDate = date('Y-m-d H:i:s'); // 기본 유효성 검사 if ( !isset($request['CS_SEQ']) || !isset($request['ANSWER']) || !isset($request['ADMIN_SEQ']) ) { return $this->respond([ 'status' => 'fail', 'message' => '필수 값이 누락됐습니다.' ], 400); } $db->transBegin(); // 트랜잭션 시작 try { // CS_BOARD 업데이트 $updateData = [ 'ADMIN_ANSWER' => $request['ANSWER'], 'ANSWER_REGDATE' => $answerDate, 'ADMIN_SEQ' => $request['ADMIN_SEQ'], 'STATUS' => '1' // 답변완료 상태로 변경 ]; $updateResult = $db->table('CS_BOARD') ->where('SEQ', $request['CS_SEQ']) ->update($updateData); if (!$updateResult) { throw new \Exception('답변 등록에 실패했습니다.'); } $db->transCommit(); return $this->respond([ 'status' => 'success', 'message' => '답변이 등록되었습니다.' ], 200); } catch (\Exception $e) { $db->transRollback(); return $this->respond([ 'status' => 'fail', 'message' => 'DB 오류: ' . $e->getMessage() ], 500); } } //상세 다운로드 public function file($fileName) { helper('filesystem'); $db = \Config\Database::connect(); $path = WRITEPATH . 'uploads/cs/' . $fileName; if (!file_exists($path)) { return $this->failNotFound('파일을 찾을 수 없습니다.'); } // DB에서 원본 파일명 조회 $fileInfo = $db->table('CS_BOARD') ->select('FILE_NAME_ORIGIN') ->where('FILE_NAME', $fileName) ->get() ->getRowArray(); $originalFileName = $fileInfo && $fileInfo['FILE_NAME_ORIGIN'] ? $fileInfo['FILE_NAME_ORIGIN'] : $fileName; return $this->response ->download($path, null) ->setFileName($originalFileName); } //문의 검색 public function csSearch() { $db = \Config\Database::connect(); // 요청 바디에서 filter와 keyword 추출 $request = $this->request->getJSON(true); $userSeq = isset($request['USER_SEQ']) ? $request['USER_SEQ'] : null; $filter = isset($request['filter']) ? $request['filter'] : null; $keyword = isset($request['keyword']) ? $request['keyword'] : null; $startDate = isset($request['startDate']) ? $request['startDate'] : null; $endDate = isset($request['endDate']) ? $request['endDate'] : null; $filterMap = [ 'title' => 'C.TITLE', 'content' => 'C.CONTENT', 'writer' => 'WRITER', ]; // CS_BOARD 테이블 검색 $builder = $db->table('CS_BOARD C') ->select('C.*, U.NICK_NAME, U.NAME, V.COMPANY_NAME, V.NAME') ->join('USER_LIST U', 'C.USER_SEQ = U.SEQ', 'left') ->join('VENDOR_LIST V', 'C.USER_SEQ = V.SEQ', 'left'); // userSeq가 0이 아니면 본인이 쓴 글만 조회 if ($userSeq !== 0) { $builder->where('C.USER_SEQ', $userSeq); } // 키워드 검색 if (!empty($keyword)) { if (empty($filter) || $filter === '') { // 필터를 선택 안했으면 전체 검색 (제목 + 내용 + 작성자) $builder->groupStart() ->like('C.TITLE', $keyword) ->orLike('C.CONTENT', $keyword) ->orLike('U.NICK_NAME', $keyword) ->orLike('U.NAME', $keyword) ->orLike('V.COMPANY_NAME', $keyword) ->orLike('V.NAME', $keyword) ->groupEnd(); } elseif (isset($filterMap[$filter])) { if ($filter === 'title') { // 제목 검색 $builder->like($filterMap[$filter], $keyword); } elseif ($filter === 'content') { // 내용 검색 $builder->like($filterMap[$filter], $keyword); } elseif ($filter === 'writer') { // 작성자 검색 $builder->groupStart() ->like('U.NICK_NAME', $keyword) ->orLike('U.NAME', $keyword) ->orLike('V.COMPANY_NAME', $keyword) ->orLike('V.NAME', $keyword) ->groupEnd(); } } } // 날짜 범위 검색 if (!empty($startDate)) { $builder->where('DATE(C.REGDATE) >=', $startDate); } if (!empty($endDate)) { $builder->where('DATE(C.REGDATE) <=', $endDate); } // 정렬: 최신순 $builder->orderBy('C.SEQ', 'DESC'); // 조회 $lists = $builder->get()->getResultArray(); return $this->respond($lists, 200); } }