habulaj commited on
Commit
fc143b9
·
verified ·
1 Parent(s): 037071f

Update routes/approvals.py

Browse files
Files changed (1) hide show
  1. routes/approvals.py +60 -4
routes/approvals.py CHANGED
@@ -55,7 +55,59 @@ def get_cached_admin_status(user_id: str) -> bool:
55
  user_info = response.json()[0]
56
  return user_info.get("is_admin", False)
57
 
58
- # 🔐 Verificação de token com permissões normais
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
59
  async def verify_admin_token(user_token: str) -> str:
60
  headers = {
61
  "Authorization": f"Bearer {user_token}",
@@ -154,7 +206,8 @@ async def approve_account(
154
  user_token: str = Header(None, alias="User-key")
155
  ):
156
  try:
157
- await verify_admin_token(user_token)
 
158
 
159
  update_url = f"{SUPABASE_URL}/rest/v1/User?id=eq.{body.user_id}"
160
  payload = { "approved_account": True }
@@ -180,7 +233,8 @@ async def reject_account(
180
  user_token: str = Header(None, alias="User-key")
181
  ):
182
  try:
183
- await verify_admin_token(user_token)
 
184
 
185
  update_url = f"{SUPABASE_URL}/rest/v1/User?id=eq.{body.user_id}"
186
  payload = {
@@ -208,7 +262,9 @@ async def pending_approvals_endpoint(
208
  user_token: str = Header(None, alias="User-key")
209
  ):
210
  try:
211
- await verify_admin_token(user_token)
 
 
212
  return await get_users_pending_approval()
213
  except HTTPException as he:
214
  raise he
 
55
  user_info = response.json()[0]
56
  return user_info.get("is_admin", False)
57
 
58
+ # Nova função para obter permissões do usuário
59
+ async def get_user_permissions(user_id: str) -> Dict[str, bool]:
60
+ """Obtém as permissões de um usuário, incluindo approve_stylists"""
61
+ user_data_url = f"{SUPABASE_URL}/rest/v1/User?id=eq.{user_id}&select=is_admin,approve_stylists"
62
+
63
+ async with aiohttp.ClientSession() as session:
64
+ async with session.get(user_data_url, headers=SUPABASE_HEADERS) as response:
65
+ if response.status != 200 or not await response.json():
66
+ return {"is_admin": False, "approve_stylists": False}
67
+
68
+ user_info = (await response.json())[0]
69
+ return {
70
+ "is_admin": user_info.get("is_admin", False),
71
+ "approve_stylists": user_info.get("approve_stylists", False)
72
+ }
73
+
74
+ # 🔐 Verificação de token com permissões especificadas
75
+ async def verify_token_with_permissions(user_token: str, required_permission: Optional[str] = None) -> Dict[str, Any]:
76
+ """Verifica o token e verifica se o usuário tem a permissão necessária"""
77
+ headers = {
78
+ "Authorization": f"Bearer {user_token}",
79
+ "apikey": SUPABASE_KEY,
80
+ "Content-Type": "application/json"
81
+ }
82
+
83
+ async with aiohttp.ClientSession() as session:
84
+ async with session.get(f"{SUPABASE_URL}/auth/v1/user", headers=headers) as response:
85
+ if response.status != 200:
86
+ raise HTTPException(status_code=401, detail="Token inválido ou expirado")
87
+
88
+ user_data = await response.json()
89
+ user_id = user_data.get("id")
90
+ if not user_id:
91
+ raise HTTPException(status_code=400, detail="ID do usuário não encontrado")
92
+
93
+ # Obter permissões do usuário
94
+ permissions = await get_user_permissions(user_id)
95
+
96
+ # Verificar permissão específica, se requisitada
97
+ if required_permission:
98
+ has_permission = permissions.get(required_permission, False)
99
+ if not has_permission:
100
+ raise HTTPException(
101
+ status_code=403,
102
+ detail=f"Acesso negado: permissão '{required_permission}' necessária"
103
+ )
104
+
105
+ return {
106
+ "user_id": user_id,
107
+ "permissions": permissions
108
+ }
109
+
110
+ # 🔐 Verificação de token admin (mantida para compatibilidade)
111
  async def verify_admin_token(user_token: str) -> str:
112
  headers = {
113
  "Authorization": f"Bearer {user_token}",
 
206
  user_token: str = Header(None, alias="User-key")
207
  ):
208
  try:
209
+ # Verificar se o usuário tem permissão para aprovar estilistas
210
+ user_info = await verify_token_with_permissions(user_token, "approve_stylists")
211
 
212
  update_url = f"{SUPABASE_URL}/rest/v1/User?id=eq.{body.user_id}"
213
  payload = { "approved_account": True }
 
233
  user_token: str = Header(None, alias="User-key")
234
  ):
235
  try:
236
+ # Verificar se o usuário tem permissão para reprovar estilistas
237
+ user_info = await verify_token_with_permissions(user_token, "approve_stylists")
238
 
239
  update_url = f"{SUPABASE_URL}/rest/v1/User?id=eq.{body.user_id}"
240
  payload = {
 
262
  user_token: str = Header(None, alias="User-key")
263
  ):
264
  try:
265
+ # Verificar se o usuário tem permissão para visualizar estilistas pendentes
266
+ user_info = await verify_token_with_permissions(user_token, "approve_stylists")
267
+
268
  return await get_users_pending_approval()
269
  except HTTPException as he:
270
  raise he