feat: deals viewer mode and links for viewers
This commit is contained in:
		
							
								
								
									
										46
									
								
								utils/auth.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								utils/auth.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
from typing import Optional
 | 
			
		||||
 | 
			
		||||
import starlette.status
 | 
			
		||||
from fastapi import HTTPException
 | 
			
		||||
 | 
			
		||||
from constants import DEALS_VIEWER, DEAL_EDITOR
 | 
			
		||||
from models import User
 | 
			
		||||
from schemas.auth import UserUnion
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def raise_403():
 | 
			
		||||
    raise HTTPException(status_code=starlette.status.HTTP_403_FORBIDDEN, detail='Forbidden')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def verify_user(user: UserUnion, raising: bool = True) -> bool:
 | 
			
		||||
    if type(user) is User:
 | 
			
		||||
        return True
 | 
			
		||||
    if raising:
 | 
			
		||||
        raise_403()
 | 
			
		||||
    return False
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def verify_user_viewer(user: UserUnion, client_id: Optional[int] = None, raising: bool = True) -> bool:
 | 
			
		||||
    is_regular_user: bool = type(user) is User
 | 
			
		||||
    is_viewer: bool = isinstance(user, dict) and user['sub'] == DEALS_VIEWER
 | 
			
		||||
    if client_id is not None:
 | 
			
		||||
        is_viewer = is_viewer and int(user['client_id']) == client_id
 | 
			
		||||
 | 
			
		||||
    if is_regular_user or is_viewer:
 | 
			
		||||
        return True
 | 
			
		||||
    if raising:
 | 
			
		||||
        raise_403()
 | 
			
		||||
    return False
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def verify_user_deal_editor(user: UserUnion, deal_id: Optional[int] = None, raising: bool = True) -> bool:
 | 
			
		||||
    is_regular_user: bool = type(user) is User
 | 
			
		||||
    is_deal_editor: bool = isinstance(user, dict) and user['sub'] == DEAL_EDITOR
 | 
			
		||||
    if deal_id is not None:
 | 
			
		||||
        is_deal_editor = is_deal_editor and int(user['deal_id']) == deal_id
 | 
			
		||||
 | 
			
		||||
    if is_regular_user or is_deal_editor:
 | 
			
		||||
        return True
 | 
			
		||||
    if raising:
 | 
			
		||||
        raise_403()
 | 
			
		||||
    return False
 | 
			
		||||
		Reference in New Issue
	
	Block a user