import base64 from email.mime.text import MIMEText from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel, EmailStr from sqlmodel import Session, select from app.core.db import get_session from app.models import GoogleAccount, AuditLog from app.google.client import get_service router = APIRouter() class SendEmailIn(BaseModel): to: EmailStr subject: str body: str def get_account(session: Session, email: str) -> GoogleAccount: acc = session.exec(select(GoogleAccount).where(GoogleAccount.email == email)).first() if not acc: raise HTTPException(status_code=404, detail="Cuenta no autorizada. Primero usa /auth/google/start.") return acc @router.get("/profile") def gmail_profile(account_email: str, session: Session = Depends(get_session)): acc = get_account(session, account_email) gmail = get_service("gmail", "v1", acc.token_json) try: profile = gmail.users().getProfile(userId="me").execute() session.add(AuditLog(account_email=account_email, action="gmail_profile", detail="ok")) session.commit() return profile except Exception as e: raise HTTPException(status_code=400, detail=str(e)) @router.post("/send") def gmail_send(payload: SendEmailIn, account_email: str, session: Session = Depends(get_session)): acc = get_account(session, account_email) gmail = get_service("gmail", "v1", acc.token_json) message = MIMEText(payload.body, "plain", "utf-8") message["to"] = payload.to message["subject"] = payload.subject raw = base64.urlsafe_b64encode(message.as_bytes()).decode("utf-8") body = {"raw": raw} try: sent = gmail.users().messages().send(userId="me", body=body).execute() session.add(AuditLog(account_email=account_email, action="gmail_send", detail=f"to={payload.to}")) session.commit() return {"status": "sent", "id": sent.get("id")} except Exception as e: raise HTTPException(status_code=400, detail=str(e))