File size: 3,712 Bytes
6a6918c
 
 
 
 
 
 
519742e
 
fe446a8
6a6918c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fe446a8
6a6918c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ad10988
6a6918c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
from fastapi import FastAPI, File, UploadFile, Form, Depends
import uvicorn
import json
from contextlib import asynccontextmanager
from fastapi.staticfiles import StaticFiles # Add this import
from PIL import Image
import io
import os

os.makedirs("/tmp/reports", exist_ok=True)

from services.measurement_service import MeasurementService
from services.pdf_service import PdfService
from services.persistence_service import PersistenceService
from models.schemas import MeasurementMetadata
from models.database import create_db_and_tables


@asynccontextmanager
async def lifespan(app: FastAPI):
    # create database and tables on startup
    create_db_and_tables()
    yield

from fastapi.middleware.cors import CORSMiddleware

app = FastAPI(title="Ship Draft Measurement API", lifespan=lifespan)

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

# Mount static files directory
app.mount("/static", StaticFiles(directory="/tmp/reports"), name="static") # Add this line

# Initialize services
measurement_service = MeasurementService()
pdf_service = PdfService()
persistence_service = PersistenceService()

@app.get("/", tags=["Health Check"])
def read_root():
    """A simple endpoint to check if the API is running."""
    return {"status": "API is running"}

@app.post("/measure", tags=["Measurement"])
async def measure_draft(
    image: UploadFile = File(...),
    metadata_json: str = Form(...)
):
    """
    Receives an image and metadata, performs draft measurement,
    generates a PDF report, and saves it.
    """
    # 1. Read image content
    image_bytes = await image.read()

    # 2. Deserialize and validate metadata
    metadata_dict = json.loads(metadata_json)
    metadata = MeasurementMetadata(**metadata_dict)

    # 3. Perform measurement (using placeholder service)
    image_pil = Image.open(io.BytesIO(image_bytes))
    measurement_results, ml_results = measurement_service.measure(image_pil)

    # 4. Generate PDF report
    pdf_report_bytes = pdf_service.create_report(
        image_bytes=image_bytes,
        metadata=metadata,
        results=measurement_results,
        ml_results=ml_results
    )

    # 5. Persist the report
    report_path = persistence_service.save_to_disk(pdf_report_bytes, metadata)
    persistence_service.save_to_db(
        report_path,
        metadata,
        measurement_results.draft_measurement,
        measurement_results.confidence_score,
        image_bytes
    )
    
    # Optional: Send email
    # persistence_service.send_by_email(report_path, "pfnfcat@gmail.com")

    return {
        "message": "Measurement complete and report generated.",
        "report_path": report_path,
        "results": measurement_results
    }

from datetime import datetime
from typing import Optional

@app.get("/reports", tags=["Reports"])
def get_reports(
    skip: int = 0,
    limit: int = 10,
    search: Optional[str] = None,
    start_date: Optional[datetime] = None,
    end_date: Optional[datetime] = None,
):
    """Returns a list of all reports."""
    return persistence_service.get_all_reports(
        skip=skip,
        limit=limit,
        search=search,
        start_date=start_date,
        end_date=end_date,
    )


@app.get("/reports/{report_id}", tags=["Reports"])
def get_report(report_id: int):
    """Returns a single report by its ID."""
    report = persistence_service.get_report_by_id(report_id)
    if report is None:
        return {"error": "Report not found"}
    return report


if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)