108 lines
3.3 KiB
Python
108 lines
3.3 KiB
Python
import json
|
|
from fastapi import APIRouter, Depends, HTTPException, UploadFile, File, Form, Request
|
|
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
|
|
from sqlalchemy.orm import Session
|
|
from sqlalchemy import func
|
|
from sqlalchemy.exc import IntegrityError
|
|
|
|
from core.db import get_db, Poster, FeedBack
|
|
from core.crypt import decode_jwt, is_admin
|
|
from core.file import get_upload_dir, save_file, get_poster_dir, generate_file_url
|
|
from pydantic import BaseModel, EmailStr
|
|
from datetime import datetime
|
|
|
|
router = APIRouter()
|
|
security = HTTPBearer()
|
|
|
|
class Comment(BaseModel):
|
|
user_id: int
|
|
text: str
|
|
rating: int
|
|
|
|
@router.post("/comment")
|
|
async def create_comment(
|
|
comment: Comment,
|
|
db: Session = Depends(get_db),
|
|
credentials: HTTPAuthorizationCredentials = Depends(security),
|
|
request: Request = None,
|
|
):
|
|
token = credentials.credentials
|
|
decoded_data = decode_jwt(token)
|
|
user_id = decoded_data.get("user_id")
|
|
|
|
if not user_id:
|
|
raise HTTPException(status_code=401, detail="Пользователь не авторизован.")
|
|
|
|
if comment.rating < 1 or comment.rating > 5:
|
|
raise HTTPException(status_code=400, detail="Рейтинг должен быть от 1 до 5.")
|
|
|
|
new_comment = FeedBack(
|
|
userid=user_id,
|
|
text=comment.text,
|
|
rating=comment.rating,
|
|
date=datetime.utcnow()
|
|
)
|
|
|
|
db.add(new_comment)
|
|
db.commit()
|
|
db.refresh(new_comment)
|
|
|
|
return {"message": "Комментарий успешно добавлен.", "comment": new_comment}
|
|
|
|
@router.delete("/comment/{comment_id}")
|
|
async def delete_comment(
|
|
comment_id: int,
|
|
db: Session = Depends(get_db),
|
|
credentials: HTTPAuthorizationCredentials = Depends(security),
|
|
):
|
|
token = credentials.credentials
|
|
decoded_data = decode_jwt(token)
|
|
user_id = decoded_data.get("user_id")
|
|
|
|
if not user_id:
|
|
raise HTTPException(status_code=401, detail="Пользователь не авторизован.")
|
|
|
|
comment = db.query(FeedBack).filter(FeedBack.id == comment_id, FeedBack.userid == user_id).first()
|
|
|
|
if not comment:
|
|
raise HTTPException(status_code=404, detail="Комментарий не найден.")
|
|
|
|
if is_admin(user_id, db):
|
|
raise HTTPException(status_code=403, detail="Недостаточно прав для выполнения этого действия.")
|
|
|
|
db.delete(comment)
|
|
db.commit()
|
|
|
|
return {"message": "Комментарий успешно удален."}
|
|
|
|
@router.get("/comments")
|
|
async def get_comments(
|
|
db: Session = Depends(get_db),
|
|
request: Request = None,
|
|
):
|
|
|
|
comments = db.query(FeedBack).order_by(FeedBack.date.desc()).all()
|
|
|
|
comments_list = []
|
|
for comment in comments:
|
|
comments_list.append({
|
|
"id": comment.id,
|
|
"userid": comment.userid,
|
|
"text": comment.text,
|
|
"date": comment.date.isoformat(),
|
|
"rating": comment.rating
|
|
})
|
|
|
|
return comments_list
|
|
|
|
@router.get("/average-rating")
|
|
async def get_average_rating(
|
|
db: Session = Depends(get_db),
|
|
):
|
|
average_rating = db.query(func.avg(FeedBack.rating)).scalar()
|
|
|
|
if average_rating is None:
|
|
return {"Нет рэйтинга.": "Рейтинг", "Рейтинг": 0}
|
|
|
|
return {"Рэйтинг": round(average_rating, 2)}
|