request->is('post') ) { // POST 방식: JSON Body에서 데이터 가져오기 $data = $this->request->getJSON(true); } else if ( $this->request->is('get') ) { // GET 방식: Query Parameter에서 데이터 가져오기 $data = $this->request->getGet(); } else { // 지원하지 않는 메소드 처리 (예: PUT, DELETE 등) return $this->response->setStatusCode(Response::HTTP_METHOD_NOT_ALLOWED) ->setJSON(['code' => 'E005', 'message' => 'Method not allowed. Use GET or POST.']); } // 2. 필수 항목 검증 $requiredKeys = ['articleNumber', 'requestType', 'requestDatetime']; foreach ($requiredKeys as $key) { // isset()과 trim()을 사용하여 '0' 값도 허용 if (!isset($data[$key]) || trim((string)$data[$key]) === '') { return $this->response->setStatusCode(Response::HTTP_BAD_REQUEST) ->setJSON([ 'code' => 'E001', 'message' => "Missing required parameter: {$key}" ]); } } // 3. requestType 값 검증 $validRequestTypes = ['verify', 'check', 'validate']; // 허용되는 requestType 값 if (!in_array($data['requestType'], $validRequestTypes, true)) { return $this->response->setStatusCode(Response::HTTP_BAD_REQUEST) ->setJSON([ 'code' => 'E002', 'message' => "Invalid requestType. Allowed values: " . implode(', ', $validRequestTypes) ]); } // 4. requestDatetime 날짜 형식 검증 (Y-m-d H:i:s 형식) $datetime = \DateTime::createFromFormat('Y-m-d H:i:s', $data['requestDatetime']); if (!$datetime || $datetime->format('Y-m-d H:i:s') !== $data['requestDatetime']) { return $this->response->setStatusCode(Response::HTTP_BAD_REQUEST) ->setJSON([ 'code' => 'E003', 'message' => "Invalid requestDatetime format. Use: YYYY-MM-DD HH:MM:SS" ]); } // 5. Redis 연결 및 큐 저장 helper('redis'); try { $redis = get_redis_connection('worker'); if (!$redis) { throw new \Exception('Redis connection failed'); } // 데이터 준비 $data['retry_count'] = 0; $data['received_at'] = date('Y-m-d H:i:s'); // 리스트에 데이터 삽입 $pushResult = $redis->lPush('naver:queue', json_encode($data)); if (!$pushResult) { throw new \Exception('Failed to push data to Redis queue'); } // 성공 로그 기록 log_message('info', "Request queued successfully - Article: {$data['articleNumber']}, Type: {$data['requestType']}"); } catch (\Exception $e) { log_message('error', 'Redis Push Error: ' . $e->getMessage()); return $this->response->setStatusCode(500)->setJSON([ 'code' => 'E999', 'message' => 'Redis Connection Error' ]); } // 6. 성공 응답 return $this->response->setStatusCode(Response::HTTP_OK) // 200 OK ->setJSON([ 'code' => 'success', 'message' => '' ]); } }