Files
AutonetSellCar/backend/app/api/settings.py
AutonetSellCar Deploy 4858965087 feat: Add car availability check feature
- 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>
2026-01-05 08:01:40 +09:00

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
}
}