120 lines
4.6 KiB
PHP
120 lines
4.6 KiB
PHP
<?php
|
|
|
|
namespace App\Controllers;
|
|
use CodeIgniter\HTTP\ResponseInterface;
|
|
use CodeIgniter\HTTP\RequestInterface;
|
|
use CodeIgniter\HTTP\Response;
|
|
|
|
class KisoController extends BaseController
|
|
{
|
|
/** @var RequestInterface */
|
|
protected $request;
|
|
|
|
/** @var ResponseInterface */
|
|
protected $response;
|
|
|
|
/**
|
|
* 네이버 검증 요청 API
|
|
*
|
|
* Required Parameters:
|
|
* - articleNumber: 기사 번호
|
|
* - requestType: 요청 타입 (verify, check, validate)
|
|
* - requestDatetime: 요청 일시 (YYYY-MM-DD HH:MM:SS)
|
|
*
|
|
* Error Codes:
|
|
* - E001: 필수 파라미터 누락
|
|
* - E002: requestType 값 오류
|
|
* - E003: requestDatetime 형식 오류
|
|
* - E005: HTTP 메소드 오류
|
|
* - E999: Redis 연결 오류
|
|
*
|
|
* @return ResponseInterface
|
|
*/
|
|
public function vrfcReq()
|
|
{
|
|
// 1. 요청 방식에 따라 데이터 파싱
|
|
if ( $this->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' => ''
|
|
]);
|
|
}
|
|
} |