"""ODF 光纤配线单元管理系统 - FastAPI 应用入口。 定义所有 RESTful API 路由,提供对 ODF 机架、配线单元、端口和 跳接连接的管理接口。 """ from typing import Optional from fastapi import FastAPI, HTTPException from app.models import PortType from app.schemas import ( RackCreate, RackResponse, RackListResponse, UnitCreate, UnitResponse, PortResponse, PortDetail, FreePortResponse, ConnectionCreate, ConnectionResponse, ) from app.services import service app = FastAPI( title="ODF 光纤配线单元管理系统", description="提供对 ODF 光纤配线架、配线单元、光纤端口和跳接连接的统一管理能力。", version="1.0.0", ) # ==================== 机架 API ==================== @app.get("/api/racks", response_model=list[RackListResponse], summary="获取所有机架列表") def list_racks(): """获取所有 ODF 机架的简要列表,包含每个机架下的单元数量。""" return service.list_racks() @app.get("/api/racks/{rack_id}", response_model=RackResponse, summary="获取机架详情") def get_rack(rack_id: str): """根据机架 ID 获取机架的详细信息,包含所有配线单元和端口。""" rack = service.get_rack(rack_id) if not rack: raise HTTPException(status_code=404, detail=f"机架 {rack_id} 不存在") return rack @app.post("/api/racks", response_model=RackResponse, status_code=201, summary="创建新机架") def create_rack(body: RackCreate): """创建一个新的空 ODF 机架,不含配线单元。""" rack = service.create_rack(body.rack_name, body.location) return rack @app.delete("/api/racks/{rack_id}", status_code=204, summary="删除机架") def delete_rack(rack_id: str): """删除指定机架及其包含的所有配线单元和端口。""" ok = service.delete_rack(rack_id) if not ok: raise HTTPException(status_code=404, detail=f"机架 {rack_id} 不存在") # ==================== 配线单元 API ==================== @app.post("/api/racks/{rack_id}/units", response_model=UnitResponse, status_code=201, summary="创建配线单元") def create_unit(rack_id: str, body: UnitCreate): """在指定机架下创建一个新的配线单元,并自动生成指定数量的端口。""" unit = service.create_unit( rack_id=rack_id, unit_number=body.unit_number, unit_name=body.unit_name, position=body.position, port_count=body.port_count, port_type=body.port_type, ) if not unit: raise HTTPException(status_code=404, detail=f"机架 {rack_id} 不存在") return unit @app.delete("/api/units/{unit_id}", status_code=204, summary="删除配线单元") def delete_unit(unit_id: str): """删除指定配线单元及其所有端口。""" ok = service.delete_unit(unit_id) if not ok: raise HTTPException(status_code=404, detail=f"单元 {unit_id} 不存在") # ==================== 端口 API ==================== @app.get("/api/ports/free", response_model=list[FreePortResponse], summary="查询空闲端口") def get_free_ports(rack_id: Optional[str] = None): """查询所有空闲端口,可选择按机架过滤。""" return service.get_free_ports(rack_id) @app.get("/api/ports/{port_id}", response_model=PortDetail, summary="获取端口详情") def get_port_detail(port_id: str): """获取指定端口的详细信息,包含所属单元和机架信息。""" detail = service.get_port_detail(port_id) if not detail: raise HTTPException(status_code=404, detail=f"端口 {port_id} 不存在") return detail # ==================== 跳接连接 API ==================== @app.get("/api/connections", response_model=list[ConnectionResponse], summary="获取所有跳接连接") def list_connections(): """获取所有跳接连接列表。""" return service.list_connections() @app.post("/api/connections", response_model=ConnectionResponse, status_code=201, summary="创建跳接连接") def create_connection(body: ConnectionCreate): """在两个空闲端口之间创建跳接连接。两个端口状态必须为空闲(FREE)。""" conn = service.create_connection( port_a_id=body.port_a_id, port_b_id=body.port_b_id, fiber_length=body.fiber_length, remark=body.remark, ) if not conn: raise HTTPException( status_code=400, detail="创建连接失败,请检查端口是否存在、是否空闲、是否同一端口", ) return conn @app.delete("/api/connections/{connection_id}", status_code=204, summary="删除跳接连接") def delete_connection(connection_id: str): """删除指定跳接连接,并自动释放两个端口的状态为空闲。""" ok = service.delete_connection(connection_id) if not ok: raise HTTPException(status_code=404, detail=f"连接 {connection_id} 不存在") # ==================== 路径查询 API ==================== @app.get("/api/ports/{port_id}/path", summary="查询端口连接路径") def get_port_path(port_id: str): """查询指定端口的连接路径信息,包括对端端口和连接详情。""" result = service.get_port_path(port_id) if not result: raise HTTPException(status_code=404, detail=f"端口 {port_id} 不存在") return result # ==================== 健康检查 ==================== @app.get("/api/health", summary="健康检查") def health_check(): """服务健康检查接口。""" return {"status": "ok", "service": "ODF光纤配线单元管理系统"}