minors corrections

main
Anaz 2025-01-11 10:01:13 +04:00
parent 7f0d1209e9
commit f0ae47dd20
9 changed files with 45 additions and 25 deletions

View File

@ -34,8 +34,8 @@ async def update_need(
if not need: if not need:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Need request not found") raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Need request not found")
# Vérifie si l'utilisateur est l'auteur ou un administrateur # V<EFBFBD>rifie si l'utilisateur est l'auteur ou un administrateur
if need.requester_email != current_user.email and not await admin_required(db=db): if need.requester_email != current_user.email and not await AuthService.admin_required(db=db):
raise HTTPException( raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN, status_code=status.HTTP_403_FORBIDDEN,
detail="You do not have permission to update this need request", detail="You do not have permission to update this need request",
@ -55,8 +55,8 @@ async def delete_need(
if not need: if not need:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Need request not found") raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Need request not found")
# Vérifie si l'utilisateur est l'auteur ou un administrateur # V<EFBFBD>rifie si l'utilisateur est l'auteur ou un administrateur
if need.requester_email != current_user.email and not await admin_required(db=db): if need.requester_email != current_user.email and not await AuthService.admin_required(db=db):
raise HTTPException( raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN, status_code=status.HTTP_403_FORBIDDEN,
detail="You do not have permission to delete this need request", detail="You do not have permission to delete this need request",

View File

@ -16,8 +16,8 @@ users_table = Table(
Column('organization', String(255)), Column('organization', String(255)),
Column('hashed_password', String(255), nullable=False), Column('hashed_password', String(255), nullable=False),
Column('role', String(50), nullable=False), Column('role', String(50), nullable=False),
Column('is_active', Boolean, default=True), Column('is_banned', Boolean, default=False),
Column('is_banned', Boolean, default=False) Column('is_deleted', Boolean, default=False)
) )
# Table des rôles # Table des rôles

View File

@ -33,8 +33,8 @@ class UserResponse(BaseModel):
date_of_birth: str date_of_birth: str
organization: Optional[str] = None organization: Optional[str] = None
role: RoleResponse role: RoleResponse
is_active: bool
is_banned: bool is_banned: bool
is_deleted: bool
class Role(BaseModel): class Role(BaseModel):
id: int id: int

View File

@ -7,7 +7,7 @@ from fastapi.security import OAuth2PasswordBearer
from config.settings import settings from config.settings import settings
from models.schemas import TokenData, UserCreate, UserResponse from models.schemas import TokenData, UserCreate, UserResponse
from config.database import get_db from config.database import get_db
from models.db import users_table from models.db import users_table, roles_table, role_permissions_table, permissions_table
from sqlalchemy import select, update, insert from sqlalchemy import select, update, insert
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from utils.logging import logger from utils.logging import logger
@ -19,7 +19,7 @@ logger.info("Test log message")
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
# Configuration pour OAuth2 # Configuration pour OAuth2
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token") oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/v1/auth/token")
class AuthService: class AuthService:
@staticmethod @staticmethod
@ -81,10 +81,29 @@ class AuthService:
query = select(users_table).where(users_table.c.email == email) query = select(users_table).where(users_table.c.email == email)
result = await db.execute(query) result = await db.execute(query)
user = result.fetchone() user = result.mappings().fetchone()
if user is None: if user is None:
raise credentials_exception raise credentials_exception
# Récupérer le rôle et ses permissions
role_query = select(roles_table.c.id, roles_table.c.name, permissions_table.c.name.label("permission")).join(
role_permissions_table, role_permissions_table.c.role_id == roles_table.c.id
).join(
permissions_table, role_permissions_table.c.permission_id == permissions_table.c.id
).where(roles_table.c.name == user["role"])
role_result = await db.execute(role_query)
role_data = role_result.mappings().all()
if not role_data:
raise credentials_exception
role = {
"id": role_data[0]["id"],
"name": role_data[0]["name"],
"permissions": [r["permission"] for r in role_data]
}
# Préparez la réponse avec tous les champs requis # Préparez la réponse avec tous les champs requis
return { return {
"id": user["id"], "id": user["id"],
@ -92,9 +111,9 @@ class AuthService:
"full_name": user["full_name"], "full_name": user["full_name"],
"phone": user["phone"], "phone": user["phone"],
"date_of_birth": user["date_of_birth"].isoformat(), "date_of_birth": user["date_of_birth"].isoformat(),
"role": user["role"], "role": role,
"is_active": not user["is_blocked"], "is_banned": user["is_banned"],
"is_banned": user["is_deleted"], "is_deleted": user["is_deleted"],
} }
@staticmethod @staticmethod

