Update routes/users.py
Browse files- routes/users.py +18 -6
routes/users.py
CHANGED
@@ -11,9 +11,10 @@ router = APIRouter()
|
|
11 |
# Configuração do Supabase
|
12 |
SUPABASE_URL = "https://ussxqnifefkgkaumjann.supabase.co"
|
13 |
SUPABASE_KEY = os.getenv("SUPA_KEY")
|
|
|
14 |
|
15 |
-
if not SUPABASE_KEY:
|
16 |
-
raise ValueError("❌ SUPA_KEY não
|
17 |
|
18 |
SUPABASE_HEADERS = {
|
19 |
"apikey": SUPABASE_KEY,
|
@@ -21,6 +22,12 @@ SUPABASE_HEADERS = {
|
|
21 |
"Content-Type": "application/json"
|
22 |
}
|
23 |
|
|
|
|
|
|
|
|
|
|
|
|
|
24 |
# Configuração do logging
|
25 |
logging.basicConfig(level=logging.INFO)
|
26 |
logger = logging.getLogger(__name__)
|
@@ -137,6 +144,7 @@ async def update_user(
|
|
137 |
"""
|
138 |
Endpoint para atualizar informações de um usuário específico.
|
139 |
Atualmente suporta atualização de name e fee.
|
|
|
140 |
"""
|
141 |
try:
|
142 |
# Verificar se o usuário é um administrador
|
@@ -153,7 +161,7 @@ async def update_user(
|
|
153 |
if name is None and fee is None:
|
154 |
raise HTTPException(status_code=400, detail="Pelo menos um campo para atualização (name ou fee) deve ser fornecido")
|
155 |
|
156 |
-
# Verificar se o usuário existe
|
157 |
user_query = f"{SUPABASE_URL}/rest/v1/User?select=name,fee&id=eq.{user_id}"
|
158 |
|
159 |
async with aiohttp.ClientSession() as session:
|
@@ -182,14 +190,18 @@ async def update_user(
|
|
182 |
if not update_fields:
|
183 |
return {"message": "Nenhuma alteração necessária", "user_id": user_id}
|
184 |
|
185 |
-
# Atualizar o usuário no Supabase
|
186 |
update_url = f"{SUPABASE_URL}/rest/v1/User?id=eq.{user_id}"
|
187 |
|
188 |
-
|
|
|
189 |
if update_response.status != 204:
|
190 |
-
logger.error(f"❌ Erro ao atualizar usuário: {update_response.status}")
|
191 |
raise HTTPException(status_code=update_response.status, detail="Erro ao atualizar usuário")
|
192 |
|
|
|
|
|
|
|
193 |
# Retornar resultado da operação
|
194 |
return {
|
195 |
"message": "Usuário atualizado com sucesso",
|
|
|
11 |
# Configuração do Supabase
|
12 |
SUPABASE_URL = "https://ussxqnifefkgkaumjann.supabase.co"
|
13 |
SUPABASE_KEY = os.getenv("SUPA_KEY")
|
14 |
+
SUPABASE_ROLE_KEY = os.getenv("SUPA_SERVICE_KEY")
|
15 |
|
16 |
+
if not SUPABASE_KEY or not SUPABASE_ROLE_KEY:
|
17 |
+
raise ValueError("❌ SUPA_KEY ou SUPA_SERVICE_KEY não foram definidos no ambiente!")
|
18 |
|
19 |
SUPABASE_HEADERS = {
|
20 |
"apikey": SUPABASE_KEY,
|
|
|
22 |
"Content-Type": "application/json"
|
23 |
}
|
24 |
|
25 |
+
SUPABASE_ROLE_HEADERS = {
|
26 |
+
"apikey": SUPABASE_ROLE_KEY,
|
27 |
+
"Authorization": f"Bearer {SUPABASE_ROLE_KEY}",
|
28 |
+
"Content-Type": "application/json"
|
29 |
+
}
|
30 |
+
|
31 |
# Configuração do logging
|
32 |
logging.basicConfig(level=logging.INFO)
|
33 |
logger = logging.getLogger(__name__)
|
|
|
144 |
"""
|
145 |
Endpoint para atualizar informações de um usuário específico.
|
146 |
Atualmente suporta atualização de name e fee.
|
147 |
+
Usa a chave de serviço para bypassar RLS do Supabase.
|
148 |
"""
|
149 |
try:
|
150 |
# Verificar se o usuário é um administrador
|
|
|
161 |
if name is None and fee is None:
|
162 |
raise HTTPException(status_code=400, detail="Pelo menos um campo para atualização (name ou fee) deve ser fornecido")
|
163 |
|
164 |
+
# Verificar se o usuário existe - usando os headers normais para consulta
|
165 |
user_query = f"{SUPABASE_URL}/rest/v1/User?select=name,fee&id=eq.{user_id}"
|
166 |
|
167 |
async with aiohttp.ClientSession() as session:
|
|
|
190 |
if not update_fields:
|
191 |
return {"message": "Nenhuma alteração necessária", "user_id": user_id}
|
192 |
|
193 |
+
# Atualizar o usuário no Supabase usando a chave de serviço para bypassar RLS
|
194 |
update_url = f"{SUPABASE_URL}/rest/v1/User?id=eq.{user_id}"
|
195 |
|
196 |
+
# Usando SUPABASE_ROLE_HEADERS para ter permissões de serviço completas
|
197 |
+
async with session.patch(update_url, json=update_fields, headers=SUPABASE_ROLE_HEADERS) as update_response:
|
198 |
if update_response.status != 204:
|
199 |
+
logger.error(f"❌ Erro ao atualizar usuário: {update_response.status} - {await update_response.text()}")
|
200 |
raise HTTPException(status_code=update_response.status, detail="Erro ao atualizar usuário")
|
201 |
|
202 |
+
# Registrar a operação bem-sucedida
|
203 |
+
logger.info(f"✅ Usuário {user_id} atualizado com sucesso por {admin_id}: {update_fields}")
|
204 |
+
|
205 |
# Retornar resultado da operação
|
206 |
return {
|
207 |
"message": "Usuário atualizado com sucesso",
|