mirror of
https://github.com/lorsanstand/Aether.git
synced 2026-06-19 12:05:16 +03:00
Edit README
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
from typing import Dict
|
||||
import logging
|
||||
|
||||
from fastapi import APIRouter, Response, Depends
|
||||
from fastapi import APIRouter, Response, Depends, UploadFile, File
|
||||
|
||||
from app.users.schemas import User, UserUpdate
|
||||
from app.users.service import UserService
|
||||
@@ -36,4 +36,16 @@ async def delete_current_user(response: Response, user: UserModel = Depends(get_
|
||||
|
||||
await AuthService.abort_all_sessions(user.id)
|
||||
await UserService.delete_user(user.id)
|
||||
return {"status": True, "message": "User successfully deleted"}
|
||||
return {"status": True, "message": "User successfully deleted"}
|
||||
|
||||
@router.post("/me/avatar")
|
||||
async def upload_avatar(
|
||||
avatar: UploadFile = File(...),
|
||||
user: UserModel = Depends(get_current_verified_user)
|
||||
) -> User:
|
||||
return await UserService.upload_avatar(user, avatar)
|
||||
|
||||
@router.delete('/me/avatar')
|
||||
async def delete_avatar(user: UserModel = Depends(get_current_verified_user)) -> Dict:
|
||||
await UserService.delete_avatar(user)
|
||||
return {"status": True, "message": "Avatar successfully deleted"}
|
||||
@@ -3,11 +3,13 @@ import uuid
|
||||
from datetime import timedelta
|
||||
from typing import List
|
||||
|
||||
from fastapi import HTTPException, status
|
||||
from fastapi import HTTPException, status, UploadFile
|
||||
from sqlalchemy import or_
|
||||
from sqlalchemy.orm.sync import update
|
||||
|
||||
from app.utils.hash_password import hash_password, verify_password
|
||||
from app.services.redis_service import EmailTokenStorage, ChangePasswordTokenStorage
|
||||
from app.core.S3_client import s3_client
|
||||
from app.core.exceptions import InvalidTokenException, TokenExpiredException, UserNotFoundException
|
||||
from app.users.models import UserModel
|
||||
from app.users.dao import UserDAO
|
||||
@@ -221,4 +223,56 @@ class UserService:
|
||||
obj_in={"hashed_password": hash_password(new_password)}
|
||||
)
|
||||
await session.commit()
|
||||
log.info("Successfully reset password", extra={"user_id": user_id})
|
||||
log.info("Successfully reset password", extra={"user_id": user_id})
|
||||
|
||||
|
||||
@classmethod
|
||||
async def upload_avatar(cls, user: UserModel, avatar: UploadFile) -> User:
|
||||
async with async_session_maker() as session:
|
||||
allowed_types = ["image/jpeg", "image/png", "image/gif"]
|
||||
|
||||
if not avatar.content_type in allowed_types:
|
||||
log.warning("Using not allowed type photo", extra={"user_id": user.id})
|
||||
raise HTTPException(status.HTTP_400_BAD_REQUEST, detail="allowed type png and jpeg")
|
||||
|
||||
if user.avatar_url is not None:
|
||||
await cls.delete_avatar(user)
|
||||
|
||||
type: str = avatar.filename.split(".")[-1]
|
||||
object_name: str = f"avatar_{user.id}_{uuid.uuid4()}.{type}"
|
||||
|
||||
url = await s3_client.upload_file(
|
||||
file=avatar.file.read(),
|
||||
object_name=object_name,
|
||||
content_type=avatar.content_type
|
||||
)
|
||||
|
||||
update_user = await UserDAO.update(
|
||||
session,
|
||||
UserModel.id==user.id,
|
||||
obj_in={"avatar_url": url}
|
||||
)
|
||||
await session.commit()
|
||||
log.info("Successfully upload avatar", extra={"user_id": user.id, "avatar_url": url})
|
||||
return update_user
|
||||
|
||||
|
||||
@classmethod
|
||||
async def delete_avatar(cls, user: UserModel):
|
||||
async with async_session_maker() as session:
|
||||
|
||||
if user.avatar_url is None:
|
||||
log.warning("Avatar is none", extra={"user_id": user.id})
|
||||
return
|
||||
|
||||
avatar_name = user.avatar_url.split("/")[-1]
|
||||
|
||||
await s3_client.delete_file(avatar_name)
|
||||
|
||||
await UserDAO.update(
|
||||
session,
|
||||
UserModel.id==user.id,
|
||||
obj_in={"avatar_url": None}
|
||||
)
|
||||
log.info("Avatar successfully deleted", extra={"user_id": user.id})
|
||||
await session.commit()
|
||||
Reference in New Issue
Block a user