mirror of
https://github.com/hasura/graphql-engine.git
synced 2024-12-15 01:12:56 +03:00
feat: Python example for ST Recipe for Coupon Expiration [Fixes #9911]
GITHUB_PR_NUMBER: 9932 GITHUB_PR_URL: https://github.com/hasura/graphql-engine/pull/9932 PR-URL: https://github.com/hasura/graphql-engine-mono/pull/10385 Co-authored-by: Shoaib Asgar <24875366+msk4862@users.noreply.github.com> Co-authored-by: Rob Dominguez <24390149+robertjdominguez@users.noreply.github.com> GitOrigin-RevId: 89e227e4ff33065142660475e0861307cb017b48
This commit is contained in:
parent
f386414058
commit
26f33bec0e
@ -152,9 +152,18 @@ simply going to send a `POST` request. Our webhook will needs to do three things
|
|||||||
2. Query the database to see which coupons are expiring in two days.
|
2. Query the database to see which coupons are expiring in two days.
|
||||||
3. For each coupon returned, send an email to the user.
|
3. For each coupon returned, send an email to the user.
|
||||||
|
|
||||||
Below, we've written an example of webhook in JavaScript. As we established earlier, this runs on port `4000`. If you're
|
Below, we've written an example of webhook. As we established earlier, this runs on port `4000`. If you're attempting to
|
||||||
attempting to run this locally, follow the instructions below. If you're running this in a hosted environment, use this
|
run this locally, follow the instructions below. If you're running this in a hosted environment, use this code as a
|
||||||
code as a guide to write your own webhook.
|
guide to write your own webhook.
|
||||||
|
|
||||||
|
<Tabs
|
||||||
|
defaultValue="javascript"
|
||||||
|
values={[
|
||||||
|
{ label: 'JavaScript', value: 'javascript' },
|
||||||
|
{ label: 'Python', value: 'python' },
|
||||||
|
]}
|
||||||
|
>
|
||||||
|
<TabItem value="javascript">
|
||||||
|
|
||||||
Init a new project with `npm init` and install the following dependencies:
|
Init a new project with `npm init` and install the following dependencies:
|
||||||
|
|
||||||
@ -227,7 +236,7 @@ nodemailer.createTestAccount((err, account) => {
|
|||||||
body: JSON.stringify({
|
body: JSON.stringify({
|
||||||
query: `
|
query: `
|
||||||
query GetExpiringCoupons($two_days_from_now: timestamptz!) {
|
query GetExpiringCoupons($two_days_from_now: timestamptz!) {
|
||||||
coupons(where: {expiration_date: {_lte: $two_days_from_now}}) {
|
coupons(where: {expiration_date: {_lte: $two_days_from_now, _gte: today}}) {
|
||||||
id
|
id
|
||||||
code
|
code
|
||||||
expiration_date
|
expiration_date
|
||||||
@ -296,8 +305,140 @@ nodemailer.createTestAccount((err, account) => {
|
|||||||
|
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
You can run the server by running `node index.js` in your terminal. If you see the message
|
You can run the server by running `node index.js` in your terminal.
|
||||||
`Webhook server is running on port 4000`, you're good to go!
|
|
||||||
|
</TabItem>
|
||||||
|
<TabItem value="python">
|
||||||
|
|
||||||
|
Make sure you have the necessary dependencies installed. You can use pip to install them:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install Flask secure-smtplib requests
|
||||||
|
```
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>
|
||||||
|
Then, create a new file called <code>index.py</code> and add the following code:
|
||||||
|
</summary>
|
||||||
|
|
||||||
|
```python
|
||||||
|
from flask import Flask, request, jsonify
|
||||||
|
import smtplib
|
||||||
|
from smtplib import SMTPException
|
||||||
|
from email.mime.multipart import MIMEMultipart
|
||||||
|
from email.mime.text import MIMEText
|
||||||
|
import requests
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
# Create an SMTP server connection
|
||||||
|
def create_smtp_server():
|
||||||
|
try:
|
||||||
|
server = smtplib.SMTP(host='smtp.ethereal.email', port=587)
|
||||||
|
server.starttls()
|
||||||
|
server.login('example@superstore.com', 'samplePassword123')
|
||||||
|
return server
|
||||||
|
except SMTPException as e:
|
||||||
|
print(f"An error occurred while creating the SMTP server: {e}\nWe'll print the message to the terminal\n")
|
||||||
|
return None
|
||||||
|
|
||||||
|
def get_expired_coupons():
|
||||||
|
today = datetime.now()
|
||||||
|
two_days_from_now = today + timedelta(days=2)
|
||||||
|
formatted_date = two_days_from_now.isoformat()
|
||||||
|
|
||||||
|
# Prepare the request headers
|
||||||
|
headers = {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
'x-hasura-admin-secret': '<YOUR_ADMIN_SECRET>',
|
||||||
|
}
|
||||||
|
|
||||||
|
graphql_query = '''
|
||||||
|
query GetExpiringCoupons($two_days_from_now: timestamptz!) {
|
||||||
|
coupons(where: {expiration_date: {_lte: $two_days_from_now, _gte: today}}) {
|
||||||
|
id
|
||||||
|
expiration_date
|
||||||
|
code
|
||||||
|
user {
|
||||||
|
email
|
||||||
|
id
|
||||||
|
name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'''
|
||||||
|
|
||||||
|
graphql_variables = {
|
||||||
|
'two_days_from_now': formatted_date
|
||||||
|
}
|
||||||
|
|
||||||
|
# Prepare the request payload as a dictionary
|
||||||
|
payload = {
|
||||||
|
'query': graphql_query,
|
||||||
|
'variables': graphql_variables
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Make the POST request to the GraphQL endpoint
|
||||||
|
response = requests.post('<YOUR_PROJECT_ENDPOINT>', json=payload, headers=headers)
|
||||||
|
|
||||||
|
# Check the response status
|
||||||
|
if response.status_code == 200:
|
||||||
|
res = response.json()
|
||||||
|
return res['data']['coupons']
|
||||||
|
else:
|
||||||
|
return []
|
||||||
|
|
||||||
|
@app.route('/expiration_check', methods=['POST'])
|
||||||
|
def expiration_check():
|
||||||
|
# Confirm the secret header is correct
|
||||||
|
auth_header = request.headers.get('secret-authorization-string')
|
||||||
|
if auth_header != 'super_secret_string_123':
|
||||||
|
return jsonify({'message': 'Unauthorized'}), 401
|
||||||
|
|
||||||
|
# Fetch expired_coupons from your Hasura
|
||||||
|
expired_coupons = get_expired_coupons()
|
||||||
|
|
||||||
|
# Send email reminders
|
||||||
|
for coupon in expired_coupons:
|
||||||
|
email = coupon['user']['email']
|
||||||
|
# Format the timestamp into a readable format (e.g., "October 15, 2023")
|
||||||
|
parsed_date = datetime.fromisoformat(coupon['expiration_date'])
|
||||||
|
readable_date = parsed_date.strftime("%B %d, %Y")
|
||||||
|
|
||||||
|
# Create reminder message
|
||||||
|
msg = MIMEMultipart()
|
||||||
|
msg['From'] = 'SuperStore.com <sender@SuperStore.com>'
|
||||||
|
msg['To'] = f"{coupon['user']['name']} <{email}>"
|
||||||
|
msg['Subject'] = f"You've got a coupon expiring soon, {coupon['user']['name'].split(' ')[0]}!"
|
||||||
|
message_body = f"Yo {coupon['user']['name'].split(' ')[0]},\n\nYour coupon code, {coupon['code']}, is expiring soon! Use it before {readable_date}.\n\nThanks,\nSuperStore.com"
|
||||||
|
msg.attach(MIMEText(message_body, 'plain'))
|
||||||
|
|
||||||
|
server = create_smtp_server()
|
||||||
|
if server is not None:
|
||||||
|
# Send the email if server is running
|
||||||
|
server.sendmail('sender@SuperStore.com', email, msg.as_string())
|
||||||
|
server.quit()
|
||||||
|
else:
|
||||||
|
# or just print the message to the terminal
|
||||||
|
print(f"From: {msg['From']}\nTo: {msg['To']}\nSubject: {msg['Subject']}\n{message_body}")
|
||||||
|
|
||||||
|
return jsonify({'message': 'Coupons sent!'})
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run(port=4000)
|
||||||
|
```
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
|
You can run the server by running `python index.py` in your terminal.
|
||||||
|
|
||||||
|
</TabItem>
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
|
If you see the message `Webhook server is running on port 4000`, you're good to go!
|
||||||
|
|
||||||
## Step 4: Test the setup
|
## Step 4: Test the setup
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user