"""충전기 관리 API""" from typing import List from fastapi import APIRouter, Depends, HTTPException from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.database import get_db from app.models import Charger from app.schemas import ChargerCreate, ChargerOut from app.services.steve_client import steve_client router = APIRouter(prefix="/chargers", tags=["충전기"]) @router.get("/", response_model=List[ChargerOut]) async def list_chargers( active_only: bool = True, db: AsyncSession = Depends(get_db), ): """등록된 충전기 목록""" stmt = select(Charger) if active_only: stmt = stmt.where(Charger.is_active == True) result = await db.execute(stmt) return result.scalars().all() @router.post("/", response_model=ChargerOut, status_code=201) async def register_charger( data: ChargerCreate, db: AsyncSession = Depends(get_db), ): """새 충전기 등록 FastAPI DB에 등록. Steve에도 이미 chargeBoxId가 등록되어 있어야 OCPP 통신 가능. """ # 중복 확인 existing = await db.execute( select(Charger).where(Charger.charge_box_id == data.charge_box_id) ) if existing.scalar_one_or_none(): raise HTTPException(409, f"이미 등록된 충전기: {data.charge_box_id}") charger = Charger(**data.model_dump()) db.add(charger) await db.flush() await db.refresh(charger) return charger @router.get("/{charge_box_id}", response_model=ChargerOut) async def get_charger( charge_box_id: str, db: AsyncSession = Depends(get_db), ): """충전기 상세 정보""" result = await db.execute( select(Charger).where(Charger.charge_box_id == charge_box_id) ) charger = result.scalar_one_or_none() if not charger: raise HTTPException(404, "충전기를 찾을 수 없습니다") return charger @router.get("/{charge_box_id}/steve-status") async def get_steve_status(charge_box_id: str): """Steve 서버에서 충전기 실시간 상태 조회""" data = await steve_client.get_charge_point(charge_box_id) if not data: raise HTTPException(502, "Steve 서버 응답 없음") return data @router.delete("/{charge_box_id}") async def deactivate_charger( charge_box_id: str, db: AsyncSession = Depends(get_db), ): """충전기 비활성화 (soft delete)""" result = await db.execute( select(Charger).where(Charger.charge_box_id == charge_box_id) ) charger = result.scalar_one_or_none() if not charger: raise HTTPException(404, "충전기를 찾을 수 없습니다") charger.is_active = False return {"message": f"{charge_box_id} 비활성화 완료"}