Skip to content

Commit 27a6b07

Browse files
authored
Merge pull request ansari-project#178 from ansari-project/integrate-mailchimp
Registers users to the mailing list during signup
2 parents 9f46998 + f79307e commit 27a6b07

File tree

6 files changed

+76
-2
lines changed

6 files changed

+76
-2
lines changed

.env.example

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ OPENAI_API_KEY="" # Token for GPT-4 (Optional)
77
# Optional. If not set, the app will not use these services.
88
SENDGRID_API_KEY="" # API key to send password reset options
99

10+
MAILCHIMP_API_KEY="" # API key
11+
MAILCHIMP_SERVER_PREFIX="" # Server prefix (data center)
12+
MAILCHIMP_LIST_ID="" # List ID
13+
1014
# Database connection string
1115
MONGO_URL="mongodb://localhost:27017"
1216
MONGO_DB_NAME="ansari_db"

.github/workflows/deploy-production.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ jobs:
5353

5454
OPENAI_API_KEY: ${{ format('{0}{1}', secrets.SSM_ROOT, 'openai-api-key') }}
5555
SENDGRID_API_KEY: ${{ format('{0}{1}', secrets.SSM_ROOT, 'sendgrid-api-key') }}
56+
MAILCHIMP_API_KEY: ${{ format('{0}{1}', secrets.SSM_ROOT, 'mailchimp-api-key') }}
57+
MAILCHIMP_SERVER_PREFIX: ${{ format('{0}{1}', secrets.SSM_ROOT, 'mailchimp-server-prefix') }}
58+
MAILCHIMP_LIST_ID: ${{ format('{0}{1}', secrets.SSM_ROOT, 'mailchimp-list-id') }}
5659
ANTHROPIC_API_KEY: ${{ format('{0}{1}', secrets.SSM_ROOT, 'anthropic-api-key') }}
5760
KALEMAT_API_KEY: ${{ format('{0}{1}', secrets.SSM_ROOT, 'kalemat-api-key') }}
5861
SUNNAH_TOKEN: ${{ format('{0}{1}', secrets.SSM_ROOT, 'sunnah-token') }}
@@ -93,6 +96,9 @@ jobs:
9396
9497
OPENAI_API_KEY
9598
SENDGRID_API_KEY
99+
MAILCHIMP_API_KEY
100+
MAILCHIMP_SERVER_PREFIX
101+
MAILCHIMP_LIST_ID
96102
ANTHROPIC_API_KEY
97103
KALEMAT_API_KEY
98104
SUNNAH_TOKEN

.github/workflows/deploy-staging.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@ jobs:
5353

5454
OPENAI_API_KEY: ${{ format('{0}{1}', secrets.SSM_ROOT, 'openai-api-key') }}
5555
SENDGRID_API_KEY: ${{ format('{0}{1}', secrets.SSM_ROOT, 'sendgrid-api-key') }}
56+
MAILCHIMP_API_KEY: ${{ format('{0}{1}', secrets.SSM_ROOT, 'mailchimp-api-key') }}
57+
MAILCHIMP_SERVER_PREFIX: ${{ format('{0}{1}', secrets.SSM_ROOT, 'mailchimp-server-prefix') }}
58+
MAILCHIMP_LIST_ID: ${{ format('{0}{1}', secrets.SSM_ROOT, 'mailchimp-list-id') }}
5659
ANTHROPIC_API_KEY: ${{ format('{0}{1}', secrets.SSM_ROOT, 'anthropic-api-key') }}
5760
KALEMAT_API_KEY: ${{ format('{0}{1}', secrets.SSM_ROOT, 'kalemat-api-key') }}
5861
SUNNAH_TOKEN: ${{ format('{0}{1}', secrets.SSM_ROOT, 'sunnah-token') }}
@@ -93,6 +96,9 @@ jobs:
9396
9497
OPENAI_API_KEY
9598
SENDGRID_API_KEY
99+
MAILCHIMP_API_KEY
100+
MAILCHIMP_SERVER_PREFIX
101+
MAILCHIMP_LIST_ID
96102
ANTHROPIC_API_KEY
97103
KALEMAT_API_KEY
98104
SUNNAH_TOKEN

src/ansari/app/main_api.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
from ansari.app.main_whatsapp import router as whatsapp_router
4242
from ansari.config import Settings, get_settings
4343
from ansari.presenters.api_presenter import ApiPresenter
44-
from ansari.util.general_helpers import CORSMiddlewareWithLogging, get_extended_origins
44+
from ansari.util.general_helpers import CORSMiddlewareWithLogging, get_extended_origins, register_to_mailing_list
4545

