File size: 3,509 Bytes
70dc852
 
9d8829a
 
a09ee49
9d8829a
 
 
73d94a0
9d8829a
 
 
 
 
 
73d94a0
9d8829a
 
 
 
a09ee49
 
9d8829a
 
 
 
 
5d7f61c
 
 
 
 
 
9d8829a
5d7f61c
 
 
 
9d8829a
 
 
 
 
 
 
a09ee49
 
 
9d8829a
a09ee49
9d8829a
 
a09ee49
 
9d8829a
 
 
 
 
 
 
a09ee49
9d8829a
 
a09ee49
 
 
 
 
9d8829a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a09ee49
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
from fastapi import FastAPI
from fastapi.responses import JSONResponse
from datetime import datetime
from fastapi.middleware.cors import CORSMiddleware # Keep if CORS is needed
import uvicorn
from contextlib import asynccontextmanager


from src.database import create_db_and_tables, get_db 
from src.routers import students, devices, clearance, token, users, admin

@asynccontextmanager
async def lifespan(app_instance: FastAPI):
    """Handles application startup and shutdown events."""
    print("Application startup...")
    create_db_and_tables()
    print("Database tables checked/created.")
    yield
    print("Application shutdown...")


# FastAPI app instance
app = FastAPI(
    title="Undergraduate Clearance System API",
    description="""
    A comprehensive API for managing student clearance processes with RFID authentication.
    
    ## Features
    * RFID Authentication - Students and staff use RFID tags for quick access
    * Multi-Department Clearance - Support for Library, Bursary, Alumni, and Departmental clearances
    * Device Management - ESP32 RFID readers with secure API key authentication
    * Role-Based Access - Different permissions for Students, Staff, and Administrators
    * Real-Time Tracking - Live clearance status updates and comprehensive logging
    
    ## Authentication Methods
    * JWT Tokens - For web interface and administrative access
    * RFID Tags - For quick student and staff authentication
    * Device API Keys - For ESP32 RFID reader authentication
    """,
    version="2.0.0",
    lifespan=lifespan,
    docs_url="/docs",
    redoc_url="/redoc",
    openapi_url="/openapi.json",
    )

app.add_middleware(
    CORSMiddleware,
    allow_origins= ['*'],
    allow_credentials=True,
    allow_methods=["*"], # Allows all methods
    allow_headers=["*"], # Allows all headers
)

# Include routers
app.include_router(devices.router)
app.include_router(students.router)
app.include_router(clearance.router)
app.include_router(token.router)
app.include_router(users.router)
app.include_router(admin.router)

# Root endpoint
@app.get("/", summary="Root endpoint", tags=["Default"])
async def read_root():
    """Basic root endpoint to confirm the API is running."""
    return {"message": "Undergraduate Clearance System API is running"}


@app.get("/version", summary="API Version Information", tags=["System"])
async def get_version():
    """Get detailed API version information."""
    return {
        "api_version": "2.0.0",
        "last_updated": "2025-06-07",
        "features": [
            "RFID Authentication",
            "Multi-Department Clearance",
            "Device Management",
            "Real-Time Tracking",
            "Comprehensive Logging"
        ],
        "supported_authentication": [
            "JWT Tokens",
            "RFID Tags",
            "Device API Keys"
        ]
    }

# Health check endpoints
@app.get("/health", summary="Health Check", tags=["System"])
async def health_check():
    """Comprehensive health check endpoint."""
    health_status = {
            "status": "healthy",
            "timestamp": datetime.utcnow().isoformat(),
            "version": "2.0.0",
            "uptime": "calculated_if_needed"
        }
        
    status_code = 200
    return JSONResponse(
            status_code=status_code,
            content=health_status
        )
    
# Run the FastAPI app using Uvicorn
if __name__ == "__main__":
    uvicorn.run("main:app", host="0.0.0.0", port=8000, reload=True)