mirror of
https://github.com/fromchat-messenger/web.git
synced 2026-09-22 19:15:08 +03:00
99 lines
3.1 KiB
Python
99 lines
3.1 KiB
Python
from pathlib import Path
|
|
from fastapi import APIRouter, Depends, HTTPException, UploadFile, File
|
|
from sqlalchemy.orm import Session
|
|
from PIL import Image
|
|
import os
|
|
import uuid
|
|
import io
|
|
|
|
from dependencies import get_db, get_current_user
|
|
from models import User
|
|
|
|
router = APIRouter()
|
|
|
|
# Create uploads directory if it doesn't exist
|
|
PROFILE_PICTURES_DIR = Path("data/uploads/pfp")
|
|
|
|
os.makedirs(PROFILE_PICTURES_DIR, exist_ok=True)
|
|
|
|
@router.post("/upload-profile-picture")
|
|
async def upload_profile_picture(
|
|
profile_picture: UploadFile = File(...),
|
|
current_user: User = Depends(get_current_user),
|
|
db: Session = Depends(get_db)
|
|
):
|
|
"""
|
|
Upload and process a profile picture
|
|
"""
|
|
# Validate file type
|
|
if not profile_picture.content_type.startswith('image/'):
|
|
raise HTTPException(status_code=400, detail="File must be an image")
|
|
|
|
# Validate file size (max 5MB)
|
|
if profile_picture.size > 5 * 1024 * 1024:
|
|
raise HTTPException(status_code=400, detail="File size must be less than 5MB")
|
|
|
|
try:
|
|
# Read and process the image
|
|
image_data = await profile_picture.read()
|
|
|
|
# Open image with PIL
|
|
image = Image.open(io.BytesIO(image_data))
|
|
|
|
# Convert to RGB if necessary
|
|
if image.mode != 'RGB':
|
|
image = image.convert('RGB')
|
|
|
|
# Resize to a reasonable size (200x200)
|
|
image.thumbnail((200, 200), Image.Resampling.LANCZOS)
|
|
|
|
# Generate unique filename
|
|
filename = f"{current_user.id}_{uuid.uuid4().hex}.jpg"
|
|
filepath = os.path.join(PROFILE_PICTURES_DIR, filename)
|
|
|
|
# Save the processed image
|
|
image.save(filepath, 'JPEG', quality=85)
|
|
|
|
# Update user's profile picture in database
|
|
profile_picture_url = f"/api/profile-picture/{filename}"
|
|
current_user.profile_picture = profile_picture_url
|
|
db.commit()
|
|
|
|
return {
|
|
"message": "Profile picture uploaded successfully",
|
|
"profile_picture_url": profile_picture_url
|
|
}
|
|
|
|
except Exception as e:
|
|
raise HTTPException(status_code=500, detail=f"Error processing image: {str(e)}")
|
|
|
|
@router.get("/profile-picture/{filename}")
|
|
async def get_profile_picture(filename: str):
|
|
"""
|
|
Serve profile picture files
|
|
"""
|
|
filepath = os.path.join(PROFILE_PICTURES_DIR, filename)
|
|
|
|
if not os.path.exists(filepath):
|
|
raise HTTPException(status_code=404, detail="Profile picture not found")
|
|
|
|
from fastapi.responses import FileResponse
|
|
return FileResponse(filepath, media_type="image/jpeg")
|
|
|
|
@router.get("/user/profile")
|
|
async def get_user_profile(
|
|
current_user: User = Depends(get_current_user),
|
|
db: Session = Depends(get_db)
|
|
):
|
|
"""
|
|
Get current user's profile information
|
|
"""
|
|
return {
|
|
"id": current_user.id,
|
|
"username": current_user.username,
|
|
"profile_picture": current_user.profile_picture,
|
|
"online": current_user.online,
|
|
"last_seen": current_user.last_seen,
|
|
"created_at": current_user.created_at
|
|
}
|