View File

@ -1,3 +1,4 @@
from fastapi import HTTPException
from sqlalchemy import insert from sqlalchemy import insert
from models.schemas import TechnicalIssue from models.schemas import TechnicalIssue
from config.database import get_db from config.database import get_db

View File

@ -9,7 +9,7 @@ from config.settings import settings
from jose import jwt, JWTError from jose import jwt, JWTError
from datetime import datetime from datetime import datetime
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token") oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/v1/auth/token")
class NeedRequestService: class NeedRequestService:
@ -53,7 +53,7 @@ class NeedRequestService:
@staticmethod @staticmethod
async def update_need(need_id: int, data: dict, db, token: str): async def update_need(need_id: int, data: dict, db, token: str):
user = await NeedRequestService.verify_requester_or_admin(need_id, token, db) user = await NeedRequestService.verify_requester_or_admin(need_id, token, db)
if "deleted" in data: # Empêche la mise à jour directe du champ `deleted` if "deleted" in data: # Emp<EFBFBD>che la mise <20> jour directe du champ `deleted`
raise HTTPException(status_code=400, detail="Invalid update field") raise HTTPException(status_code=400, detail="Invalid update field")
query = ( query = (
@ -97,7 +97,7 @@ class NeedRequestService:
detail="You do not have permission to perform this action.", detail="You do not have permission to perform this action.",
) )
try: try:
# Décodage du token JWT # D<EFBFBD>codage du token JWT
payload = jwt.decode(token, settings.secret_key, algorithms=[settings.algorithm]) payload = jwt.decode(token, settings.secret_key, algorithms=[settings.algorithm])
email: str = payload.get("sub") email: str = payload.get("sub")
if email is None: if email is None:
@ -106,21 +106,21 @@ class NeedRequestService:
except JWTError: except JWTError:
raise credentials_exception raise credentials_exception
# Récupère l'utilisateur depuis la base de données # R<EFBFBD>cup<EFBFBD>re l'utilisateur depuis la base de donn<6E>es
user_query = select(users_table).where(users_table.c.email == token_data.email) user_query = select(users_table).where(users_table.c.email == token_data.email)
result = await db.execute(user_query) result = await db.execute(user_query)
user = result.fetchone() user = result.fetchone()
if user is None: if user is None:
raise credentials_exception raise credentials_exception
# Récupère la demande de besoin # R<EFBFBD>cup<EFBFBD>re la demande de besoin
need_query = select(need_requests_table).where(need_requests_table.c.id == need_id) need_query = select(need_requests_table).where(need_requests_table.c.id == need_id)
result = await db.execute(need_query) result = await db.execute(need_query)
need = result.fetchone() need = result.fetchone()
if need is None: if need is None:
raise HTTPException(status_code=404, detail="Need request not found") raise HTTPException(status_code=404, detail="Need request not found")
# Vérifie si l'utilisateur est l'auteur ou un administrateur # V<EFBFBD>rifie si l'utilisateur est l'auteur ou un administrateur
if need["requester_email"] != user["email"] and user["role"] != "admin": if need["requester_email"] != user["email"] and user["role"] != "admin":
raise credentials_exception raise credentials_exception

View File

@ -7,7 +7,7 @@ from typing import Optional
from fastapi import Depends from fastapi import Depends
from fastapi.security import OAuth2PasswordBearer from fastapi.security import OAuth2PasswordBearer
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token") oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/v1/auth/token")
class PersonReportService: class PersonReportService:

View File

@ -8,7 +8,7 @@ from config.settings import settings
from jose import jwt, JWTError from jose import jwt, JWTError
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token") oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/v1/auth/token")
class RoleService: class RoleService:

View File

@ -1,4 +1,4 @@
from sqlalchemy import update, select from sqlalchemy import select, update, insert
from fastapi import Depends, HTTPException, status from fastapi import Depends, HTTPException, status
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from models.schemas import UserCreate, UserResponse, UserUpdateRole, UserBlockBan from models.schemas import UserCreate, UserResponse, UserUpdateRole, UserBlockBan
@ -12,11 +12,11 @@ class UserService:
@staticmethod @staticmethod
async def list_users(status: Optional[str] = None, db=Depends(get_db)): async def list_users(status: Optional[str] = None, db=Depends(get_db)):
query = select(person_reports_table) query = select(users_table)
if status: if status:
query = query.where(users_table.c.status == status) query = query.where(users_table.c.status == status)
result = await db.execute(query) result = await db.execute(query)
users = result.fetchall() users = result.mappings().all()
return [UserResponse(**user) for user in users] return [UserResponse(**user) for user in users]
@staticmethod @staticmethod