- Add daily scheduled check for Carmodoo car availability - Add manual trigger button in admin settings - Mark sold cars as soldout=True automatically - Add settings for check time and enable/disable toggle - Display check status and statistics in admin UI 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
129 lines
4.2 KiB
Python
129 lines
4.2 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, BackgroundTasks
|
|
from sqlalchemy.orm import Session
|
|
|
|
from ..database import get_db
|
|
from ..models.settings import SystemSettings
|
|
from ..schemas.settings import SystemSettingsUpdate, SystemSettingsResponse
|
|
from .auth import get_current_user
|
|
from ..models import User
|
|
from ..services.car_availability_service import run_car_availability_check
|
|
|
|
router = APIRouter(prefix="/settings", tags=["settings"])
|
|
|
|
|
|
def get_admin_user(current_user: User = Depends(get_current_user)) -> User:
|
|
"""관리자 권한 확인 (임시: 모든 로그인 사용자 허용)"""
|
|
return current_user
|
|
|
|
|
|
def get_or_create_settings(db: Session) -> SystemSettings:
|
|
"""시스템 설정 조회 또는 기본값 생성"""
|
|
settings = db.query(SystemSettings).first()
|
|
if not settings:
|
|
settings = SystemSettings(
|
|
search_page_size=20,
|
|
korea_margin_percent=5.0,
|
|
mongolia_margin_percent=5.0,
|
|
cc_per_usdc=1, # 1 USD = 1 CC
|
|
cc_per_view=1, # 차량 상세 조회 시 1 CC
|
|
cars_per_cc=3, # 1 CC = 3 recommended vehicles per request
|
|
cc_per_banner_view=0.1, # 배너 차량 PDF/상세 보기 비용
|
|
cc_signup_bonus=3, # 3 CC free on signup
|
|
cache_ttl_hours=2,
|
|
container_logistics_usd=3600,
|
|
shoring_cost_usd=300,
|
|
)
|
|
db.add(settings)
|
|
db.commit()
|
|
db.refresh(settings)
|
|
return settings
|
|
|
|
|
|
# ==================== Public Endpoints ====================
|
|
|
|
@router.get("/", response_model=SystemSettingsResponse)
|
|
def get_system_settings(db: Session = Depends(get_db)):
|
|
"""시스템 설정 조회 (Public)"""
|
|
return get_or_create_settings(db)
|
|
|
|
|
|
@router.get("/search-page-size")
|
|
def get_search_page_size(db: Session = Depends(get_db)):
|
|
"""검색 결과 페이지 크기 조회 (Public)"""
|
|
settings = get_or_create_settings(db)
|
|
return {"search_page_size": settings.search_page_size}
|
|
|
|
|
|
# ==================== Admin Endpoints ====================
|
|
|
|
@router.put("/", response_model=SystemSettingsResponse)
|
|
def update_system_settings(
|
|
settings_data: SystemSettingsUpdate,
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(get_admin_user)
|
|
):
|
|
"""시스템 설정 수정 (Admin)"""
|
|
settings = get_or_create_settings(db)
|
|
|
|
update_data = settings_data.model_dump(exclude_unset=True)
|
|
for field, value in update_data.items():
|
|
setattr(settings, field, value)
|
|
|
|
db.commit()
|
|
db.refresh(settings)
|
|
return settings
|
|
|
|
|
|
# ==================== Car Availability Check Endpoints ====================
|
|
|
|
@router.post("/car-availability-check")
|
|
async def trigger_car_availability_check(
|
|
background_tasks: BackgroundTasks,
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(get_admin_user)
|
|
):
|
|
"""차량 판매상태 검증 즉시 실행 (Admin)"""
|
|
# 백그라운드에서 실행
|
|
async def run_check():
|
|
from ..database import SessionLocal
|
|
check_db = SessionLocal()
|
|
try:
|
|
await run_car_availability_check(check_db)
|
|
finally:
|
|
check_db.close()
|
|
|
|
import asyncio
|
|
asyncio.create_task(run_check())
|
|
|
|
return {
|
|
"message": "Car availability check started in background",
|
|
"status": "running"
|
|
}
|
|
|
|
|
|
@router.get("/car-availability-status")
|
|
def get_car_availability_status(
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(get_admin_user)
|
|
):
|
|
"""차량 판매상태 검증 상태 조회 (Admin)"""
|
|
settings = get_or_create_settings(db)
|
|
|
|
# soldout 통계
|
|
from ..models.car import Car
|
|
total_cars = db.query(Car).filter(Car.source == 'carmodoo').count()
|
|
available_cars = db.query(Car).filter(Car.source == 'carmodoo', Car.soldout == False).count()
|
|
sold_cars = db.query(Car).filter(Car.source == 'carmodoo', Car.soldout == True).count()
|
|
|
|
return {
|
|
"check_enabled": settings.car_availability_check_enabled,
|
|
"check_hour": settings.car_availability_check_hour,
|
|
"last_check": settings.car_availability_last_check,
|
|
"last_result": settings.car_availability_last_result,
|
|
"stats": {
|
|
"total_cars": total_cars,
|
|
"available": available_cars,
|
|
"sold": sold_cars
|
|
}
|
|
}
|