worker service 매물 등록 및 redis 다운시 처리
This commit is contained in:
@@ -13,6 +13,23 @@ class KisoController extends BaseController
|
||||
/** @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. 요청 방식에 따라 데이터 파싱
|
||||
@@ -25,56 +42,79 @@ class KisoController extends BaseController
|
||||
} else {
|
||||
// 지원하지 않는 메소드 처리 (예: PUT, DELETE 등)
|
||||
return $this->response->setStatusCode(Response::HTTP_METHOD_NOT_ALLOWED)
|
||||
->setJSON(['resultCode' => 'E005', 'resultMessage' => 'Method not allowed. Use GET or POST.']);
|
||||
->setJSON(['code' => 'E005', 'message' => 'Method not allowed. Use GET or POST.']);
|
||||
}
|
||||
|
||||
// 2. 필수 항목 검증
|
||||
$requiredKeys = ['articleNumber', 'requestType', 'requestDatetime'];
|
||||
|
||||
foreach ($requiredKeys as $key) {
|
||||
// 파싱된 데이터($data) 내에 키가 없거나 값이 비어있는지 확인
|
||||
if (empty($data[$key])) {
|
||||
// isset()과 trim()을 사용하여 '0' 값도 허용
|
||||
if (!isset($data[$key]) || trim((string)$data[$key]) === '') {
|
||||
return $this->response->setStatusCode(Response::HTTP_BAD_REQUEST)
|
||||
->setJSON([
|
||||
'resultCode' => 'E001',
|
||||
'resultMessage' => "Missing required parameter: {$key}"
|
||||
'code' => 'E001',
|
||||
'message' => "Missing required parameter: {$key}"
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Redis 연결 및 예외 처리
|
||||
// 3. Redis 연결 및 직접 푸시
|
||||
try {
|
||||
$redis = new \Redis();
|
||||
// Docker 환경이므로 host를 'redis'로 설정
|
||||
$success = $redis->connect('redis', 6379);
|
||||
|
||||
if (!$success) {
|
||||
// 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');
|
||||
}
|
||||
|
||||
$redis->select(10); // 10번 DB 선택
|
||||
|
||||
// 데이터 준비
|
||||
$data['retry_count'] = 0;
|
||||
$data['received_at'] = date('Y-m-d H:i:s');
|
||||
|
||||
// 리스트에 데이터 삽입 (이 명령어가 실행되어야 monitor에 LPUSH가 뜹니다)
|
||||
$redis->lPush('naver:queue', json_encode($data));
|
||||
// 리스트에 데이터 삽입
|
||||
$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([
|
||||
'resultCode' => 'E999',
|
||||
'resultMessage' => 'Redis Connection Error'
|
||||
'code' => 'E999',
|
||||
'message' => 'Redis Connection Error'
|
||||
]);
|
||||
}
|
||||
|
||||
// 4. 성공 응답
|
||||
return $this->response->setStatusCode(Response::HTTP_ACCEPTED) // 202 Accepted
|
||||
// 6. 성공 응답
|
||||
return $this->response->setStatusCode(Response::HTTP_OK) // 200 OK
|
||||
->setJSON([
|
||||
'resultCode' => 'S000',
|
||||
'resultMessage' => 'Request successfully queued for processing',
|
||||
'articleNumber' => $data['articleNumber']
|
||||
'code' => 'success',
|
||||
'message' => ''
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@ namespace App\Controllers;
|
||||
|
||||
use App\Controllers\BaseController;
|
||||
use App\Models\common\LoginModel;
|
||||
use CodeIgniter\Session\Handlers\DatabaseHandler;
|
||||
|
||||
class Login extends BaseController
|
||||
{
|
||||
@@ -13,6 +14,37 @@ class Login extends BaseController
|
||||
$this->loginModel = new LoginModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* Redis 폴백 상태 체크 (세션이 DatabaseHandler로 동작 중인지)
|
||||
*/
|
||||
private function getSystemStatus(): array
|
||||
{
|
||||
$status = [
|
||||
'redis_fallback' => false,
|
||||
'warning_message' => ''
|
||||
];
|
||||
|
||||
// Session 설정에서 현재 드라이버 확인
|
||||
$sessionConfig = config('Session');
|
||||
if ($sessionConfig->driver === DatabaseHandler::class) {
|
||||
$status['redis_fallback'] = true;
|
||||
$status['warning_message'] = '세션 서버(Redis) 장애로 임시 모드로 운영 중입니다. 시스템 관리자에게 문의하세요.';
|
||||
}
|
||||
|
||||
return $status;
|
||||
}
|
||||
|
||||
/**
|
||||
* JSON 응답에 시스템 상태 추가
|
||||
*/
|
||||
private function jsonResponse(array $data): \CodeIgniter\HTTP\ResponseInterface
|
||||
{
|
||||
$systemStatus = $this->getSystemStatus();
|
||||
$data['system'] = $systemStatus;
|
||||
|
||||
return $this->response->setJSON($data);
|
||||
}
|
||||
|
||||
public function index(): string
|
||||
{
|
||||
$user_id = get_cookie('save_id');
|
||||
@@ -59,7 +91,7 @@ class Login extends BaseController
|
||||
];
|
||||
|
||||
if (!$this->validate($rules)) {
|
||||
return $this->response->setJSON([
|
||||
return $this->jsonResponse([
|
||||
'code' => '1',
|
||||
'errors' => $this->validator->getErrors()
|
||||
]);
|
||||
@@ -82,7 +114,7 @@ class Login extends BaseController
|
||||
|
||||
$this->loginModel->insertUserLog($logs);
|
||||
|
||||
return $this->response->setJSON([
|
||||
return $this->jsonResponse([
|
||||
'code' => '1',
|
||||
'msg' => '존재하지 않는 아이디입니다.'
|
||||
]);
|
||||
@@ -96,7 +128,7 @@ class Login extends BaseController
|
||||
|
||||
$this->loginModel->insertUserLog($logs);
|
||||
|
||||
return $this->response->setJSON(body: [
|
||||
return $this->jsonResponse([
|
||||
'code' => '1',
|
||||
'msg' => '잘못된 비밀번호 입니다.'
|
||||
]);
|
||||
@@ -135,7 +167,7 @@ class Login extends BaseController
|
||||
|
||||
$this->session->set($newdata);
|
||||
|
||||
return $this->response->setJSON([
|
||||
return $this->jsonResponse([
|
||||
'code' => '0',
|
||||
'msg' => 'success'
|
||||
]);
|
||||
@@ -148,7 +180,17 @@ class Login extends BaseController
|
||||
log_message('error', '[LOGIN ERROR] ' . $e->getMessage());
|
||||
log_message('error', $e->getTraceAsString());
|
||||
|
||||
return $this->response->setJSON([
|
||||
// 세션 관련 에러인지 확인
|
||||
$errorMessage = $e->getMessage();
|
||||
if (stripos($errorMessage, 'session') !== false ||
|
||||
stripos($errorMessage, 'redis') !== false) {
|
||||
return $this->jsonResponse([
|
||||
'code' => '8',
|
||||
'msg' => '세션 서비스 오류입니다. 시스템 관리자에게 문의해주세요.'
|
||||
]);
|
||||
}
|
||||
|
||||
return $this->jsonResponse([
|
||||
'code' => '9',
|
||||
'msg' => '서버 내부 오류가 발생했습니다. 잠시 후 다시 시도해주세요.'
|
||||
]);
|
||||
|
||||
Reference in New Issue
Block a user