xclasscode's picture
Update main.py
8a1ff67 verified
from fastapi import Depends, FastAPI, HTTPException, status
from sqlalchemy.orm import Session
from fastapi.responses import JSONResponse
from fastapi.middleware.cors import CORSMiddleware
import schemas, models
from transformers import pipeline
import database
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
models.database.Base.metadata.create_all(bind=database.engine)
pipe = pipeline("text-classification", model="lxyuan/distilbert-base-multilingual-cased-sentiments-student")
# Database session dependency
def get_db():
db = database.SessionLocal()
try:
yield db
finally:
db.close()
@app.post("/analyze_sentiment")
def create_sentiment_result(sentiment_result: schemas.SentimentResultCreate,db: Session = Depends(get_db))->JSONResponse:
try:
# Perform input validation
if not isinstance(sentiment_result.text_input, str) or not sentiment_result.text_input.strip():
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail="Invalid text input"
)
text_content = sentiment_result.text_input
sentiment_analysis_result = pipe(text_content)
# Create a new SentimentResult instance
new_sentiment_result = models.SentimentResult(
score=sentiment_analysis_result[0]['score'],
label=sentiment_analysis_result[0]['label'],
text_input=text_content
)
# Add the new SentimentResult to the database
db.add(new_sentiment_result)
db.commit()
db.refresh(new_sentiment_result)
# Convert datetime objects to strings
created_at_str = new_sentiment_result.created_at.strftime("%Y-%m-%dT%H:%M:%SZ")
textinput_dict = {
"id": new_sentiment_result.id,
"text_input": new_sentiment_result.text_input,
"score": new_sentiment_result.score,
"label": new_sentiment_result.label,
"created_at": created_at_str,
}
return JSONResponse(content=textinput_dict, status_code=status.HTTP_201_CREATED)
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"An error occurred: {str(e)}"
)
@app.delete("/sentiment/{id}", status_code=status.HTTP_204_NO_CONTENT)
def delete_sentiment_result(id: int, db: Session = Depends(get_db)):
# Retrieve the sentiment result and check for existence
sentiment_result_to_delete = db.query(models.SentimentResult).filter(models.SentimentResult.id == id).first()
if sentiment_result_to_delete is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"SentimentResult with ID {id} not found")
# Delete the sentiment result
db.delete(sentiment_result_to_delete)
db.commit()