ODF/app/main.py

158 lines
5.5 KiB
Python
Raw Normal View History

2026-05-14 08:04:47 +00:00
"""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光纤配线单元管理系统"}