4646
logger = get_logger(__name__)
4747
deployment_type = get_settings().DEPLOYMENT_TYPE
@@ -185,6 +185,7 @@ class RegisterRequest(BaseModel):
185185
password: str
186186
first_name: str
187187
last_name: str
188+
register_to_mail_list: bool = False
188189
# Left as an optional field for now to avoid breaking the frontend
189190
# (I.e., the frontend doesn't send this field yet)
190191
source: SourceType = SourceType.WEB
@@ -227,13 +228,23 @@ async def register_user(req: RegisterRequest):
227228
status_code=400,
228229
detail="Password is too weak. Suggestions: " + ",".join(passwd_quality["feedback"]["suggestions"]),
229230
)
230-
return db.register(
231+
232+
result = db.register(
231233
source=req.source,
232234
email=req.email,
233235
first_name=req.first_name,
234236
last_name=req.last_name,
235237
password_hash=password_hash,
236238
)
239+
240+
if result["status"] == "success" and req.register_to_mail_list:
241+
try:
242+
register_to_mailing_list(req.email, req.first_name, req.last_name)
243+
except Exception as e:
244+
logger.error(f"Error registering to Mailchimp: {e}")
245+
sentry_sdk.capture_exception(e)
246+
247+
return result
237248
except HTTPException:
238249
# Re-raise HTTP exceptions
239250
raise

src/ansari/config.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,9 @@ def get_resource_path(filename):
174174

175175
DISCORD_TOKEN: SecretStr | None = Field(default=None)
176176
SENDGRID_API_KEY: SecretStr | None = Field(default=None)
177+
MAILCHIMP_API_KEY: SecretStr | None = Field(default=None)
178+
MAILCHIMP_SERVER_PREFIX: str | None = Field(default=None)
179+
MAILCHIMP_LIST_ID: str | None = Field(default=None)
177180
QURAN_DOT_COM_API_KEY: SecretStr = Field(alias="QURAN_DOT_COM_API_KEY")
178181
WHATSAPP_ENABLED: bool = Field(default=True)
179182
WHATSAPP_API_VERSION: str | None = Field(default="v22.0")

src/ansari/util/general_helpers.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import unicodedata as ud
44
from typing import Literal
55

6+
import requests
7+
from requests.auth import HTTPBasicAuth
68
from fastapi import Depends, HTTPException, Request
79
from fastapi.middleware.cors import CORSMiddleware
810
from jwt import PyJWTError
@@ -14,6 +16,48 @@
1416
logger = get_logger(__name__)
1517

1618

19+
def register_to_mailing_list(email: str, first_name: str, last_name: str) -> bool:
20+
"""Register a user to Mailchimp.
21+
22+
Args:
23+
email (str): The email address of the user.
24+
first_name (str): The first name of the user.
25+
last_name (str): The last name of the user.
26+
27+
Returns:
28+
bool: True if the registration was successful, False otherwise.
29+
"""
30+
31+
api_key = get_settings().MAILCHIMP_API_KEY.get_secret_value()
32+
server_prefix = get_settings().MAILCHIMP_SERVER_PREFIX
33+
list_id = get_settings().MAILCHIMP_LIST_ID
34+
35+
url = f"https://{server_prefix}.api.mailchimp.com/3.0/lists/{list_id}/members"
36+
37+
data = {
38+
"email_address": email,
39+
"status": "subscribed",
40+
"merge_fields": {
41+
"FNAME": first_name,
42+
"LNAME": last_name,
43+
},
44+
}
45+
46+
headers = {
47+
"Content-Type": "application/json",
48+
}
49+
50+
try:
51+
basic_auth = HTTPBasicAuth("anystring", api_key)
52+
response = requests.post(url, json=data, headers=headers, auth=basic_auth)
53+
response.raise_for_status()
54+
55+
logger.info(f"Successfully registered {email} to Mailchimp.")
56+
return True
57+
except requests.exceptions.RequestException as e:
58+
logger.error(f"Failed to register {email} to Mailchimp: {e}")
59+
return False
60+
1761
def get_extended_origins(settings: Settings = Depends(get_settings)):
1862
origins = get_settings().ORIGINS
1963

0 commit comments

Comments
 (0)