|
9 | 9 | from loguru import logger |
10 | 10 | from stripe import Customer as StripeCustomer |
11 | 11 | from stripe import Subscription as StripeSubscription |
| 12 | +from django.db.models import Q |
| 13 | +from django.core.exceptions import ObjectDoesNotExist |
12 | 14 |
|
13 | 15 | from backend.apps.account.models import Account, Subscription |
14 | 16 | from backend.custom.client import send_discord_message as send |
@@ -76,26 +78,56 @@ def add_user(email: str, group_key: str = None, role: str = "MEMBER"): |
76 | 78 | logger.error(e) |
77 | 79 | raise e |
78 | 80 |
|
| 81 | +def _normalize_plus(email: str) -> str: |
| 82 | + """Normaliza: trim, lower e remove +alias antes do @.""" |
| 83 | + email = email.strip().lower() |
| 84 | + local, _, domain = email.partition("@") |
| 85 | + if "+" in local: |
| 86 | + local = local.split("+", 1)[0] |
| 87 | + return f"{local}@{domain}" |
79 | 88 |
|
80 | 89 | def remove_user(email: str, group_key: str = None) -> None: |
81 | | - """Remove user from google group""" |
82 | | - if not group_key: |
83 | | - group_key = settings.GOOGLE_DIRECTORY_GROUP_KEY |
84 | | - if "+" in email and email.index("+") < email.index("@"): |
85 | | - email = email.split("+")[0] + "@" + email.split("@")[1] |
| 90 | + """Remove user from Google Group""" |
| 91 | + if not email or "@" not in email: |
| 92 | + logger.error(f"E-mail inválido fornecido: {email!r}") |
| 93 | + return |
| 94 | + |
| 95 | + raw_email = email.strip().lower() |
| 96 | + base_email = _normalize_plus(raw_email) |
| 97 | + |
| 98 | + try: |
| 99 | + user = Account.objects.get( |
| 100 | + Q(email__iexact=raw_email) | |
| 101 | + Q(email__iexact=base_email) | |
| 102 | + Q(gcp_email__iexact=raw_email) | |
| 103 | + Q(gcp_email__iexact=base_email) |
| 104 | + ) |
| 105 | + except ObjectDoesNotExist: |
| 106 | + logger.warning(f"Usuário {raw_email} não encontrado no banco. Prosseguindo com remoção.") |
| 107 | + return |
| 108 | + |
| 109 | + if user and user.is_admin: |
| 110 | + logger.warning(f"Bloqueado: {raw_email} é admin. Não removido do Google Groups.") |
| 111 | + return |
| 112 | + |
| 113 | + group_key = group_key or settings.GOOGLE_DIRECTORY_GROUP_KEY |
| 114 | + |
86 | 115 | try: |
87 | 116 | service = get_service() |
88 | 117 | service.members().delete( |
89 | 118 | groupKey=group_key, |
90 | | - memberKey=email.lower(), |
| 119 | + memberKey=base_email, |
91 | 120 | ).execute() |
92 | 121 | except HttpError as e: |
93 | 122 | if e.resp.status == 404: |
94 | | - logger.warning(f"{email} já foi removido do google groups") |
| 123 | + logger.warning(f"{base_email} já foi removido do Google Groups") |
95 | 124 | else: |
96 | | - send(f"Verifique o erro ao remover o usuário do google groups '{email}': {e}") |
| 125 | + send(f"Verifique o erro ao remover '{base_email}' do Google Groups: {e}") |
97 | 126 | logger.error(e) |
98 | | - raise e |
| 127 | + raise |
| 128 | + except Exception: |
| 129 | + logger.exception(f"Erro inesperado ao remover {base_email} do Google Groups") |
| 130 | + raise |
99 | 131 |
|
100 | 132 |
|
101 | 133 | def list_user(group_key: str = None): |
|
0 commit comments