minors corrections
parent
7f0d1209e9
commit
f0ae47dd20
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue