habulaj commited on
Commit
4ebb593
·
verified ·
1 Parent(s): 7922375

Update routes/support.py

Browse files
Files changed (1) hide show
  1. routes/support.py +78 -18
routes/support.py CHANGED
@@ -112,12 +112,9 @@ GMAIL_CLIENT_ID = "784687789817-3genmmvps11ip3a6fkbkkd8dm3bstgdc.apps.googleuser
112
  GMAIL_CLIENT_SECRET = "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"
113
  GMAIL_REFRESH_TOKEN = "1//04ZOO_chVwlYiCgYIARAAGAQSNwF-L9IrhQO1ij79thk-DTjiMudl_XQshuU5CDTDYtt8rrOTMbz_rL8ECGjNfEN9da6W-mnjhZA"
114
 
115
- class SendEmailRequest(BaseModel):
116
- to: str
117
- subject: str
118
- body: str
119
- sender_name: Optional[str] = "Ameddes"
120
- sender_email: Optional[str] = "[email protected]"
121
 
122
 
123
  async def get_gmail_access_token() -> str:
@@ -141,16 +138,56 @@ def encode_message(raw_message: str) -> str:
141
  return base64.urlsafe_b64encode(raw_message.encode("utf-8")).decode("utf-8").replace("=", "")
142
 
143
 
144
- @router.post("/send-email")
145
- async def send_email(payload: SendEmailRequest = Body(...)):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
146
  access_token = await get_gmail_access_token()
 
147
 
148
- raw_message = f"""To: {payload.to}
149
- From: "{payload.sender_name}" <{payload.sender_email}>
150
- Subject: {payload.subject}
151
  Content-Type: text/html; charset="UTF-8"
152
 
153
- {payload.body}
154
  """
155
 
156
  encoded_message = encode_message(raw_message)
@@ -163,10 +200,33 @@ Content-Type: text/html; charset="UTF-8"
163
  "Content-Type": "application/json"
164
  },
165
  json={"raw": encoded_message}
166
- ) as resp:
167
- if resp.status != 200:
168
- error_detail = await resp.text()
169
- raise HTTPException(status_code=resp.status, detail=f"Erro ao enviar e-mail: {error_detail}")
170
- response_data = await resp.json()
 
 
 
 
 
 
 
 
171
 
172
- return {"status": "email sent", "message_id": response_data.get("id")}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
  GMAIL_CLIENT_SECRET = "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"
113
  GMAIL_REFRESH_TOKEN = "1//04ZOO_chVwlYiCgYIARAAGAQSNwF-L9IrhQO1ij79thk-DTjiMudl_XQshuU5CDTDYtt8rrOTMbz_rL8ECGjNfEN9da6W-mnjhZA"
114
 
115
+ class TicketResponseRequest(BaseModel):
116
+ ticket_id: int
117
+ content: str
 
 
 
118
 
119
 
120
  async def get_gmail_access_token() -> str:
 
138
  return base64.urlsafe_b64encode(raw_message.encode("utf-8")).decode("utf-8").replace("=", "")
139
 
140
 
141
+ @router.post("/ticket/respond")
142
+ async def respond_ticket(
143
+ payload: TicketResponseRequest,
144
+ user_token: str = Header(None, alias="User-key")
145
+ ):
146
+ # 1. Verifica o token do remetente (quem está respondendo)
147
+ support_id = await verify_user_token(user_token)
148
+ created_at = datetime.utcnow().isoformat()
149
+
150
+ # 2. Busca o ticket
151
+ async with aiohttp.ClientSession() as session:
152
+ async with session.get(
153
+ f"{SUPABASE_URL}/rest/v1/Tickets?id=eq.{payload.ticket_id}",
154
+ headers=SUPABASE_ROLE_HEADERS
155
+ ) as ticket_resp:
156
+ if ticket_resp.status != 200:
157
+ raise HTTPException(status_code=404, detail="Ticket não encontrado")
158
+
159
+ ticket_data = await ticket_resp.json()
160
+ if not ticket_data:
161
+ raise HTTPException(status_code=404, detail="Ticket não existe")
162
+
163
+ ticket = ticket_data[0]
164
+ user_id = ticket["user_id"]
165
+
166
+ # 3. Pega o e-mail do usuário
167
+ async with aiohttp.ClientSession() as session:
168
+ async with session.get(
169
+ f"{SUPABASE_URL}/rest/v1/User?id=eq.{user_id}",
170
+ headers=SUPABASE_ROLE_HEADERS
171
+ ) as user_resp:
172
+ if user_resp.status != 200:
173
+ raise HTTPException(status_code=404, detail="Usuário não encontrado")
174
+
175
+ user_data = await user_resp.json()
176
+ if not user_data:
177
+ raise HTTPException(status_code=404, detail="Usuário não existe")
178
+
179
+ user_email = user_data[0]["email"]
180
+
181
+ # 4. Envia o e-mail
182
  access_token = await get_gmail_access_token()
183
+ subject = f"Suporte ClosetCoach - Caso {payload.ticket_id}"
184
 
185
+ raw_message = f"""To: {user_email}
186
+ From: "ClosetCoach Support" <streamify@ameddes.com>
187
+ Subject: {subject}
188
  Content-Type: text/html; charset="UTF-8"
189
 
190
+ {payload.content}
191
  """
192
 
193
  encoded_message = encode_message(raw_message)
 
200
  "Content-Type": "application/json"
201
  },
202
  json={"raw": encoded_message}
203
+ ) as gmail_resp:
204
+ if gmail_resp.status != 200:
205
+ error_detail = await gmail_resp.text()
206
+ raise HTTPException(status_code=500, detail=f"Erro ao enviar e-mail: {error_detail}")
207
+ gmail_data = await gmail_resp.json()
208
+
209
+ # 5. Salva resposta em messages_tickets
210
+ message_payload = {
211
+ "user": support_id,
212
+ "content": payload.content,
213
+ "created_at": created_at,
214
+ "ticket_id": payload.ticket_id
215
+ }
216
 
217
+ async with aiohttp.ClientSession() as session:
218
+ async with session.post(
219
+ f"{SUPABASE_URL}/rest/v1/messages_tickets",
220
+ headers=SUPABASE_ROLE_HEADERS,
221
+ json=message_payload
222
+ ) as msg_resp:
223
+ if msg_resp.status != 201:
224
+ error_detail = await msg_resp.text()
225
+ raise HTTPException(status_code=500, detail=f"Erro ao registrar resposta: {error_detail}")
226
+
227
+ return {
228
+ "status": "resposta enviada com sucesso",
229
+ "ticket_id": payload.ticket_id,
230
+ "email_to": user_email,
231
+ "message_id": gmail_data.get("id")
232
+ }