semi-complete
Browse files- App/Users/UserRoutes.py +1 -1
- App/Users/utils.py +0 -0
- App/Webhooks/webhookRoute.py +46 -0
- App/app.py +2 -1
- App/modelInit.py +3 -20
App/Users/UserRoutes.py
CHANGED
|
@@ -31,8 +31,8 @@ async def register_user(user: RegisterUserRequest):
|
|
| 31 |
existing_user = await User.filter(phoneNumber=user.phoneNumber).first()
|
| 32 |
if existing_user:
|
| 33 |
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="User already exists.")
|
| 34 |
-
|
| 35 |
user.hash_password()
|
|
|
|
| 36 |
new_user = await User.create(**user.dict())
|
| 37 |
return BaseResponse(code=200, message="User created successfully", payload={"user_id": new_user.id})
|
| 38 |
|
|
|
|
| 31 |
existing_user = await User.filter(phoneNumber=user.phoneNumber).first()
|
| 32 |
if existing_user:
|
| 33 |
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="User already exists.")
|
|
|
|
| 34 |
user.hash_password()
|
| 35 |
+
|
| 36 |
new_user = await User.create(**user.dict())
|
| 37 |
return BaseResponse(code=200, message="User created successfully", payload={"user_id": new_user.id})
|
| 38 |
|
App/Users/utils.py
ADDED
|
File without changes
|
App/Webhooks/webhookRoute.py
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from fastapi import FastAPI, Request, HTTPException,APIRouter
|
| 2 |
+
from pydantic import BaseModel
|
| 3 |
+
|
| 4 |
+
|
| 5 |
+
webhook_router = APIRouter(tags=["Webhooks"])
|
| 6 |
+
|
| 7 |
+
WEBHOOK_SECRET = "your_webhook_secret" # Replace with your secret
|
| 8 |
+
|
| 9 |
+
class WebhookPayload(BaseModel):
|
| 10 |
+
event: str
|
| 11 |
+
data: dict
|
| 12 |
+
|
| 13 |
+
# Endpoint to receive webhook events
|
| 14 |
+
@webhook_router.post("/webhook/sms_received/")
|
| 15 |
+
async def handle_webhook(request: Request):
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
# Parse the webhook payload
|
| 19 |
+
payload = await request.json()
|
| 20 |
+
event = payload.get("event")
|
| 21 |
+
data = payload.get("data")
|
| 22 |
+
|
| 23 |
+
# Handle different event types
|
| 24 |
+
if event == "payment_success":
|
| 25 |
+
# Process payment success
|
| 26 |
+
print("Payment was successful:", data)
|
| 27 |
+
elif event == "user_registered":
|
| 28 |
+
# Process new user registration
|
| 29 |
+
print("New user registered:", data)
|
| 30 |
+
else:
|
| 31 |
+
print("Received unknown event:", event)
|
| 32 |
+
|
| 33 |
+
# Return a response
|
| 34 |
+
return {"status": "received"}
|
| 35 |
+
|
| 36 |
+
# # Optional: Verify the webhook signature
|
| 37 |
+
# def verify_signature(request: Request, signature: str) -> bool:
|
| 38 |
+
# if not signature:
|
| 39 |
+
# return False
|
| 40 |
+
# body = await request.body()
|
| 41 |
+
# computed_signature = hmac.new(
|
| 42 |
+
# WEBHOOK_SECRET.encode(),
|
| 43 |
+
# body,
|
| 44 |
+
# hashlib.sha256
|
| 45 |
+
# ).hexdigest()
|
| 46 |
+
# return hmac.compare_digest(computed_signature, signature)
|
App/app.py
CHANGED
|
@@ -1,6 +1,7 @@
|
|
| 1 |
from fastapi import FastAPI
|
| 2 |
from tortoise import Tortoise, run_async
|
| 3 |
from .Users.UserRoutes import user_router
|
|
|
|
| 4 |
from .modelInit import TORTOISE_ORM
|
| 5 |
|
| 6 |
app = FastAPI()
|
|
@@ -18,7 +19,7 @@ async def landing_page():
|
|
| 18 |
|
| 19 |
|
| 20 |
app.include_router(user_router)
|
| 21 |
-
|
| 22 |
|
| 23 |
|
| 24 |
async def main():
|
|
|
|
| 1 |
from fastapi import FastAPI
|
| 2 |
from tortoise import Tortoise, run_async
|
| 3 |
from .Users.UserRoutes import user_router
|
| 4 |
+
from .Webhooks.webhookRoute import webhook_router
|
| 5 |
from .modelInit import TORTOISE_ORM
|
| 6 |
|
| 7 |
app = FastAPI()
|
|
|
|
| 19 |
|
| 20 |
|
| 21 |
app.include_router(user_router)
|
| 22 |
+
app.include_router(webhook_router)
|
| 23 |
|
| 24 |
|
| 25 |
async def main():
|
App/modelInit.py
CHANGED
|
@@ -1,4 +1,7 @@
|
|
| 1 |
from App.discovery import discover_models
|
|
|
|
|
|
|
|
|
|
| 2 |
|
| 3 |
DATABASE_URL = "sqlite://db.sqlite3" # Example: SQLite for local development
|
| 4 |
|
|
@@ -12,24 +15,4 @@ TORTOISE_ORM = {
|
|
| 12 |
},
|
| 13 |
}
|
| 14 |
|
| 15 |
-
# HOST=aws.connect.psdb.cloud
|
| 16 |
-
# USERNAME=kn9rzjlad1tw8bvojqg9
|
| 17 |
-
# PASSWORD=pscale_pw_hSBO8rcekvnQp74bezC9gjnShhAWgkJYUS8GjGdrBKn
|
| 18 |
-
# DATABASE=movie-website
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
# database = databases.Database(
|
| 22 |
-
# "postgresql+asyncpg://postgres:[email protected]:5432/postgres"
|
| 23 |
-
# )
|
| 24 |
-
# database = databases.Database(
|
| 25 |
-
# "postgresql+asyncpg://user:password@db:5432/mydatabase"
|
| 26 |
-
# )
|
| 27 |
-
|
| 28 |
-
# #mysql
|
| 29 |
-
# database = databases.Database(
|
| 30 |
-
# 'mysql+asyncmy://kn9rzjlad1tw8bvojqg9:pscale_pw_hSBO8rcekvnQp74bezC9gjnShhAWgkJYUS8GjGdrBKn@aws.connect.psdb.cloud/movie-website'
|
| 31 |
-
# ,)
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
# databases = databases.Database(**args)
|
| 35 |
|
|
|
|
| 1 |
from App.discovery import discover_models
|
| 2 |
+
import asyncio
|
| 3 |
+
|
| 4 |
+
|
| 5 |
|
| 6 |
DATABASE_URL = "sqlite://db.sqlite3" # Example: SQLite for local development
|
| 7 |
|
|
|
|
| 15 |
},
|
| 16 |
}
|
| 17 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
|